diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ba191626635d7bb271e178e56723157b4632d1d --- /dev/null +++ b/pom.xml @@ -0,0 +1,188 @@ + + + 4.0.0 + + com.es + disped + 1.0.0-SNAPSHOT + + disped-web + war + disped-web Maven Webapp + http://maven.apache.org + + + + + com.es + disped-core + 1.0.0-SNAPSHOT + + + commons-io + commons-io + + + + + + com.alibaba + druid + 1.1.5 + + + + + javax.servlet + jstl + 1.2 + + + + + dom4j + dom4j + 1.6.1 + + + + + org.apache.solr + solr-solrj + 7.1.0 + + + slf4j-api + org.slf4j + + + zookeeper + org.apache.zookeeper + + + commons-io + commons-io + + + + + + + com.alibaba + dubbo + 2.6.0 + + + spring-context + org.springframework + + + spring-beans + org.springframework + + + spring-web + org.springframework + + + + + + + org.apache.zookeeper + zookeeper + 3.4.11 + + + slf4j-log4j12 + org.slf4j + + + slf4j-api + org.slf4j + + + log4j + log4j + + + + + + + com.github.sgroschupf + zkclient + 0.1 + + + zookeeper + org.apache.zookeeper + + + log4j + log4j + + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + log4j-over-slf4j + ${slf4j.version} + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + org.springframework.data + spring-data-redis + 1.8.9.RELEASE + + + jcl-over-slf4j + org.slf4j + + + + + + org.springframework.session + spring-session + 1.3.2.RELEASE + + + com.fasterxml.jackson.core + jackson-databind + 2.9.5 + + + + com.thetransactioncompany + cors-filter + 2.6 + + + + org.springframework + spring-test + ${spring.version} + test + + + + disped-web + + diff --git a/src/main/java/com/es/disped/web/controller/area/AreaController.java b/src/main/java/com/es/disped/web/controller/area/AreaController.java new file mode 100644 index 0000000000000000000000000000000000000000..424d94773bfb323ab7c395ff617c9a0baaf84695 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/area/AreaController.java @@ -0,0 +1,155 @@ +/** + * + */ +package com.es.disped.web.controller.area; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.area.AreaService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Area; +import com.es.disped.dao.model.AreaExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 下午3:41:36 + * + * 名称:AreaController.java + * + * 描述:区域管理 + */ +@Api("区域管理") +@Controller +@RequestMapping("/manage/area") +public class AreaController extends BaseController { + + @Autowired + AreaService areaService; + + @ApiOperation(value="保存地区",response=MsgModel.class,httpMethod="POST", + notes="保存地区对象,地区名称,地区联系人手机号以及地区联系人不能为空") + @RequiresPermissions(value="sys:save") + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="area",value="地区对象",required=true) Area area) + { + int count=0; + if(Optional.of(area) + .filter(name->area.getAreaName()!=null) + .filter(code->area.getAreaPhone()!=null) + .filter(uid->area.getUserId()!=null) + .isPresent()) + { + area.setAreaId(getUUID()); + area.setAreaValid(RecordStatus.USEAGE.getValue()); + count=areaService.insertSelective(area); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"":"保存失败", count==1?area:"") ; + } + + + + @ApiOperation(value="更新地区",response=MsgModel.class,httpMethod="POST", + notes="更新地区对象,其中地区编号不能为空") + @RequiresPermissions(value="sys:update") + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="area",value="地区对象",required=true) Area area) + { + int count=0; + if(Optional.of(area) + .filter(areaId->area.getAreaId()!=null) + .isPresent()) + { + count=areaService.updateByPrimaryKeySelective(area); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"":"保存失败", count==1?area:"") ; + } + + + @ApiOperation(value="删除地区",response=MsgModel.class,httpMethod="POST",notes="删除地区,需要地区编号") + @RequiresPermissions(value="sys:delete") + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="area",value="地区对象",required=true) Area area) + { + int count=0; + if(Optional.of(area) + .filter(areaId->area.getAreaId()!=null) + .isPresent()) + { + count=areaService.deleteByPrimaryKey(area.getAreaId()); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"":"删除失败", count==1?area:""); + } + + + @ApiOperation(value="检索地区",response=MsgModel.class,httpMethod="POST",notes="检索地区,包括模糊检索") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="area",value="地区对象",required=false) Area area) + { + AreaExample listExample=new AreaExample(); + AreaExample.Criteria criteria=listExample.createCriteria(); + if(!this.isNull(area.getAreaId())) + { + criteria.andAreaIdEqualTo(area.getAreaId()); + } + if(!this.isNull(area.getAreaName())) + { + criteria.andAreaNameLike("%"+area.getAreaName()+"%"); + } + if(!this.isNull(area.getAreaPhone())) + { + criteria.andAreaPhoneLike("%"+area.getAreaPhone()+"%"); + } + if(!this.isNull(area.getAreaAddress())) + { + criteria.andAreaAddressLike("%"+area.getAreaAddress()+"%"); + } + List areas=areaService.selectByExample(listExample); + return this.resultMsg(areas.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + areas.size()>0?"":"地区列表为空", areas.size()>0?areas:""); + } + + + @ApiOperation(value="获取地区列表",httpMethod="POST",response=MsgModel.class,notes="获取地区信息(管理端),分页加载") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + AreaExample pageExample=new AreaExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=areaService.selectByExampleForOffsetPage(pageExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + } + return this.resultMsg(pageModel!=null?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + pageModel!=null?"":"地区列表为空", pageModel!=null?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/clazz/ClazzController.java b/src/main/java/com/es/disped/web/controller/clazz/ClazzController.java new file mode 100644 index 0000000000000000000000000000000000000000..37b3320be8941e2f3cf620d9fcf0e85bb60e598c --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/clazz/ClazzController.java @@ -0,0 +1,211 @@ +package com.es.disped.web.controller.clazz; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.clazz.ClazzService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Clazz; +import com.es.disped.dao.model.ClazzExample; +import com.es.disped.dao.model.SyllabusForeignModel; +import com.es.disped.dao.model.UserForeignModel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月6日 上午10:08:09 + * 名称:ClazzController.java + * 描述:班级管理 + */ +@Api(value="班级管理") +@Controller +@RequestMapping("/manage/clazz") +public class ClazzController extends BaseController{ + + private final String USER_NAMESPACE="com.es.disped.dao.mapper.user.UserCustomMapper"; + + private final String CLAZZ_NAMESPACE="com.es.disped.dao.mapper.clazz.ClazzCustomMapper"; + + private final String SYLLABUS_NAMESPACE="com.es.disped.dao.mapper.syllabus.SyllabusCustomMapper"; + + @Autowired + ClazzService clazzService; + + + @ApiOperation(value="保存班级",response=MsgModel.class,httpMethod="POST",notes="保存班级信息") + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="clazz",value="班级对象",required=true) Clazz clazz) + { + int count=0; + if(Optional.of(clazz) + .filter(name->clazz.getClazzName()!=null) + .filter(tId->clazz.getTeacherId()!=null) + .filter(max->clazz.getClazzMaxStudent()!=null) + .filter(syId->clazz.getSyllabusId()!=null) + .isPresent()) + { + clazz.setClazzId(getUUID()); + + UserForeignModel teacherForeignModel=this.getService().selectOne( + USER_NAMESPACE+".getUserForeignModel", clazz.getTeacherId()); + clazz.setTeacherName(teacherForeignModel.getUserName()); + + SyllabusForeignModel syllabusForeignModel=this.getService().selectOne( + SYLLABUS_NAMESPACE, clazz.getSyllabusId()); + clazz.setSyllabusName(syllabusForeignModel.getSyllabusName()); + + if(!this.isNull(clazz.getAssistantId())) + { + UserForeignModel assistantForeignModel=this.getService().selectOne(USER_NAMESPACE+".getUserForeignModel", clazz.getAssistantId()); + clazz.setAssistantName(assistantForeignModel.getUserName()); + } + + clazz.setClazzValid(RecordStatus.USEAGE.getValue()); + + count=clazzService.insertSelective(clazz); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败",count==1?clazz:""); + } + + + @ApiOperation(value="更新班级",response=MsgModel.class,httpMethod="POST",notes="更新班级信息") + @RequiresPermissions(value={"admin:update","sys:update"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="clazz",value="班级对象",required=true) Clazz clazz) + { + int count=0; + if(Optional.of(clazz) + .filter(cId->clazz.getClazzId()!=null) + .isPresent()) + { + if(!this.isNull(clazz.getTeacherId())) + { + UserForeignModel teacherForeignModel=this.getService().selectOne(USER_NAMESPACE+".getUserForeignModel", clazz.getTeacherId()); + clazz.setTeacherName(teacherForeignModel.getUserName()); + } + if(!this.isNull(clazz.getAssistantId())) + { + UserForeignModel assistantForeignModel=this.getService().selectOne(USER_NAMESPACE+".getUserForeignModel", clazz.getAssistantId()); + clazz.setAssistantName(assistantForeignModel.getUserName()); + } + if(!this.isNull(clazz.getSyllabusId())) + { + SyllabusForeignModel syllabusForeignModel=this.getService().selectOne( + SYLLABUS_NAMESPACE, clazz.getSyllabusId()); + clazz.setSyllabusName(syllabusForeignModel.getSyllabusName()); + } + count=clazzService.updateByPrimaryKeySelective(clazz); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败",count==1?clazz:""); + } + + @ApiOperation(value="删除班级",response=MsgModel.class,httpMethod="POST",notes="删除班级信息") + @RequiresPermissions(value={"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="clazz",value="班级对象",required=true) Clazz clazz) + { + int count=0; + if(!this.isNull(clazz.getClazzId())) + { + count=this.getService().delete(CLAZZ_NAMESPACE+".deleteClazzModel", clazz.getClazzId()); + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"保存成功":"保存失败",count>=1?clazz:""); + } + + + @ApiOperation(value="检索班级",response=MsgModel.class,httpMethod="POST", + notes="检索班级对象,精确检索:班级ID,教学计划ID,教师ID,助教ID;模糊检索:班级名称,教学大纲名称,教师姓名,助教姓名,班级最大容量") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="clazz",value="班级对象",required=false) Clazz clazz) + { + ClazzExample listExample=new ClazzExample(); + ClazzExample.Criteria criteria=listExample.createCriteria(); + if(!this.isNull(clazz.getClazzId())) + { + criteria.andClazzIdEqualTo(clazz.getClazzId()); + } + if(!this.isNull(clazz.getTeacherId())) + { + criteria.andTeacherIdEqualTo(clazz.getTeacherId()); + } + if(!this.isNull(clazz.getAssistantId())) + { + criteria.andAssistantIdEqualTo(clazz.getAssistantId()); + } + if(!this.isNull(clazz.getSyllabusId())) + { + criteria.andSyllabusIdEqualTo(clazz.getSyllabusId()); + } + if(!this.isNull(clazz.getClazzName())) + { + criteria.andClazzNameLike("%"+clazz.getClazzName()+"%"); + } + if(!this.isNull(clazz.getTeacherName())) + { + criteria.andTeacherNameLike("%"+clazz.getTeacherName()+"%"); + } + if(!this.isNull(clazz.getAssistantName())) + { + criteria.andAssistantNameLike("%"+clazz.getAssistantName()+"%"); + } + if(!this.isNull(clazz.getSyllabusName())) + { + criteria.andSyllabusNameLike("%"+clazz.getSyllabusName()+"%"); + } + if(!this.isNull(clazz.getClazzMaxStudent())) + { + criteria.andClazzMaxStudentLessThanOrEqualTo(clazz.getClazzMaxStudent()); + } + List list=clazzService.selectByExample(listExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"课时列表加载成功":"课时列表加载失败",!this.isNull(list)?list:""); + } + + + @ApiOperation(value="分页加载班级",response=MsgModel.class,httpMethod="POST",notes="分页加载班级,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + ClazzExample listExample=new ClazzExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=clazzService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"课时加载成功":"课时加载失败",!this.isNull(pageModel)?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/clazzstudent/ClazzStudentController.java b/src/main/java/com/es/disped/web/controller/clazzstudent/ClazzStudentController.java new file mode 100644 index 0000000000000000000000000000000000000000..1120ee8fa9a2f0e62bafbdf5ed11774625d4d761 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/clazzstudent/ClazzStudentController.java @@ -0,0 +1,178 @@ +package com.es.disped.web.controller.clazzstudent; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.clazzstudent.ClazzStudentService; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.ClazzForeignModel; +import com.es.disped.dao.model.ClazzStudent; +import com.es.disped.dao.model.ClazzStudentExample; +import com.es.disped.dao.model.UserForeignModel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月6日 下午8:33:32 + * 名称:ClazzStudentController.java + * 描述:班级学生管理 + */ +@Api(value="班级学生关系管理") +@Controller +@RequestMapping("/manage/clazz/student") +public class ClazzStudentController extends BaseController{ + + private final String CLAZZ_NAMESPACE="com.es.disped.dao.mapper.clazz.ClazzCustomMapper"; + + private final String USER_NAMESPACE="com.es.disped.dao.mapper.user.UserCustomMapper"; + + @Autowired + ClazzStudentService clazzStudentService; + + @ApiOperation(value="保存班级学生关系对象",response=MsgModel.class,httpMethod="POST",notes="保存班级学生关系对象") + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="clazzStudent",value="班级学生对象",required=true) ClazzStudent clazzStudent) + { + int count=0; + if(Optional.of(clazzStudent) + .filter(cId->clazzStudent.getClazzId()!=null) + .filter(sId->clazzStudent.getStudentId()!=null) + .isPresent()) + { + ClazzForeignModel clazzForeignModel=this.getService().selectOne(CLAZZ_NAMESPACE+".getClazzForeignModel", clazzStudent.getClazzId()); + if(clazzForeignModel.getClazzStudentNum()>clazzForeignModel.getClazzMaxStudent()) + { + clazzStudent.setClazzName(clazzForeignModel.getClazzName()); + clazzStudent.setRelId(getUUID()); + UserForeignModel userForeignModel=this.getService().selectOne(USER_NAMESPACE+".getUserForeignModel", clazzStudent.getStudentId()); + clazzStudent.setStudentName(userForeignModel.getUserName()); + count=clazzStudentService.insertSelective(clazzStudent); + } + //若学生添加成功,则更新班级人数 + if(count==1) + { + this.getService().update(CLAZZ_NAMESPACE+".addClazzStudentNum", clazzStudent.getClazzId()); + } + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败", count==1?clazzStudent:""); + } + + @ApiOperation(value="更新班级学生关系对象",response=MsgModel.class,httpMethod="POST",notes="更新班级学生关系对象") + @RequiresPermissions(value={"admin:update","sys:update"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="clazzStudent",value="班级学生对象",required=true) ClazzStudent clazzStudent) + { + int count=0; + if(!this.isNull(clazzStudent.getRelId())) + { + if(!this.isNull(clazzStudent.getClazzId())) + { + ClazzForeignModel clazzForeignModel=this.getService().selectOne(CLAZZ_NAMESPACE+".getClazzForeignModel", clazzStudent.getClazzId()); + clazzStudent.setClazzName(clazzForeignModel.getClazzName()); + } + if(!this.isNull(clazzStudent.getStudentId())) + { + UserForeignModel userForeignModel=this.getService().selectOne(USER_NAMESPACE+".getUserForeignModel", clazzStudent.getStudentId()); + clazzStudent.setStudentName(userForeignModel.getUserName()); + } + count=clazzStudentService.updateByPrimaryKeySelective(clazzStudent); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"更新成功":"更新失败", count==1?clazzStudent:""); + } + + @ApiOperation(value="删除班级学生关系对象",response=MsgModel.class,httpMethod="POST",notes="删除班级学生关系对象") + @RequiresPermissions(value={"admin:delete","sys:delete"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="clazzStudent",value="班级学生对象",required=true) ClazzStudent clazzStudent) + { + int count=0; + if(!this.isNull(clazzStudent.getRelId())) + { + count=clazzStudentService.deleteByPrimaryKey(clazzStudent.getRelId()); + this.getService().update(CLAZZ_NAMESPACE+".minusClazzStudentNum", clazzStudent.getClazzId()); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"删除成功":"删除失败", count==1?clazzStudent:""); + } + + + @ApiOperation(value="检索班级学生关系对象",response=MsgModel.class,httpMethod="POST", + notes="检索班级学生关系对象,精确检索:关系主键ID,班级ID,学生ID;模糊检索:班级名称,学生姓名") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="clazzStudent",value="班级学生对象",required=false) ClazzStudent clazzStudent) + { + ClazzStudentExample listExample=new ClazzStudentExample(); + ClazzStudentExample.Criteria criteria=listExample.createCriteria(); + if(!this.isNull(clazzStudent.getRelId())) + { + criteria.andRelIdEqualTo(clazzStudent.getRelId()); + } + if(!this.isNull(clazzStudent.getClazzId())) + { + criteria.andClazzIdEqualTo(clazzStudent.getClazzId()); + } + if(!this.isNull(clazzStudent.getStudentId())) + { + criteria.andStudentIdEqualTo(clazzStudent.getStudentId()); + } + if(!this.isNull(clazzStudent.getClazzName())) + { + criteria.andClazzNameLike("%"+clazzStudent.getClazzName()+"%"); + } + if(!this.isNull(clazzStudent.getStudentName())) + { + criteria.andStudentNameLike("%"+clazzStudent.getStudentName()+"%"); + } + List list=clazzStudentService.selectByExample(listExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"班级学生加载成功":"班级学生加载失败", !this.isNull(list)?list:""); + } + + + @ApiOperation(value="分页加载班级学生",response=MsgModel.class,httpMethod="POST",notes="分页加载班级学生,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + ClazzStudentExample listExample=new ClazzStudentExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=clazzStudentService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"班级学生加载成功":"班级学生加载失败",!this.isNull(pageModel)?pageModel:""); + } + +} diff --git a/src/main/java/com/es/disped/web/controller/course/CourseController.java b/src/main/java/com/es/disped/web/controller/course/CourseController.java new file mode 100644 index 0000000000000000000000000000000000000000..df95f93872df21ce4ad5262c60389088a1d8ec92 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/course/CourseController.java @@ -0,0 +1,128 @@ +package com.es.disped.web.controller.course; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.course.CourseService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Course; +import com.es.disped.dao.model.CourseExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api(value="课程管理") +@Controller +@RequestMapping("/manage/course") +public class CourseController extends BaseController{ + + private final String COURSE_NAMESPACE="com.es.disped.dao.mapper.course.CourseCustomMapper"; + + @Autowired + CourseService courseService; + + @ApiOperation(value="课程新增",response=MsgModel.class,httpMethod="POST",notes="系统管理员添加课程") + @RequestMapping(value="/save",method=RequestMethod.POST) + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="course", value="课程对象",required=true) Course course) + { + int count=0; + if(Optional.of(course) + .filter(name->course.getCourseName()!=null) + .isPresent()) + { + course.setCourseId(this.getUUID()); + course.setCourseUpdateDate(this.currentDate("yyyy-MM-dd HH:mm:ss")); + course.setCourseValid(RecordStatus.USEAGE.getValue()); + count=courseService.insertSelective(course); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"课程保存成功":"课程保存失败",count==1?course:""); + } + + + @ApiOperation(value="课程更新",response=MsgModel.class,httpMethod="POST",notes="系统管理员更新课程") + @RequestMapping(value="/update",method=RequestMethod.POST) + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="course", value="课程对象",required=true) Course course) + { + int count=0; + if(Optional.of(course) + .filter(name->course.getCourseId()!=null) + .isPresent()) + { + count=courseService.updateByPrimaryKey(course); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"课程更新成功":"课程更新失败",count==1?course:""); + } + + @ApiOperation(value="课程删除",response=MsgModel.class,httpMethod="POST",notes="系统管理员删除课程") + @RequestMapping(value="/delete",method=RequestMethod.POST) + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="course", value="课程对象",required=true) Course course) + { + int count=0; + if(Optional.of(course) + .filter(name->course.getCourseId()!=null) + .isPresent()) + { + //删除对象及引用对象 + count=this.getService().delete(COURSE_NAMESPACE+".deleteCourseModel", course.getCourseId()); + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"课程删除成功":"课程删除失败",count>=1?course:""); + } + + @ApiOperation(value="课程检索",response=MsgModel.class,httpMethod="POST",notes="检索课程,包含模糊检索(课程名称),精确检索(课程ID)") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="course", value="课程对象",required=false) Course course) + { + CourseExample listExample=new CourseExample(); + if(!this.isNull(course.getCourseId())) + { + listExample.createCriteria().andCourseIdEqualTo(course.getCourseId()); + } + if(!this.isNull(course.getCourseName())) + { + listExample.createCriteria().andCourseNameLike("%"+course.getCourseName()+"%"); + } + List courses=courseService.selectByExample(listExample); + return this.resultMsg(!this.isNull(courses)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(courses)?"课程加载成功":"课程加载失败",!this.isNull(courses)?courses:""); + } + + + @ApiOperation(value="课程分页加载",response=MsgModel.class,httpMethod="POST",notes="分页加载课程,分页参数[offset,limit]") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + CourseExample listExample=new CourseExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=courseService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"课程加载成功":"课程加载失败",!this.isNull(pageModel)?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/coursetemplate/CourseTemplateController.java b/src/main/java/com/es/disped/web/controller/coursetemplate/CourseTemplateController.java new file mode 100644 index 0000000000000000000000000000000000000000..a65ed9013f7068875a5d80195a8c0456ecbaec7d --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/coursetemplate/CourseTemplateController.java @@ -0,0 +1,193 @@ +package com.es.disped.web.controller.coursetemplate; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.coursetemplate.CourseTemplateService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.CourseForeignModel; +import com.es.disped.dao.model.CourseTemplate; +import com.es.disped.dao.model.CourseTemplateExample; +import com.es.disped.dao.model.LevelForeignModel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月3日 上午9:52:12 + * 名称:CourseTemplateController.java + * 描述:课程模板管理 + */ +@Api(value="课程模板管理") +@Controller +@RequestMapping("/manage/course/template") +public class CourseTemplateController extends BaseController { + + private final String COURSE_NAMESPACE="com.es.disped.dao.mapper.course.CourseCustomMapper"; + private final String LEVEL_NAMESPACE="com.es.disped.dao.mapper.level.LevelCustomMapper"; + private final String TEMPLATE_NAMESPACE="com.es.disped.dao.mapper.template.TemplateCustomMapper"; + + @Autowired + CourseTemplateService courseTemplateService; + + @ApiOperation(value="保存课程模板",response=MsgModel.class,httpMethod="POST",notes="保存课程模板") + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="courseTemplate",value="课程模板对象",required=true) CourseTemplate courseTemplate) + { + int count=0; + if(Optional.of(courseTemplate) + .filter(templateName->courseTemplate.getTemplateName()!=null) + .filter(courseId->courseTemplate.getCourseId()!=null) + .filter(levelId->courseTemplate.getLevelId()!=null) + .filter(minAge->courseTemplate.getMinAge()!=null) + .filter(maxAge->courseTemplate.getMaxAge()!=null) + .filter(type->courseTemplate.getCourseType()!=null) + .filter(book->courseTemplate.getCourseBook()!=null) + .isPresent()) + { + courseTemplate.setTemplateId(getUUID()); + CourseForeignModel courseForeignModel=this.getService().selectOne( + COURSE_NAMESPACE+".getCourseForeignModel", courseTemplate.getCourseId()); + courseTemplate.setCourseName(courseForeignModel.getCourseName()); + LevelForeignModel levelForeignModel=this.getService().selectOne( + LEVEL_NAMESPACE+".getLevelForeignModel",courseTemplate.getLevelId()); + courseTemplate.setLevelName(levelForeignModel.getLevelName()); + courseTemplate.setCourseValid(RecordStatus.USEAGE.getValue()); + count=courseTemplateService.insertSelective(courseTemplate); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败",count==1?courseTemplate:""); + } + + @ApiOperation(value="更新课程模板",response=MsgModel.class,httpMethod="POST",notes="更新课程模板") + @RequiresPermissions(value={"admin:update","sys:update"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="courseTemplate",value="课程模板对象",required=true) CourseTemplate courseTemplate) + { + int count=0; + if(!this.isNull(courseTemplate.getTemplateId())) + { + if(!this.isNull(courseTemplate.getCourseId())) + { + CourseForeignModel courseForeignModel=this.getService().selectOne( + COURSE_NAMESPACE+".getCourseForeignModel", courseTemplate.getCourseId()); + courseTemplate.setCourseName(courseForeignModel.getCourseName()); + } + if(!this.isNull(courseTemplate.getLevelId())) + { + LevelForeignModel levelForeignModel=this.getService().selectOne( + LEVEL_NAMESPACE+".getLevelForeignModel",courseTemplate.getLevelId()); + courseTemplate.setLevelName(levelForeignModel.getLevelName()); + } + count=courseTemplateService.updateByPrimaryKeySelective(courseTemplate); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"更新成功":"更新失败",count==1?courseTemplate:""); + } + + @ApiOperation(value="删除课程模板",response=MsgModel.class,httpMethod="POST",notes="删除课程模板") + @RequiresPermissions(value={"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="courseTemplate",value="课程模板对象",required=true) CourseTemplate courseTemplate) + { + int count=0; + if(!this.isNull(courseTemplate.getTemplateId())) + { + count=this.getService().delete(TEMPLATE_NAMESPACE+".deleteTemplateModel", courseTemplate.getTemplateId()); + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"删除成功":"删除失败",count>=1?courseTemplate:""); + } + + + @ApiOperation(value="检索课程模板",response=MsgModel.class,httpMethod="POST",notes="检索课程模板") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="courseTemplate",value="课程模板对象",required=false) CourseTemplate courseTemplate) + { + CourseTemplateExample listExample=new CourseTemplateExample(); + CourseTemplateExample.Criteria criteria=listExample.createCriteria(); + if(!this.isNull(courseTemplate.getTemplateId())) + { + criteria.andTemplateIdEqualTo(courseTemplate.getTemplateId()); + } + if(!this.isNull(courseTemplate.getTemplateName())) + { + criteria.andTemplateNameEqualTo(courseTemplate.getTemplateName()); + } + if(!this.isNull(courseTemplate.getCourseId())) + { + criteria.andCourseIdEqualTo(courseTemplate.getCourseId()); + } + if(!this.isNull(courseTemplate.getCourseName())) + { + criteria.andCourseNameLike("%"+courseTemplate.getCourseName()+"%"); + } + if(!this.isNull(courseTemplate.getLevelId())) + { + criteria.andLevelIdEqualTo(courseTemplate.getLevelId()); + } + if(!this.isNull(courseTemplate.getLevelName())) + { + criteria.andLevelNameLike("%"+courseTemplate.getLevelName()+"%"); + } + if(!this.isNull(courseTemplate.getMinAge())) + { + criteria.andMinAgeGreaterThanOrEqualTo(courseTemplate.getMinAge()); + } + if(!this.isNull(courseTemplate.getMaxAge())) + { + criteria.andMaxAgeLessThanOrEqualTo(courseTemplate.getMaxAge()); + } + if(!this.isNull(courseTemplate.getCourseType())) + { + criteria.andCourseTypeLike("%"+courseTemplate.getCourseType()+"%"); + } + List courseTemplates=courseTemplateService.selectByExample(listExample); + return this.resultMsg(!this.isNull(courseTemplates)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(courseTemplates)?"课程模板加载成功":"课程模板加载失败",!this.isNull(courseTemplates)?courseTemplates:""); + } + + + @ApiOperation(value="课程模板分页加载",response=MsgModel.class,httpMethod="POST",notes="课程模板分页加载,分页参数[offset,limit]") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + CourseTemplateExample listExample=new CourseTemplateExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=courseTemplateService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"课程加载成功":"课程加载失败",!this.isNull(pageModel)?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/homework/HomeworkController.java b/src/main/java/com/es/disped/web/controller/homework/HomeworkController.java new file mode 100644 index 0000000000000000000000000000000000000000..c4cc3076b089cb1386a3a2fd50bf669c3ef6e31b --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/homework/HomeworkController.java @@ -0,0 +1,161 @@ +//package com.es.disped.web.controller.homework; +// +//import java.util.List; +//import java.util.Map; +//import java.util.Optional; +// +//import org.apache.shiro.authz.annotation.Logical; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.http.HttpStatus; +//import org.springframework.stereotype.Controller; +//import org.springframework.transaction.annotation.Transactional; +//import org.springframework.web.bind.annotation.RequestBody; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RequestMethod; +//import org.springframework.web.bind.annotation.ResponseBody; +// +//import com.es.disped.api.homework.HomeworkService; +//import com.es.disped.common.constant.RecordStatus; +//import com.es.disped.common.model.MsgModel; +//import com.es.disped.common.model.PageModel; +//import com.es.disped.core.controller.BaseController; +//import com.es.disped.dao.model.Homework; +//import com.es.disped.dao.model.HomeworkExample; +//import com.es.disped.dao.model.LessonForeignModel; +// +//import io.swagger.annotations.Api; +//import io.swagger.annotations.ApiOperation; +//import io.swagger.annotations.ApiParam; +// +///** +// * @author Anson +// * Copyright by EasyShare 2019 +// * +// * All right reserved +// * +// * Created on 2019年7月7日 下午12:01:59 +// * 名称:HomeworkController.java +// * 描述:作业管理 +// */ +//@Api(value="作业管理") +//@Controller +//@RequestMapping("/manage/homework") +//public class HomeworkController extends BaseController{ +// +// private final String LESSON_NAMESPACE="com.es.disped.dao.mapper.lesson.LessonCustomMapper"; +// +// private final String HOMEWORK_NAMESPACE="com.es.disped.dao.mapper.homework.HomeworkCustomMapper"; +// +// @Autowired +// HomeworkService homeworkService; +// +// @ApiOperation(value="保存作业对象",response=MsgModel.class,httpMethod="POST",notes="保存作业对象") +// @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) +// @Transactional +// @RequestMapping(value="/save",method=RequestMethod.POST) +// public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="homework",value="作业对象",required=true) Homework homework) +// { +// int count=0; +// if(Optional.of(homework) +// .filter(name->homework.getHomeworkName()!=null) +// .filter(content->homework.getHomeworkContent()!=null) +// .filter(lId->homework.getLessonId()!=null) +// .filter(url->homework.getHomeWorkUrl()!=null) +// .isPresent()) +// { +// LessonForeignModel foreignModel=this.getService().selectOne(LESSON_NAMESPACE+".getLessonForeignModel", homework.getLessonId()); +// homework.setLessonName(foreignModel.getLessonName()); +// homework.setHomeworkId(getUUID()); +// homework.setHomeworkUpdateTime(this.currentDate("yyyy-MM-dd")); +// homework.setHomeworkValid(RecordStatus.USEAGE.getValue()); +// count=homeworkService.insertSelective(homework); +// } +// return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// count==1?"保存成功":"保存失败", count==1?homework:""); +// } +// +// @ApiOperation(value="更新作业对象",response=MsgModel.class,httpMethod="POST",notes="更新作业对象") +// @RequiresPermissions(value={"admin:update","sys:update"},logical=Logical.OR) +// @Transactional +// @RequestMapping(value="/update",method=RequestMethod.POST) +// public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="homework",value="作业对象",required=true) Homework homework) +// { +// int count=0; +// if(!this.isNull(homework.getHomeworkId())) +// { +// if(!this.isNull(homework.getLessonId())) +// { +// LessonForeignModel foreignModel=this.getService().selectOne(LESSON_NAMESPACE+".getLessonForeignModel", homework.getLessonId()); +// homework.setLessonName(foreignModel.getLessonName()); +// } +// homework.setHomeworkUpdateTime(this.currentDate("yyyy-MM-dd")); +// count=homeworkService.updateByPrimaryKeySelective(homework); +// } +// return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// count==1?"更新成功":"更新失败", count==1?homework:""); +// } +// +// @ApiOperation(value="删除作业对象",response=MsgModel.class,httpMethod="POST",notes="删除作业对象") +// @RequiresPermissions(value={"admin:delete","sys:delete"},logical=Logical.OR) +// @RequestMapping(value="/delete",method=RequestMethod.POST) +// public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="homework",value="作业对象",required=true) Homework homework) +// { +// int count=0; +// if(!this.isNull(homework.getHomeworkId())) +// { +// count=this.getService().delete(HOMEWORK_NAMESPACE+".deleteHomeworkModel", homework.getHomeworkId()); +// } +// return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// count>=1?"删除成功":"删除失败", count>=1?homework:""); +// } +// +// @ApiOperation(value="检索作业",response=MsgModel.class,httpMethod="POST", +// notes="检索作业对象,精确检索:作业ID,课时ID;模糊检索:作业名称,课时名称") +// @RequiresPermissions(value={"admin:select","sys:select"},logical=Logical.OR) +// @RequestMapping(value="/list",method=RequestMethod.POST) +// public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="homework",value="作业对象",required=false) Homework homework) +// { +// HomeworkExample listExample=new HomeworkExample(); +// HomeworkExample.Criteria criteria=listExample.createCriteria(); +// if(!this.isNull(homework.getHomeworkId())) +// { +// criteria.andHomeworkIdEqualTo(homework.getHomeworkId()); +// } +// if(!this.isNull(homework.getLessonId())) +// { +// criteria.andLessonIdEqualTo(homework.getLessonId()); +// } +// if(!this.isNull(homework.getHomeworkName())) +// { +// criteria.andHomeworkNameLike("%"+homework.getHomeworkName()+"%"); +// } +// if(!this.isNull(homework.getLessonName())) +// { +// criteria.andLessonNameLike("%"+homework.getLessonName()+"%"); +// } +// List list=homeworkService.selectByExample(listExample); +// return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// !this.isNull(list)?"作业列表加载成功":"作业列表加载失败",!this.isNull(list)?list:""); +// } +// +// @ApiOperation(value="分页加载作业",response=MsgModel.class,httpMethod="POST",notes="分页加载作业,分页参数['offset','limit']") +// @RequiresPermissions(value={"admin:select","sys:select"},logical=Logical.OR) +// @RequestMapping(value="/pages",method=RequestMethod.POST) +// public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) +// { +// HomeworkExample listExample=new HomeworkExample(); +// PageModel pageModel=null; +// if(Optional.of(paramMap) +// .filter(offset->paramMap.containsKey("offset")!=false) +// .filter(limit->paramMap.containsKey("limit")!=false) +// .isPresent()) +// { +// pageModel=homeworkService.selectByExampleForOffsetPage(listExample, +// Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); +// +// } +// return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// !this.isNull(pageModel)?"作业加载成功":"作业加载失败",!this.isNull(pageModel)?pageModel:""); +// } +//} diff --git a/src/main/java/com/es/disped/web/controller/index/IndexController.java b/src/main/java/com/es/disped/web/controller/index/IndexController.java new file mode 100644 index 0000000000000000000000000000000000000000..de5996030e0b073865c452e761ea4bc8246da9b2 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/index/IndexController.java @@ -0,0 +1,172 @@ +package com.es.disped.web.controller.index; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.slf4j.Logger; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.LoginUser; +import com.es.disped.dao.model.MenuModel; +import com.es.disped.dao.model.UserType; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +@Api(value="首页") +@Controller +public class IndexController extends BaseController{ + + private final String NAMESPACE="com.es.disped.dao.mapper.index.IndexCustomMapper"; + + @LogInject + private static Logger log; + + /** + * 跳转到登录页 + * + * @return String 登录页路径 + */ + @RequestMapping("/sign") + public String login() + { + if (this.isNull(this.getSessionUser())) + { + return "login"; + } else + { + return "redirect:/"; + } + } + + /** + * 跳转错误页(包含404、500等一系列错误页) + * + * @return String 错误页路径 + */ + @RequestMapping("/{errorCode}/error") + public @ResponseBody MsgModel error(@PathVariable String errorCode) + { + System.out.println(errorCode); + return new MsgModel(Integer.valueOf(errorCode),"error"); + } + + /** + * 获取系统菜单 + * + * @return List 菜单列表集合 + */ + @ApiOperation(value="获取系统菜单",response=MsgModel.class,httpMethod="POST",notes="登录用户获取当前用户对应角色的系统菜单") + @ApiImplicitParam(name="roleId",value="当前登录用户的角色ID",required=false,dataType="String") + @RequestMapping(value="/init/menu",method=RequestMethod.POST) + public @ResponseBody MsgModel menu(String roleId) { + if (UserType.ADMIN.getValue().equals(this.getSessionUser().getUserType())) + { + // 管理员菜单(在系统 xml 中配置) + return getMenuForXml(); + } else + { + // 一般用户菜单 general(根据角色获取对应菜单列表) + if(this.isNull(roleId)) + { + Subject subject = SecurityUtils.getSubject(); + LoginUser loginUser=(LoginUser) subject.getPrincipal(); + if(!this.isNull(loginUser.getUserRoles())) + { + roleId=loginUser.getUserRoles().get(0).getRoleId(); + } + } + Map paramMap = new HashMap<>(); + paramMap.put("menuId", "00000000000000000000000000000000"); + paramMap.put("roleId", roleId); + paramMap.put("userId", this.getSessionUser().getUserId()); + + List list = new ArrayList<>(); + List rootList = this.getService().selectList(NAMESPACE+".getMenu", paramMap); + for (MenuModel menuModel : rootList) { + menuModel.setChildren(getMenu(menuModel.getId(), roleId)); + list.add(menuModel); + } + return this.resultMsg(list.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + list.size()>0?"":"系统菜单获取失败", list.size()>0?list:""); + } + } + + /** + * 递归获取当前登录用户的所有菜单信息 + * + * @param pid 菜单父ID + * @return List 菜单列表集合 + */ + private List getMenu(String pid, String roleId) { + Map paramMap = new HashMap<>(); + paramMap.put("menuId", pid); + paramMap.put("roleId", roleId); + paramMap.put("userId", this.getSessionUser().getUserId()); + + List list = new ArrayList<>(); + List menuList = this.getService().selectList(NAMESPACE+".getMenu", paramMap); + for (MenuModel menuModel : menuList) { + if (!this.isNull(menuModel.getId())) { + menuModel.setChildren(getMenu(menuModel.getId(), roleId)); + } + list.add(menuModel); + } + return list; + } + + + /** + * 从 xml 中读取管理员菜单(adminMenu.xml) + * + * @return List 菜单列表集合 + */ + @SuppressWarnings("unchecked") + private MsgModel getMenuForXml() { + List list = new ArrayList<>(); + try { + InputStream inputStream = this.getClass().getResourceAsStream("/adminMenu.xml"); + SAXReader reader = new SAXReader(); + Document document = reader.read(inputStream); + Element element = document.getRootElement(); + List menus = element.elements(); + for(Element menu : menus) { + MenuModel menuModelParent = new MenuModel(); + List childList = new ArrayList<>(); + menuModelParent.setName(menu.attributeValue("name")); + menuModelParent.setIcon(this.isNull(menu.attributeValue("icon")) ? "zmdi zmdi-apps" : menu.attributeValue("icon")); + List menuItems = menu.elements(); + for (Element menuItem : menuItems) { + MenuModel menuModelChild = new MenuModel(); + menuModelChild.setName(menuItem.elementText("name")); + menuModelChild.setUrl(menuItem.elementText("url")); + childList.add(menuModelChild); + } + menuModelParent.setChildren(childList); + list.add(menuModelParent); + } + } catch (DocumentException e) { + log.error("读取 xml 菜单信息失败"); + } + return this.resultMsg(list.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + list.size()>0?"":"管理员菜单加载失败", list.size()>0?list:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/lesson/LessonController.java b/src/main/java/com/es/disped/web/controller/lesson/LessonController.java new file mode 100644 index 0000000000000000000000000000000000000000..2d473dde47458fc552b75249ceb05bf75082bc73 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/lesson/LessonController.java @@ -0,0 +1,177 @@ +package com.es.disped.web.controller.lesson; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.lesson.LessonService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Lesson; +import com.es.disped.dao.model.LessonExample; +import com.es.disped.dao.model.SyllabusForeignModel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月5日 下午4:41:01 + * 名称:LessonController.java + * 描述:课时管理 + */ +@Api(value="课时管理") +@Controller +@RequestMapping("/manage/lesson") +public class LessonController extends BaseController{ + + private final String SYLLABUS_NAMESPACE="com.es.disped.dao.mapper.syllabus.SyllabusCustomMapper"; + private final String LESSON_NAMESPACE="com.es.disped.dao.mapper.lesson.LessonCustomMapper"; + + @Autowired + LessonService lessonService; + + @ApiOperation(value="新增课时",response=MsgModel.class,httpMethod="POST",notes="新增课时对象") + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="lesson",value="课时对象",required=true) Lesson lesson) + { + int count=0; + if(Optional.of(lesson) + .filter(lname->lesson.getLessonName()!=null) + .filter(syId->lesson.getSyllabusId()!=null) + .filter(content->lesson.getLessonContent()!=null) + .filter(btime->lesson.getLessonBeginTime()!=null) + .filter(etime->lesson.getLessonEndTime()!=null) + .isPresent()) + { + lesson.setLessonId(getUUID()); + SyllabusForeignModel syllabusForeignModel=this.getService().selectOne( + SYLLABUS_NAMESPACE+".getSyllabusForeignModel", lesson.getSyllabusId()); + lesson.setSyllabusName(syllabusForeignModel.getSyllabusName()); + + LessonExample countExample=new LessonExample(); + LessonExample.Criteria criteria=countExample.createCriteria(); + criteria.andSyllabusIdEqualTo(lesson.getSyllabusId()).andLessonValidEqualTo(RecordStatus.USEAGE.getValue()); + int total=lessonService.countByExample(countExample); + lesson.setLessonIndex(total+1); + + lesson.setLessonValid(RecordStatus.USEAGE.getValue()); + count=lessonService.insertSelective(lesson); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败",count==1?lesson:""); + } + + + @ApiOperation(value="更新课时",response=MsgModel.class,httpMethod="POST",notes="更新课时对象") + @RequiresPermissions(value={"admin:update","sys:update"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="lesson",value="课时对象",required=true) Lesson lesson) + { + int count=0; + if(!this.isNull(lesson.getLessonId())) + { + if(!this.isNull(lesson.getSyllabusId())) + { + SyllabusForeignModel syllabusForeignModel=this.getService().selectOne( + SYLLABUS_NAMESPACE+".getSyllabusForeignModel", lesson.getSyllabusId()); + lesson.setSyllabusName(syllabusForeignModel.getSyllabusName()); + } + count=lessonService.updateByPrimaryKey(lesson); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"更新成功":"更新失败",count==1?lesson:""); + } + + + @ApiOperation(value="删除课时",response=MsgModel.class,httpMethod="POST",notes="删除课时对象") + @RequiresPermissions(value={"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="lesson",value="课时对象",required=true) Lesson lesson) + { + int count=0; + if(!this.isNull(lesson.getLessonId())) + { + count=this.getService().delete(LESSON_NAMESPACE+".deleteLessonModel", lesson.getLessonId()); + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"删除成功":"删除失败",count>=1?lesson:""); + } + + @ApiOperation(value="检索课时",response=MsgModel.class,httpMethod="POST", + notes="检索课时对象,精确检索:课时ID,教学计划ID;模糊检索:教学大纲名称,课时名称,课时开始时间+结束时间") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="lesson",value="课时对象",required=false) Lesson lesson) + { + LessonExample listExample=new LessonExample(); + LessonExample.Criteria criteria=listExample.createCriteria(); + if(!this.isNull(lesson.getLessonId())) + { + criteria.andLessonIdEqualTo(lesson.getLessonId()); + } + if(!this.isNull(lesson.getSyllabusId())) + { + criteria.andSyllabusIdEqualTo(lesson.getSyllabusId()); + } + if(!this.isNull(lesson.getSyllabusName())) + { + criteria.andSyllabusNameLike("%"+lesson.getSyllabusName()+"%"); + } + if(!this.isNull(lesson.getLessonName())) + { + criteria.andLessonNameLike("%"+lesson.getLessonName()+"%"); + } + if(!this.isNull(lesson.getLessonBeginTime())) + { + criteria.andLessonBeginTimeGreaterThanOrEqualTo(lesson.getLessonBeginTime()); + } + if(!this.isNull(lesson.getLessonEndTime())) + { + criteria.andLessonEndTimeLessThanOrEqualTo(lesson.getLessonEndTime()); + } + List list=lessonService.selectByExample(listExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"课时列表加载成功":"课时列表加载失败",!this.isNull(list)?list:""); + } + + + @ApiOperation(value="分页加载课时",response=MsgModel.class,httpMethod="POST",notes="分页加载课时,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + LessonExample listExample=new LessonExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=lessonService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"课时加载成功":"课时加载失败",!this.isNull(pageModel)?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/level/LevelController.java b/src/main/java/com/es/disped/web/controller/level/LevelController.java new file mode 100644 index 0000000000000000000000000000000000000000..65270e95bd01353d05758adcf6d211b029fd5696 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/level/LevelController.java @@ -0,0 +1,129 @@ +package com.es.disped.web.controller.level; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.level.LevelService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Level; +import com.es.disped.dao.model.LevelExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api(value="等级阶段管理") +@Controller +@RequestMapping("/manage/level") +public class LevelController extends BaseController { + + @Autowired + LevelService levelService; + + @ApiOperation(value="保存等级",response=MsgModel.class,httpMethod="POST", + notes="保存等级对象,等级名称不能为空") + @RequiresPermissions(value="sys:save") + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="level",value="等级对象",required=true) Level level) + { + int count=0; + if(Optional.of(level) + .filter(name->level.getLevelName()!=null) + .isPresent()) + { + level.setLevelId(this.getUUID()); + level.setLevelValid(RecordStatus.USEAGE.getValue()); + count=levelService.insertSelective(level); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败", count==1?level:"") ; + } + + @ApiOperation(value="更新等级",response=MsgModel.class,httpMethod="POST", + notes="更新等级对象,等级ID不能为空") + @RequiresPermissions(value="sys:update") + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="level",value="等级对象",required=true) Level level) + { + int count=0; + if(Optional.of(level) + .filter(name->level.getLevelId()!=null) + .isPresent()) + { + count=levelService.updateByPrimaryKey(level); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"更新成功":"更新失败", count==1?level:"") ; + } + + @ApiOperation(value="删除等级",response=MsgModel.class,httpMethod="POST", + notes="删除等级对象,等级ID不能为空") + @RequiresPermissions(value="sys:delete") + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="level",value="等级对象",required=true) Level level) + { + int count=0; + if(Optional.of(level) + .filter(name->level.getLevelId()!=null) + .isPresent()) + { + count=levelService.deleteByPrimaryKey(level.getLevelId()); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"删除成功":"删除失败", count==1?level:"") ; + } + + @ApiOperation(value="检索等级",response=MsgModel.class,httpMethod="POST",notes="检索等级,包括模糊检索(等级名称,等级描述),精确检索(等级ID)") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="level",value="等级对象",required=false) Level level) + { + LevelExample listExample=new LevelExample(); + if(!this.isNull(level.getLevelId())) + { + listExample.createCriteria().andLevelIdEqualTo(level.getLevelId()); + } + if(!this.isNull(level.getLevelName())) + { + listExample.createCriteria().andLevelNameLike("%"+level.getLevelName()+"%"); + } + if(!this.isNull(level.getLevelDescription())) + { + listExample.createCriteria().andLevelDescriptionLike("%"+level.getLevelDescription()+"%"); + } + List levels=levelService.selectByExample(listExample); + return this.resultMsg(!this.isNull(levels)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(levels)?"等级列表加载成功":"等级列表为空", !this.isNull(levels)?levels:""); + } + + + @ApiOperation(value="获取等级列表",httpMethod="POST",response=MsgModel.class,notes="获取等级信息(管理端),分页加载") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + LevelExample pageExample=new LevelExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=levelService.selectByExampleForOffsetPage(pageExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + } + return this.resultMsg(pageModel!=null?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + pageModel!=null?"等级列表加载成功":"等级列表为空", pageModel!=null?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/login/LoginController.java b/src/main/java/com/es/disped/web/controller/login/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..e536e8dd6b1b17e18d2d9a588e134f34847c3d67 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/login/LoginController.java @@ -0,0 +1,148 @@ +package com.es.disped.web.controller.login; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.sms.SmsService; +import com.es.disped.api.user.UserService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.LoginUser; +import com.es.disped.dao.model.User; +import com.es.disped.dao.model.UserExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api("用户登录注册接口") +@Controller +@RequestMapping("/common/login") +public class LoginController extends BaseController{ + + @LogInject + Logger log; + @Autowired + SmsService smsService; + @Autowired + UserService userService; + @Autowired + RedisTemplate redisTemplate; + + + @ApiOperation(value="验证手机号",httpMethod="POST",response=MsgModel.class,notes="检查手机号是否被注册") + @ApiImplicitParam(name="phone",value="手机号",required=true,dataType="String") + @RequestMapping(value="/check/phone",method=RequestMethod.POST) + public @ResponseBody MsgModel checkPhone(@RequestBody Map paramMap) + { + UserExample userExample=new UserExample(); + userExample.createCriteria().andPhoneEqualTo(paramMap.get("phone").toString()); + List users=userService.selectByExample(userExample); + return new MsgModel(this.isNull(users)?HttpStatus.OK.value():HttpStatus.NOT_ACCEPTABLE.value(), + this.isNull(users)?"":"手机号已被注册"); + } + + + + @ApiOperation(value="注册",httpMethod="POST",response=MsgModel.class,notes="实现用户信息注册(个人注册)") + @RequestMapping(value="/registe", method=RequestMethod.POST) + public @ResponseBody MsgModel registe(@RequestBody @ApiParam(name="user", value="用户对象",required=true) User user) + { + int count=0; + if(Optional.of(user) + .filter((username)->user.getUsername()!=null) + .filter((phone)->user.getPhone()!=null) + .filter((password)->user.getPassword()!=null) + .isPresent() + &&redisTemplate.hasKey(user.getPhone()))//防止用户替换手机号 + { + user.setUserId(getUUID()); + user.setPassword(this.md5(user.getPassword())); + user.setJoinDate(this.currentDate("yyyy-MM-dd HH:mm:ss")); + user.setUserValid(RecordStatus.VERTIFY.getValue()); + count=userService.insert(user); + } + //无论注册是否成功,删除验证码 + redisTemplate.delete(user.getPhone()); + //无论是否成功,保存用户ID + this.getSession().setAttribute("registeUser", user); + log.debug(count==1?HttpStatus.OK.value()+"-注册成功":HttpStatus.EXPECTATION_FAILED.value()+"-注册失败",user); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(),count==1?"注册成功":"注册失败"); + } + + + @ApiOperation(value="登录",httpMethod="POST", response=MsgModel.class,notes="根据用户名密码实现用户登录") + @ApiImplicitParam(name="paramMap",value="登录",required=true,dataType="HashMap") + @RequestMapping(value="/sign/in", method=RequestMethod.POST) + public @ResponseBody MsgModel login(@RequestBody Map paramMap) + { + paramMap.put("password", this.md5(paramMap.get("password").toString())); + LoginUser loginUser = this.getService().selectOne( + "com.es.disped.dao.mapper.login.LoginCustomMapper.getLoginUser", + paramMap.get("phone").toString()); + if (this.isNull(loginUser)) + { + return new MsgModel(HttpStatus.FORBIDDEN.value(), "用户名、密码不正确!"); + } + + if (RecordStatus.USEAGE.getValue()!=loginUser.getUserValid()) + { + return new MsgModel(HttpStatus.FORBIDDEN.value(), "该用户"+RecordStatus.getName(loginUser.getUserValid())); + } + try + { + Subject subject = SecurityUtils.getSubject(); + // 当前用户是否已通过身份验证 + if (!subject.isAuthenticated()) + { + + UsernamePasswordToken token = new UsernamePasswordToken(paramMap.get("phone").toString(), + paramMap.get("password").toString()); + + token.setRememberMe(Boolean.valueOf(paramMap.get("remember").toString())); + //验证角色和权限 + subject.login(token); + this.getSession().setAttribute(this.sessionUser, loginUser); + } + return new MsgModel(HttpStatus.OK.value(), paramMap.get("remember").toString(),loginUser); + } catch (AuthenticationException e) { + e.printStackTrace(); + return new MsgModel(HttpStatus.EXPECTATION_FAILED.value(), "登录认证失败"); + } + } + + + + @ApiOperation(value="退出登录",httpMethod="GET",response=MsgModel.class,notes="退出登录") + @RequestMapping(value="/sign/out",method=RequestMethod.GET) + public @ResponseBody MsgModel logout() + { + Subject subject = SecurityUtils.getSubject(); + LoginUser loginUser=(LoginUser) subject.getPrincipal(); + System.out.println(">>>>>>>>>>>logout>>>>>>>>>>>"+loginUser); + if(subject.isAuthenticated()) + { + subject.logout(); + this.getSession().invalidate(); + } + return new MsgModel(HttpStatus.OK.value(), "退出"); + } +} diff --git a/src/main/java/com/es/disped/web/controller/menu/MenuController.java b/src/main/java/com/es/disped/web/controller/menu/MenuController.java new file mode 100644 index 0000000000000000000000000000000000000000..6f3ac4bada1ac78550100538198b8c6fe02a80a6 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/menu/MenuController.java @@ -0,0 +1,160 @@ +package com.es.disped.web.controller.menu; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.menu.MenuService; +import com.es.disped.api.menurole.MenuRoleService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Menu; +import com.es.disped.dao.model.MenuExample; +import com.es.disped.dao.model.MenuNode; +import com.es.disped.dao.model.MenuType; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api(value="菜单管理") +@Controller +@RequestMapping("/manage/menu") +public class MenuController extends BaseController { + + private final String NAMESPACE="com.es.disped.dao.mapper.menu.MenuCustomMapper"; + + @Autowired + MenuService menuService; + @Autowired + MenuRoleService menuRoleService; + + @ApiOperation(value="菜单保存",response=MsgModel.class,httpMethod="POST",notes="保存菜单-管理端") + @RequiresPermissions(value= {"admin:save","sys:save"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="menu",value="菜单对象",required=true) Menu menu) + { + int count=0; + if(Optional.of(menu) + .filter(name->menu.getMenuName()!=null) + .filter(icon->menu.getMenuIcon()!=null) + .filter(parentId->menu.getMenuParentId()!=null) + .filter(url->menu.getMenuUrl()!=null) + .isPresent()) + { + //保存菜单 + menu.setMenuId(this.getUUID()); + menu.setMenuType(MenuType.MENU.getValue()); + menu.setMenuValid(RecordStatus.USEAGE.getValue()); + count=menuService.insertSelective(menu); + //更新菜单父节点 + Menu oldParentNode=menuService.selectByPrimaryKey(menu.getMenuParentId()); + if(MenuType.MENU.getValue().equals(oldParentNode.getMenuType())) + { + Menu parentNode=new Menu(); + parentNode.setMenuType(MenuType.GROUP.getValue()); + MenuExample menuExample=new MenuExample(); + menuExample.createCriteria().andMenuIdEqualTo(oldParentNode.getMenuId()); + menuService.updateByExampleSelective(parentNode, menuExample); + } + } + return new MsgModel(count!=0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count!=0?"":"添加失败", count!=0?menu:""); + } + + @ApiOperation(value="菜单更新",response=MsgModel.class,httpMethod="POST",notes="菜单更新-管理端") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="menu",value="菜单对象",required=true) Menu menu) + { + int count=0; + if(Optional.of(menu) + .filter(mid->menu.getMenuId()!=null) + .isPresent()) + { + count=menuService.updateByPrimaryKeySelective(menu); + } + return new MsgModel(count!=0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count!=0?"":"更新失败", count!=0?menu:""); + } + + @ApiOperation(value="菜单删除",response=MsgModel.class,httpMethod="POST",notes="删除菜单-管理端") + @RequiresPermissions(value= {"admin:delete","sys:delete"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="menu",value="菜单对象",required=true) Menu menu) + { + int count=0; + if(Optional.of(menu) + .filter(mid->menu.getMenuId()!=null) + .filter(perantId->menu.getMenuParentId()!=null) + .isPresent()) + { + //删除菜单节点及子节点 + MenuExample deleteExample=new MenuExample(); + deleteExample.createCriteria().andMenuParentIdEqualTo(menu.getMenuId()); + count+=menuService.deleteByExample(deleteExample); + count+=menuService.deleteByPrimaryKey(menu.getMenuId()); + //修改父类节点类型 + MenuExample listExample=new MenuExample(); + listExample.createCriteria().andMenuParentIdEqualTo(menu.getMenuParentId()); + List list=menuService.selectByExample(listExample); + if(this.isNull(list)) + { + Menu parentNode=new Menu(); + parentNode.setMenuType(MenuType.MENU.getValue()); + MenuExample parentExample=new MenuExample(); + parentExample.createCriteria().andMenuIdEqualTo(menu.getMenuParentId()); + menuService.updateByExampleSelective(parentNode, parentExample); + } + } + return new MsgModel(count!=0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count!=0?"":"删除失败", count!=0?menu:""); + } + + + @ApiOperation(value="获取Tree结构菜单",response=MsgModel.class,httpMethod="POST",notes="获取Tree结构菜单-管理端") + @ApiImplicitParam(name="id", value="菜单ID", required=false,dataType="String") + @RequestMapping(value="/menuTree",method=RequestMethod.POST) + public @ResponseBody MsgModel getMenuTree(String id) + { + if(this.isNull(id)) + { + id="00000000000000000000000000000000"; + } + List nodeList=new ArrayList(); + List rootList=this.getService().selectList(NAMESPACE+".getMenuNode", id); + for(MenuNode menuNode:rootList) + { + menuNode.setChildren(getMenuNode(menuNode.getId())); + nodeList.add(menuNode); + } + return new MsgModel(nodeList.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + nodeList.size()>0?"":"获取菜单为空", nodeList.size()>0?nodeList:""); + } + + /** + * 菜单 tree 结构加载 + * + * @param pid 菜单父ID + * @return List 菜单节点集合 + */ + private List getMenuNode(String pid) { + List menuList = this.getService().selectList(NAMESPACE + ".getMenuNode", pid); + return menuList; + } +} diff --git a/src/main/java/com/es/disped/web/controller/menurole/MenuRoleController.java b/src/main/java/com/es/disped/web/controller/menurole/MenuRoleController.java new file mode 100644 index 0000000000000000000000000000000000000000..d507be2bad1695bdcd3713c618ec96cf7afee03d --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/menurole/MenuRoleController.java @@ -0,0 +1,130 @@ +package com.es.disped.web.controller.menurole; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.menurole.MenuRoleService; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.MenuNode; +import com.es.disped.dao.model.MenuRoleRel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api(value="为角色管理菜单") +@Controller +@RequestMapping("/manage/role/menu") +public class MenuRoleController extends BaseController { + + private final String NAMESPACE="com.es.disped.dao.mapper.menu.MenuCustomMapper"; + + @Autowired + MenuRoleService menuRoleService; + + @ApiOperation(value="为角色添加菜单",response=MsgModel.class,httpMethod="POST",notes="为角色添加菜单-管理端") + @RequiresPermissions(value= {"admin:save","sys:save"},logical=Logical.OR) + @RequestMapping(value="/add",method=RequestMethod.POST) + public @ResponseBody MsgModel add(@RequestBody @ApiParam() MenuRoleRel menuRoleRel) + { + int count=0; + if(Optional.of(menuRoleRel) + .filter(roleId->menuRoleRel.getRoleId()!=null) + .filter(menuId->menuRoleRel.getMenuId()!=null) + .isPresent()) + { + menuRoleRel.setRelId(getUUID()); + count=menuRoleService.insert(menuRoleRel); + } + return new MsgModel(count!=0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count!=0?"":"赋予菜单失败",count!=0?menuRoleRel:""); + } + + @ApiOperation(value="更新角色菜单",response=MsgModel.class,httpMethod="POST",notes="更新角色菜单-管理端") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam() MenuRoleRel menuRoleRel) + { + int count=0; + if(Optional.of(menuRoleRel) + .filter(relId->menuRoleRel.getRelId()!=null) + .filter(roleId->menuRoleRel.getRoleId()!=null) + .filter(menuId->menuRoleRel.getMenuId()!=null) + .isPresent()) + { + count=menuRoleService.updateByPrimaryKey(menuRoleRel); + } + return new MsgModel(count!=0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count!=0?"":"更新角色菜单失败",count!=0?menuRoleRel:""); + } + + @ApiOperation(value="回收角色菜单",response=MsgModel.class,httpMethod="POST",notes="回收角色菜单-管理端") + @RequiresPermissions(value= {"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/recycle",method=RequestMethod.POST) + public @ResponseBody MsgModel recycle(@RequestBody @ApiParam() MenuRoleRel menuRoleRel) + { + int count=0; + if(Optional.of(menuRoleRel) + .filter(relId->menuRoleRel.getRelId()!=null) + .isPresent()) + { + count=menuRoleService.deleteByPrimaryKey(menuRoleRel.getRelId()); + } + return new MsgModel(count!=0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count!=0?"":"回收角色菜单失败",count!=0?menuRoleRel:""); + } + + + @ApiOperation(value="获取 checkbox 形式的树结构,并获取已选中项",response=MsgModel.class,httpMethod="POST", + notes="获取 checkbox 形式的树结构,并获取已选中项-管理端") + @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) + @RequestMapping(value="/menuCheckedTree",method=RequestMethod.POST) + public @ResponseBody MsgModel getMenuCheckedTree(String roleId, String id) + { + if (this.isNull(id)) { + id = "00000000000000000000000000000000"; + } + + Map paramMap = new HashMap<>(); + paramMap.put("roleId", roleId); + paramMap.put("menuId", id); + + List nodeList = new ArrayList<>(); + List rootList = this.getService().selectList(NAMESPACE + ".getMenuCheckedNode", paramMap); + for (MenuNode menuNode : rootList) { + menuNode.setChildren(getMenuCheckedNode(roleId, menuNode.getId())); + nodeList.add(menuNode); + } + return this.resultMsg(nodeList.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + nodeList.size()>0?"":"菜单列表为空", nodeList.size()>0?nodeList:""); + } + + /** + * 获取 checkbox 形式的树结构,并获取已选中项(为角色管理提供支持) + * + * @param roleId 角色Id + * @param pid 树父Id + * @return List 树结构结果集 + */ + private List getMenuCheckedNode(String roleId, String pid) { + Map paramMap = new HashMap<>(); + paramMap.put("roleId", roleId); + paramMap.put("menuId", pid); + List menuList = this.getService().selectList(NAMESPACE + ".getMenuCheckedNode", paramMap); + return menuList; + } +} diff --git a/src/main/java/com/es/disped/web/controller/oj/contest/ContestController.java b/src/main/java/com/es/disped/web/controller/oj/contest/ContestController.java new file mode 100644 index 0000000000000000000000000000000000000000..c990933487d2ea25c138444fde29f98fa0322ed6 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/contest/ContestController.java @@ -0,0 +1,154 @@ +package com.es.disped.web.controller.oj.contest; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.contest.HustContestService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.oj.model.Contest; +import com.es.disped.dao.oj.model.ContestExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月17日 下午3:32:04 + * 名称:ContestController.java + * 描述:竞赛及作业管理 + */ +@Api("竞赛及作业管理") +@Controller +@RequestMapping("manage/oj/contest") +public class ContestController extends BaseController{ + + @Autowired + HustContestService hustContestService; + + @ApiOperation(value="保存竞赛作业",response=MsgModel.class,httpMethod="POST",notes="保存竞赛或保存作业练习") + @RequiresPermissions(value={"teacher:save","admin:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="contest",value="竞赛及作业对象",required=true) Contest contest) + { + int count=0; + if(Optional.of(contest) + .filter(title->contest.getTitle()!=null) + .filter(stime->contest.getStartTime()!=null) + .filter(etime->contest.getEndTime()!=null) + .filter(lang->contest.getLangmask()!=null) + .isPresent()) + { + contest.setUserId(this.getSessionUser().getPhone()); + count=hustContestService.insertSelective(contest); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"竞赛及作业保存成功":"竞赛及作业保存失败",count==1?contest:""); + } + + + @ApiOperation(value="更新竞赛作业",response=MsgModel.class,httpMethod="POST",notes="更新竞赛或保存作业练习") + @RequiresPermissions(value={"teacher:update","admin:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="contest",value="竞赛及作业对象",required=true) Contest contest) + { + int count=0; + if(Optional.of(contest) + .filter(title->contest.getContestId()!=null) + .isPresent()) + { + count=hustContestService.updateByPrimaryKeySelective(contest); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"竞赛及作业更新成功":"竞赛及作业更新失败",count==1?contest:""); + } + + + @ApiOperation(value="删除竞赛作业",response=MsgModel.class,httpMethod="POST",notes="删除竞赛或保存作业练习,逻辑删除") + @RequiresPermissions(value={"teacher:delete","admin:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="contest",value="竞赛及作业对象",required=true) Contest contest) + { + int count=0; + if(!this.isNull(contest.getContestId())) + { + contest.setDefunct("Y");//设置为删除标记 + ContestExample deleteExample=new ContestExample(); + deleteExample.createCriteria().andContestIdEqualTo(contest.getContestId()); + count=hustContestService.updateByPrimaryKeySelective(contest); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"竞赛及作业删除成功":"竞赛及作业删除失败",count==1?contest:""); + } + + @ApiOperation(value="检索竞赛及作业",response=MsgModel.class,httpMethod="POST",notes="检索竞赛/作业") + @RequestMapping(value="/list",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="contest",value="竞赛/作业对象",required=false) Contest contest) + { + ContestExample listExample=new ContestExample(); + ContestExample.Criteria criteria=listExample.createCriteria(); + criteria.andDefunctEqualTo("N"); + if(!this.isNull(contest.getContestId())) + { + criteria.andContestIdEqualTo(contest.getContestId()); + } + if(!this.isNull(contest.getTitle())) + { + criteria.andTitleLike("%"+contest.getTitle()+"%"); + } + if(!this.isNull(contest.getStartTime())) + { + criteria.andStartTimeGreaterThanOrEqualTo(contest.getStartTime()); + } + if(!this.isNull(contest.getEndTime())) + { + criteria.andEndTimeLessThanOrEqualTo(contest.getEndTime()); + } + List list=hustContestService.selectByExample(listExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"竞赛/作业列表加载成功":"竞赛/作业列表加载失败",!this.isNull(list)?list:""); + } + + + @ApiOperation(value="分页加载竞赛/作业",response=MsgModel.class,httpMethod="POST",notes="分页加载竞赛/作业,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + ContestExample listExample=new ContestExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=hustContestService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"竞赛/作业加载成功":"竞赛/作业加载失败",!this.isNull(pageModel)?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/oj/contestproblem/ContestProblemController.java b/src/main/java/com/es/disped/web/controller/oj/contestproblem/ContestProblemController.java new file mode 100644 index 0000000000000000000000000000000000000000..ec0134cdf09c6f1408fdfd762d30b24138f1be7b --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/contestproblem/ContestProblemController.java @@ -0,0 +1,130 @@ +package com.es.disped.web.controller.oj.contestproblem; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.contestproblem.HustContestProblemService; +import com.es.disped.api.oj.problem.HustProblemService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.oj.model.ContestProblem; +import com.es.disped.dao.oj.model.ContestProblemExample; +import com.es.disped.dao.oj.model.Problem; +import com.es.disped.dao.oj.model.ProblemExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月17日 下午9:45:31 + * 名称:ContestProblemController.java + * 描述:竞赛及作业题目管理 + */ +@Api("竞赛及作业题目管理") +@Controller +@RequestMapping("/manage/oj/contest/problem") +public class ContestProblemController extends BaseController{ + + @Autowired + HustContestProblemService hustContestProblemService; + @Autowired + HustProblemService hustProblemService; + + @ApiOperation(value="保存竞赛题目对象集合",response=MsgModel.class,httpMethod="POST",notes="批量添加竞赛或者作业题目") + @RequiresPermissions(value={"teacher:save","admin:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + @Transactional + @DynamicDataSource + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="contestProblems",value="竞赛及作业题目对象集合",required=true) List contestProblems) + { + int count=0; + for(ContestProblem record:contestProblems) + { + if(Optional.of(record) + .filter(cId->record.getContestId()!=null) + .filter(pId->record.getProblemId()!=null) + .isPresent()) + { + count+=hustContestProblemService.insertSelective(record); + } + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"竞赛作业题目添加成功":"竞赛作业题目添加失败",count>=1?contestProblems:""); + } + + + @ApiOperation(value="移除竞赛题目对象",response=MsgModel.class,httpMethod="POST",notes="移除竞赛或者作业题目,支持批量移除") + @RequiresPermissions(value={"teacher:delete","admin:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="contestProblems",value="竞赛及作业题目对象集合",required=true) List contestProblems) + { + int count=0; + List pIds=new ArrayList(); + for(ContestProblem record:contestProblems) + { + if(!this.isNull(record.getProblemId())) + { + pIds.add(record.getProblemId()); + } + } + ContestProblemExample deleteExample=new ContestProblemExample(); + ContestProblemExample.Criteria criteria=deleteExample.createCriteria(); + criteria.andProblemIdIn(pIds); + count=hustContestProblemService.deleteByExample(deleteExample); + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"竞赛作业题目移除成功":"竞赛作业题目移除失败",count>=1?contestProblems:""); + } + + @ApiOperation(value="根据竞赛/作业ID查询学生竞赛/作业列表",response=MsgModel.class,httpMethod="POST",notes="加载某一竞赛/作业的题目列表") + @RequestMapping(value="/select",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel getContestProblem(@RequestBody @ApiParam(name="contestProblem",value="竞赛及作业学生对象",required=true) + ContestProblem contestProblem) + { + List contestProblems=new ArrayList(); + if(!this.isNull(contestProblem.getContestId())) + { + ContestProblemExample contestProblemExample=new ContestProblemExample(); + ContestProblemExample.Criteria criteria=contestProblemExample.createCriteria(); + criteria.andContestIdEqualTo(contestProblem.getContestId()); + contestProblems=hustContestProblemService.selectByExample(contestProblemExample); + } + List pIds=new ArrayList(); + if(!this.isNull(contestProblems)) + { + for(ContestProblem record:contestProblems) + { + if(!this.isNull(record.getProblemId())) + { + pIds.add(record.getProblemId()); + } + } + } + ProblemExample problemExample=new ProblemExample(); + ProblemExample.Criteria criteria=problemExample.createCriteria(); + criteria.andProblemIdIn(pIds).andDefunctEqualTo("N"); + List problems=hustProblemService.selectByExample(problemExample); + return this.resultMsg(!this.isNull(problems)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(problems)?"学生作业加载成功":"学生作业加载失败",!this.isNull(problems)?problems:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/oj/conteststudent/ContestStudentController.java b/src/main/java/com/es/disped/web/controller/oj/conteststudent/ContestStudentController.java new file mode 100644 index 0000000000000000000000000000000000000000..561f43aa573ff0c996c98bf41b4d40a9e24a8ea1 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/conteststudent/ContestStudentController.java @@ -0,0 +1,137 @@ +package com.es.disped.web.controller.oj.conteststudent; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.contest.HustContestService; +import com.es.disped.api.oj.conteststudent.HustContestStudentService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.constant.DataSourceName; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.spring.DataSourceContextHolder; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.ContestStudentRel; +import com.es.disped.dao.model.ContestStudentRelExample; +import com.es.disped.dao.oj.model.Contest; +import com.es.disped.dao.oj.model.ContestExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月18日 下午12:07:58 + * 名称:ContestStudentController.java + * 描述:竞赛及作业学生关系管理 + */ +@Api("竞赛及作业学生关系管理") +@Controller +@RequestMapping("/manage/oj/contest/student") +public class ContestStudentController extends BaseController{ + + @Autowired + HustContestStudentService hustContestStudentService; + @Autowired + HustContestService hustContestService; + + @ApiOperation(value="为学生分配给竞赛及作业对象",response=MsgModel.class,httpMethod="POST",notes="为竞赛及作业添加学生") + @RequiresPermissions(value={"teacher:save","admin:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + @Transactional + @DynamicDataSource + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="contestStudentRels",value="竞赛及作业学生对象",required=true) + List contestStudentRels) + { + int count=0; + for(ContestStudentRel record:contestStudentRels) + { + if(Optional.of(record) + .filter(cId->record.getContestId()!=null) + .filter(sId->record.getStudentId()!=null)//ESH平台对象的用户ID + .filter(spe->record.getStudentPhone()!=null)//OJ系统对应的用户ID + .isPresent()) + { + record.setRelId(getUUID()); + count+=hustContestStudentService.insertSelective(record); + } + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"竞赛作业学生添加成功":"竞赛作业学生添加失败",count>=1?contestStudentRels:""); + } + + + @ApiOperation(value="删除竞赛及作业对象关联的学生",response=MsgModel.class,httpMethod="POST",notes="删除为竞赛及作业添加的学生") + @RequiresPermissions(value={"teacher:delete","admin:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="contestStudentRels",value="竞赛及作业学生对象",required=true) + List contestStudentRels) + { + int count=0; + List sIds=new ArrayList(); + for(ContestStudentRel record:contestStudentRels) + { + if(!this.isNull(record.getStudentId())) + { + sIds.add(record.getStudentId()); + } + } + ContestStudentRelExample deleteExample=new ContestStudentRelExample(); + ContestStudentRelExample.Criteria criteria=deleteExample.createCriteria(); + criteria.andStudentIdIn(sIds); + count=hustContestStudentService.deleteByExample(deleteExample); + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"竞赛作业学生删除成功":"竞赛作业学生删除失败",count>=1?contestStudentRels:""); + } + + + @ApiOperation(value="根据学生ID查询学生竞赛及作业列表",response=MsgModel.class,httpMethod="POST",notes="加载学生个人相关的竞赛及作业") + @RequestMapping(value="/select",method=RequestMethod.POST) + public @ResponseBody MsgModel getStudentContest(@RequestBody @ApiParam(name="contestStudentRel",value="竞赛及作业学生对象",required=true) + ContestStudentRel contestStudentRel) + { + List contestStudentRels=null; + if(!this.isNull(contestStudentRel.getStudentId())) + { + ContestStudentRelExample selectExample=new ContestStudentRelExample(); + ContestStudentRelExample.Criteria criteria=selectExample.createCriteria(); + criteria.andStudentIdEqualTo(contestStudentRel.getStudentId()); + contestStudentRels=hustContestStudentService.selectByExample(selectExample); + } + ContestExample contestExample=new ContestExample(); + ContestExample.Criteria criteria=contestExample.createCriteria(); + List cIds=new ArrayList(); + if(!this.isNull(contestStudentRels)) + { + for(ContestStudentRel record:contestStudentRels) + { + if(!this.isNull(record.getContestId())) + { + cIds.add(record.getContestId()); + } + } + } + criteria.andContestIdIn(cIds).andDefunctEqualTo("N"); + DataSourceContextHolder.setDataSource(DataSourceName.EXTEND.getName()); + List contests=hustContestService.selectByExample(contestExample); + DataSourceContextHolder.clearDataSource(); + return this.resultMsg(!this.isNull(contests)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(contests)?"学生作业加载成功":"学生作业加载失败",!this.isNull(contests)?contests:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/oj/judgeproblem/JudgeProblemController.java b/src/main/java/com/es/disped/web/controller/oj/judgeproblem/JudgeProblemController.java new file mode 100644 index 0000000000000000000000000000000000000000..f6b93a14465f6f4f37ddb3fab41ab548ecf47efb --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/judgeproblem/JudgeProblemController.java @@ -0,0 +1,137 @@ +package com.es.disped.web.controller.oj.judgeproblem; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.solution.HustSolutionService; +import com.es.disped.api.oj.sourcecode.HustSourceCodeService; +import com.es.disped.api.oj.sourcecodeuser.HustSourceCodeUserService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.oj.model.Solution; +import com.es.disped.dao.oj.model.SourceCode; +import com.es.disped.dao.oj.model.SourceCodeUser; +import com.es.disped.dao.oj.model.SubmitProbDefunct; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月19日 下午1:49:08 + * 名称:JudgeProblemController.java + * 描述:OJ判题 + */ +@Api("OJ判题") +@Controller +@RequestMapping("/oj/judge") +public class JudgeProblemController extends BaseController{ + + private final String NAMESPACE="com.es.disped.dao.mapper.judge.JudgeCustomMapper"; + + @Autowired + HustSolutionService hustSolutionService; + @Autowired + HustSourceCodeService hustSourceCodeService; + @Autowired + HustSourceCodeUserService hustSourceCodeUserService; + + @ApiOperation(value="提交题目",response=MsgModel.class,httpMethod="POST", + notes="OJ判题,问题列表与作业题目提交参数不同:问题列表,问题ID,语言,源码;作业:作业ID,问题在作业中的序号值,语言,源码") + @RequestMapping(value="/submit",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel submit(@RequestBody @ApiParam(name="paramMap",value="判题序列对象",required=true) Map paramMap) + { + int count=0; + SubmitProbDefunct submitProbDefunct=null; + if(paramMap.containsKey("id")) + { + submitProbDefunct=this.getHustService().selectOne(NAMESPACE+".getProbDefunctById", paramMap.get("id")); + }else if(paramMap.containsKey("cid")&¶mMap.containsKey("pid")) + { + Map map=new HashMap(); + map.put("cid", paramMap.get("cid")); + map.put("pid", paramMap.get("pid")); + submitProbDefunct=this.getHustService().selectOne(NAMESPACE+".getProbDefunctByParams", map); + } + if(this.isNull(submitProbDefunct)) + { + return this.resultMsg(HttpStatus.NOT_FOUND.value(), "所提交的题目不存在"); + } + if(!this.isNull(submitProbDefunct)&&!submitProbDefunct.getDefunct().equals("N")) + { + return this.resultMsg(HttpStatus.UNAVAILABLE_FOR_LEGAL_REASONS.value(), "题目被禁用"); + } + Integer res=this.getHustService().selectOne(NAMESPACE+".getProblastSubmit", this.getSessionUser().getPhone()); + if(res==1) + { + return this.resultMsg(HttpStatus.FORBIDDEN.value(), "题目提交过于频繁"); + } + + String source=paramMap.get("source").toString(); + source=source.replaceAll("\r\n", "\n"); + + Solution solution=new Solution(); + solution.setProblemId(submitProbDefunct.getProblemId()); + solution.setUserId(this.getSessionUser().getPhone()); + solution.setInDate(new Date()); + solution.setLanguage(Integer.valueOf(paramMap.get("language").toString())); + solution.setIp(this.getRequest().getRemoteAddr()); + solution.setCodeLength(source.length()); + solution.setResult((short)14); + if(paramMap.containsKey("cid")&¶mMap.containsKey("pid")) + { + solution.setContestId(Integer.valueOf(paramMap.get("cid").toString())); + solution.setNum(Byte.valueOf(paramMap.get("pid").toString())); + } + //保存提交记录 + count+=hustSolutionService.insertSelective(solution); + //查询记录ID + Map soMap=new HashMap(); + soMap.put("userId", this.getSessionUser().getPhone()); + soMap.put("problemId", submitProbDefunct.getProblemId()); + Integer solutionId=this.getHustService().selectOne(NAMESPACE+".getLastSubmitsoId", soMap); + //保存提交源码 + SourceCode sourceCode=new SourceCode(); + sourceCode.setSolutionId(solutionId); + sourceCode.setSource(source); + count+=hustSourceCodeService.insert(sourceCode); + SourceCodeUser sourceCodeUser=new SourceCodeUser(); + sourceCodeUser.setSolutionId(solutionId); + sourceCodeUser.setSource(source); + count+=hustSourceCodeUserService.insert(sourceCodeUser); + //修改result为0,开始判题 + Solution updateSolution=new Solution(); + updateSolution.setResult((short)0); + updateSolution.setSolutionId(solutionId); + hustSolutionService.updateByPrimaryKeySelective(updateSolution); + return this.resultMsg(count>1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>1?"提交成功":"提交失败",count>1?solutionId:""); + } + + + @ApiOperation(value="获取判题结果",response=MsgModel.class,httpMethod="POST",notes="OJ判题结果") + @RequestMapping(value="/status",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel status(@RequestBody @ApiParam(name="solution",value="判题结果对象",required=true) Solution solution) + { + Solution res=this.getHustService().selectOne(NAMESPACE+".getJudgeStatus", solution.getSolutionId()); + return this.resultMsg(!this.isNull(res)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(res)?"加载成功":"获取失败",!this.isNull(res)?res:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/oj/problem/ProblemController.java b/src/main/java/com/es/disped/web/controller/oj/problem/ProblemController.java new file mode 100644 index 0000000000000000000000000000000000000000..6b6a9739390f80c05275696c991c1fd5400738b3 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/problem/ProblemController.java @@ -0,0 +1,106 @@ +package com.es.disped.web.controller.oj.problem; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.problem.HustProblemService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.oj.model.Problem; +import com.es.disped.dao.oj.model.ProblemExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月16日 上午12:57:21 + * 名称:ProblemController.java + * 描述:OJ题库管理 + */ +@Api("OJ题库管理") +@Controller +@RequestMapping("/oj/problem") +public class ProblemController extends BaseController{ + + @Autowired + HustProblemService hustProblemService; + + @ApiOperation(value="检索OJ题库",response=MsgModel.class,httpMethod="POST",notes="检索OJ题库") + @RequestMapping(value="/list",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="problem",value="OJ题库对象",required=false) Problem problem) + { + ProblemExample listExample=new ProblemExample(); + ProblemExample.Criteria criteria=listExample.createCriteria(); + criteria.andDefunctEqualTo("N"); + if(!this.isNull(problem.getProblemId())) + { + criteria.andProblemIdEqualTo(problem.getProblemId()); + } + if(!this.isNull(problem.getTitle())) + { + criteria.andTitleLike("%"+problem.getTitle()+"%"); + } + listExample.setOrderByClause("problem_id asc"); + List list=hustProblemService.selectByExample(listExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"OJ题库列表加载成功":"OJ题库列表加载失败",!this.isNull(list)?list:""); + } + + + @ApiOperation(value="分页加载OJ题库",response=MsgModel.class,httpMethod="POST",notes="分页加载OJ题库,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + ProblemExample listExample=new ProblemExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + listExample.setOrderByClause("problem_id asc"); + pageModel=hustProblemService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"OJ题库加载成功":"OJ题库加载失败",!this.isNull(pageModel)?pageModel:""); + } + + + + @ApiOperation(value="获取题目描述",response=MsgModel.class,httpMethod="POST",notes="通过题目ID获取题目描述内容") + @RequestMapping(value="/getProblemDetail",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel getProblemDetail(@RequestBody @ApiParam(name="problem",value="OJ题库对象",required=false) Problem problem) + { + ProblemExample problemExample=new ProblemExample(); + ProblemExample.Criteria criteria=problemExample.createCriteria(); + criteria.andDefunctEqualTo("N").andProblemIdEqualTo(problem.getProblemId()); + Problem problemDetail=hustProblemService.selectFirstByExampleWithBLOBs(problemExample); + return this.resultMsg(!this.isNull(problemDetail)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(problemDetail)?"OJ题库列表加载成功":"OJ题库列表加载失败",!this.isNull(problemDetail)?problemDetail:""); + } + + + +} diff --git a/src/main/java/com/es/disped/web/controller/oj/solution/SolutionController.java b/src/main/java/com/es/disped/web/controller/oj/solution/SolutionController.java new file mode 100644 index 0000000000000000000000000000000000000000..8bc02736dc97a24dd19be5b85799cb504721d8e4 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/solution/SolutionController.java @@ -0,0 +1,143 @@ +package com.es.disped.web.controller.oj.solution; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.solution.HustSolutionService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.oj.model.Solution; +import com.es.disped.dao.oj.model.SolutionExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api("OJ判题结果管理") +@Controller +@RequestMapping("/oj/solution") +public class SolutionController extends BaseController{ + + private final String NAMESPACE="com.es.disped.dao.mapper.solution.SolutionCustomMapper"; + + @Autowired + HustSolutionService hustSolutionService; + + + @ApiOperation(value="获取用户所有答题结果",response=MsgModel.class,httpMethod="POST",notes="通过用户ID判断用户是否通过答题") + @RequestMapping(value="/getProblemResultList",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel judgeProblemPassResult(@RequestBody @ApiParam(name="solution",value="判题结果对象",required=true) Solution solution) + { + List solutions=null; + if(!this.isNull(solution.getUserId())) + { + solutions=this.getHustService().selectList(NAMESPACE+".getProblemResultList", solution.getUserId()); + } + Map map=new HashMap(); + if(!this.isNull(solutions)) + { + for(Solution record:solutions) + { + map.put(record.getSolutionId(), record.getResult()==(short)4?"Y":"N"); + } + } + return this.resultMsg(!this.isNull(solutions)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(solutions)?"获取成功":"获取失败",!this.isNull(solutions)?map:""); + } + + + @ApiOperation(value="获取用户答题情况列表",response=MsgModel.class,httpMethod="POST",notes="获取用户提交记录") + @RequestMapping(value="/getProblemPassUserList",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel getProblemPassResult(@RequestBody @ApiParam(name="solution",value="判题结果对象",required=false) Solution solution) + { + List list=null; + SolutionExample solutionExample=new SolutionExample(); + SolutionExample.Criteria criteria=solutionExample.createCriteria(); + if(!this.isNull(solution.getProblemId())) + { + criteria.andProblemIdEqualTo(solution.getProblemId()); + } + if(!this.isNull(solution.getResult())) + { + criteria.andResultEqualTo(solution.getResult()); + } + if(!this.isNull(solution.getSolutionId())) + { + criteria.andSolutionIdEqualTo(solution.getSolutionId()); + } + if(!this.isNull(solution.getUserId())) + { + criteria.andUserIdEqualTo(solution.getUserId()); + } + solutionExample.setOrderByClause("judgetime desc"); + list=hustSolutionService.selectByExample(solutionExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"列表加载成功":"数据为空",!this.isNull(list)?list:""); + } + + + + @ApiOperation(value="分页获取状态栏目所有答题情况",response=MsgModel.class,httpMethod="POST",notes="分页获取状态栏所有答题情况,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + SolutionExample listExample=new SolutionExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=hustSolutionService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"判题结果加载成功":"判题结果加载失败",!this.isNull(pageModel)?pageModel:""); + } + +// @ApiOperation(value="获取编译结果",response=MsgModel.class,httpMethod="POST",notes="通过判题ID获取题目编译结果") +// @RequestMapping(value="/getCompileRuntimeInfo",method=RequestMethod.POST) +// @DynamicDataSource +// public @ResponseBody MsgModel getSource(@RequestBody Solution solution) +// { +// if(Optional.of(solution) +// .filter(sId->solution.getSolutionId()!=null) +// .filter(uId->solution.getUserId()!=null) +// .isPresent()) +// { +// SolutionExample selectExample=new SolutionExample(); +// SolutionExample.Criteria criteria=selectExample.createCriteria(); +// criteria.andSolutionIdEqualTo(solution.getSolutionId()).andUserIdEqualTo(solution.getUserId()); +// selectExample.ord +// Solution res=hustSolutionService.selectByExample(selectExample); +// } +// return this.resultMsg(null); +// } + +// @ApiOperation(value="AAAAAAAAAAAA",response=MsgModel.class,httpMethod="POST", +// notes="AAAAAAAAAAAA") +// @RequestMapping(value="/a",method=RequestMethod.POST) +// @DynamicDataSource +// public @ResponseBody MsgModel getUserACRate(@RequestBody Integer problemId) +// { +//// List list=null; +// List list=this.getHustService().selectList("com.es.disped.dao.mapper.problem.ProblemCustomMapper.getProblemPassResult", problemId); +// return this.resultMsg(HttpStatus.OK.value(),"",list); +// } +} diff --git a/src/main/java/com/es/disped/web/controller/oj/sourcecode/SourceCodeController.java b/src/main/java/com/es/disped/web/controller/oj/sourcecode/SourceCodeController.java new file mode 100644 index 0000000000000000000000000000000000000000..034bdade3b3ae677f2d1291b556e9a98ae36c6f9 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/sourcecode/SourceCodeController.java @@ -0,0 +1,49 @@ +//package com.es.disped.web.controller.oj.sourcecode; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.http.HttpStatus; +//import org.springframework.stereotype.Controller; +//import org.springframework.web.bind.annotation.RequestBody; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RequestMethod; +//import org.springframework.web.bind.annotation.ResponseBody; +// +//import com.es.disped.api.oj.solution.HustSolutionService; +//import com.es.disped.common.annotation.DynamicDataSource; +//import com.es.disped.common.model.MsgModel; +//import com.es.disped.core.controller.BaseController; +//import com.es.disped.dao.oj.model.Solution; +// +//import io.swagger.annotations.Api; +//import io.swagger.annotations.ApiOperation; +//import io.swagger.annotations.ApiParam; +// +///** +// * @author Anson +// * Copyright by EasyShare 2019 +// * +// * All right reserved +// * +// * Created on 2019年7月21日 下午10:38:58 +// * 名称:SourceCodeController.java +// * 描述:源码管理 +// */ +//@Api("源码管理") +//@Controller +//@RequestMapping("/oj/source") +//public class SourceCodeController extends BaseController{ +// +// @Autowired +// HustSolutionService hustSolutionService; +// +// @ApiOperation(value="获取判题源码",response=MsgModel.class,httpMethod="POST",notes="获取提交的源码") +// @RequestMapping(value="/code",method=RequestMethod.POST) +// @DynamicDataSource +// public @ResponseBody MsgModel getSource(@RequestBody @ApiParam(name="solution",value="判题结果对象",required=true) Solution solution) +// { +// Solution res=hustSolutionService.selectByPrimaryKey(solution.getSolutionId().toString()); +// return this.resultMsg(!this.isNull(res)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// !this.isNull(res)?"加载成功":"获取失败",!this.isNull(res)?res:""); +// } +// +//} diff --git a/src/main/java/com/es/disped/web/controller/oj/sourcecodeuser/SourceCodeUserController.java b/src/main/java/com/es/disped/web/controller/oj/sourcecodeuser/SourceCodeUserController.java new file mode 100644 index 0000000000000000000000000000000000000000..8dbe91c42887ab198984658762041edc24567acf --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/sourcecodeuser/SourceCodeUserController.java @@ -0,0 +1,49 @@ +package com.es.disped.web.controller.oj.sourcecodeuser; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.sourcecodeuser.HustSourceCodeUserService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.oj.model.SourceCodeUser; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月21日 下午10:38:58 + * 名称:SourceCodeUserController.java + * 描述:用户源码管理 + */ +@Api("用户源码管理") +@Controller +@RequestMapping("/oj/source/user") +public class SourceCodeUserController extends BaseController{ + + @Autowired + HustSourceCodeUserService hustSourceCodeUserService; + + @ApiOperation(value="获取判题源码",response=MsgModel.class,httpMethod="POST",notes="获取提交的源码") + @RequestMapping(value="/code",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel getSource(@RequestBody @ApiParam(name="sourceCodeUser",value="用户源码对象",required=true) SourceCodeUser sourceCodeUser) + { + SourceCodeUser res=hustSourceCodeUserService.selectByPrimaryKey(sourceCodeUser.getSolutionId()); + return this.resultMsg(!this.isNull(res)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(res)?"加载成功":"获取失败",!this.isNull(res)?res:""); + } + +} diff --git a/src/main/java/com/es/disped/web/controller/oj/users/UsersController.java b/src/main/java/com/es/disped/web/controller/oj/users/UsersController.java new file mode 100644 index 0000000000000000000000000000000000000000..93bbdc65f03b863ed639d6d043cf7754a1e19fc5 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/oj/users/UsersController.java @@ -0,0 +1,88 @@ +package com.es.disped.web.controller.oj.users; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.oj.user.HustUserService; +import com.es.disped.common.annotation.DynamicDataSource; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.User; +import com.es.disped.dao.oj.model.Users; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月17日 下午11:59:52 + * 名称:UsersController.java + * 描述:OJ用户管理 + */ +@Api("OJ用户管理") +@Controller +@RequestMapping("/oj/users") +public class UsersController extends BaseController{ + + + @Autowired + HustUserService hustUserService; + + @ApiOperation(value="OJ注册",httpMethod="POST",response=MsgModel.class,notes="OJ注册") + @RequestMapping(value="/registe",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel RegisteOJ() + { + int count=0; + User user=(User) this.getSession().getAttribute("registeUser"); + Users ojUser=hustUserService.selectByPrimaryKey(user.getUserId()); + if(this.isNull(ojUser)) + { + ojUser=new Users(); + ojUser.setUserId(user.getPhone()); + ojUser.setNick(user.getUsername()); + ojUser.setPassword(user.getPassword()); + ojUser.setEmail(user.getEmail()); + ojUser.setSchool(user.getBelongSchool()); + ojUser.setIp(this.getRequest().getRemoteAddr()); + ojUser.setRegTime(new Date()); + ojUser.setAccesstime(new Date()); + count=hustUserService.insertSelective(ojUser); + } + this.getSession().removeAttribute("registeUser"); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(),count==1?"":"OJ系统注册失败"); + } + + + @ApiOperation(value="统计用户答题情况",response=MsgModel.class,httpMethod="POST", + notes="通过用户ID统计用户答题情况,此处用户ID为ESH平台用户注册的手机号") + @RequestMapping(value="/getUserACRate",method=RequestMethod.POST) + @DynamicDataSource + public @ResponseBody MsgModel getUserACRate(@RequestBody Users user) + { + Map map=new HashMap(); + Users res=null; + if(!this.isNull(user.getUserId())) + { + res=hustUserService.selectByPrimaryKey(user.getUserId()); + } + map.put("problemSum", res.getSubmit()); + map.put("passSum", res.getSolved()); + map.put("rate", new StringBuilder(res.getSubmit()>0?String.format("%.2f", 100.0*res.getSolved()/res.getSubmit()):"0.00")+"%"); + return this.resultMsg(HttpStatus.OK.value(),"",map); + } +} diff --git a/src/main/java/com/es/disped/web/controller/permission/PermissionController.java b/src/main/java/com/es/disped/web/controller/permission/PermissionController.java new file mode 100644 index 0000000000000000000000000000000000000000..ff6c36fde0a64790dce1900ce5de0820873ed781 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/permission/PermissionController.java @@ -0,0 +1,227 @@ +/** + * + */ +package com.es.disped.web.controller.permission; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.permission.PermissionService; +import com.es.disped.api.rolepermission.RolePermissionService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Permission; +import com.es.disped.dao.model.PermissionExample; +import com.es.disped.dao.model.PermissionNode; +import com.es.disped.dao.model.PermissionType; +import com.es.disped.dao.model.RolePermissionRelExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 下午4:31:39 + * + * 名称:PermissionController.java + * + * 描述:权限管理 + */ +@Api(value="权限管理") +@Controller +@RequestMapping("/manage/permission") +public class PermissionController extends BaseController{ + + private static final String NAMESPACE="com.es.disped.dao.mapper.permission.PermissionCustomMapper"; + + @LogInject + Logger log; + + @Autowired + PermissionService permissionService; + @Autowired + RolePermissionService rolePermissionService; + + @ApiOperation(value="权限保存",response=MsgModel.class,httpMethod="POST",notes="保存新权限-管理端") + @RequiresPermissions(value= {"admin:save","sys:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + @Transactional + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="permission",value="权限对象",required=true) Permission permission) + { + int count=0; + if(Optional.of(permission) + .filter(name->permission.getPermissionName()!=null) + .filter(parentId->permission.getPermissionParentId()!=null) + .filter(code->permission.getPermissionCode()!=null) + .isPresent()) + { + permission.setPermissionId(getUUID()); + permission.setPermissionType(PermissionType.PERMISSION.getValue()); + permission.setPermissionValid(RecordStatus.USEAGE.getValue()); + count=permissionService.insertSelective(permission); + Permission oldParentNode=permissionService.selectByPrimaryKey(permission.getPermissionParentId()); + //修改父节点类型 + if(PermissionType.PERMISSION.getValue().equals(oldParentNode.getPermissionType())) + { + Permission parentNode=new Permission(); + parentNode.setPermissionType(PermissionType.GROUP.getValue()); + PermissionExample permissionExample=new PermissionExample(); + permissionExample.createCriteria().andPermissionIdEqualTo(oldParentNode.getPermissionId()); + permissionService.updateByExampleSelective(parentNode, permissionExample); + } + } + log.debug(count==1?HttpStatus.OK.value()+"-权限保存成功": + HttpStatus.EXPECTATION_FAILED.value()+"-权限保存失败",permission); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"权限保存成功":"权限保存失败", permission); + } + + @ApiOperation(value="权限更新",response=MsgModel.class,httpMethod="POST",notes="更新权限-管理端") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="permission",value="权限对象",required=true) Permission permission) + { + int count=0; + if(Optional.of(permission) + .filter(id->permission.getPermissionId()!=null) + .isPresent()) + { + count=permissionService.updateByPrimaryKeySelective(permission); + } + log.debug(count==1?HttpStatus.OK.value()+"-权限更新成功": + HttpStatus.EXPECTATION_FAILED.value()+"-权限更新失败",permission); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"权限更新成功":"权限更新失败", permission); + } + + @ApiOperation(value="删除权限",response=MsgModel.class,httpMethod="POST",notes="根据权限主键删除权限-管理端") + @RequiresPermissions(value= {"admin:delete","sys:delete"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="permission",value="权限对象",required=true) Permission permission) + { + int pCount=0,relCount=0; + if(Optional.of(permission) + .filter(pId->permission.getPermissionId()!=null) + .filter(ppId->permission.getPermissionParentId()!=null) + .isPresent()) + { + //删除权限引用 + RolePermissionRelExample rolePermissionRelExample=new RolePermissionRelExample(); + rolePermissionRelExample.createCriteria().andPermissionIdEqualTo(permission.getPermissionId()); + relCount=rolePermissionService.deleteByExample(rolePermissionRelExample); + //删除权限节点及子节点 + PermissionExample permissionExample=new PermissionExample(); + permissionExample.createCriteria().andPermissionParentIdEqualTo(permission.getPermissionId()); + pCount+=permissionService.deleteByExample(permissionExample);//删除子节点 + pCount+=permissionService.deleteByPrimaryKey(permission.getPermissionId());//删除当前节点 + //修改权限父类节点 + PermissionExample parentExample=new PermissionExample(); + parentExample.createCriteria().andPermissionParentIdEqualTo(permission.getPermissionParentId()); + List list=permissionService.selectByExample(parentExample); + if(this.isNull(list)) + { + Permission parentNode=new Permission(); + parentNode.setPermissionType(PermissionType.PERMISSION.getValue()); + PermissionExample parentPermissionExample=new PermissionExample(); + parentPermissionExample.createCriteria().andPermissionIdEqualTo(permission.getPermissionParentId()); + permissionService.updateByExampleSelective(parentNode, parentPermissionExample); + } + } + log.debug(pCount>=1?HttpStatus.OK.value()+"-权限删除成功,共删除"+pCount+"个权限,"+relCount+"个引用": + HttpStatus.EXPECTATION_FAILED.value()+"-权限删除失败,共删除"+pCount+"个权限,"+relCount+"个引用"); + return new MsgModel(pCount>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + pCount>=1?"权限删除成功,共删除"+pCount+"个权限,"+relCount+"个引用":"权限删除失败"); + } + + @ApiOperation(value="权限检索",response=MsgModel.class,httpMethod="POST",notes="根据权限可检索字段检索权限列表-管理端") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="permission",value="权限对象",required=false) Permission permission) + { + PermissionExample example=new PermissionExample(); + if(!this.isNull(permission.getPermissionName())) + { + example.createCriteria().andPermissionNameLike("%"+permission.getPermissionName()+"%"); + } + if(!this.isNull(permission.getPermissionId())) + { + example.createCriteria().andPermissionIdEqualTo(permission.getPermissionId()); + } + List permissions=permissionService.selectByExample(example); + return new MsgModel(permissions.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + permissions.size()>0?"":"权限列表为空", permissions.size()>0?permissions:""); + } + +// @ApiOperation(value="权限列表分页查询",response=MsgModel.class,httpMethod="POST",notes="分页加载权限列表-管理端") +// @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) +// @RequestMapping(value="/pages",method=RequestMethod.POST) +// public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) +// { +// PermissionExample example=new PermissionExample(); +// PageModel pageModel=null; +// if(Optional.of(paramMap) +// .filter(offset->paramMap.containsKey("offset")!=false) +// .filter(limit->paramMap.containsKey("limit")!=false) +// .isPresent()) +// { +// pageModel=permissionService.selectByExampleForOffsetPage(example, +// Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); +// } +// return new MsgModel(pageModel!=null?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// pageModel!=null?"":"权限加载失败", pageModel!=null?pageModel:""); +// } + + + @ApiOperation(value="获取权限Tree结构列表",response=MsgModel.class,httpMethod="POST",notes="根据权限ID检索权限Tree列表-管理端") + @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) + @RequestMapping(value="/permissionTree",method=RequestMethod.POST) + public @ResponseBody MsgModel getPermissionTree(@RequestBody @ApiParam(name="paramMap",value="当前检索的Tree的起始节点ID,若默认为空则从根节点开始",required=false) Map paramMap) + { + if (!paramMap.containsKey("id")) { + paramMap.put("id", "00000000000000000000000000000000"); + } + List nodeList=new ArrayList<>(); + List rootList=this.getService().selectList(NAMESPACE+".getPermissionNode", paramMap.get("id")); + for(PermissionNode permissionNode:rootList) + { + permissionNode.setChildren(getPermissionNode(permissionNode.getId())); + nodeList.add(permissionNode); + } + return new MsgModel(nodeList.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + nodeList.size()>0?"":"列表加载失败", nodeList.size()>0?nodeList:""); + } + + /** + * 获取Tree结构权限集合 + * @param pid + * {@link String} pid 权限父类ID + * @return + * List 权限节点列表集合 + */ + private List getPermissionNode(String pid) { + List permissionList=this.getService().selectList(NAMESPACE+".getPermissionNode", pid); + return permissionList; + } +} diff --git a/src/main/java/com/es/disped/web/controller/reset/ResetController.java b/src/main/java/com/es/disped/web/controller/reset/ResetController.java new file mode 100644 index 0000000000000000000000000000000000000000..eba3bd43d3cab638722ecfdb8d91c9fca4798134 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/reset/ResetController.java @@ -0,0 +1,129 @@ +/** + * + */ +package com.es.disped.web.controller.reset; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.alibaba.fastjson.JSONObject; +import com.es.disped.api.sms.SmsService; +import com.es.disped.api.user.UserService; +import com.es.disped.common.constant.AliSms; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.User; +import com.es.disped.dao.model.UserExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +/** + * @author Anson + * + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 下午8:43:07 + * + * 名称:ResetController.java + * + * 描述:用户密码重置 + */ +@Api("用户密码重置") +@Controller +@RequestMapping("/reset") +public class ResetController extends BaseController { + + @LogInject + Logger log; + @Autowired + SmsService smsService; + @Autowired + UserService userService; + @Autowired + RedisTemplate redisTemplate; + + + + @ApiOperation(value="重置密码人员手机号确认",httpMethod="POST",response=MsgModel.class, + notes="用户重置密码,先通过向手机号发送验证码的形式,确认用户账号是否存在,且手机号是否确证") + @ApiImplicitParam(name="phone",value="手机号",required=true,dataType="String") + @RequestMapping(value="/vertify",method=RequestMethod.POST) + public @ResponseBody MsgModel resetUserVertify(@RequestBody Map paramMap) + { + UserExample userExample=new UserExample(); + userExample.createCriteria().andPhoneEqualTo(paramMap.get("phone").toString()); + List users=userService.selectByExample(userExample); + return new MsgModel((!this.isNull(users))?HttpStatus.OK.value():HttpStatus.NOT_ACCEPTABLE.value(), + (!this.isNull(users))?"":"手机号不存在"); + } + + + + @ApiOperation(value="密码重置",httpMethod="POST",response=MsgModel.class, + notes="重置密码,提交用户手机验证码,用户手机号,以及新密码") + @ApiImplicitParams({ + @ApiImplicitParam(name="code",value="验证码",required=true,dataType="String"), + @ApiImplicitParam(name="phone",value="手机号",required=true,dataType="String"), + @ApiImplicitParam(name="password",value="密码",required=true,dataType="String") + }) + @RequestMapping(value="/password",method=RequestMethod.POST) + public @ResponseBody MsgModel reset(@RequestBody Map paramMap) + { + int count=0; + User user=new User(); + if(Optional.of(paramMap) + .filter(code->paramMap.get("code")!=null) + .filter(phone->paramMap.get("phone")!=null) + .filter(password->paramMap.get("password")!=null) + .isPresent() + &&redisTemplate.hasKey(paramMap.get("phone").toString())) + { + user.setPassword(this.md5(paramMap.get("password").toString())); + UserExample userExample=new UserExample(); + userExample.createCriteria().andPhoneEqualTo(user.getPhone()); + count=userService.updateByExampleSelective(user, userExample); + redisTemplate.delete(paramMap.get("phone").toString()); + } + //重置成功,短信通知用户 + if(count==1) + { + JSONObject paramJson=new JSONObject(); + paramJson.put("password", paramMap.get("password")); + smsService.sendMessage( + AliSms.ALI_MESSAGE_SIGN_NAME.ES_TECH.getValue(), + paramMap.get("phone").toString(), + AliSms.ALI_MESSAGE_TEMPLATE_CODE.PASSWORD_RESET.getValue(), + paramJson.toJSONString()); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"":"密码重置失败"); + } + + + + @ApiOperation(value="新密码短信通知",httpMethod="POST",response=MsgModel.class, + notes="用户重置密码,将密码通过短信形式发送至手机") + @RequestMapping(value="/notice") + public @ResponseBody MsgModel resetNotice(@RequestBody Map paramMap) + { + + return new MsgModel(); + } +} diff --git a/src/main/java/com/es/disped/web/controller/role/RoleController.java b/src/main/java/com/es/disped/web/controller/role/RoleController.java new file mode 100644 index 0000000000000000000000000000000000000000..e3438d733491ec886756f64449b53f061b1ec68c --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/role/RoleController.java @@ -0,0 +1,225 @@ +package com.es.disped.web.controller.role; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.role.RoleService; +import com.es.disped.api.userrole.UserRoleRelService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Role; +import com.es.disped.dao.model.RoleExample; +import com.es.disped.dao.model.RoleNode; +import com.es.disped.dao.model.RoleType; +import com.es.disped.dao.model.UserRoleRelExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 下午5:00:13 + * + * 名称:RoleController.java + * + * 描述:角色管理 + */ +@Api(value="角色管理") +@Controller +@RequestMapping("/manage/role") +public class RoleController extends BaseController{ + + private static final String NAMESPACE="com.es.disped.dao.mapper.role.RoleCustomMapper"; + + @LogInject + private static Logger log; + + @Autowired + RoleService roleService; + + @Autowired + UserRoleRelService userRoleRelService; + + @ApiOperation(value="新增角色",httpMethod="POST",response=MsgModel.class,notes="新增角色-管理端") + @RequiresPermissions(value= {"admin:save","sys:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + @Transactional + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="role",value="角色对象",required=true) Role role) + { + int count=0; + if(Optional.of(role) + .filter(name->role.getRoleName()!=null) + .filter(parentId->role.getRoleParentId()!=null) + .filter(code->role.getRoleCode()!=null) + .isPresent()) + { + role.setRoleId(getUUID()); + role.setRoleType(RoleType.ROLE.getValue()); + role.setRoleValid(RecordStatus.USEAGE.getValue()); + count=roleService.insertSelective(role); + //修改角色父类节点类型 + Role oldParentNode=roleService.selectByPrimaryKey(role.getRoleParentId()); + if(RoleType.ROLE.getValue().equals(oldParentNode.getRoleType())) + { + Role parentNode=new Role(); + parentNode.setRoleType(RoleType.GROUP.getValue()); + RoleExample roleExample=new RoleExample(); + roleExample.createCriteria().andRoleIdEqualTo(oldParentNode.getRoleId()); + roleService.updateByExampleSelective(parentNode, roleExample); + } + } + log.debug(count==1?HttpStatus.OK.value()+"-角色写入成功": + HttpStatus.EXPECTATION_FAILED.value()+"-保存失败",role); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"角色写入成功":"保存失败", role); + } + + @ApiOperation(value="更新角色",httpMethod="POST",response=MsgModel.class,notes="更新角色-管理端") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="role",value="角色对象",required=true) Role role) + { + int count=0; + if(Optional.of(role) + .filter(id->role.getRoleId()!=null) + .isPresent()) + { + count=roleService.updateByPrimaryKeySelective(role); + } + log.debug(count==1?HttpStatus.OK.value()+"-角色更新成功": + HttpStatus.EXPECTATION_FAILED.value()+"-角色更新失败",role); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"角色更新成功":"角色更新失败", role); + } + + @ApiOperation(value="删除角色",httpMethod="POST",response=MsgModel.class,notes="删除角色-系统端") + @RequiresPermissions(value= {"admin:delete","sys:delete"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="role",value="角色对象",required=true) Role role) + { + int relCount=0,roleCount=0; + if(Optional.of(role) + .filter(rId->role.getRoleId()!=null) + .filter(rpId->role.getRoleParentId()!=null) + .isPresent()) + { + //删除角色引用 + UserRoleRelExample userRoleRelExample=new UserRoleRelExample(); + userRoleRelExample.createCriteria().andRoleIdEqualTo(role.getRoleId()); + relCount=userRoleRelService.deleteByExample(userRoleRelExample); + //删除角色节点及子节点 + RoleExample roleExample=new RoleExample(); + roleExample.createCriteria().andRoleParentIdEqualTo(role.getRoleId()); + roleCount+=roleService.deleteByExample(roleExample); + roleCount+=roleService.deleteByPrimaryKey(role.getRoleId()); + //修改当前角色父节点类型 + RoleExample parentExample=new RoleExample(); + parentExample.createCriteria().andRoleParentIdEqualTo(role.getRoleParentId()); + List list=roleService.selectByExample(parentExample); + if(this.isNull(list)) + { + Role parentNode=new Role(); + parentNode.setRoleType(RoleType.ROLE.getValue()); + RoleExample parentRoleExample=new RoleExample(); + parentRoleExample.createCriteria().andRoleIdEqualTo(parentNode.getRoleId()); + roleService.updateByExampleSelective(parentNode, parentRoleExample); + } + } + log.debug(roleCount>=1?HttpStatus.OK.value()+"-角色删除成功,共删除"+roleCount+"个角色,"+relCount+"个引用": + HttpStatus.EXPECTATION_FAILED.value()+"-角色删除失败,共删除"+roleCount+"个角色,"+relCount+"个引用"); + return new MsgModel(roleCount>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + roleCount>=1?"角色删除成功,共删除"+roleCount+"个角色,"+relCount+"个引用":"角色删除失败"); + } + + + + @ApiOperation(value="角色检索",httpMethod="POST",response=MsgModel.class,notes="角色检索-系统端") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="role",value="角色对象",required=false) Role role) + { + RoleExample roleExample=new RoleExample(); + if(!this.isNull(role.getRoleName())) + { + roleExample.createCriteria().andRoleNameLike("%"+role.getRoleName()+"%"); + } + if(!this.isNull(role.getRoleId())) + { + roleExample.createCriteria().andRoleIdEqualTo(role.getRoleId()); + } + List roles=roleService.selectByExample(roleExample); + return new MsgModel(roles.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + roles.size()>0?"":"角色检索不到", roles.size()>0?roles:""); + } + +// @ApiOperation(value="角色分页查询",httpMethod="POST",response=MsgModel.class,notes="角色分页查询-系统端") +// @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) +// @RequestMapping(value="/pages",method=RequestMethod.POST) +// public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页查询参数[offset,limit]",required=true) Map paramMap) +// { +// RoleExample roleExample=new RoleExample(); +// PageModel pageModel=null; +// if(Optional.of(paramMap) +// .filter(offset->paramMap.containsKey("offset")!=false) +// .filter(limit->paramMap.containsKey("limit")!=false) +// .isPresent()) +// { +// pageModel=roleService.selectByExampleForOffsetPage(roleExample, +// Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); +// } +// return new MsgModel(pageModel!=null?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// pageModel!=null?"":"角色检索不到", pageModel!=null?pageModel:""); +// } + + @ApiOperation(value="获取角色Tree结构列表",httpMethod="POST",response=MsgModel.class,notes="根据角色ID对应节点向下检索拉取Tree,id可为null-系统端") + @RequestMapping(value="/roleTree",method=RequestMethod.POST) + public @ResponseBody MsgModel getRoleTree(@RequestBody @ApiParam(name="paramMap",value="当前检索的Tree的起始节点ID,若默认为空则从根节点开始",required=false) Map paramMap) + { + if (!paramMap.containsKey("id")) { + paramMap.put("id", "00000000000000000000000000000000"); + } + List nodeList = new ArrayList<>(); + List rootList = this.getService().selectList(NAMESPACE+".getRoleNode", paramMap.get("id")); + for (RoleNode roleNode : rootList) { + roleNode.setChildren(getRoleNode(roleNode.getId())); + nodeList.add(roleNode); + } + return new MsgModel(nodeList.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + nodeList.size()>0?"":"列表加载失败", nodeList.size()>0?nodeList:""); + } + + /** + * 角色 tree 结构加载 + * + * @param pid 父Id + * @return List 角色节点列表集合 + */ + private List getRoleNode(String pid) { + List roleList = this.getService().selectList(NAMESPACE+".getRoleNode", pid); + return roleList; + } + + +} diff --git a/src/main/java/com/es/disped/web/controller/rolepermission/RolePermissionController.java b/src/main/java/com/es/disped/web/controller/rolepermission/RolePermissionController.java new file mode 100644 index 0000000000000000000000000000000000000000..b53b010e54d66addfde04944053f4ebb899d6ce2 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/rolepermission/RolePermissionController.java @@ -0,0 +1,157 @@ +/** + * + */ +package com.es.disped.web.controller.rolepermission; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.rolepermission.RolePermissionService; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.PermissionNode; +import com.es.disped.dao.model.RolePermissionRel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + * @author Anson + * + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 上午10:59:17 + * + * 名称:PermissionForRoleController.java + * + * 描述:角色赋予权限 + */ +@Api(value="角色赋予权限") +@Controller +@RequestMapping("/manage/permission/role") +public class RolePermissionController extends BaseController{ + + private static final String NAMESPACE="com.es.disped.dao.mapper.permission.PermissionCustomMapper"; + + @LogInject + Logger log; + + @Autowired + RolePermissionService rolePermissionService; + + @ApiOperation(value="保存角色权限引用",httpMethod="POST",response=MsgModel.class,notes="为角色新增权限") + @RequiresPermissions(value= {"admin:save","sys:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save( @RequestBody @ApiParam(name="rolePermissionRel",value="角色权限引用关系对象",required=true) RolePermissionRel rolePermissionRel) + { + int count=0; + if(Optional.of(rolePermissionRel) + .filter(roleid->rolePermissionRel.getRoleId()!=null) + .filter(pid->rolePermissionRel.getPermissionId()!=null) + .isPresent()) + { + rolePermissionRel.setRelId(getUUID()); + count=rolePermissionService.insert(rolePermissionRel); + } + log.debug(count==1?HttpStatus.OK.value()+"-为角色新增权限成功" + :HttpStatus.EXPECTATION_FAILED.value()+"-为角色新增权限失败"); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"为角色新增权限成功":"为角色新增权限失败", rolePermissionRel); + } + + @ApiOperation(value="更新角色权限引用",httpMethod="POST",response=MsgModel.class,notes="为角色更新权限") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update( @RequestBody @ApiParam(name="rolePermissionRel",value="角色权限引用关系对象",required=true) RolePermissionRel rolePermissionRel) + { + int count=0; + if(Optional.of(rolePermissionRel) + .filter(relid->rolePermissionRel.getRelId()!=null) + .isPresent()) + { + count=rolePermissionService.updateByPrimaryKeySelective(rolePermissionRel); + } + log.debug(count==1?HttpStatus.OK.value()+"-为角色更新权限成功" + :HttpStatus.EXPECTATION_FAILED.value()+"-为角色更新权限失败"); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"为角色更新权限成功":"为角色更新权限失败", rolePermissionRel); + } + + @ApiOperation(value="回收角色权限引用",httpMethod="POST",response=MsgModel.class,notes="回收角色权限") + @RequiresPermissions(value= {"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/recycle",method=RequestMethod.POST) + public @ResponseBody MsgModel recycle( @RequestBody @ApiParam(name="rolePermissionRel",value="角色权限引用关系对象",required=true,example="relId=XXXX") RolePermissionRel rolePermissionRel) + { + int count=0; + String relId=rolePermissionRel.getRelId(); + if(!this.isNull(relId)) + { + count=rolePermissionService.deleteByPrimaryKey(relId); + } + log.debug(count==1?HttpStatus.OK.value()+"-回收角色权限成功" + :HttpStatus.EXPECTATION_FAILED.value()+"-回收角色权限失败"); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"回收角色权限成功":"回收角色权限失败"); + } + + @ApiOperation(value="获取 checkbox 形式的 tree 结构(为角色管理提供支持)",response=MsgModel.class,httpMethod="POST", + notes="根据角色ID和权限父类ID获取checked类型Tree列表-管理端") +// @ApiImplicitParams({ +// @ApiImplicitParam(name="roleId",value="角色ID",required=true), +// @ApiImplicitParam(name="permissionId",value="当前检索的角色类型的权限节点ID,若默认为空则从根节点开始",required=false) +// }) + @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) + @RequestMapping(value="/permissionCheckedTree",method=RequestMethod.POST) + public @ResponseBody MsgModel getPermissionCheckedTree(@RequestBody @ApiParam(name="paramMap",value="当前检索的角色类型的权限节点ID,若默认为空则从根节点开始",required=false) Map paramMap) + { + if (!paramMap.containsKey("permissionId")) { + paramMap.put("permissionId", "00000000000000000000000000000000"); + } + + List nodeList=new ArrayList<>(); + List rootList=this.getService().selectList(NAMESPACE+".getPermissionCheckedNode", paramMap); + for(PermissionNode permissionNode:rootList) + { + permissionNode.setChildren(getPermissionCheckedNode(paramMap.get("roleId").toString(), permissionNode.getId())); + nodeList.add(permissionNode); + } + return new MsgModel(nodeList.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + nodeList.size()>0?"":"列表加载失败", nodeList.size()>0?nodeList:""); + } + + + /** + * 获取 checkbox 形式的 tree 结构(为角色管理提供支持) + * @param roleId + * {@link String} roleId 角色ID + * @param pid + * {@link String} pid 权限父类ID + * @return + * List 权限节点列表集合 + */ + private List getPermissionCheckedNode(String roleId, String pid) { + Map paramMap = new HashMap<>(); + paramMap.put("roleId", roleId); + paramMap.put("permissionId", pid); + List permissionList=this.getService().selectList(NAMESPACE+".getPermissionCheckedNode", paramMap); + return permissionList; + } +} diff --git a/src/main/java/com/es/disped/web/controller/settings/SettingController.java b/src/main/java/com/es/disped/web/controller/settings/SettingController.java new file mode 100644 index 0000000000000000000000000000000000000000..dc52e70c7a4f0bbd6c1fbcd6f374c04730306267 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/settings/SettingController.java @@ -0,0 +1,116 @@ +package com.es.disped.web.controller.settings; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.MenuType; +import com.es.disped.dao.model.PermissionType; +import com.es.disped.dao.model.RoleType; +import com.es.disped.dao.model.UserType; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api(value="属性配置") +@Controller +@RequestMapping("/common/setting") +public class SettingController extends BaseController { + + private final String MENU="menu"; + private final String RECORD="record"; + private final String PERMISSION="permission"; + private final String ROLE="role"; + private final String USER="user"; + + @ApiOperation(value="菜单类型",response=MsgModel.class,httpMethod="POST",notes="获取菜单类型") + @RequestMapping(value="/property",method=RequestMethod.POST) + public @ResponseBody MsgModel getProperties(@RequestBody @ApiParam(name="properties",value="需要获取的属性名称['menu','record','permission','role','user']",required=true) List properties) + { + List> lists=new ArrayList>(); + for(String property:properties) + { + if(MENU.equals(property)) + { + lists.add(getMenuTypes()); + }else if(RECORD.equals(property)) + { + lists.add(getRecordStatusTypes()); + }else if(PERMISSION.equals(property)) + { + lists.add(getPermissionTypes()); + }else if(ROLE.equals(property)) + { + lists.add(getRoleTypes()); + }else if(USER.equals(property)) + { + lists.add(getUserTypes()); + } + } + return new MsgModel(lists.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + lists.size()>0?"":"获取失败", lists.size()>0?lists:""); + } + + private Map getUserTypes() { + Map map=new HashMap(); + List userTypes=Arrays.asList(UserType.values()); + for(UserType userType:userTypes) + { + map.put(userType.getValue(), userType.getName()); + } + return map; + } + + private Map getRoleTypes() { + Map map=new HashMap(); + List roleTypes=Arrays.asList(RoleType.values()); + for(RoleType roleType:roleTypes) + { + map.put(roleType.getValue(), roleType.getName()); + } + return map; + } + + private Map getPermissionTypes() { + Map map=new HashMap(); + List permissionTypes=Arrays.asList(PermissionType.values()); + for(PermissionType permissionType:permissionTypes) + { + map.put(permissionType.getValue(), permissionType.getName()); + } + return map; + } + + private Map getRecordStatusTypes() { + Map map=new HashMap(); + List recordStatus=Arrays.asList(RecordStatus.values()); + for(RecordStatus status:recordStatus) + { + map.put(String.valueOf(status.getValue()), status.getName()); + } + return map; + } + + private Map getMenuTypes() { + Map map=new HashMap(); + List menuTypes=Arrays.asList(MenuType.values()); + for(MenuType menuType:menuTypes) + { + map.put(menuType.getValue(), menuType.getName()); + } + return map; + } +} diff --git a/src/main/java/com/es/disped/web/controller/sms/SmsController.java b/src/main/java/com/es/disped/web/controller/sms/SmsController.java new file mode 100644 index 0000000000000000000000000000000000000000..d74dfe34fe2df80d525f48a587f20d9173b650ec --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/sms/SmsController.java @@ -0,0 +1,228 @@ +/** + * + */ +package com.es.disped.web.controller.sms; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.es.disped.api.sms.SmsService; +import com.es.disped.common.constant.AliSms; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +/** + * @author Anson + * + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 下午4:06:29 + * + * 名称:SmsController.java + * + * 描述: + */ +@Api("短信发送") +@Controller +@RequestMapping("/sms") +public class SmsController extends BaseController{ + + @Autowired + SmsService smsService; + @Autowired + RedisTemplate redisTemplate; + +// @RequestMapping(value="/templatecode/list",method=RequestMethod.POST) +// public @ResponseBody MsgModel getTemplateCodeList() +// { +// Map tempalteCodeMap=new HashMap(); +// for(AliSms.ALI_MESSAGE_TEMPLATE_CODE templateCode:AliSms.ALI_MESSAGE_TEMPLATE_CODE.values()) +// { +// tempalteCodeMap.put(templateCode.getName(), templateCode.getValue()); +// } +// return new MsgModel(HttpStatus.OK.value(), "短信模板获取成功",tempalteCodeMap); +// } + + + + /** + * 手机号认证-验证码请求 + * + * @param paramMap + * {@link Map} 请求参数-phone + * @return + * {@link MsgModel} 消息返回对象 + */ + @ApiOperation(value="短信验证码发送",response=MsgModel.class,httpMethod="POST",notes="发送短信验证码") + @ApiImplicitParam(name="phone",value="手机号",required=true,dataType="String") + @RequestMapping(value="/send/code",method=RequestMethod.POST) + public @ResponseBody MsgModel sendVertifyCode(@RequestBody Map paramMap) + { + String vertifyCode=String.valueOf((int)((Math.random()*9+1)*1000000)); + String templateCode=AliSms.ALI_MESSAGE_TEMPLATE_CODE.VERTIFY_CODE.getValue(); + String phone=paramMap.get("phone").toString(); + JSONObject paramJson= new JSONObject(); + paramJson.put("code", vertifyCode); + MsgModel msgModel=smsService.sendMessage(AliSms.ALI_MESSAGE_SIGN_NAME.ES_TECH.getValue(), phone, + templateCode, paramJson.toJSONString()); + if(msgModel.getStatus()==HttpStatus.OK.value()&&msgModel.getMsg().equals("OK")) + { + redisTemplate.opsForValue().set(phone, vertifyCode,30,TimeUnit.MINUTES); + } + return new MsgModel((msgModel.getStatus()==HttpStatus.OK.value() + &&msgModel.getMsg().equals("OK"))?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value() + , (msgModel.getStatus()==HttpStatus.OK.value() + &&msgModel.getMsg().equals("OK"))?"验证码发送成功":msgModel.getMsg()); + } + + + /** + * 验证码校验 + * @param paramMap + * phone-value手机号 + * code-value验证码 + * @return + * {@link MsgModel} + */ + @ApiOperation(value="验证短信验证码",httpMethod="POST",response=MsgModel.class,notes="验证短信验证码是否正确") + @ApiImplicitParams({ + @ApiImplicitParam(name="phone", value="用户手机号",required=true,dataType="String"), + @ApiImplicitParam(name="code", value="验证码",required=true,dataType="String") + }) + @RequestMapping(value="/vertify/code",method=RequestMethod.POST) + public @ResponseBody MsgModel vertify(@RequestBody Map paramMap) + { + String phone=paramMap.get("phone").toString(); + String code=paramMap.get("code").toString(); + String redisCode=redisTemplate.opsForValue().get(phone); + return new MsgModel(redisCode.equals(code)?HttpStatus.OK.value():HttpStatus.NOT_FOUND.value(), + redisCode.equals(code)?"":"验证失败"); + } + + /** + * 一对一短信发送 + * @param paramMap + * phone-value手机号 + * paramJson-value("content":"value")参数内容,JSON格式 + * @return + * {@link MsgModel} + */ + @ApiOperation(value="一对一发送短信",response=MsgModel.class,httpMethod="POST", + notes="一对一短信发送,提交参数中,paramJson变量值为JSON对象->content:value") + @ApiImplicitParams({ + @ApiImplicitParam(name="phone",value="手机号",required=true,dataType="String",example="{phone:'11111111111',paramJson:'{'content':'新消息'}'}"), + @ApiImplicitParam(name="paramJson",value="短信内容的JSON字符串{'content':'XXX'},content名称不可变",required=true,dataType="String") + }) + @RequestMapping(value="/send/notice",method=RequestMethod.POST) + public @ResponseBody MsgModel sendMessage(@RequestBody Map paramMap) + { + String phone=paramMap.get("phone").toString(); + String paramJson=paramMap.get("paramJson").toString(); + MsgModel msgModel=smsService.sendMessage(AliSms.ALI_MESSAGE_SIGN_NAME.ES_TECH.getValue(), + phone, AliSms.ALI_MESSAGE_TEMPLATE_CODE.ORDINARY_NOTICE.getValue(), paramJson); + return new MsgModel((msgModel.getStatus()==HttpStatus.OK.value() + &&msgModel.getMsg().equals("OK"))?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value() + , (msgModel.getStatus()==HttpStatus.OK.value() + &&msgModel.getMsg().equals("OK"))?"通知发送成功":msgModel.getMsg()); + } + + + /** + * 群发短信 + * @param paramMap + * phone-value的JSON数组,名为phoneJsonArray + * content-value的的json对象,名为paramJson + * @return + * {@link MsgModel} + */ + @ApiOperation(value="群发短信",response=MsgModel.class,httpMethod="POST", + notes="短信群发,提交参数中,paramJson变量值为JSON对象->content:value") + @ApiImplicitParams({ + @ApiImplicitParam(name="phoneJsonArray",value="phonjson数组",required=true,dataType="String"), + @ApiImplicitParam(name="paramJson",value="json字符串{'content':'XXX'}",required=true,dataType="String") + }) + @RequestMapping(value="/send/batch",method=RequestMethod.POST) + public @ResponseBody MsgModel sendBatch(@RequestBody Map paramMap) + { + JSONArray phoneJsonArray=(JSONArray) paramMap.get("phoneJsonArray"); + JSONArray signNameJsonArray= new JSONArray(); + JSONArray paramJsonArray=new JSONArray(); + for(int i=0;i + * phone-value;sendDate-value;offset-value;limit-value + * @return + * {@link MsgModel} + */ + @ApiOperation(value="短信查询接口",response=MsgModel.class,httpMethod="POST", + notes="查询已发送的短信,手机号,发送日期,当前查询页,每页数据容量") + @ApiImplicitParams({ + @ApiImplicitParam(name="phone",value="手机号",required=true,dataType="String"), + @ApiImplicitParam(name="sendDate",value="发送日期",required=true,dataType="String"), + @ApiImplicitParam(name="offset",value="查询位置",required=true,dataType="Integer"), + @ApiImplicitParam(name="limit",value="查询数量", required=true,dataType="Integer") + }) + @RequestMapping(value="/query",method=RequestMethod.POST) + public @ResponseBody MsgModel query(@RequestBody Map paramMap) + { + MsgModel msgModel=null; + if(Optional.of(paramMap) + .filter(phone->paramMap.get("phone")!=null) + .filter(sendDate->paramMap.get("sendDate")!=null) + .filter(currentPage->paramMap.get("offset")!=null) + .filter(pageSize->paramMap.get("limit")!=null) + .isPresent()) + { + msgModel=smsService.queryMessage( + paramMap.get("phone").toString(), + paramMap.get("sendDate").toString(), + Long.valueOf(paramMap.get("offset").toString()), + Long.valueOf(paramMap.get("limit").toString())); + } + + return new MsgModel((msgModel.getStatus()==HttpStatus.OK.value() + &&msgModel.getMsg().equals("OK"))?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value() + , (msgModel.getStatus()==HttpStatus.OK.value() + &&msgModel.getMsg().equals("OK"))?"":msgModel.getMsg() + , (msgModel.getStatus()==HttpStatus.OK.value() + &&msgModel.getMsg().equals("OK"))?msgModel.getRes():""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/syllabus/SyllabusController.java b/src/main/java/com/es/disped/web/controller/syllabus/SyllabusController.java new file mode 100644 index 0000000000000000000000000000000000000000..43793e352952fc7df63c0875ed0eec401a045c3d --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/syllabus/SyllabusController.java @@ -0,0 +1,171 @@ +package com.es.disped.web.controller.syllabus; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.syllabus.SyllabusService; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.Syllabus; +import com.es.disped.dao.model.SyllabusExample; +import com.es.disped.dao.model.TemplateForeignModel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api(value="教学大纲管理") +@Controller +@RequestMapping("/manage/syllabus") +public class SyllabusController extends BaseController{ + + private final String TEMPLATE_NAMESPACE="com.es.disped.dao.mapper.template.TemplateCustomMapper"; + + private final String SYLLABUS_NAMESPACE="com.es.disped.dao.mapper.syllabus.SyllabusCustomMapper"; + + @Autowired + SyllabusService syllabusService; + + @ApiOperation(value="新增教学大纲",response=MsgModel.class,httpMethod="POST",notes="添加教学大纲") + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="syllabus",value="教学大纲对象",required=true) Syllabus syllabus) + { + int count=0; + if(Optional.of(syllabus) + .filter(name->syllabus.getSyllabusName()!=null) + .filter(tpId->syllabus.getTemplateId()!=null) + .filter(address->syllabus.getAddress()!=null) + .filter(bday->syllabus.getSyllabusBeginDay()!=null) + .filter(eday->syllabus.getSyllabusEndDay()!=null) + .filter(thway->syllabus.getTeachWay()!=null) + .filter(redate->syllabus.getReminderTime()!=null) + .isPresent()) + { + syllabus.setSyllabusId(getUUID()); + TemplateForeignModel foreignModel=this.getService().selectOne( + TEMPLATE_NAMESPACE+".getTemplateForeignModel", syllabus.getTemplateId()); + syllabus.setTemplateName(foreignModel.getTemplateName()); + syllabus.setSyllabusValid(RecordStatus.USEAGE.getValue()); + count=syllabusService.insertSelective(syllabus); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败",count==1?syllabus:""); + } + + + @ApiOperation(value="更新教学大纲",response=MsgModel.class,httpMethod="POST",notes="更新教学大纲") + @RequiresPermissions(value={"admin:update","sys:update"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="syllabus",value="教学大纲对象",required=true) Syllabus syllabus) + { + int count=0; + if(!this.isNull(syllabus.getSyllabusId())) + { + if(!this.isNull(syllabus.getTemplateId())) + { + TemplateForeignModel foreignModel=this.getService().selectOne( + TEMPLATE_NAMESPACE+".getTemplateForeignModel", syllabus.getTemplateId()); + syllabus.setTemplateName(foreignModel.getTemplateName()); + } + count=syllabusService.updateByPrimaryKeySelective(syllabus); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"更新成功":"更新失败",count==1?syllabus:""); + } + + + @ApiOperation(value="删除教学大纲",response=MsgModel.class,httpMethod="POST",notes="删除教学大纲") + @RequiresPermissions(value={"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="syllabus",value="教学大纲对象",required=true) Syllabus syllabus) + { + int count=0; + if(!this.isNull(syllabus.getSyllabusId())) + { + count=this.getService().delete(SYLLABUS_NAMESPACE+".deleteSyllabusModel", syllabus.getSyllabusId()); + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"删除成功":"删除失败",count>=1?syllabus:""); + } + + + @ApiOperation(value="检索教学大纲",response=MsgModel.class,httpMethod="POST", + notes="检索教学大纲,精确检索:主键,课程模板ID,开始及截止日期;模糊检索:大纲名称,课程模板名称,上课地址,教学类型") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="syllabus",value="教学大纲对象",required=false) Syllabus syllabus) + { + SyllabusExample listExample=new SyllabusExample(); + SyllabusExample.Criteria criteria=listExample.createCriteria(); + if(!this.isNull(syllabus.getSyllabusId())) + { + criteria.andSyllabusIdEqualTo(syllabus.getSyllabusId()); + } + if(!this.isNull(syllabus.getSyllabusName())) + { + criteria.andSyllabusNameLike("%"+syllabus.getSyllabusName()+"%"); + } + if(!this.isNull(syllabus.getTemplateId())) + { + criteria.andTemplateIdEqualTo(syllabus.getTemplateId()); + } + if(!this.isNull(syllabus.getTemplateName())) + { + criteria.andTemplateNameLike("%"+syllabus.getTemplateName()+"%"); + } + if(!this.isNull(syllabus.getAddress())) + { + criteria.andAddressLike("%"+syllabus.getAddress()+"%"); + } + if(!this.isNull(syllabus.getSyllabusBeginDay())) + { + criteria.andSyllabusBeginDayGreaterThanOrEqualTo(syllabus.getSyllabusBeginDay()); + } + if(!this.isNull(syllabus.getSyllabusEndDay())) + { + criteria.andSyllabusEndDayLessThanOrEqualTo(syllabus.getSyllabusEndDay()); + } + if(!this.isNull(syllabus.getTeachWay())) + { + criteria.andTeachWayLike("%"+syllabus.getTeachWay()+"%"); + } + List list=syllabusService.selectByExample(listExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"加载成功":"查询失败",!this.isNull(list)?list:""); + } + + @ApiOperation(value="分页加载教学大纲",response=MsgModel.class,httpMethod="POST",notes="分页加载教学大纲,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + SyllabusExample listExample=new SyllabusExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=syllabusService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"教学大纲加载成功":"教学大纲加载失败",!this.isNull(pageModel)?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/syllabusstudent/SyllabusStudentController.java b/src/main/java/com/es/disped/web/controller/syllabusstudent/SyllabusStudentController.java new file mode 100644 index 0000000000000000000000000000000000000000..d469fb7c43a37230af4215bb6d63579e047d57bd --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/syllabusstudent/SyllabusStudentController.java @@ -0,0 +1,190 @@ +package com.es.disped.web.controller.syllabusstudent; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.syllabusstudent.SyllabusStudentRelService; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.SyllabusForeignModel; +import com.es.disped.dao.model.SyllabusStudentRel; +import com.es.disped.dao.model.SyllabusStudentRelExample; +import com.es.disped.dao.model.UserForeignModel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + + +/** + * @author Anson + * Copyright by EasyShare 2019 + * + * All right reserved + * + * Created on 2019年7月5日 下午1:02:25 + * 名称:SyllabusStudentController.java + * 描述:教学大纲学生关系管理 + */ +@Api(value="教学大纲学生关系管理-课程学生") +@Controller +@RequestMapping("/manage/syllabus/student") +public class SyllabusStudentController extends BaseController{ + + private final String USER_NAMESPACE="com.es.disped.dao.mapper.user.UserCustomMapper"; + private final String SYLLABUS_NAMESPACE="com.es.disped.dao.mapper.syllabus.SyllabusCustomMapper"; + private final String SYLLABUS_STUDENT_NAMESPACE="com.es.disped.dao.mapper.syllabusstudent.SyllabusStudentCustomMapper"; + + @Autowired + SyllabusStudentRelService syllabusStudentRelService; + + @ApiOperation(value="保存大纲授课学生关系对象",response=MsgModel.class,httpMethod="POST",notes="将学生加入教学计划中,表明学生所在的教学计划类别,不分班级") + @RequiresPermissions(value={"admin:save","sys:save"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="syllabusStudentRel",value="教学计划学生关系对象",required=true) SyllabusStudentRel syllabusStudentRel) + { + int count=0; + if(Optional.of(syllabusStudentRel) + .filter(stuId->syllabusStudentRel.getStudentId()!=null) + .filter(sylId->syllabusStudentRel.getSyllabusId()!=null) + .filter(stype->syllabusStudentRel.getStudentType()!=null) + .isPresent()) + { + syllabusStudentRel.setRelId(getUUID()); + if(this.isNull(syllabusStudentRel.getJoinDate())) + { + syllabusStudentRel.setJoinDate(this.currentDate("yyyy-MM-dd")); + } + UserForeignModel userForeignModel=this.getService().selectOne( + USER_NAMESPACE+".getUserForeignModel", syllabusStudentRel.getStudentId()); + SyllabusForeignModel syllabusForeignModel=this.getService().selectOne( + SYLLABUS_NAMESPACE+".getSyllabusForeignModel", syllabusStudentRel.getSyllabusId()); + syllabusStudentRel.setStudentName(userForeignModel.getUserName()); + syllabusStudentRel.setSyllabusName(syllabusForeignModel.getSyllabusName()); + count=syllabusStudentRelService.insertSelective(syllabusStudentRel); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败",count==1?syllabusStudentRel:""); + } + + + @ApiOperation(value="更新大纲授课学生关系对象",response=MsgModel.class,httpMethod="POST",notes="更新教学计划信息") + @RequiresPermissions(value={"admin:update","sys:update"},logical=Logical.OR) + @Transactional + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="syllabusStudentRel",value="教学计划学生关系对象",required=true) SyllabusStudentRel syllabusStudentRel) + { + int count=0; + if(Optional.of(syllabusStudentRel) + .filter(relId->syllabusStudentRel.getRelId()!=null) + .isPresent()) + { + if(!this.isNull(syllabusStudentRel.getStudentId())) + { + UserForeignModel userForeignModel=this.getService().selectOne( + USER_NAMESPACE+".getUserForeignModel",syllabusStudentRel.getStudentId()); + syllabusStudentRel.setStudentName(userForeignModel.getUserName()); + } + if(!this.isNull(syllabusStudentRel.getSyllabusId())) + { + SyllabusForeignModel syllabusForeignModel=this.getService().selectOne( + SYLLABUS_NAMESPACE+".getSyllabusForeignModel",syllabusStudentRel.getSyllabusId()); + syllabusStudentRel.setSyllabusName(syllabusForeignModel.getSyllabusName()); + } + count=syllabusStudentRelService.updateByPrimaryKey(syllabusStudentRel); + } + return this.resultMsg(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"更新成功":"更新失败",count==1?syllabusStudentRel:""); + } + + @ApiOperation(value="删除大纲授课学生关系对象",response=MsgModel.class,httpMethod="POST",notes="删除教学计划信息") + @RequiresPermissions(value={"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/delete",method=RequestMethod.POST) + public @ResponseBody MsgModel delete(@RequestBody @ApiParam(name="syllabusStudentRel",value="教学计划学生关系对象",required=true) SyllabusStudentRel syllabusStudentRel) + { + int count=0; + if(Optional.of(syllabusStudentRel) + .filter(relId->syllabusStudentRel.getRelId()!=null) + .isPresent()) + { +// count=syllabusStudentRelService.deleteByPrimaryKey(syllabusStudentRel.getRelId()); + this.getService().delete(SYLLABUS_STUDENT_NAMESPACE+".deleteSyllabusStudentModel", syllabusStudentRel.getRelId()); + } + return this.resultMsg(count>=1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count>=1?"删除成功":"删除失败",count>=1?syllabusStudentRel:""); + } + + @ApiOperation(value="查询大纲授课学生关系对象",response=MsgModel.class,httpMethod="POST", + notes="查询教学计划信息,精确检索:关系主键,学生ID,教学大纲ID;模糊检索:学生姓名,教学大纲名称,学生类型,报名时间") + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="syllabusStudentRel",value="教学计划学生关系对象",required=false) SyllabusStudentRel syllabusStudentRel) + { + SyllabusStudentRelExample listExample=new SyllabusStudentRelExample(); + SyllabusStudentRelExample.Criteria criteria=listExample.createCriteria(); + + if(!this.isNull(syllabusStudentRel.getRelId())) + { + criteria.andRelIdEqualTo(syllabusStudentRel.getRelId()); + } + if(!this.isNull(syllabusStudentRel.getStudentId())) + { + criteria.andStudentIdEqualTo(syllabusStudentRel.getStudentId()); + } + if(!this.isNull(syllabusStudentRel.getSyllabusId())) + { + criteria.andSyllabusIdEqualTo(syllabusStudentRel.getSyllabusId()); + } + if(!this.isNull(syllabusStudentRel.getStudentName())) + { + criteria.andStudentNameLike("%"+syllabusStudentRel.getStudentName()+"%"); + } + if(!this.isNull(syllabusStudentRel.getSyllabusName())) + { + criteria.andSyllabusNameLike("%"+syllabusStudentRel.getSyllabusName()+"%"); + } + if(!this.isNull(syllabusStudentRel.getStudentType())) + { + criteria.andStudentTypeLike("%"+syllabusStudentRel.getStudentType()+"%"); + } + if(!this.isNull(syllabusStudentRel.getJoinDate())) + { + criteria.andJoinDateEqualTo("%"+syllabusStudentRel.getJoinDate()+"%"); + } + List list=syllabusStudentRelService.selectByExample(listExample); + return this.resultMsg(!this.isNull(list)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(list)?"加载成功":"查询失败",!this.isNull(list)?list:""); + } + + + @ApiOperation(value="分页加载教学大纲内学生关系信息",response=MsgModel.class,httpMethod="POST",notes="分页加载教学大纲内学生关系信息,分页参数['offset','limit']") + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + SyllabusStudentRelExample listExample=new SyllabusStudentRelExample(); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=syllabusStudentRelService.selectByExampleForOffsetPage(listExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + } + return this.resultMsg(!this.isNull(pageModel)?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + !this.isNull(pageModel)?"教学大纲内学生关系信息加载成功":"教学大纲内学生关系信息加载失败",!this.isNull(pageModel)?pageModel:""); + } +} diff --git a/src/main/java/com/es/disped/web/controller/user/UserController.java b/src/main/java/com/es/disped/web/controller/user/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..04be838c575f14e6ca713497bbba87ab73fc298d --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/user/UserController.java @@ -0,0 +1,181 @@ +package com.es.disped.web.controller.user; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.sms.SmsService; +import com.es.disped.api.user.UserService; +import com.es.disped.common.constant.AliSms; +import com.es.disped.common.constant.RecordStatus; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.model.PageModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.User; +import com.es.disped.dao.model.UserExample; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api("用户信息管理端") +@Controller +@RequestMapping("/manage/user") +public class UserController extends BaseController{ + + @LogInject + Logger log; + @Autowired + SmsService smsService; + @Autowired + UserService userService; + + @ApiOperation(value="保存用户对象",httpMethod="POST",response=MsgModel.class, + notes="教研员保存用户信息(管理端)") + @RequiresPermissions(value= {"admin:save","sys:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="user",value="用户对象",required=true) User user) + { + int count=0; + if(Optional.of(user) + .filter(name->user.getUsername()!=null) + .filter(psd->user.getPassword()!=null) + .isPresent()) + { + user.setUserId(this.getUUID()); + user.setPassword(this.md5(user.getPassword())); + user.setUserValid(RecordStatus.VERTIFY.getValue()); + count=userService.insertSelective(user); + } + this.getSession().setAttribute("registeUser", user); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"保存成功":"保存失败", user); + } + + + + @ApiOperation(value="更新用户对象",httpMethod="POST",response=MsgModel.class, + notes="教研员更新用户信息(管理端)") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="user",value="用户对象",required=true) User user) + { + int count=0; + if(!this.isNull(user.getPassword())) + { + user.setPassword(this.md5(user.getPassword())); + } + if(!this.isNull(user.getUserId())) + { + count=userService.updateByPrimaryKeySelective(user); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"更新成功":"更新失败", user); + } + + + @ApiOperation(value="检索用户对象",httpMethod="POST",response=MsgModel.class, + notes="教研员检索用户信息(管理端)") + @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) + @RequestMapping(value="/list",method=RequestMethod.POST) + public @ResponseBody MsgModel list(@RequestBody @ApiParam(name="user",value="用户对象",required=false) User user) + { + UserExample listExample=new UserExample(); + UserExample.Criteria criteria=listExample.createCriteria(); + criteria.andUserValidNotEqualTo(RecordStatus.VERTIFY.getValue()); + if(!this.isNull(user.getUsername())) + { + criteria.andUsernameLike("%"+user.getUsername()+"%"); + } + if(!this.isNull(user.getUserId())) + { + criteria.andUserIdEqualTo(user.getUserId()); + } + if(!this.isNull(user.getPhone())) + { + criteria.andPhoneLike("%"+user.getPhone()+"%"); + } + if(!this.isNull(user.getUserType())) + { + criteria.andUserTypeEqualTo(user.getUserType()); + } + List users=userService.selectByExample(listExample); + return new MsgModel(users.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + users.size()>0?"列表加载成功":"列表加载失败", users); + } + + + @ApiOperation(value="分页获取用户列表",httpMethod="POST",response=MsgModel.class,notes="管理员获取用户信息(管理端),分页加载") + @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) + @RequestMapping(value="/pages",method=RequestMethod.POST) + public @ResponseBody MsgModel pages(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + UserExample userExample=new UserExample(); + userExample.createCriteria().andUserValidNotEqualTo(RecordStatus.VERTIFY.getValue()); + userExample.setOrderByClause("join_date desc"); + PageModel pageModel=null; + if(Optional.of(paramMap) + .filter(offset->paramMap.containsKey("offset")!=false) + .filter(limit->paramMap.containsKey("limit")!=false) + .isPresent()) + { + pageModel=userService.selectByExampleForOffsetPage(userExample, + Integer.valueOf(paramMap.get("offset").toString()), Integer.valueOf(paramMap.get("limit").toString())); + } + return new MsgModel(pageModel!=null?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + pageModel!=null?"":"用户列表为空", pageModel!=null?pageModel:""); + } + + + @ApiOperation(value="获取待审核新用户列表",httpMethod="POST",response=MsgModel.class, notes="管理员获取待审核新用户信息(管理端),分页加载") + @RequiresPermissions(value= {"admin:select","sys:select"},logical=Logical.OR) + @RequestMapping(value="/vertifyUserList",method=RequestMethod.POST) + public @ResponseBody MsgModel vertifyUserList(@RequestBody @ApiParam(name="paramMap",value="分页参数[offset,limit]",required=true) Map paramMap) + { + UserExample userExample=new UserExample(); + int offset=(int) paramMap.get("offset"); + int limit=(int) paramMap.get("limit"); + userExample.createCriteria().andUserValidEqualTo(RecordStatus.VERTIFY.getValue()); + PageModel users=userService.selectByExampleForOffsetPage(userExample, offset, limit); + return new MsgModel(this.isNull(users)?HttpStatus.NOT_FOUND.value():HttpStatus.OK.value(), + this.isNull(users)?"没有待审核用户":"",this.isNull(users)?null:users); + } + + + + @ApiOperation(value="审核新用户",httpMethod="POST",response=MsgModel.class, + notes="教研员审核新用户信息,需用户提交ID及手机号、状态更新值(管理端)") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/vertify",method=RequestMethod.POST) + public @ResponseBody MsgModel vertify(@RequestBody @ApiParam(name="user",value="用户对象",required=true) User user) + { + int count=0; + if(Optional.of(user) + .filter(userId->user.getUserId()!=null) + .isPresent()) + { + user.setUserValid(RecordStatus.USEAGE.getValue()); + count=userService.updateByPrimaryKeySelective(user); + } + //审核通过,短信通知 + if(count==1) + { + smsService.sendMessage(AliSms.ALI_MESSAGE_SIGN_NAME.ES_TECH.getValue(), user.getPhone(), + AliSms.ALI_MESSAGE_TEMPLATE_CODE.PASSWORD_RESET.getValue(), null); + } + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"":"审核不通过"); + } +} \ No newline at end of file diff --git a/src/main/java/com/es/disped/web/controller/usermenu/UserMenuController.java b/src/main/java/com/es/disped/web/controller/usermenu/UserMenuController.java new file mode 100644 index 0000000000000000000000000000000000000000..41d741926e2f642db285ec229ebb60abb59525a8 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/usermenu/UserMenuController.java @@ -0,0 +1,44 @@ +//package com.es.disped.web.controller.usermenu; +// +//import java.util.ArrayList; +//import java.util.List; +// +//import org.springframework.http.HttpStatus; +//import org.springframework.stereotype.Controller; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RequestMethod; +//import org.springframework.web.bind.annotation.ResponseBody; +// +//import com.es.disped.common.model.MsgModel; +//import com.es.disped.core.controller.BaseController; +//import com.es.disped.dao.model.Menu; +//import com.es.disped.dao.model.RolePermission; +// +//import io.swagger.annotations.Api; +//import io.swagger.annotations.ApiOperation; +// +//@Api(value="用户菜单") +//@Controller +//@RequestMapping("/user/menu") +//public class UserMenuController extends BaseController { +// +// +// @ApiOperation(value="获取登录用户菜单",response=MsgModel.class,httpMethod="POST",notes="获取登录用户菜单") +// @RequestMapping(value="/init",method=RequestMethod.POST) +// public @ResponseBody MsgModel init() +// { +// if(this.isNull(this.getSessionUser())) +// { +// return new MsgModel(HttpStatus.FORBIDDEN.value(), "用户已下线"); +// } +// List ids=new ArrayList(); +// for(RolePermission rolePermission:this.getSessionUser().getUserRoles()) +// { +// ids.add(rolePermission.getRoleId()); +// } +// List menus=this.getService().selectList("com.es.disped.dao.mapper.menu.MenuCustomMapper.getUserMenuMap", ids); +// +// return new MsgModel(menus.size()>0?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), +// menus.size()>0?"":"菜单加载失败",menus.size()>0?menus:""); +// } +//} diff --git a/src/main/java/com/es/disped/web/controller/userrole/UserRoleController.java b/src/main/java/com/es/disped/web/controller/userrole/UserRoleController.java new file mode 100644 index 0000000000000000000000000000000000000000..041794e76a11e40517e25b177a2d98eb94de8b09 --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/userrole/UserRoleController.java @@ -0,0 +1,141 @@ +package com.es.disped.web.controller.userrole; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.userrole.UserRoleRelService; +import com.es.disped.common.model.MsgModel; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.RoleNode; +import com.es.disped.dao.model.UserRoleRel; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +@Api(value="用户角色管理") +@Controller +@RequestMapping("/manage/user/role") +public class UserRoleController extends BaseController{ + + private static final String NAMESPACE="com.es.disped.dao.mapper.role.RoleCustomMapper"; + + @LogInject + private static Logger log; + + @Autowired + UserRoleRelService userRoleRelService; + + @ApiOperation(value="用户角色绑定",httpMethod="POST",response=MsgModel.class,notes="给用户赋予角色-管理端") + @RequiresPermissions(value= {"admin:save","sys:save"},logical=Logical.OR) + @RequestMapping(value="/save",method=RequestMethod.POST) + public @ResponseBody MsgModel save(@RequestBody @ApiParam(name="userRoleRel", value="用户角色关联对象",required=true) UserRoleRel userRoleRel) + { + int count=0; + if(Optional.of(userRoleRel) + .filter(uid->userRoleRel.getUserId()!=null) + .filter(rid->userRoleRel.getRoleId()!=null) + .isPresent()) + { + userRoleRel.setRelId(this.getUUID()); + count=userRoleRelService.insert(userRoleRel); + } + log.debug(count==1?HttpStatus.OK.value()+"-权限赋予成功": + HttpStatus.EXPECTATION_FAILED.value()+"-权限赋予失败", userRoleRel); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"权限赋予成功":"权限赋予失败", userRoleRel); + } + + + + @ApiOperation(value="用户角色修改",httpMethod="POST",response=MsgModel.class,notes="修改用户角色-管理端:通过关系主键修改") + @RequiresPermissions(value= {"admin:update","sys:update"},logical=Logical.OR) + @RequestMapping(value="/update",method=RequestMethod.POST) + public @ResponseBody MsgModel update(@RequestBody @ApiParam(name="userRoleRel", value="用户角色关联对象",required=true) UserRoleRel userRoleRel) + { + int count=0; + if(Optional.of(userRoleRel) + .filter(relid->userRoleRel.getRelId()!=null) + .isPresent()) + { + count=userRoleRelService.updateByPrimaryKeySelective(userRoleRel); + } + log.debug(count==1?HttpStatus.OK.value()+"-权限修改成功": + HttpStatus.EXPECTATION_FAILED.value()+"-权限修改失败", userRoleRel); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"权限修改成功":"权限修改失败", userRoleRel); + } + + @ApiOperation(value="回收用户角色",httpMethod="POST",response=MsgModel.class,notes="回收用户角色-管理端:通过关联主键回收") + @RequiresPermissions(value= {"admin:delete","sys:delete"},logical=Logical.OR) + @RequestMapping(value="/recycle",method=RequestMethod.POST) + public @ResponseBody MsgModel recycle(@RequestBody @ApiParam(name="userRoleRel", value="用户角色关联对象",required=true) UserRoleRel userRoleRel) + { + int count=0; + String relId=userRoleRel.getRelId(); + if(!this.isNull(relId)) + { + count=userRoleRelService.deleteByPrimaryKey(relId); + } + log.debug(count==1?HttpStatus.OK.value()+"-角色收回成功": + HttpStatus.EXPECTATION_FAILED.value()+"-角色收回失败",relId); + return new MsgModel(count==1?HttpStatus.OK.value():HttpStatus.EXPECTATION_FAILED.value(), + count==1?"角色收回成功":"角色收回失败"); + } + + + + @ApiOperation(value="获取 checkbox 形式的 tree 结构(为用户管理提供支持)",httpMethod="POST",response=MsgModel.class, + notes="根据用户ID和角色父类ID获取checked类型Tree列表-系统端") +// @ApiImplicitParams({ +// @ApiImplicitParam(name="userId",value="用户ID",required=true), +// @ApiImplicitParam(name="roleId",value="当当前检索的用户的角色节点ID,若默认为空则从根节点开始",required=false) +// }) + @RequestMapping(value = "/roleCheckedTree", method = RequestMethod.POST) + public @ResponseBody List getRoleCheckedTree(@RequestBody @ApiParam(name="paramMap",value="当前检索的用户的角色节点ID,若默认为空则从根节点开始",required=false) Map paramMap) { + + if (!paramMap.containsKey("roleId")) { + paramMap.put("roleId", "00000000000000000000000000000000"); + } + + List nodeList = new ArrayList<>(); + List rootList = this.getService().selectList(NAMESPACE+".getRoleCheckedNode", paramMap); + for (RoleNode roleNode : rootList) { + roleNode.setChildren(getRoleCheckedNode(paramMap.get("userId").toString(), roleNode.getId())); + nodeList.add(roleNode); + } + return nodeList; + } + + + + /** + * 角色 checkbox 形式 tree 加载(为用户管理提供支持) + * + * @param userId 用户Id + * @param pid 父Id + * @return List 角色节点列表集合 + */ + private List getRoleCheckedNode(String userId, String pid) { + Map paramMap = new HashMap<>(); + paramMap.put("userId", userId); + paramMap.put("roleId", pid); + List roleList = this.getService().selectList(NAMESPACE+".getRoleCheckedNode", paramMap); + return roleList; + } +} diff --git a/src/main/java/com/es/disped/web/controller/wechat/WeChatController.java b/src/main/java/com/es/disped/web/controller/wechat/WeChatController.java new file mode 100644 index 0000000000000000000000000000000000000000..d98a9039152fae7d06e33344af0bbbaa6021012a --- /dev/null +++ b/src/main/java/com/es/disped/web/controller/wechat/WeChatController.java @@ -0,0 +1,155 @@ +package com.es.disped.web.controller.wechat; + +import java.io.IOException; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.es.disped.api.user.UserService; +import com.es.disped.api.wechat.WeChatService; +import com.es.disped.common.constant.WeChat; +import com.es.disped.common.model.MsgModel; +import com.es.disped.common.wechat.http.request.WeChatRequest; +import com.es.disped.common.wechat.http.response.AccessResponse; +import com.es.disped.common.wechat.model.TextMsg; +import com.es.disped.common.wechat.signature.WeChatSignature; +import com.es.disped.core.annotation.LogInject; +import com.es.disped.core.controller.BaseController; +import com.es.disped.dao.model.User; +import com.es.disped.dao.model.UserExample; + +import io.swagger.annotations.Api; + +@Api(value="微信消息推送") +@Controller +@RequestMapping("/wechat/message") +public class WeChatController extends BaseController{ + + @LogInject + Logger logger; + @Autowired + RedisTemplate redisTemplate; + @Autowired + WeChatService weChatService; + @Autowired + UserService userService; + + + @RequestMapping(value="/signature",method=RequestMethod.GET) + @ResponseBody + public String checkSignature(WeChatRequest request) + { + System.out.println("测试微信的接入:"+request); + if (WeChatSignature.checkSignature(request)) { + logger.info("校验成功,直接返回数据"); + return request.getEchostr(); + } + logger.info("校验失败"); + return null; + } + + + + @RequestMapping(value="/course/notice",method=RequestMethod.POST) + public @ResponseBody MsgModel sendCourseReservationSuccessMessage(@RequestBody Map paramMap) + { + //若token在半小时内过期,则重新获取 + checkToken(); + + + +// String toUser=paramMap.remove("toUser").toString(); + + + + MsgModel msgModel=weChatService.sendTemplateMessage(paramMap, + WeChat.TemplateMessage.COURSE_RESERVATION_SUCCESS.getValue(), + //toUser, + "oFR0dw2TCCyaXYZMa9rmF64bp3Ao", + redisTemplate.opsForValue().get("wechat_access_token")); + return msgModel; + } + + @RequestMapping(value="/signature",method=RequestMethod.POST) + public void bindWeChatUser(HttpServletRequest request, HttpServletResponse response) + { + response.setCharacterEncoding("UTF-8"); + Map paramMap=xmlToMap(request); + String fromUserName=paramMap.get("FromUserName"); + String toUserName=paramMap.get("ToUserName"); + String msgType=paramMap.get("MsgType"); + String content=paramMap.get("Content"); + + + TextMsg textMsg=new TextMsg(); + textMsg.setFromUserName(toUserName); + textMsg.setToUserName(fromUserName); + textMsg.setCreateTime(this.currentDate("yyyy-MM-dd HH:mm:ss")); + if(WeChat.MessageType.TEXT.getValue().equals(msgType)) + { + int count=0; + if(content.length()==11) + { + User user=new User(); + user.setOpenId(fromUserName); + UserExample example=new UserExample(); + example.createCriteria().andPhoneEqualTo(content); + count=userService.updateByExampleSelective(user, example); + } + textMsg.setMsgType(WeChat.MessageType.TEXT.getValue()); + textMsg.setContent(count==1?"绑定成功":"绑定失败"); + }else if(WeChat.MessageType.EVENT.getValue().equals(msgType)) + { + String eventType=paramMap.get("Event"); + if(WeChat.MessageType.EVENT_SUBSCRIBE.getValue().equals(eventType)) + { + textMsg.setMsgType(WeChat.MessageType.TEXT.getValue()); + textMsg.setContent("感谢您的关注~\r\n请输入注册教研室平台所用的手机号进行绑定\r\n若尚未注册教研室平台,请先前往教研室平台进行注册!"); + } + } + try { + response.getWriter().write(textMsgToXml(textMsg)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + /** + * 监测accessToken是否过期 + */ + private void checkToken() + { + //若token在半小时内过期,则重新获取 + if(redisTemplate.getExpire("wechat_access_token", TimeUnit.SECONDS)<60*30) + { + MsgModel msgModel=weChatService.getAccessToken(); + if(Optional.of(msgModel) + .filter(status->msgModel.getStatus()==HttpStatus.OK.value()) + .filter(response->msgModel.getRes()!=null) + .filter(errcode->((AccessResponse)msgModel.getRes()).getErrorcode()==null) + .isPresent()) + { + AccessResponse response=(AccessResponse) msgModel.getRes(); + redisTemplate.opsForValue().set("wechat_access_token", + response.getAccess_token(), + Integer.valueOf(response.getExpires_in()), + TimeUnit.SECONDS); + } + } + } + +} diff --git a/src/main/java/com/es/disped/web/swagger2/Swagger2Config.java b/src/main/java/com/es/disped/web/swagger2/Swagger2Config.java new file mode 100644 index 0000000000000000000000000000000000000000..4987b9a734e400d4dacc913f835c8143f1e709c6 --- /dev/null +++ b/src/main/java/com/es/disped/web/swagger2/Swagger2Config.java @@ -0,0 +1,47 @@ +package com.es.disped.web.swagger2; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Component +@Configuration +@EnableSwagger2 +@EnableWebMvc +@ComponentScan("com.es.disped") +public class Swagger2Config { + @Bean + public Docket createAPI() { + return new Docket(DocumentationType.SWAGGER_2) + .forCodeGeneration(true) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + .apiInfo(apiInfo()); + } + + private ApiInfo apiInfo() { + + Contact contact=new Contact("Anson","https://blog.csdn.net/j_anson","georgeanson@foxmail.com"); + ApiInfo apiInfo = new ApiInfoBuilder() + .license("Apache License Version 2.0") + .title("易享学堂平台") + .description("易享学堂平台API文档") + .contact(contact) + .version("1.0") + .build(); + return apiInfo; + } +} \ No newline at end of file diff --git a/src/main/resources/adminMenu.xml b/src/main/resources/adminMenu.xml new file mode 100644 index 0000000000000000000000000000000000000000..1098d3ddcc707c3ede72ffb84642f8fc30fd4963 --- /dev/null +++ b/src/main/resources/adminMenu.xml @@ -0,0 +1,64 @@ + + + + + + 用户管理 + /# + + + 权限管理 + /# + + + + + 角色管理 + /# + + + 菜单管理 + /# + + + + + 课程管理 + /# + + + 课程模板管理 + /# + + + 教学计划管理 + /# + + + + + + + 区域管理 + /# + + + + \ No newline at end of file diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml new file mode 100644 index 0000000000000000000000000000000000000000..1920f7586b2bb228bd5ce51a8fd4037e15d97818 --- /dev/null +++ b/src/main/resources/ehcache.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..0914d60f7de7ee1f45459ba45ea2a606a3f31a38 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + + + + ERROR + ACCEPT + DENY + + + + + ${logback.path}/%d{yyyy-MM-dd}/${logback.name}.error.log + + ${logback.maxHistory} + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + ${logback.maxSize} + + + + + + + + WARN + ACCEPT + DENY + + + + ${logback.path}/%d{yyyy-MM-dd}/${logback.name}.warn.log + + ${logback.maxHistory} + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + ${logback.maxSize} + + + + + + + + INFO + ACCEPT + DENY + + + + ${logback.path}/%d{yyyy-MM-dd}/${logback.name}.info.log + + ${logback.maxHistory} + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + ${logback.maxSize} + + + + + + + + DEBUG + ACCEPT + DENY + + + + ${logback.path}/%d{yyyy-MM-dd}/${logback.name}.debug.log + + + ${logback.maxHistory} + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + ${logback.maxSize} + + + + + + + + TRACE + ACCEPT + DENY + + + + ${logback.path}/%d{yyyy-MM-dd}/${logback.name}.trace.log + + ${logback.maxHistory} + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + ${logback.maxSize} + + + + + + + WARN + ACCEPT + DENY + + + + + + ${logback.db.url} + ${logback.db.username} + ${logback.db.password} + ${logback.db.driverClassName} + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/properties/dubbo.properties b/src/main/resources/properties/dubbo.properties new file mode 100644 index 0000000000000000000000000000000000000000..99996447cc0dedce87b0ba80be7ab99fac469a9e --- /dev/null +++ b/src/main/resources/properties/dubbo.properties @@ -0,0 +1,2 @@ +dubbo.application.name=disped-dubbo-consumer +dubbo.registry.address=zookeeper://127.0.0.1:2181 \ No newline at end of file diff --git a/src/main/resources/properties/logback.properties b/src/main/resources/properties/logback.properties new file mode 100644 index 0000000000000000000000000000000000000000..ce564a091512b82e5ed7d26fa48728ce327f5db2 --- /dev/null +++ b/src/main/resources/properties/logback.properties @@ -0,0 +1,10 @@ +logback.name=disped-web +logback.path=E:\\logs + +logback.maxHistory=30 +logback.maxSize=10MB + +logback.db.username=root +logback.db.password=root +logback.db.driverClassName=com.mysql.jdbc.Driver +logback.db.url=jdbc:mysql://localhost:3306/esheducation_logback_mysql_schema?useUnicode=true&characterEncoding=utf8&useSSL=false \ No newline at end of file diff --git a/src/main/resources/properties/redis.properties b/src/main/resources/properties/redis.properties new file mode 100644 index 0000000000000000000000000000000000000000..f407b5163b973322ece46512cf415679878374f5 --- /dev/null +++ b/src/main/resources/properties/redis.properties @@ -0,0 +1,15 @@ +redis.maxIdle=300 +redis.maxTotal=1000 +redis.maxWaitMillis=10000 +redis.minEvictableIdleTimeMillis=300000 +redis.numTestsPerEvictionRun=1024 +redis.timeBetweenEvictionRunsMillis=30000 +redis.testOnBorrow=true +redis.testWhileIdle=true + +redis.hostName=127.0.0.1 +redis.port=6379 +redis.password=anson +redis.usePool=true + +redis.maxInactiveIntervalInSeconds=100 \ No newline at end of file diff --git a/src/main/resources/properties/setting.properties b/src/main/resources/properties/setting.properties new file mode 100644 index 0000000000000000000000000000000000000000..5c398c999869625f581dd0416f0e523070cc9822 --- /dev/null +++ b/src/main/resources/properties/setting.properties @@ -0,0 +1 @@ +setting.upload=E:\\upload \ No newline at end of file diff --git a/src/main/resources/spring/applicationContext.xml b/src/main/resources/spring/applicationContext.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6a5dfd99928a594fdfdd83475a8a65788c57520 --- /dev/null +++ b/src/main/resources/spring/applicationContext.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/src/main/resources/spring/config/spring-beans.xml b/src/main/resources/spring/config/spring-beans.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce7c43d1f68011ccbd0521b84b4d8295f848c18d --- /dev/null +++ b/src/main/resources/spring/config/spring-beans.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/src/main/resources/spring/config/spring-druid.xml b/src/main/resources/spring/config/spring-druid.xml new file mode 100644 index 0000000000000000000000000000000000000000..071d3cea0c3c0d785b959c2ba2d5167fba5119b4 --- /dev/null +++ b/src/main/resources/spring/config/spring-druid.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + com.es.disped.web.controller.* + + + + + + + + diff --git a/src/main/resources/spring/config/spring-dubbo-customer.xml b/src/main/resources/spring/config/spring-dubbo-customer.xml new file mode 100644 index 0000000000000000000000000000000000000000..8fee95fdbba7081f9200a3e479113dc8936eca35 --- /dev/null +++ b/src/main/resources/spring/config/spring-dubbo-customer.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring/config/spring-ehcache.xml b/src/main/resources/spring/config/spring-ehcache.xml new file mode 100644 index 0000000000000000000000000000000000000000..35adacae32c65b3cdc72976e0ee199f5d550f42a --- /dev/null +++ b/src/main/resources/spring/config/spring-ehcache.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring/config/spring-redis.xml b/src/main/resources/spring/config/spring-redis.xml new file mode 100644 index 0000000000000000000000000000000000000000..d142f1c8d123158ca55aa8161fc07dc41d2c543f --- /dev/null +++ b/src/main/resources/spring/config/spring-redis.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring/config/spring-shiro.xml b/src/main/resources/spring/config/spring-shiro.xml new file mode 100644 index 0000000000000000000000000000000000000000..06aa250d9cc47bb2f41a0b7be9bb4d67698b7e8f --- /dev/null +++ b/src/main/resources/spring/config/spring-shiro.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /swagger-ui.html = anon + /swagger-resources/** = anon + /v2/** = anon + /webjars/** = anon + /resources/** = anon + /common/login/** = anon + /sms/send/code = anon + /sms/vertify/code = anon + /wechat/message/** = anon + /** = authc + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring/springMVC-servlet.xml b/src/main/resources/spring/springMVC-servlet.xml new file mode 100644 index 0000000000000000000000000000000000000000..78d201ab49d253bf6521cfcd33c0cae2baf82f47 --- /dev/null +++ b/src/main/resources/spring/springMVC-servlet.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + text/html;charset=UTF-8 + application/json;charset=UTF-8 + + + + + QuoteFieldNames + WriteNullBooleanAsFalse + WriteDateUseDateFormat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/html; charset=UTF-8 + application/json;charset=UTF-8 + + + + + + + + text/html; charset=UTF-8 + application/json;charset=UTF-8 + + + + + + + + + + + + + + + + + + + + + + + + + + + redirect:/views/error.jsp + + + + + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..ac017b0d0decc01b30d525a4915663a588add456 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,123 @@ + + + disped-web + + + + springSessionRepositoryFilter + org.springframework.web.filter.DelegatingFilterProxy + + + springSessionRepositoryFilter + /* + + + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceRequestEncoding + true + + + + characterEncodingFilter + /* + + + + + springMVC + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:spring/springMVC-servlet.xml + + 1 + + + springMVC + / + + + + + + contextConfigLocation + classpath:spring/applicationContext.xml + + + + org.springframework.web.context.ContextLoaderListener + + + + + shiroFilter + org.springframework.web.filter.DelegatingFilterProxy + + targetFilterLifecycle + true + + + + shiroFilter + /* + + + + + + CORS + com.thetransactioncompany.cors.CORSFilter + + cors.allowOrigin + * + + + cors.supportedMethods + GET, POST, OPTIONS + + + cors.supportedHeaders + Accept, Origin, Authorization, Access-Control-Allow-Headers, X-Requested-With, X_Requested_With, Content-Type, Last-Modified + + + cors.exposedHeaders + Set-Cookie + + + cors.supportsCredentials + true + + + + CORS + /* + + + + + 60 + + + + + views/index.jsp + + + + + 404 + /404/error + + + diff --git a/src/main/webapp/resources/css/.DS_Store b/src/main/webapp/resources/css/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..73f2322e7a7392218334c6086a5d60e57befef9d Binary files /dev/null and b/src/main/webapp/resources/css/.DS_Store differ diff --git a/src/main/webapp/resources/css/bootstrap-responsive.min.css b/src/main/webapp/resources/css/bootstrap-responsive.min.css new file mode 100644 index 0000000000000000000000000000000000000000..05978601011d16a1473189fce9ce1090055af2ce --- /dev/null +++ b/src/main/webapp/resources/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/src/main/webapp/resources/css/bootstrap-wysihtml5.css b/src/main/webapp/resources/css/bootstrap-wysihtml5.css new file mode 100644 index 0000000000000000000000000000000000000000..d0b845e594eed50328f71516ba3ee58fc46ff963 --- /dev/null +++ b/src/main/webapp/resources/css/bootstrap-wysihtml5.css @@ -0,0 +1,102 @@ +ul.wysihtml5-toolbar { + margin: 0; + padding: 0; + display: block; +} + +ul.wysihtml5-toolbar::after { + clear: both; + display: table; + content: ""; +} + +ul.wysihtml5-toolbar > li { + float: left; + display: list-item; + list-style: none; + margin: 0 5px 10px 0; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] { + font-weight: bold; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] { + font-style: italic; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] { + text-decoration: underline; +} + +ul.wysihtml5-toolbar a.btn.wysihtml5-command-active { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + background-color: #E6E6E6; + background-color: #D9D9D9; + outline: 0; +} + +ul.wysihtml5-commands-disabled .dropdown-menu { + display: none !important; +} + +ul.wysihtml5-toolbar div.wysihtml5-colors { + display:block; + width: 50px; + height: 20px; + margin-top: 2px; + margin-left: 5px; + position: absolute; + pointer-events: none; +} + +ul.wysihtml5-toolbar a.wysihtml5-colors-title { + padding-left: 70px; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] { + background: black !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] { + background: silver !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] { + background: gray !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] { + background: maroon !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] { + background: red !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] { + background: purple !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] { + background: green !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] { + background: olive !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] { + background: navy !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] { + background: blue !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] { + background: orange !important; +} \ No newline at end of file diff --git a/src/main/webapp/resources/css/bootstrap.min.css b/src/main/webapp/resources/css/bootstrap.min.css new file mode 100644 index 0000000000000000000000000000000000000000..c9a1a590c9cc64aad30ed6e5839c12ce78498a8e --- /dev/null +++ b/src/main/webapp/resources/css/bootstrap.min.css @@ -0,0 +1 @@ +/*!* Bootstrap v2.3.0** Copyright 2012 Twitter, Inc* Licensed under the Apache License v2.0* http://www.apache.org/licenses/LICENSE-2.0** Designed and built with all the love in the world @twitter by @mdo and @fat.*/.clearfix {*zoom:1}.clearfix:before, .clearfix:after {display:table;line-height:0;content:""}.clearfix:after {clear:both}.hide-text {font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level {display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article, aside, details, figcaption, figure, footer, header, hgroup, nav, section {display:block}audio, canvas, video {display:inline-block;*display:inline;*zoom:1}audio:not([controls]) {display:none}html {font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus {outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover, a:active {outline:0}sub, sup {position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup {top:-0.5em}sub {bottom:-0.25em}img {width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img, .google-maps img {max-width:none}button, input, select, textarea {margin:0;font-size:100%;vertical-align:middle}button, input {*overflow:visible;line-height:normal}button::-moz-focus-inner, input::-moz-focus-inner {padding:0;border:0}button, html input[type="button"], input[type="reset"], input[type="submit"] {cursor:pointer;-webkit-appearance:button}label, select, button, input[type="button"], input[type="reset"], input[type="submit"], input[type="radio"], input[type="checkbox"] {cursor:pointer}input[type="search"] {-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button {-webkit-appearance:none}textarea {overflow:auto;vertical-align:top}@media print {* {color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a, a:visited {text-decoration:underline}a[href]:after {content:" (" attr(href) ")"}abbr[title]:after {content:" (" attr(title) ")"}.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after {content:""}pre, blockquote {border:1px solid #999;page-break-inside:avoid}thead {display:table-header-group}tr, img {page-break-inside:avoid}img {max-width:100%!important}@page {margin:.5cm}p, h2, h3 {orphans:3;widows:3}h2, h3 {page-break-after:avoid}}body {margin:0;font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a {color:#08c;text-decoration:none}a:hover, a:focus {color:#005580;text-decoration:underline}.img-rounded {-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid {padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle {-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row {margin-left:-20px;*zoom:1}.row:before, .row:after {display:table;line-height:0;content:""}.row:after {clear:both}[class*="span"] {float:left;min-height:1px;margin-left:20px}.container, .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container {width:940px}.span12 {width:940px}.span11 {width:860px}.span10 {width:780px}.span9 {width:700px}.span8 {width:620px}.span7 {width:540px}.span6 {width:460px}.span5 {width:380px}.span4 {width:300px}.span3 {width:220px}.span2 {width:140px}.span1 {width:60px}.offset12 {margin-left:980px}.offset11 {margin-left:900px}.offset10 {margin-left:820px}.offset9 {margin-left:740px}.offset8 {margin-left:660px}.offset7 {margin-left:580px}.offset6 {margin-left:500px}.offset5 {margin-left:420px}.offset4 {margin-left:340px}.offset3 {margin-left:260px}.offset2 {margin-left:180px}.offset1 {margin-left:100px}.row-fluid {width:100%;*zoom:1}.row-fluid:before, .row-fluid:after {display:table;line-height:0;content:""}.row-fluid:after {clear:both}.row-fluid [class*="span"] {display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child {margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"] {margin-left:2.127659574468085%}.row-fluid .span12 {width:100%;*width:99.94680851063829%}.row-fluid .span11 {width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10 {width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9 {width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8 {width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7 {width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6 {width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5 {width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4 {width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3 {width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2 {width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1 {width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12 {margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child {margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11 {margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child {margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10 {margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child {margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9 {margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child {margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8 {margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child {margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7 {margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child {margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6 {margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child {margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5 {margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child {margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4 {margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child {margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3 {margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child {margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2 {margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child {margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1 {margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child {margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide, .row-fluid [class*="span"].hide {display:none}[class*="span"].pull-right, .row-fluid [class*="span"].pull-right {float:right}.container {margin-right:auto;margin-left:auto;*zoom:1}.container:before, .container:after {display:table;line-height:0;content:""}.container:after {clear:both}.container-fluid {padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before, .container-fluid:after {display:table;line-height:0;content:""}.container-fluid:after {clear:both}p {margin:0 0 10px}.lead {margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small {font-size:85%}strong {font-weight:bold}em {font-style:italic}cite {font-style:normal}.muted {color:#999}a.muted:hover, a.muted:focus {color:#808080}.text-warning {color:#c09853}a.text-warning:hover, a.text-warning:focus {color:#a47e3c}.text-error {color:#b94a48}a.text-error:hover, a.text-error:focus {color:#953b39}.text-info {color:#3a87ad}a.text-info:hover, a.text-info:focus {color:#2d6987}.text-success {color:#468847}a.text-success:hover, a.text-success:focus {color:#356635}.text-left {text-align:left}.text-right {text-align:right}.text-center {text-align:center}h1, h2, h3, h4, h5, h6 {margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small, h2 small, h3 small, h4 small, h5 small, h6 small {font-weight:normal;line-height:1;color:#999}h1, h2, h3 {line-height:40px}h1 {font-size:38.5px}h2 {font-size:31.5px}h3 {font-size:24.5px}h4 {font-size:17.5px}h5 {font-size:14px}h6 {font-size:11.9px}h1 small {font-size:24.5px}h2 small {font-size:17.5px}h3 small {font-size:14px}h4 small {font-size:14px}.page-header {padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul, ol {padding:0;margin:0 0 10px 25px}ul ul, ul ol, ol ol, ol ul {margin-bottom:0}li {line-height:20px}ul.unstyled, ol.unstyled {margin-left:0;list-style:none}ul.inline, ol.inline {margin-left:0;list-style:none}ul.inline>li, ol.inline>li {display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl {margin-bottom:20px}dt, dd {line-height:20px}dt {font-weight:bold}dd {margin-left:10px}.dl-horizontal {*zoom:1}.dl-horizontal:before, .dl-horizontal:after {display:table;line-height:0;content:""}.dl-horizontal:after {clear:both}.dl-horizontal dt {float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd {margin-left:180px}hr {margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title], abbr[data-original-title] {cursor:help;border-bottom:1px dotted #999}abbr.initialism {font-size:90%;text-transform:uppercase}blockquote {padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p {margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small {display:block;line-height:20px;color:#999}blockquote small:before {content:'\2014 \00A0'}blockquote.pull-right {float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p, blockquote.pull-right small {text-align:right}blockquote.pull-right small:before {content:''}blockquote.pull-right small:after {content:'\00A0 \2014'}q:before, q:after, blockquote:before, blockquote:after {content:""}address {display:block;margin-bottom:20px;font-style:normal;line-height:20px}code, pre {padding:0 3px 2px;font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code {padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre {display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint {margin-bottom:20px}pre code {padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable {max-height:340px;overflow-y:scroll}form {margin:0 0 20px}fieldset {padding:0;margin:0;border:0}legend {display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small {font-size:15px;color:#999}label, input, button, select, textarea {font-size:14px;font-weight:normal;line-height:20px}input, button, select, textarea {font-family:"Helvetica Neue", Helvetica, Arial, sans-serif}label {display:block;margin-bottom:5px}select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input {display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input, textarea, .uneditable-input {width:206px}textarea {height:auto}textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input {background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s}textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, .uneditable-input:focus {border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgba(82,168,236,0.6)}input[type="radio"], input[type="checkbox"] {margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"], input[type="image"], input[type="submit"], input[type="reset"], input[type="button"], input[type="radio"], input[type="checkbox"] {width:auto}select, input[type="file"] {height:30px;*margin-top:4px;line-height:30px}select {width:70px;background-color:#fff;border:1px solid #ccc}select[multiple], select[size] {height:auto}select:focus, input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus {outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input, .uneditable-textarea {color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input {overflow:hidden;white-space:nowrap}.uneditable-textarea {width:auto;height:auto}input:-moz-placeholder, textarea:-moz-placeholder {color:#999}input:-ms-input-placeholder, textarea:-ms-input-placeholder {color:#999}input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {color:#999}.radio, .checkbox {min-height:20px;padding-left:20px}.radio input[type="radio"], .checkbox input[type="checkbox"] {float:left;margin-left:-20px}.controls>.radio:first-child, .controls>.checkbox:first-child {padding-top:5px}.radio.inline, .checkbox.inline {display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline, .checkbox.inline+.checkbox.inline {margin-left:10px}.input-mini {width:60px}.input-small {width:90px}.input-medium {width:150px}.input-large {width:210px}.input-xlarge {width:270px}.input-xxlarge {width:530px}input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input[class*="span"], .row-fluid input[class*="span"], .row-fluid select[class*="span"], .row-fluid textarea[class*="span"], .row-fluid .uneditable-input[class*="span"] {float:none;margin-left:0}.input-append input[class*="span"], .input-append .uneditable-input[class*="span"], .input-prepend input[class*="span"], .input-prepend .uneditable-input[class*="span"], .row-fluid input[class*="span"], .row-fluid select[class*="span"], .row-fluid textarea[class*="span"], .row-fluid .uneditable-input[class*="span"], .row-fluid .input-prepend [class*="span"], .row-fluid .input-append [class*="span"] {display:inline-block}input, textarea, .uneditable-input {margin-left:0}.controls-row [class*="span"]+[class*="span"] {margin-left:20px}input.span12, textarea.span12, .uneditable-input.span12 {width:926px}input.span11, textarea.span11, .uneditable-input.span11 {width:846px}input.span10, textarea.span10, .uneditable-input.span10 {width:766px}input.span9, textarea.span9, .uneditable-input.span9 {width:686px}input.span8, textarea.span8, .uneditable-input.span8 {width:606px}input.span7, textarea.span7, .uneditable-input.span7 {width:526px}input.span6, textarea.span6, .uneditable-input.span6 {width:446px}input.span5, textarea.span5, .uneditable-input.span5 {width:366px}input.span4, textarea.span4, .uneditable-input.span4 {width:286px}input.span3, textarea.span3, .uneditable-input.span3 {width:206px}input.span2, textarea.span2, .uneditable-input.span2 {width:126px}input.span1, textarea.span1, .uneditable-input.span1 {width:46px}.controls-row {*zoom:1}.controls-row:before, .controls-row:after {display:table;line-height:0;content:""}.controls-row:after {clear:both}.controls-row [class*="span"], .row-fluid .controls-row [class*="span"] {float:left}.controls-row .checkbox[class*="span"], .controls-row .radio[class*="span"] {padding-top:5px}input[disabled], select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] {cursor:not-allowed;background-color:#eee}input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"][readonly], input[type="checkbox"][readonly] {background-color:transparent}.control-group.warning .control-label, .control-group.warning .help-block, .control-group.warning .help-inline {color:#c09853}.control-group.warning .checkbox, .control-group.warning .radio, .control-group.warning input, .control-group.warning select, .control-group.warning textarea {color:#c09853}.control-group.warning input, .control-group.warning select, .control-group.warning textarea {border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus {border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on {color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label, .control-group.error .help-block, .control-group.error .help-inline {color:#b94a48}.control-group.error .checkbox, .control-group.error .radio, .control-group.error input, .control-group.error select, .control-group.error textarea {color:#b94a48}.control-group.error input, .control-group.error select, .control-group.error textarea {border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus {border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #d59392}.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on {color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label, .control-group.success .help-block, .control-group.success .help-inline {color:#468847}.control-group.success .checkbox, .control-group.success .radio, .control-group.success input, .control-group.success select, .control-group.success textarea {color:#468847}.control-group.success input, .control-group.success select, .control-group.success textarea {border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus {border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #7aba7b}.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on {color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label, .control-group.info .help-block, .control-group.info .help-inline {color:#3a87ad}.control-group.info .checkbox, .control-group.info .radio, .control-group.info input, .control-group.info select, .control-group.info textarea {color:#3a87ad}.control-group.info input, .control-group.info select, .control-group.info textarea {border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus, .control-group.info select:focus, .control-group.info textarea:focus {border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on, .control-group.info .input-append .add-on {color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid, textarea:focus:invalid, select:focus:invalid {color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus, textarea:focus:invalid:focus, select:focus:invalid:focus {border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions {padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before, .form-actions:after {display:table;line-height:0;content:""}.form-actions:after {clear:both}.help-block, .help-inline {color:#595959}.help-block {display:block;margin-bottom:10px}.help-inline {display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append, .input-prepend {display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input, .input-prepend input, .input-append select, .input-prepend select, .input-append .uneditable-input, .input-prepend .uneditable-input, .input-append .dropdown-menu, .input-prepend .dropdown-menu, .input-append .popover, .input-prepend .popover {font-size:14px}.input-append input, .input-prepend input, .input-append select, .input-prepend select, .input-append .uneditable-input, .input-prepend .uneditable-input {position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus, .input-prepend input:focus, .input-append select:focus, .input-prepend select:focus, .input-append .uneditable-input:focus, .input-prepend .uneditable-input:focus {z-index:2}.input-append .add-on, .input-prepend .add-on {display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on, .input-prepend .add-on, .input-append .btn, .input-prepend .btn, .input-append .btn-group>.dropdown-toggle, .input-prepend .btn-group>.dropdown-toggle {vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active, .input-prepend .active {background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on, .input-prepend .btn {margin-right:-1px}.input-prepend .add-on:first-child, .input-prepend .btn:first-child {-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input, .input-append select, .input-append .uneditable-input {-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child, .input-append select+.btn-group .btn:last-child, .input-append .uneditable-input+.btn-group .btn:last-child {-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on, .input-append .btn, .input-append .btn-group {margin-left:-1px}.input-append .add-on:last-child, .input-append .btn:last-child, .input-append .btn-group:last-child>.dropdown-toggle {-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input, .input-prepend.input-append select, .input-prepend.input-append .uneditable-input {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn, .input-prepend.input-append select+.btn-group .btn, .input-prepend.input-append .uneditable-input+.btn-group .btn {-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child, .input-prepend.input-append .btn:first-child {margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child, .input-prepend.input-append .btn:last-child {margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child {margin-left:0}input.search-query {padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query, .form-search .input-prepend .search-query {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query {-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn {-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query {-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn {-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input, .form-inline input, .form-horizontal input, .form-search textarea, .form-inline textarea, .form-horizontal textarea, .form-search select, .form-inline select, .form-horizontal select, .form-search .help-inline, .form-inline .help-inline, .form-horizontal .help-inline, .form-search .uneditable-input, .form-inline .uneditable-input, .form-horizontal .uneditable-input, .form-search .input-prepend, .form-inline .input-prepend, .form-horizontal .input-prepend, .form-search .input-append, .form-inline .input-append, .form-horizontal .input-append {display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide, .form-inline .hide, .form-horizontal .hide {display:none}.form-search label, .form-inline label, .form-search .btn-group, .form-inline .btn-group {display:inline-block}.form-search .input-append, .form-inline .input-append, .form-search .input-prepend, .form-inline .input-prepend {margin-bottom:0}.form-search .radio, .form-search .checkbox, .form-inline .radio, .form-inline .checkbox {padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"], .form-search .checkbox input[type="checkbox"], .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] {float:left;margin-right:3px;margin-left:0}.control-group {margin-bottom:10px}legend+.control-group {margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group {margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before, .form-horizontal .control-group:after {display:table;line-height:0;content:""}.form-horizontal .control-group:after {clear:both}.form-horizontal .control-label {float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls {*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child {*padding-left:180px}.form-horizontal .help-block {margin-bottom:0}.form-horizontal input+.help-block, .form-horizontal select+.help-block, .form-horizontal textarea+.help-block, .form-horizontal .uneditable-input+.help-block, .form-horizontal .input-prepend+.help-block, .form-horizontal .input-append+.help-block {margin-top:10px}.form-horizontal .form-actions {padding-left:180px}table {max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table {width:100%;margin-bottom:20px}.table th, .table td {padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th {font-weight:bold}.table thead th {vertical-align:bottom}.table caption+thead tr:first-child th, .table caption+thead tr:first-child td, .table colgroup+thead tr:first-child th, .table colgroup+thead tr:first-child td, .table thead:first-child tr:first-child th, .table thead:first-child tr:first-child td {border-top:0}.table tbody+tbody {border-top:2px solid #ddd}.table .table {background-color:#fff}.table-condensed th, .table-condensed td {padding:4px 5px}.table-bordered {border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th, .table-bordered td {border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th, .table-bordered caption+tbody tr:first-child th, .table-bordered caption+tbody tr:first-child td, .table-bordered colgroup+thead tr:first-child th, .table-bordered colgroup+tbody tr:first-child th, .table-bordered colgroup+tbody tr:first-child td, .table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td {border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child, .table-bordered tbody:first-child tr:first-child>td:first-child, .table-bordered tbody:first-child tr:first-child>th:first-child {-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child, .table-bordered tbody:first-child tr:first-child>td:last-child, .table-bordered tbody:first-child tr:first-child>th:last-child {-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child, .table-bordered tbody:last-child tr:last-child>td:first-child, .table-bordered tbody:last-child tr:last-child>th:first-child, .table-bordered tfoot:last-child tr:last-child>td:first-child, .table-bordered tfoot:last-child tr:last-child>th:first-child {-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child, .table-bordered tbody:last-child tr:last-child>td:last-child, .table-bordered tbody:last-child tr:last-child>th:last-child, .table-bordered tfoot:last-child tr:last-child>td:last-child, .table-bordered tfoot:last-child tr:last-child>th:last-child {-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child {-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child {-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child, .table-bordered caption+tbody tr:first-child td:first-child, .table-bordered colgroup+thead tr:first-child th:first-child, .table-bordered colgroup+tbody tr:first-child td:first-child {-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child, .table-bordered caption+tbody tr:first-child td:last-child, .table-bordered colgroup+thead tr:first-child th:last-child, .table-bordered colgroup+tbody tr:first-child td:last-child {-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td, .table-striped tbody>tr:nth-child(odd)>th {background-color:#f9f9f9}.table-hover tbody tr:hover>td, .table-hover tbody tr:hover>th {background-color:#f5f5f5}table td[class*="span"], table th[class*="span"], .row-fluid table td[class*="span"], .row-fluid table th[class*="span"] {display:table-cell;float:none;margin-left:0}.table td.span1, .table th.span1 {float:none;width:44px;margin-left:0}.table td.span2, .table th.span2 {float:none;width:124px;margin-left:0}.table td.span3, .table th.span3 {float:none;width:204px;margin-left:0}.table td.span4, .table th.span4 {float:none;width:284px;margin-left:0}.table td.span5, .table th.span5 {float:none;width:364px;margin-left:0}.table td.span6, .table th.span6 {float:none;width:444px;margin-left:0}.table td.span7, .table th.span7 {float:none;width:524px;margin-left:0}.table td.span8, .table th.span8 {float:none;width:604px;margin-left:0}.table td.span9, .table th.span9 {float:none;width:684px;margin-left:0}.table td.span10, .table th.span10 {float:none;width:764px;margin-left:0}.table td.span11, .table th.span11 {float:none;width:844px;margin-left:0}.table td.span12, .table th.span12 {float:none;width:924px;margin-left:0}.table tbody tr.success>td {background-color:#dff0d8}.table tbody tr.error>td {background-color:#f2dede}.table tbody tr.warning>td {background-color:#fcf8e3}.table tbody tr.info>td {background-color:#d9edf7}.table-hover tbody tr.success:hover>td {background-color:#d0e9c6}.table-hover tbody tr.error:hover>td {background-color:#ebcccc}.table-hover tbody tr.warning:hover>td {background-color:#faf2cc}.table-hover tbody tr.info:hover>td {background-color:#c4e3f3}[class^="icon-"], [class*=" icon-"] {display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top; background-image:url("../img/glyphicons-halflings.html");background-position:14px 14px;background-repeat:no-repeat}.icon-white, .nav-pills>.active>a>[class^="icon-"], .nav-pills>.active>a>[class*=" icon-"], .nav-list>.active>a>[class^="icon-"], .nav-list>.active>a>[class*=" icon-"], .navbar-inverse .nav>.active>a>[class^="icon-"], .navbar-inverse .nav>.active>a>[class*=" icon-"], .dropdown-menu>li>a:hover>[class^="icon-"], .dropdown-menu>li>a:focus>[class^="icon-"], .dropdown-menu>li>a:hover>[class*=" icon-"], .dropdown-menu>li>a:focus>[class*=" icon-"], .dropdown-menu>.active>a>[class^="icon-"], .dropdown-menu>.active>a>[class*=" icon-"], .dropdown-submenu:hover>a>[class^="icon-"], .dropdown-submenu:focus>a>[class^="icon-"], .dropdown-submenu:hover>a>[class*=" icon-"], .dropdown-submenu:focus>a>[class*=" icon-"] {background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass {background-position:0 0}.icon-music {background-position:-24px 0}.icon-search {background-position:-48px 0}.icon-envelope {background-position:-72px 0}.icon-heart {background-position:-96px 0}.icon-star {background-position:-120px 0}.icon-star-empty {background-position:-144px 0}.icon-user {background-position:-168px 0}.icon-film {background-position:-192px 0}.icon-th-large {background-position:-216px 0}.icon-th {background-position:-240px 0}.icon-th-list {background-position:-264px 0}.icon-ok {background-position:-288px 0}.icon-remove {background-position:-312px 0}.icon-zoom-in {background-position:-336px 0}.icon-zoom-out {background-position:-360px 0}.icon-off {background-position:-384px 0}.icon-signal {background-position:-408px 0}.icon-cog {background-position:-432px 0}.icon-trash {background-position:-456px 0}.icon-home {background-position:0 -24px}.icon-file {background-position:-24px -24px}.icon-time {background-position:-48px -24px}.icon-road {background-position:-72px -24px}.icon-download-alt {background-position:-96px -24px}.icon-download {background-position:-120px -24px}.icon-upload {background-position:-144px -24px}.icon-inbox {background-position:-168px -24px}.icon-play-circle {background-position:-192px -24px}.icon-repeat {background-position:-216px -24px}.icon-refresh {background-position:-240px -24px}.icon-list-alt {background-position:-264px -24px}.icon-lock {background-position:-287px -24px}.icon-flag {background-position:-312px -24px}.icon-headphones {background-position:-336px -24px}.icon-volume-off {background-position:-360px -24px}.icon-volume-down {background-position:-384px -24px}.icon-volume-up {background-position:-408px -24px}.icon-qrcode {background-position:-432px -24px}.icon-barcode {background-position:-456px -24px}.icon-tag {background-position:0 -48px}.icon-tags {background-position:-25px -48px}.icon-book {background-position:-48px -48px}.icon-bookmark {background-position:-72px -48px}.icon-print {background-position:-96px -48px}.icon-camera {background-position:-120px -48px}.icon-font {background-position:-144px -48px}.icon-bold {background-position:-167px -48px}.icon-italic {background-position:-192px -48px}.icon-text-height {background-position:-216px -48px}.icon-text-width {background-position:-240px -48px}.icon-align-left {background-position:-264px -48px}.icon-align-center {background-position:-288px -48px}.icon-align-right {background-position:-312px -48px}.icon-align-justify {background-position:-336px -48px}.icon-list {background-position:-360px -48px}.icon-indent-left {background-position:-384px -48px}.icon-indent-right {background-position:-408px -48px}.icon-facetime-video {background-position:-432px -48px}.icon-picture {background-position:-456px -48px}.icon-pencil {background-position:0 -72px}.icon-map-marker {background-position:-24px -72px}.icon-adjust {background-position:-48px -72px}.icon-tint {background-position:-72px -72px}.icon-edit {background-position:-96px -72px}.icon-share {background-position:-120px -72px}.icon-check {background-position:-144px -72px}.icon-move {background-position:-168px -72px}.icon-step-backward {background-position:-192px -72px}.icon-fast-backward {background-position:-216px -72px}.icon-backward {background-position:-240px -72px}.icon-play {background-position:-264px -72px}.icon-pause {background-position:-288px -72px}.icon-stop {background-position:-312px -72px}.icon-forward {background-position:-336px -72px}.icon-fast-forward {background-position:-360px -72px}.icon-step-forward {background-position:-384px -72px}.icon-eject {background-position:-408px -72px}.icon-chevron-left {background-position:-432px -72px}.icon-chevron-right {background-position:-456px -72px}.icon-plus-sign {background-position:0 -96px}.icon-minus-sign {background-position:-24px -96px}.icon-remove-sign {background-position:-48px -96px}.icon-ok-sign {background-position:-72px -96px}.icon-question-sign {background-position:-96px -96px}.icon-info-sign {background-position:-120px -96px}.icon-screenshot {background-position:-144px -96px}.icon-remove-circle {background-position:-168px -96px}.icon-ok-circle {background-position:-192px -96px}.icon-ban-circle {background-position:-216px -96px}.icon-arrow-left {background-position:-240px -96px}.icon-arrow-right {background-position:-264px -96px}.icon-arrow-up {background-position:-289px -96px}.icon-arrow-down {background-position:-312px -96px}.icon-share-alt {background-position:-336px -96px}.icon-resize-full {background-position:-360px -96px}.icon-resize-small {background-position:-384px -96px}.icon-plus {background-position:-408px -96px}.icon-minus {background-position:-433px -96px}.icon-asterisk {background-position:-456px -96px}.icon-exclamation-sign {background-position:0 -120px}.icon-gift {background-position:-24px -120px}.icon-leaf {background-position:-48px -120px}.icon-fire {background-position:-72px -120px}.icon-eye-open {background-position:-96px -120px}.icon-eye-close {background-position:-120px -120px}.icon-warning-sign {background-position:-144px -120px}.icon-plane {background-position:-168px -120px}.icon-calendar {background-position:-192px -120px}.icon-random {width:16px;background-position:-216px -120px}.icon-comment {background-position:-240px -120px}.icon-magnet {background-position:-264px -120px}.icon-chevron-up {background-position:-288px -120px}.icon-chevron-down {background-position:-313px -119px}.icon-retweet {background-position:-336px -120px}.icon-shopping-cart {background-position:-360px -120px}.icon-folder-close {width:16px;background-position:-384px -120px}.icon-folder-open {width:16px;background-position:-408px -120px}.icon-resize-vertical {background-position:-432px -119px}.icon-resize-horizontal {background-position:-456px -118px}.icon-hdd {background-position:0 -144px}.icon-bullhorn {background-position:-24px -144px}.icon-bell {background-position:-48px -144px}.icon-certificate {background-position:-72px -144px}.icon-thumbs-up {background-position:-96px -144px}.icon-thumbs-down {background-position:-120px -144px}.icon-hand-right {background-position:-144px -144px}.icon-hand-left {background-position:-168px -144px}.icon-hand-up {background-position:-192px -144px}.icon-hand-down {background-position:-216px -144px}.icon-circle-arrow-right {background-position:-240px -144px}.icon-circle-arrow-left {background-position:-264px -144px}.icon-circle-arrow-up {background-position:-288px -144px}.icon-circle-arrow-down {background-position:-312px -144px}.icon-globe {background-position:-336px -144px}.icon-wrench {background-position:-360px -144px}.icon-tasks {background-position:-384px -144px}.icon-filter {background-position:-408px -144px}.icon-briefcase {background-position:-432px -144px}.icon-fullscreen {background-position:-456px -144px}.dropup, .dropdown {position:relative}.dropdown-toggle {*margin-bottom:-3px}.dropdown-toggle:active, .open .dropdown-toggle {outline:0}.caret {display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret {margin-top:8px;margin-left:2px}.dropdown-menu {position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right {right:0;left:auto}.dropdown-menu .divider {*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a {display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus, .dropdown-submenu:hover>a, .dropdown-submenu:focus>a {color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top, #08c, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0077b3));background-image:-webkit-linear-gradient(top, #08c, #0077b3);background-image:-o-linear-gradient(top, #08c, #0077b3);background-image:linear-gradient(to bottom, #08c, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu>.active>a, .dropdown-menu>.active>a:hover, .dropdown-menu>.active>a:focus {color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top, #08c, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0077b3));background-image:-webkit-linear-gradient(top, #08c, #0077b3);background-image:-o-linear-gradient(top, #08c, #0077b3);background-image:linear-gradient(to bottom, #08c, #0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu>.disabled>a, .dropdown-menu>.disabled>a:hover, .dropdown-menu>.disabled>a:focus {color:#999}.dropdown-menu>.disabled>a:hover, .dropdown-menu>.disabled>a:focus {text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open {*z-index:1000}.open>.dropdown-menu {display:block}.pull-right>.dropdown-menu {right:0;left:auto}.dropup .caret, .navbar-fixed-bottom .dropdown .caret {border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu {top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu {position:relative}.dropdown-submenu>.dropdown-menu {top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu {display:block}.dropup .dropdown-submenu>.dropdown-menu {top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after {display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after {border-left-color:#fff}.dropdown-submenu.pull-left {float:none}.dropdown-submenu.pull-left>.dropdown-menu {left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header {padding-right:20px;padding-left:20px}.typeahead {z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well {min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote {border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large {padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small {padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade {opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in {opacity:1}.collapse {position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in {height:auto}.close {float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover, .close:focus {color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close {padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn {display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2), 0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2), 0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2), 0 1px 2px rgba(0,0,0,0.05)}.btn:hover, .btn:focus, .btn:active, .btn.active, .btn.disabled, .btn[disabled] {color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active, .btn.active {background-color:#ccc \9}.btn:first-child {*margin-left:0}.btn:hover, .btn:focus {color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus {outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active, .btn:active {background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15), 0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15), 0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15), 0 1px 2px rgba(0,0,0,0.05)}.btn.disabled, .btn[disabled] {cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large {padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"], .btn-large [class*=" icon-"] {margin-top:4px}.btn-small {padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"], .btn-small [class*=" icon-"] {margin-top:0}.btn-mini [class^="icon-"], .btn-mini [class*=" icon-"] {margin-top:-1px}.btn-mini {padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block {display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block {margin-top:5px}input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block {width:100%}.btn-primary.active, .btn-warning.active, .btn-danger.active, .btn-success.active, .btn-info.active, .btn-inverse.active {color:rgba(255,255,255,0.75)}.btn-primary {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(to bottom, #08c, #04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] {color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active, .btn-primary.active {background-color:#039 \9}.btn-warning {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .btn-warning.disabled, .btn-warning[disabled] {color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active, .btn-warning.active {background-color:#c67605 \9}.btn-danger {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .btn-danger.disabled, .btn-danger[disabled] {color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active, .btn-danger.active {background-color:#942a25 \9}.btn-success {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .btn-success.disabled, .btn-success[disabled] {color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active, .btn-success.active {background-color:#408140 \9}.btn-info {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .btn-info.disabled, .btn-info[disabled] {color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active, .btn-info.active {background-color:#24748c \9}.btn-inverse {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top, #444, #222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222));background-image:-webkit-linear-gradient(top, #444, #222);background-image:-o-linear-gradient(top, #444, #222);background-image:linear-gradient(to bottom, #444, #222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover, .btn-inverse:focus, .btn-inverse:active, .btn-inverse.active, .btn-inverse.disabled, .btn-inverse[disabled] {color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active, .btn-inverse.active {background-color:#080808 \9}button.btn, input[type="submit"].btn {*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner {padding:0;border:0}button.btn.btn-large, input[type="submit"].btn.btn-large {*padding-top:7px;*padding-bottom:7px}button.btn.btn-small, input[type="submit"].btn.btn-small {*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini, input[type="submit"].btn.btn-mini {*padding-top:1px;*padding-bottom:1px}.btn-link, .btn-link:active, .btn-link[disabled] {background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link {color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover, .btn-link:focus {color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover, .btn-link[disabled]:focus {color:#333;text-decoration:none}.btn-group {position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child {*margin-left:0}.btn-group+.btn-group {margin-left:5px}.btn-toolbar {margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn, .btn-toolbar>.btn-group+.btn, .btn-toolbar>.btn+.btn-group {margin-left:5px}.btn-group>.btn {position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn {margin-left:-1px}.btn-group>.btn, .btn-group>.dropdown-menu, .btn-group>.popover {font-size:14px}.btn-group>.btn-mini {font-size:10.5px}.btn-group>.btn-small {font-size:11.9px}.btn-group>.btn-large {font-size:17.5px}.btn-group>.btn:first-child {margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child, .btn-group>.dropdown-toggle {-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child {margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child, .btn-group>.large.dropdown-toggle {-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover, .btn-group>.btn:focus, .btn-group>.btn:active, .btn-group>.btn.active {z-index:2}.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle {outline:0}.btn-group>.btn+.dropdown-toggle {*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125), inset 0 1px 0 rgba(255,255,255,0.2), 0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125), inset 0 1px 0 rgba(255,255,255,0.2), 0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125), inset 0 1px 0 rgba(255,255,255,0.2), 0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle {*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle {*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle {*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle {background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15), 0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15), 0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15), 0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle {background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle {background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle {background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle {background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle {background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle {background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle {background-color:#222}.btn .caret {margin-top:8px;margin-left:0}.btn-large .caret {margin-top:6px}.btn-large .caret {border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret, .btn-small .caret {margin-top:8px}.dropup .btn-large .caret {border-bottom-width:5px}.btn-primary .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret, .btn-success .caret, .btn-inverse .caret {border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical {display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn {display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn {margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child {-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child {-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child {-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child {-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert {padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert, .alert h4 {color:#c09853}.alert h4 {margin:0}.alert .close {position:relative;top:-2px;right:-21px;line-height:20px}.alert-success {color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4 {color:#468847}.alert-danger, .alert-error {color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4, .alert-error h4 {color:#b94a48}.alert-info {color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4 {color:#3a87ad}.alert-block {padding-top:14px;padding-bottom:14px}.alert-block>p, .alert-block>ul {margin-bottom:0}.alert-block p+p {margin-top:5px}.nav {margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a {display:block}.nav>li>a:hover, .nav>li>a:focus {text-decoration:none;background-color:#eee}.nav>li>a>img {max-width:none}.nav>.pull-right {float:right}.nav-header {display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header {margin-top:9px}.nav-list {padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a, .nav-list .nav-header {margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a {padding:3px 15px}.nav-list>.active>a, .nav-list>.active>a:hover, .nav-list>.active>a:focus {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"], .nav-list [class*=" icon-"] {margin-right:2px}.nav-list .divider {*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs, .nav-pills {*zoom:1}.nav-tabs:before, .nav-pills:before, .nav-tabs:after, .nav-pills:after {display:table;line-height:0;content:""}.nav-tabs:after, .nav-pills:after {clear:both}.nav-tabs>li, .nav-pills>li {float:left}.nav-tabs>li>a, .nav-pills>li>a {padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs {border-bottom:1px solid #ddd}.nav-tabs>li {margin-bottom:-1px}.nav-tabs>li>a {padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover, .nav-tabs>li>a:focus {border-color:#eee #eee #ddd}.nav-tabs>.active>a, .nav-tabs>.active>a:hover, .nav-tabs>.active>a:focus {color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a {padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a, .nav-pills>.active>a:hover, .nav-pills>.active>a:focus {color:#fff;background-color:#08c}.nav-stacked>li {float:none}.nav-stacked>li>a {margin-right:0}.nav-tabs.nav-stacked {border-bottom:0}.nav-tabs.nav-stacked>li>a {border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a {-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a {-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover, .nav-tabs.nav-stacked>li>a:focus {z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a {margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a {margin-bottom:1px}.nav-tabs .dropdown-menu {-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu {-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret {margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret, .nav .dropdown-toggle:focus .caret {border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret {margin-top:8px}.nav .active .dropdown-toggle .caret {border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret {border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover, .nav>.dropdown.active>a:focus {cursor:pointer}.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav>li.dropdown.open.active>a:hover, .nav>li.dropdown.open.active>a:focus {color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret, .nav li.dropdown.open.active .caret, .nav li.dropdown.open a:hover .caret, .nav li.dropdown.open a:focus .caret {border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover, .tabs-stacked .open>a:focus {border-color:#999}.tabbable {*zoom:1}.tabbable:before, .tabbable:after {display:table;line-height:0;content:""}.tabbable:after {clear:both}.tab-content {overflow:auto}.tabs-below>.nav-tabs, .tabs-right>.nav-tabs, .tabs-left>.nav-tabs {border-bottom:0}.tab-content>.tab-pane, .pill-content>.pill-pane {display:none}.tab-content>.active, .pill-content>.active {display:block}.tabs-below>.nav-tabs {border-top:1px solid #ddd}.tabs-below>.nav-tabs>li {margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a {-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover, .tabs-below>.nav-tabs>li>a:focus {border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a, .tabs-below>.nav-tabs>.active>a:hover, .tabs-below>.nav-tabs>.active>a:focus {border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li, .tabs-right>.nav-tabs>li {float:none}.tabs-left>.nav-tabs>li>a, .tabs-right>.nav-tabs>li>a {min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs {float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a {margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover, .tabs-left>.nav-tabs>li>a:focus {border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a, .tabs-left>.nav-tabs .active>a:hover, .tabs-left>.nav-tabs .active>a:focus {border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs {float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a {margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover, .tabs-right>.nav-tabs>li>a:focus {border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a, .tabs-right>.nav-tabs .active>a:hover, .tabs-right>.nav-tabs .active>a:focus {border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a {color:#999}.nav>.disabled>a:hover, .nav>.disabled>a:focus {text-decoration:none;cursor:default;background-color:transparent}.navbar {*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner {min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #fff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #fff, #f2f2f2);background-image:-o-linear-gradient(top, #fff, #f2f2f2);background-image:linear-gradient(to bottom, #fff, #f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before, .navbar-inner:after {display:table;line-height:0;content:""}.navbar-inner:after {clear:both}.navbar .container {width:auto}.nav-collapse.collapse {height:auto;overflow:visible}.navbar .brand {display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover, .navbar .brand:focus {text-decoration:none}.navbar-text {margin-bottom:0;line-height:40px;color:#777}.navbar-link {color:#777}.navbar-link:hover, .navbar-link:focus {color:#333}.navbar .divider-vertical {height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn, .navbar .btn-group {margin-top:5px}.navbar .btn-group .btn, .navbar .input-prepend .btn, .navbar .input-append .btn, .navbar .input-prepend .btn-group, .navbar .input-append .btn-group {margin-top:0}.navbar-form {margin-bottom:0;*zoom:1}.navbar-form:before, .navbar-form:after {display:table;line-height:0;content:""}.navbar-form:after {clear:both}.navbar-form input, .navbar-form select, .navbar-form .radio, .navbar-form .checkbox {margin-top:5px}.navbar-form input, .navbar-form select, .navbar-form .btn {display:inline-block;margin-bottom:0}.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] {margin-top:3px}.navbar-form .input-append, .navbar-form .input-prepend {margin-top:5px;white-space:nowrap}.navbar-form .input-append input, .navbar-form .input-prepend input {margin-top:0}.navbar-search {position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query {padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top {position:static;margin-bottom:0}.navbar-static-top .navbar-inner {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top, .navbar-fixed-bottom {position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner, .navbar-static-top .navbar-inner {border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner {border-width:1px 0 0}.navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container {width:940px}.navbar-fixed-top {top:0}.navbar-fixed-top .navbar-inner, .navbar-static-top .navbar-inner {-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom {bottom:0}.navbar-fixed-bottom .navbar-inner {-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav {position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right {float:right;margin-right:0}.navbar .nav>li {float:left}.navbar .nav>li>a {float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret {margin-top:8px}.navbar .nav>li>a:focus, .navbar .nav>li>a:hover {color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a, .navbar .nav>.active>a:hover, .navbar .nav>.active>a:focus {color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar {display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover, .navbar .btn-navbar:focus, .navbar .btn-navbar:active, .navbar .btn-navbar.active, .navbar .btn-navbar.disabled, .navbar .btn-navbar[disabled] {color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active, .navbar .btn-navbar.active {background-color:#ccc \9}.navbar .btn-navbar .icon-bar {display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar {margin-top:3px}.navbar .nav>li>.dropdown-menu:before {position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after {position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before {top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after {top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret, .navbar .nav li.dropdown>a:focus .caret {border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle, .navbar .nav li.dropdown.active>.dropdown-toggle, .navbar .nav li.dropdown.open.active>.dropdown-toggle {color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret {border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret, .navbar .nav li.dropdown.active>.dropdown-toggle .caret, .navbar .nav li.dropdown.open.active>.dropdown-toggle .caret {border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu, .navbar .nav>li>.dropdown-menu.pull-right {right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before, .navbar .nav>li>.dropdown-menu.pull-right:before {right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after, .navbar .nav>li>.dropdown-menu.pull-right:after {right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu, .navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu {right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner {background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222, #111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222), to(#111));background-image:-webkit-linear-gradient(top, #222, #111);background-image:-o-linear-gradient(top, #222, #111);background-image:linear-gradient(to bottom, #222, #111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0)}.navbar-inverse .brand, .navbar-inverse .nav>li>a {color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover, .navbar-inverse .nav>li>a:hover, .navbar-inverse .brand:focus, .navbar-inverse .nav>li>a:focus {color:#fff}.navbar-inverse .brand {color:#999}.navbar-inverse .navbar-text {color:#999}.navbar-inverse .nav>li>a:focus, .navbar-inverse .nav>li>a:hover {color:#fff;background-color:transparent}.navbar-inverse .nav .active>a, .navbar-inverse .nav .active>a:hover, .navbar-inverse .nav .active>a:focus {color:#fff;background-color:#111}.navbar-inverse .navbar-link {color:#999}.navbar-inverse .navbar-link:hover, .navbar-inverse .navbar-link:focus {color:#fff}.navbar-inverse .divider-vertical {border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle, .navbar-inverse .nav li.dropdown.active>.dropdown-toggle, .navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle {color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret, .navbar-inverse .nav li.dropdown>a:focus .caret {border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret {border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret, .navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret, .navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret {border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query {color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1), 0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1), 0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1), 0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder {color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {color:#ccc}.navbar-inverse .navbar-search .search-query:focus, .navbar-inverse .navbar-search .search-query.focused {padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar {color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover, .navbar-inverse .btn-navbar:focus, .navbar-inverse .btn-navbar:active, .navbar-inverse .btn-navbar.active, .navbar-inverse .btn-navbar.disabled, .navbar-inverse .btn-navbar[disabled] {color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active, .navbar-inverse .btn-navbar.active {background-color:#000 \9}.breadcrumb {padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li {display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider {padding:0 5px;color:#ccc}.breadcrumb>.active {color:#999}.pagination {margin:20px 0}.pagination ul {display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li {display:inline}.pagination ul>li>a, .pagination ul>li>span {float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover, .pagination ul>li>a:focus, .pagination ul>.active>a, .pagination ul>.active>span {background-color:#f5f5f5}.pagination ul>.active>a, .pagination ul>.active>span {color:#999;cursor:default}.pagination ul>.disabled>span, .pagination ul>.disabled>a, .pagination ul>.disabled>a:hover, .pagination ul>.disabled>a:focus {color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a, .pagination ul>li:first-child>span {border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a, .pagination ul>li:last-child>span {-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered {text-align:center}.pagination-right {text-align:right}.pagination-large ul>li>a, .pagination-large ul>li>span {padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a, .pagination-large ul>li:first-child>span {-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a, .pagination-large ul>li:last-child>span {-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a, .pagination-small ul>li:first-child>a, .pagination-mini ul>li:first-child>span, .pagination-small ul>li:first-child>span {-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a, .pagination-small ul>li:last-child>a, .pagination-mini ul>li:last-child>span, .pagination-small ul>li:last-child>span {-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a, .pagination-small ul>li>span {padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a, .pagination-mini ul>li>span {padding:0 6px;font-size:10.5px}.pager {margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before, .pager:after {display:table;line-height:0;content:""}.pager:after {clear:both}.pager li {display:inline}.pager li>a, .pager li>span {display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover, .pager li>a:focus {text-decoration:none;background-color:#f5f5f5}.pager .next>a, .pager .next>span {float:right}.pager .previous>a, .pager .previous>span {float:left}.pager .disabled>a, .pager .disabled>a:hover, .pager .disabled>a:focus, .pager .disabled>span {color:#999;cursor:default;background-color:#fff}.modal-backdrop {position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade {opacity:0}.modal-backdrop, .modal-backdrop.fade.in {opacity:.8;filter:alpha(opacity=80)}.modal {position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade {top:-25%;-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out}.modal.fade.in {top:10%}.modal-header {padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close {margin-top:2px}.modal-header h3 {margin:0;line-height:30px}.modal-body {position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form {margin-bottom:0}.modal-footer {padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before, .modal-footer:after {display:table;line-height:0;content:""}.modal-footer:after {clear:both}.modal-footer .btn+.btn {margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn {margin-left:-1px}.modal-footer .btn-block+.btn-block {margin-left:0}.tooltip {position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in {opacity:.8;filter:alpha(opacity=80)}.tooltip.top {padding:5px 0;margin-top:-3px}.tooltip.right {padding:0 5px;margin-left:3px}.tooltip.bottom {padding:5px 0;margin-top:3px}.tooltip.left {padding:0 5px;margin-left:-3px}.tooltip-inner {max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow {position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow {bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow {top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow {top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow {top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover {position:absolute;top:0;left:0;z-index:1010;display:none;min-width:200px;max-width:200px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top {margin-top:-10px}.popover.right {margin-left:10px}.popover.bottom {margin-top:10px}.popover.left {margin-left:-10px}.popover-title {padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty {display:none}.popover-content {padding:9px 14px}.popover .arrow, .popover .arrow:after {position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow {border-width:11px}.popover .arrow:after {border-width:10px;content:""}.popover.top .arrow {bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after {bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow {top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after {bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow {top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after {top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow {top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after {right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails {margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before, .thumbnails:after {display:table;line-height:0;content:""}.thumbnails:after {clear:both}.row-fluid .thumbnails {margin-left:0}.thumbnails>li {float:left;margin-bottom:20px;margin-left:20px}.thumbnail {display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover, a.thumbnail:focus {border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img {display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption {padding:9px;color:#555}.media, .media-body {overflow:hidden;*overflow:visible;zoom:1}.media, .media .media {margin-top:15px}.media:first-child {margin-top:0}.media-object {display:block}.media-heading {margin:0 0 5px}.media>.pull-left {margin-right:10px}.media>.pull-right {margin-left:10px}.media-list {margin-left:0;list-style:none}.label, .badge {display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label {-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge {padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty, .badge:empty {display:none}a.label:hover, a.label:focus, a.badge:hover, a.badge:focus {color:#fff;text-decoration:none;cursor:pointer}.label-important, .badge-important {background-color:#b94a48}.label-important[href], .badge-important[href] {background-color:#953b39}.label-warning, .badge-warning {background-color:#f89406}.label-warning[href], .badge-warning[href] {background-color:#c67605}.label-success, .badge-success {background-color:#468847}.label-success[href], .badge-success[href] {background-color:#356635}.label-info, .badge-info {background-color:#3a87ad}.label-info[href], .badge-info[href] {background-color:#2d6987}.label-inverse, .badge-inverse {background-color:#333}.label-inverse[href], .badge-inverse[href] {background-color:#1a1a1a}.btn .label, .btn .badge {position:relative;top:-1px}.btn-mini .label, .btn-mini .badge {top:0}@-webkit-keyframes progress-bar-stripes {from {background-position:40px 0}to {background-position:0 0}}@-moz-keyframes progress-bar-stripes {from {background-position:40px 0}to {background-position:0 0}}@-ms-keyframes progress-bar-stripes {from {background-position:40px 0}to {background-position:0 0}}@-o-keyframes progress-bar-stripes {from {background-position:0 0}to {background-position:40px 0}}@keyframes progress-bar-stripes {from {background-position:40px 0}to {background-position:0 0}}.progress {height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar {float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar {-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15), inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15), inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15), inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar {background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar {-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar, .progress .bar-danger {background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0)}.progress-danger.progress-striped .bar, .progress-striped .bar-danger {background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-success .bar, .progress .bar-success {background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0)}.progress-success.progress-striped .bar, .progress-striped .bar-success {background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-info .bar, .progress .bar-info {background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0)}.progress-info.progress-striped .bar, .progress-striped .bar-info {background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-warning .bar, .progress .bar-warning {background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0)}.progress-warning.progress-striped .bar, .progress-striped .bar-warning {background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.accordion {margin-bottom:20px}.accordion-group {margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading {border-bottom:0}.accordion-heading .accordion-toggle {display:block;padding:8px 15px}.accordion-toggle {cursor:pointer}.accordion-inner {padding:9px 15px;border-top:1px solid #e5e5e5}.carousel {position:relative;margin-bottom:20px;line-height:1}.carousel-inner {position:relative;width:100%;overflow:hidden}.carousel-inner>.item {position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img, .carousel-inner>.item>a>img {display:block;line-height:1}.carousel-inner>.active, .carousel-inner>.next, .carousel-inner>.prev {display:block}.carousel-inner>.active {left:0}.carousel-inner>.next, .carousel-inner>.prev {position:absolute;top:0;width:100%}.carousel-inner>.next {left:100%}.carousel-inner>.prev {left:-100%}.carousel-inner>.next.left, .carousel-inner>.prev.right {left:0}.carousel-inner>.active.left {left:-100%}.carousel-inner>.active.right {left:100%}.carousel-control {position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right {right:15px;left:auto}.carousel-control:hover, .carousel-control:focus {color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators {position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li {display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active {background-color:#fff}.carousel-caption {position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4, .carousel-caption p {line-height:20px;color:#fff}.carousel-caption h4 {margin:0 0 5px}.carousel-caption p {margin-bottom:0}.hero-unit {padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1 {margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li {line-height:30px}.pull-right {float:right}.pull-left {float:left}.hide {display:none}.show {display:block}.invisible {visibility:hidden}.affix {position:fixed} \ No newline at end of file diff --git a/src/main/webapp/resources/css/colorpicker.css b/src/main/webapp/resources/css/colorpicker.css new file mode 100644 index 0000000000000000000000000000000000000000..da77e450712c3150d162dca3dbd07dfce15af120 --- /dev/null +++ b/src/main/webapp/resources/css/colorpicker.css @@ -0,0 +1,115 @@ +/* + Colorpicker for Bootstrap + Copyright 2012 Stefan Petre + Licensed under the Apache License v2.0 + http://www.apache.org/licenses/LICENSE-2.0 +*/ + .colorpicker-saturation { + width: 100px; + height: 100px; + background-image: url('../img/saturation.png'); + cursor: crosshair; + float: left; +} +.colorpicker-saturation i { + display: block; + height: 5px; + width: 5px; + border: 1px solid #000; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + position: absolute; + top: 0; + left: 0; + margin: -4px 0 0 -4px; +} +.colorpicker-saturation i b { + display: block; + height: 5px; + width: 5px; + border: 1px solid #fff; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.colorpicker-hue, .colorpicker-alpha { + width: 15px; + height: 100px; + float: left; + cursor: row-resize; + margin-left: 4px; + margin-bottom: 4px; +} +.colorpicker-hue i, .colorpicker-alpha i { + display: block; + height: 1px; + background: #000; + border-top: 1px solid #fff; + position: absolute; + top: 0; + left: 0; + width: 100%; + margin-top: -1px; +} +.colorpicker-hue { + background-image: url('../img/hue.png'); +} +.colorpicker-alpha { + background-image: url('../img/alpha.html'); + display: none; +} +.colorpicker { +*zoom: 1; + top: 0; + left: 0; + padding: 4px; + min-width: 120px; + margin-top: 1px; +} +.colorpicker:before, .colorpicker:after { + display: table; + content: ""; +} +.colorpicker:after { + clear: both; +} +.colorpicker:before { + content: ''; + display: inline-block; + position: absolute; + top: -7px; + left: 6px; +} +.colorpicker:after { + content: ''; + display: inline-block; + position: absolute; + top: -6px; + left: 7px; +} +.colorpicker div { + position: relative; +} +.colorpicker.alpha { + min-width: 140px; +} +.colorpicker.alpha .colorpicker-alpha { + display: block; +} +.colorpicker-color { + height: 10px; + margin-top: 5px; + clear: both; + background-image: url('../img/alpha.html'); + background-position: 0 100%; +} +.colorpicker-color div { + height: 10px; +} +.input-append.color .add-on i, .input-prepend.color .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} diff --git a/src/main/webapp/resources/css/datepicker.css b/src/main/webapp/resources/css/datepicker.css new file mode 100644 index 0000000000000000000000000000000000000000..43ee2f9cd871d98d016878582402841af9b8b0a4 --- /dev/null +++ b/src/main/webapp/resources/css/datepicker.css @@ -0,0 +1,116 @@ +/* + Datepicker for Bootstrap + Copyright 2012 Stefan Petre + Licensed under the Apache License v2.0 + http://www.apache.org/licenses/LICENSE-2.0 +*/ + .datepicker { + top: 0; + left: 0; + padding: 4px; + margin-top: 1px; /*.dow { border-top: 1px solid #ddd !important; }*/ +} +.datepicker:before { + content: ''; + display: inline-block; + position: absolute; + top: -7px; + left: 6px; +} +.datepicker:after { + content: ''; + display: inline-block; + +} +.datepicker > div { + display: none; +} +.datepicker table { + width: 100%; + margin: 0; +} +.datepicker td, .datepicker th { + text-align: center; + width: 20px; + height: 20px; + +} +.datepicker td.day:hover { + background: #eeeeee; + cursor: pointer; +} +.datepicker td.old, .datepicker td.new { + color: #999999; +} +.datepicker td.active, .datepicker td.active:hover { + background: #49cced; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker td.active:hover, .datepicker td.active:hover:hover, .datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active, .datepicker td.active.disabled, .datepicker td.active:hover.disabled, .datepicker td.active[disabled], .datepicker td.active:hover[disabled] { + background-color: #49cced; +} +.datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active { + background-color: #003399 \9; +} +.datepicker td span { + display: block; + width: 47px; + height: 54px; + line-height: 54px; + float: left; + margin: 2px; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker td span:hover { + background: #eeeeee; +} +.datepicker td span.active { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; +filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker td span.active:hover, .datepicker td span.active:active, .datepicker td span.active.active, .datepicker td span.active.disabled, .datepicker td span.active[disabled] { + background-color: #0044cc; +} +.datepicker td span.active:active, .datepicker td span.active.active { + background-color: #003399 \9; +} +.datepicker td span.old { + color: #999999; +} +.datepicker th.switch { + width: 145px; +} +.datepicker th.next, .datepicker th.prev { + font-size: 19.5px; +} +.datepicker thead tr:first-child th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover { + background: #eeeeee; +} +.input-append.date .add-on i, .input-prepend.date .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} diff --git a/src/main/webapp/resources/css/et.css b/src/main/webapp/resources/css/et.css new file mode 100644 index 0000000000000000000000000000000000000000..16ec535f8b61be763f6ccdc1fa573974067f9378 --- /dev/null +++ b/src/main/webapp/resources/css/et.css @@ -0,0 +1 @@ +@font-face{font-family:fontello;src:url(../font/fontello.eot);src:url(../font/fontello.eot#iefix) format("embedded-opentype"),url(../font/fontello.woff2) format("woff2"),url(../font/fontello.woff) format("woff"),url(../font/fontello.ttf) format("truetype"),url(../font/fontello.svg#fontello) format("svg");font-weight:400;font-style:normal}[class*=" v-icon-"]:before,[class^=v-icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.v-icon-down-dir:before{content:"\E800"}.v-icon-up-dir:before{content:"\E801"}.v-icon-cancel:before{content:"\E802"}.v-icon-spin3:before{content:"\E832"}.v-icon-spin4:before{content:"\E834"}.v-icon-spin5:before{content:"\E838"}.v-icon-filter:before{content:"\F0B0"}.v-icon-angle-double-left:before{content:"\F100"}.v-icon-angle-double-right:before{content:"\F101"}.v-icon-angle-left:before{content:"\F104"}.v-icon-angle-right:before{content:"\F105"}.animate-loading-05{-moz-animation:spin .5s infinite linear;-o-animation:spin .5s infinite linear;-webkit-animation:spin .5s infinite linear;animation:spin .5s infinite linear;display:inline-block}.animate-loading-08{-moz-animation:spin .8s infinite linear;-o-animation:spin .8s infinite linear;-webkit-animation:spin .8s infinite linear;animation:spin .8s infinite linear;display:inline-block}.animate-loading-11{-moz-animation:spin 1.1s infinite linear;-o-animation:spin 1.1s infinite linear;-webkit-animation:spin 1.1s infinite linear;animation:spin 1.1s infinite linear;display:inline-block}.animate-loading-14{-moz-animation:spin 1.4s infinite linear;-o-animation:spin 1.4s infinite linear;-webkit-animation:spin 1.4s infinite linear;animation:spin 1.4s infinite linear;display:inline-block}.animate-loading-17{-moz-animation:spin 1.7s infinite linear;-o-animation:spin 1.7s infinite linear;-webkit-animation:spin 1.7s infinite linear;animation:spin 1.7s infinite linear;display:inline-block}.animate-loading-20{-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;display:inline-block}.animate-loading-23{-moz-animation:spin 2.3s infinite linear;-o-animation:spin 2.3s infinite linear;-webkit-animation:spin 2.3s infinite linear;animation:spin 2.3s infinite linear;display:inline-block}.animate-loading-26{-moz-animation:spin 2.6s infinite linear;-o-animation:spin 2.6s infinite linear;-webkit-animation:spin 2.6s infinite linear;animation:spin 2.6s infinite linear;display:inline-block}.animate-loading-29{-moz-animation:spin 2.9s infinite linear;-o-animation:spin 2.9s infinite linear;-webkit-animation:spin 2.9s infinite linear;animation:spin 2.9s infinite linear;display:inline-block}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}*,:after,:before{box-sizing:border-box}.v-page--large .v-page-goto,.v-page--large .v-page-goto .v-page-goto-input,.v-page--large .v-page-li,.v-page--large .v-page-select,.v-page--large .v-page-total{font-size:16px;height:40px;line-height:40px}.v-page--large .v-page-li{min-width:40px}.v-page--large .v-page-li i{font-size:120%}.v-page--large .v-page-goto .v-page-goto-input{width:50px}.v-page--middle .v-page-goto,.v-page--middle .v-page-goto .v-page-goto-input,.v-page--middle .v-page-li,.v-page--middle .v-page-select,.v-page--middle .v-page-total{font-size:14px;height:32px;line-height:32px}.v-page--middle .v-page-li{min-width:32px}.v-page--middle .v-page-li i{font-size:120%}.v-page--middle .v-page-goto .v-page-goto-input{width:50px}.v-page--small .v-page-goto,.v-page--small .v-page-goto .v-page-goto-input,.v-page--small .v-page-li,.v-page--small .v-page-select,.v-page--small .v-page-total{font-size:12px;height:24px;line-height:24px}.v-page--small .v-page-li{min-width:24px}.v-page--small .v-page-li i{font-size:120%}.v-page--small .v-page-goto .v-page-goto-input{width:45px}.v-page-ul{margin:0;padding:0;display:inline-block;margin:0 4px;list-style-type:none;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.v-page-total{float:left;display:inline-block;margin:0 4px}.v-page-select{float:left}.v-page-li{float:left;margin-right:4px;cursor:pointer;transition:all .1s ease-in-out;text-align:center;list-style:none;background-color:#fff;border:1px solid #c8cdd4;border-radius:4px}.v-page-li a{color:#333}.v-page-li:hover{border-color:#0092dd}.v-page-li:hover a{color:#0092dd}.v-page-li-active{border-color:#0092dd;background-color:#0092dd}.v-page-li-active a{color:#fff}.v-page-li-active:hover{border-color:#0092dd;background-color:#0092dd}.v-page-li-active:hover a{color:#fff}.v-page-next i,.v-page-prev i{color:#666}.v-page-jump-next:after,.v-page-jump-prev:after{content:"\2022\2022\2022";display:block;letter-spacing:1px;color:#666;text-align:center}.v-page-jump-next:hover:after,.v-page-jump-next i,.v-page-jump-prev:hover:after,.v-page-jump-prev i{display:none}.v-page-jump-next:hover i,.v-page-jump-prev:hover i{display:inline;color:#0092dd}.v-page-select{display:inline-block;margin:0 4px}.v-page-pager{float:left}.v-page-goto{float:left;display:inline-block;margin:0 4px}.v-page-goto-input{padding:1px 7px;display:inline-block;border:1px solid #c8cdd4;background-color:#fff;background-image:none;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;border-radius:4px}.v-page-goto-input:hover{border-color:#0092dd}.v-page-disabled{cursor:not-allowed;border-color:#d7dde4}.v-page-disabled i{color:#ccc}.v-page-disabled:hover{border-color:#d7dde4}.v-page-disabled:hover i{color:#ccc;cursor:not-allowed}.v-select--large .v-select-items-li,.v-select--large .v-select-selected{font-size:16px;height:40px;line-height:40px}.v-select--large .v-select-selected-i{line-height:40px!important}.v-select--middle .v-select-items-li,.v-select--middle .v-select-selected{font-size:14px;height:32px;line-height:32px}.v-select--middle .v-select-selected-i{line-height:32px!important}.v-select--small .v-select-items-li,.v-select--small .v-select-selected{font-size:13px;height:24px;line-height:24px}.v-select--small .v-select-selected-i{line-height:24px!important}.v-select-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-image:none;border:1px solid #fff;box-sizing:border-box;color:#1f2d3d;display:inline-block;font-size:inherit;line-height:1;outline:none;padding-left:2px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:80%;text-align:left}.v-select-selected-span{width:80%;display:block!important;text-align:center;cursor:pointer;white-space:nowrap;overflow:hidden;padding-left:2px}.v-select-selected-i{display:inline-block;position:absolute;top:0;right:0;font-size:120%}.v-table-views,.v-table-views *,.v-table-views :after,.v-table-views :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.v-table-views{position:relative;overflow:hidden;border:1px solid #ddd;padding:0;background-color:#fff}.v-table-footer{border-top:1px solid #ddd}.v-table-leftview,.v-table-rightview{position:absolute;overflow:hidden;top:0}.v-table-leftview{left:0}.v-table-header{overflow:hidden;background-position:0 0;background-size:initial;background-attachment:scroll;background-origin:initial;background-clip:initial;background-color:initial;background-repeat-x:repeat;background-repeat-y:no-repeat}.v-table-footer-inner,.v-table-header,.v-table-pager,.v-table-toolbar{border-color:#ddd}.v-table-header-inner{float:left;width:10000px}.v-table-btable,.v-table-ftable,.v-table-htable{border-collapse:separate}.v-table-body td,.v-table-footer td,.v-table-header td{margin:0;padding:0}.v-table-body-cell{padding:0 3px;margin:0;white-space:nowrap;word-wrap:normal;overflow:hidden;border:0 solid #ddd;text-overflow:ellipsis}.v-table-body{margin:0;padding:0;zoom:1}.v-table-rightview .v-table-body,.v-table-rightview .v-table-footer{overflow-x:auto;overflow-y:auto}.v-table-leftview .v-table-body{overflow-x:hidden!important;overflow-y:hidden!important}.v-table-body-inner-pb{padding-bottom:20px}.v-table-rightview{right:0}.v-table-title-cell{margin:0;border:0 solid #ddd}.v-table-title-cell:before{content:"";display:inline-block;height:100%;vertical-align:middle}.table-title{padding:0 3px;word-break:break-all;line-height:1.2em}.table-title,.v-table-sort-icon{display:inline-block;vertical-align:middle;overflow:hidden}.v-table-sort-icon{position:relative;width:16px;height:19px;margin-left:-5px;cursor:pointer}.v-table-sort-icon i{position:absolute;display:block;width:16px;height:15px;overflow:hidden;color:#a6a6a6;transition:color .2s ease-in-out}.v-table-sort-icon i:first-child{top:-5px}.v-table-sort-icon i:last-child{bottom:1px}.v-table-header .cursorPointer{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.vertical-border{border-right-width:1px!important}.horizontal-border{border-bottom-width:1px!important}.v-table-rightview-special-border td:last-child .v-table-body-cell{border-right-width:0!important}.v-table-dropdown{margin-left:-3px!important}.v-table-filter-icon{font-size:14px;cursor:pointer}.v-table-empty-content,.v-table-empty-scroll{position:absolute;overflow-y:hidden;text-align:center}.v-table-empty-content{overflow-x:auto}.v-table-empty-inner{overflow:hidden}.v-table-loading{position:relative;display:block;z-index:99999;background-color:#fff;height:100%;width:100%}.v-table-loading-content{z-index:9999999;position:absolute;left:50%}.v-table-drag-line{position:absolute;left:0;top:0;bottom:0;width:0;border-left:2px dashed #ddd;z-index:10}.v-checkbox-wrapper{font-size:12px}.v-checkbox,.v-checkbox-wrapper{cursor:pointer;display:inline-block;position:relative}.v-checkbox{white-space:nowrap;outline:none;line-height:1;vertical-align:text-bottom}.v-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:2px;border:1px solid #108ee9;content:"";-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.v-checkbox-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);top:0;bottom:0;right:0}.v-checkbox-inner{position:relative;top:0;left:0;display:block;width:14px;height:14px;border:1px solid #abbacc;border-radius:2px;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.v-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);left:4px;top:1px;width:5px;height:8px;-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6);transition:all .1s cubic-bezier(.71,-.46,.88,.6)}.v-checkbox-checked .v-checkbox-inner:after,.v-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;content:" "}.v-checkbox-checked .v-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.v-checkbox-checked .v-checkbox-inner,.v-checkbox-indeterminate .v-checkbox-inner{background-color:#108ee9;border-color:#108ee9}.v-checkbox-input:focus+.v-checkbox-inner,.v-checkbox-wrapper:hover .v-checkbox-inner,.v-checkbox:hover .v-checkbox-inner{border-color:#108ee9}.v-checkbox-disabled{cursor:not-allowed}.v-checkbox-disabled.v-checkbox-checked .v-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:rgba(0,0,0,.25)}.v-checkbox-disabled .v-checkbox-input{cursor:not-allowed}.v-checkbox-disabled .v-checkbox-inner{border-color:#d9d9d9!important;background-color:#f7f7f7}.v-checkbox-disabled .v-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f7f7f7}.v-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.v-checkbox-indeterminate .v-checkbox-inner:after{content:" ";-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);position:absolute;left:2px;top:5px;width:8px;height:1px}.v-checkbox-indeterminate.v-checkbox-disabled .v-checkbox-inner:after{border-color:rgba(0,0,0,.25)}.v-select-items-multiple{display:table;width:100%;padding:5px}.v-select-items-multiple span{vertical-align:middle;font-size:14px;font-weight:400;color:rgba(0,0,0,.65)}.v-select-items-multiple:hover{background-color:#e6f7ff}.v-dropdown--large .v-dropdown-items-li,.v-dropdown--large .v-dropdown-selected{font-size:16px;height:40px;line-height:40px}.v-dropdown--large .v-dropdown-selected-i{line-height:40px!important}.v-dropdown--middle .v-dropdown-items-li,.v-dropdown--middle .v-dropdown-selected{font-size:14px;height:32px;line-height:32px}.v-dropdown--middle .v-dropdown-selected-i{line-height:32px!important}.v-dropdown--small .v-dropdown-items-li,.v-dropdown--small .v-dropdown-selected{font-size:13px;height:24px;line-height:24px}.v-dropdown--small .v-dropdown-selected-i{line-height:24px!important}.v-dropdown{display:inline-table;margin:0}.v-dropdown-dd,.v-dropdown-dt{z-index:9999}.v-dropdown-dd,.v-dropdown-dt,.v-dropdown-items{margin:0;padding:0;background-color:#fff}.v-dropdown-items{overflow:hidden;text-overflow:ellipsis;word-wrap:normal;white-space:nowrap}.v-dropdown a,.v-dropdown a:visited{color:#000;text-decoration:none;outline:none}.v-dropdown-selected{position:relative;display:block;border:1px solid #c8cdd4;border-radius:2px}.v-dropdown-selected:hover{color:#0092dd;border-color:#0092dd}.v-dropdown-selected-span{width:80%;display:block!important;text-align:center;cursor:pointer;white-space:nowrap;overflow:hidden;padding-left:2px}.v-dropdown-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-image:none;border:1px solid #fff;box-sizing:border-box;color:#1f2d3d;display:inline-block;font-size:inherit;line-height:1;outline:none;padding-left:2px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:80%;text-align:left}.v-dropdown-selected-i{display:inline-block;position:absolute;top:0;right:0;font-size:120%}.v-dropdown-dd{position:absolute!important;z-index:9999999}.v-dropdown-items{position:fixed;top:2px;left:0;list-style:none;border-radius:2px;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12),0 0 6px rgba(0,0,0,.04);border:1px solid #d1dbe5;color:#c5c0b0;padding:5px 0;width:auto}.v-dropdown-items-li{white-space:nowrap}.v-dropdown-items-li.active{background-color:#0092dd}.v-dropdown-items-li.active a{color:#fff}.v-dropdown-items-li-a{width:100%;display:block;padding-left:8px;padding-right:8px}.v-dropdown-items-li-a-left{text-align:left}.v-dropdown-items-li-a-center{text-align:center}.v-dropdown-items-li-a-right{text-align:right}.v-dropdown-items-li:hover{background-color:#e4e8f1;color:#fff}.v-dropdown-items-li.active:hover{background-color:#0092dd}.v-dropdown-items-multiple{display:table;width:100%;padding:5px}.v-dropdown-items-multiple span{vertical-align:middle;font-size:14px;font-weight:400;color:rgba(0,0,0,.65)}.v-dropdown-items-multiple:hover{background-color:#e6f7ff}.v-dropdown-operation{padding:8px 0 3px;font-size:14px;border-top:1px solid #e8e8e8}.v-dropdown-operation-item{padding:0 8px;color:#495060}.v-dropdown-operation-item:last-child{float:right}.v-dropdown-operation-item:hover{color:#1890ff}.v-table-sort-icon .checked{color:#48576a}.v-table-filter-icon{color:#999}.v-table-filter-icon.checked{color:#48576a} \ No newline at end of file diff --git a/src/main/webapp/resources/css/fullcalendar.css b/src/main/webapp/resources/css/fullcalendar.css new file mode 100644 index 0000000000000000000000000000000000000000..6d0c52c892781eff94ea0daf6b97d53b6eafc19e --- /dev/null +++ b/src/main/webapp/resources/css/fullcalendar.css @@ -0,0 +1,404 @@ + +.fc { + direction: ltr; + text-align: left; border:1px solid #dadada; +} +.fc table { + border-collapse: collapse; + border-spacing: 0; +} +html .fc, .fc table { + font-size: 1em; +} +.fc td, .fc th { + padding: 0; + vertical-align: top; +} +.fc-header { + position: relative; +} +.fc-header td { + position: relative; + white-space: nowrap; +} +.fc-header-left { + text-align: left; +} +.fc-header-center { + left: 10%; + position: absolute; + text-align: center; + top: 0; + width: 80%; +} +.fc-button-inner { + border-left: 1px solid #D5D5D5; +} +.panel-left .fc-header-right .fc-button:last-child .fc-button-inner { + border-right: 1px solid #D5D5D5; +} +.fc-header-left .fc-button-inner { + border: medium none; +} +.fc-header-right { + position: absolute !important; + right: 0; + text-align: right; + top: -37px; +} +.panel-left .fc-header-right { + right: -1px; +} +.fc-header-title { + display: inline-block; + vertical-align: top; +} +.fc-header-title strong { + display: block; + margin-top: 0; + padding: 8px 12px !important; + white-space: nowrap; +} +.fc .fc-header-space { + padding-left: 10px; +} +.fc-header .fc-corner-right { + float: right; + margin-right: 1px; +} +.fc-header .ui-corner-right { + margin-right: 0; +} +.fc-header .fc-state-hover, .fc-header .ui-state-hover { + z-index: 2; +} +.fc-header .fc-state-down { + z-index: 3; +} +.fc-header .fc-state-active, .fc-header .ui-state-active { + z-index: 4; +} +.fc-button-prev .fc-button-content { + background: url("../img/larrow.png") no-repeat scroll 15px 13px transparent; + width: 10px; +} +.fc-button-next .fc-button-content { + background: url("../img/rarrow.png") no-repeat scroll 15px 13px transparent; + width: 10px; +} +.fc-content { +} +.fc-view { + overflow: hidden; + width: 100%; +} +.fc-widget-header, .fc-widget-content { + border: 1px solid #D5D5D5; +} +.fc-state-highlight { + background: url("../images/backgrounds/calActiveBg.html") repeat-x scroll 0 0 #F5F5F5; +} +.fc-cell-overlay { + background: none repeat scroll 0 0 #99CCFF; + opacity: 0.2; +} +.fc-button { + cursor: pointer; + display: inline-block; + position: relative; +} +.fc-state-default { +} +.fc-button-inner { + float: left; + overflow: hidden; + position: relative; +} +.fc-state-default .fc-button-inner { +} +.fc-button-content { + float: left; + height: 36px; + line-height: 37px; + padding: 0 14px; + position: relative; + white-space: nowrap; +} +.fc-header-right .fc-button-content { + height: 37px; +} +.fc-button-content .fc-icon-wrap { + float: left; + position: relative; + top: 50%; +} +.fc-button-content .ui-icon { + float: left; + margin-top: -50%; + position: relative; +} +.fc-state-default .fc-button-effect { + left: 0; + position: absolute; + top: 50%; +} +.fc-state-default .fc-button-effect span { +} +.fc-state-default, .fc-state-default .fc-button-inner { +} +.fc-state-hover, .fc-state-hover .fc-button-inner { +} +.fc-state-down, .fc-state-down .fc-button-inner { +} +.fc-state-active, .fc-state-active .fc-button-inner { + background: none repeat scroll 0 0 #F9F9F9; + color: #797979; +} +.fc-first th { + padding-top: 1px; +} +.fc-state-disabled, .fc-state-disabled .fc-button-inner { + border-color: #DDDDDD; + color: #999999; +} +.fc-state-disabled { + cursor: default; +} +.fc-state-disabled .fc-button-effect { + display: none; +} +.fc-event { + border-style: solid; + border-width: 0; + cursor: default; + font-size: 0.85em; +} +a.fc-event, .fc-event-draggable { + cursor: pointer; +} +a.fc-event { + text-decoration: none; +} +.fc-rtl .fc-event { + text-align: right; +} +.fc-event-skin { + background-color: #fb7a2c; + border-color: #000000; + border-radius: 2px 2px 2px 2px; + color: #FFFFFF; + display: block; + font-size: 11px; + margin-top: 1px; + padding: 1px 0; +} +.fc-event-inner { + border-style: solid; + border-width: 0; + height: 100%; + overflow: hidden; + position: relative; + width: 100%; +} +.fc-event-time, .fc-event-title { + display: block; + float: left; + line-height: 16px; + padding: 0 2px 1px 5px; +} +.fc .ui-resizable-handle { + display: block; + font-size: 300%; + line-height: 50%; + overflow: hidden; + position: absolute; + z-index: 99999; +} +.fc-event-hori { + margin-bottom: 1px; +} +.fc-event-hori .ui-resizable-e { + cursor: e-resize; + height: 100% !important; + right: -3px !important; + top: 0 !important; + width: 7px !important; +} +.fc-event-hori .ui-resizable-w { + cursor: w-resize; + height: 100% !important; + left: -3px !important; + top: 0 !important; + width: 7px !important; +} +.fc-event-hori .ui-resizable-handle { +} +.fc-corner-left { + margin-left: 1px; +} +.fc-corner-left .fc-button-inner, .fc-corner-left .fc-event-inner { +} +.fc-corner-right { + margin-right: 1px; +} +.fc-corner-right .fc-button-inner, .fc-corner-right .fc-event-inner { + margin-right: -1px; +} +.fc-corner-top { + margin-top: 1px; +} +.fc-corner-top .fc-event-inner { + margin-top: -1px; +} +.fc-corner-bottom { + margin-bottom: 1px; +} +.fc-corner-bottom .fc-event-inner { + margin-bottom: -1px; +} +.fc-corner-left .fc-event-inner { +} +.fc-corner-right .fc-event-inner { +} +.fc-corner-top .fc-event-inner { + border-top-width: 1px; +} +.fc-corner-bottom .fc-event-inner { + border-bottom-width: 1px; +} +table.fc-border-separate { + border-collapse: separate; +} +.fc-border-separate th, .fc-border-separate td { + border-width: 1px 0 0 1px; +} +.fc-border-separate td:first-child, .fc-border-separate th:first-child { + border-left: medium none; +} +.fc-border-separate th.fc-last, .fc-border-separate td.fc-last { +} +.fc-border-separate tr.fc-last th, .fc-border-separate tr.fc-last td { + border-top-width: 1px; +} +.fc-border-separate tbody tr.fc-first td, .fc-border-separate tbody tr.fc-first th { + border-top-width: 1px; +} +.fc-grid th { + text-align: center; +} +.fc-grid .fc-day-number { + float: right; + padding: 3px 5px; +} +.fc-grid .fc-other-month .fc-day-number { + opacity: 0.3; +} +.fc-grid .fc-day-content { + clear: both; + padding: 5px 2px 3px; +} +.fc-grid .fc-event-time { + font-weight: bold; +} +.fc-rtl .fc-grid .fc-day-number { + float: left; +} +.fc-rtl .fc-grid .fc-event-time { + float: right; +} +.fc-agenda table { + border-collapse: separate; +} +.fc-agenda-days th { + text-align: center; +} +.fc-agenda .fc-agenda-axis { + font-weight: normal; + padding: 0 4px; + text-align: right; + vertical-align: middle; + white-space: nowrap; + width: 50px; +} +.fc-agenda .fc-day-content { + padding: 2px 2px 1px; +} +.fc-agenda-days .fc-agenda-axis { + border-right-width: 1px; +} +.fc-agenda-days .fc-col0 { + border-left-width: 0; +} +.fc-agenda-allday th { + border-width: 0 1px; +} +.fc-agenda-allday .fc-day-content { + min-height: 34px; +} +.fc-agenda-divider-inner { + height: 2px; + overflow: hidden; +} +.fc-widget-header .fc-agenda-divider-inner { + background: none repeat scroll 0 0 #EEEEEE; +} +.fc-agenda-slots th { + border-width: 1px 1px 0; +} +.fc-agenda-slots td { + background: none repeat scroll 0 0 transparent; + border-width: 1px 0 0; +} +.fc-agenda-slots td div { + height: 20px; +} +.fc-agenda-slots tr.fc-slot0 th, .fc-agenda-slots tr.fc-slot0 td { + border-top-width: 0; +} +.fc-agenda-slots tr.fc-minor th, .fc-agenda-slots tr.fc-minor td { + border-top-style: dotted; +} +.fc-agenda-slots tr.fc-minor th.ui-widget-header { +} +.fc-event-vert { + border-width: 0 1px; +} +.fc-event-vert .fc-event-head, .fc-event-vert .fc-event-content { + overflow: hidden; + position: relative; + width: 100%; + z-index: 2; +} +.fc-event-vert .fc-event-time { + font-size: 10px; + white-space: nowrap; +} +.fc-event-vert .fc-event-bg { + background: none repeat scroll 0 0 #FFFFFF; + height: 100%; + left: 0; + opacity: 0.3; + position: absolute; + top: 0; + width: 100%; + z-index: 1; +} +.fc .ui-draggable-dragging .fc-event-bg, .fc-select-helper .fc-event-bg { +} +.fc-event-vert .ui-resizable-s { + bottom: 0 !important; + cursor: s-resize; + font-family: monospace; + font-size: 11px !important; + height: 8px !important; + line-height: 8px !important; + overflow: hidden !important; + text-align: center; + width: 100% !important; +} +.fc-agenda .ui-resizable-resizing { +} + +#external-events .external-event { + margin-bottom: 5px; cursor:all-scroll; +} diff --git a/src/main/webapp/resources/css/jquery.gritter.css b/src/main/webapp/resources/css/jquery.gritter.css new file mode 100644 index 0000000000000000000000000000000000000000..fe11500453fc369ffe592692827ed4c3dde42997 --- /dev/null +++ b/src/main/webapp/resources/css/jquery.gritter.css @@ -0,0 +1,91 @@ +/* the norm */ +#gritter-notice-wrapper { + position:fixed; + top:50px; + right:10px; + width:301px; + z-index:100001; +} +#gritter-notice-wrapper.top-left { + left: 20px; + right: auto; +} +#gritter-notice-wrapper.bottom-right { + top: auto; + left: auto; + bottom: 20px; + right: 20px; +} +#gritter-notice-wrapper.bottom-left { + top: auto; + right: auto; + bottom: 20px; + left: 20px; +} +.gritter-item-wrapper { + position:relative; + margin:0 0 10px 0; +} + +.gritter-top, .gritter-bottom { + height: 0; +} + +.gritter-item { + display:block; + background: #f74d4d; /* Old browsers */ + color:#2b2b2b; box-shadow:3px 3px 20px #000; + padding:7px 10px 10px; + font-size: 11px; color:#fff; + font-family:verdana; +} +.hover .gritter-item { +} +.gritter-item p { + padding:0; + margin:0; + word-wrap:break-word; + font-size: 10px; + line-height: 14px; +} +.gritter-close { + display:none; + position:absolute; + top:-7px; + right:-9px; + background:url(../img/gritter.png) no-repeat left top; + cursor:pointer; + width:30px; + height:30px; +} +.gritter-title { + font-size:12px; + font-weight:bold; + padding:0 0 7px 0; + display:block; +} +.gritter-image { + width:32px; + height:32px; + float:left; + margin: 5px; +} +.gritter-with-image, +.gritter-without-image { + padding:0; +} +.gritter-with-image { + width:220px; + float:right; +} +/* for the light (white) version of the gritter notice */ +.gritter-light .gritter-item, +.gritter-light .gritter-bottom, +.gritter-light .gritter-top, +.gritter-light .gritter-close { + background-image: url(../img/gritter-light.png); + color: #222; +} +.gritter-light .gritter-title { + text-shadow: none; +} diff --git a/src/main/webapp/resources/css/matrix-login.css b/src/main/webapp/resources/css/matrix-login.css new file mode 100644 index 0000000000000000000000000000000000000000..049a29068fad0996ce9fc3420fcf7a30c7b7302e --- /dev/null +++ b/src/main/webapp/resources/css/matrix-login.css @@ -0,0 +1,66 @@ +html, body { width: 100%; height: 100%;} +/*Bootstrap-overlay*/ + +body { + overflow-x: hidden; + margin-top: -10px; font-family: 'Open Sans', sans-serif; font-size:12px; color:#666; +} +a{color:#666;} +a:hover, a:focus { + text-decoration: none; color:#28b779; +} +.dropdown-menu .divider{ margin:4px 0px;} +.dropdown-menu{ min-width:180px;} +.dropdown-menu > li > a{ padding:3px 10px; color:#666; font-size:12px;} +.dropdown-menu > li > a i{ padding-right:3px;} +.userphoto img{ width:19px; height:19px;} +select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input, .label, .dropdown-menu, .btn, .well, .progress, .table-bordered, .btn-group > .btn:first-child, .btn-group > .btn:last-child, .btn-group > .btn:last-child, .btn-group > .dropdown-toggle, .alert{ border-radius:0px;} +.btn, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input{ box-shadow:none;} +.progress, .progress-success .bar, .progress .bar-success, .progress-warning .bar, .progress .bar-warning, .progress-danger .bar, .progress .bar-danger, .progress-info .bar, .progress .bar-info, .btn, .btn-primary{background-image:none;} +.accordion-heading h5{ width:70%; } +.form-horizontal .form-actions{ padding-left:20px; } +#footer{ padding:10px; text-align:center;} +.carousel{ margin-bottom:0px;} +.fl { float:left} +.fr {float:right} +.label-important, .badge-important{ background:#f74d4d;} + +/*Metro Background color class*/ +.bg_lb{ background:#27a9e3;} +.bg_db{ background:#2295c9;} +.bg_lg{ background:#28b779;} +.bg_dg{ background:#28b779;} +.bg_ly{ background:#ffb848;} +.bg_dy{ background:#da9628;} +.bg_ls{ background:#2255a4;} +.bg_lo{ background:#da542e;} +.bg_lr{ background:#f74d4d;} +.bg_lv{ background:#603bbc;} +.bg_lh{ background:#b6b3b3;} + +body { background-color:#2E363F; padding: 0; margin-top:10%;} +#logo, #loginbox { width: 32%; margin-left: auto; margin-right: auto; position: relative;} +#logo img { margin: 0 auto; display: block;} +#loginbox { overflow: hidden !important; text-align: left; position: relative; } +#loginbox form{ width:100%; position:relative; top:0; left:0; } +#loginbox .form-actions { padding: 14px 20px 15px;} +#loginbox .form-actions .pull-left { margin-top:0px;} +#loginbox form#loginform { z-index: 200; display:block;} +#loginbox form#recoverform { z-index: 100; display:none;} +#loginbox form#recoverform .form-actions { margin-top: 10px;} +#loginbox .main_input_box { margin:0 auto; text-align:center; font-size:13px;} +#loginbox .main_input_box .add-on{ padding:9px 9px; *line-height:31px; color:#fff; width:30px; display:inline-block;} +#loginbox .main_input_box input{ height:30px; border:0px; display:inline-block; width:75%; line-height:28px; margin-bottom:3px;} +/* #loginbox .controls{ padding:0 20px;} */ +#loginbox .control-group{ padding:20px 0; margin-bottom:0px;} +.form-vertical, .form-actions { margin-bottom: 0; background:none;} +#loginbox .normal_text{ padding:15px 10px; text-align:center; font-size:14px; line-height:20px; color:#fff; } +@media (max-width:800px){ +#logo { width: 60%; } +#loginbox{ width:80%} +} +@media (max-width: 480px){ +#logo { width: 40%; } +#loginbox{ width:90%} +#loginbox .control-group{ padding:8px 0; margin-bottom:0px;} +} \ No newline at end of file diff --git a/src/main/webapp/resources/css/matrix-media.css b/src/main/webapp/resources/css/matrix-media.css new file mode 100644 index 0000000000000000000000000000000000000000..a680bbb2c69365b42f2d13cf9d09db148051199f --- /dev/null +++ b/src/main/webapp/resources/css/matrix-media.css @@ -0,0 +1,76 @@ +body { + background:#2E363F; +} + +#header { + background-color: #1f262d; + margin-top:10px; +} +#search input[type=text], #search button { + background-color: #28b779; +} +#search input[type=text]:focus { + color: #777777; +} +#sidebar > ul{border-bottom: 1px solid #37414b} +#sidebar > ul > li { + border-top: 1px solid #37414b; border-bottom: 1px solid #1f262d; +} +#sidebar > ul > li.active { + background-color: #27a9e3; border-bottom: 1px solid #27a9e3; border-top: 1px solid #27a9e3; +} +#sidebar > ul > li.active a{ color:#fff; text-decoration:none;} + +#sidebar > ul > li > a > .label { + background-color:#F66; +} +#sidebar > ul > li > a:hover { + background-color: #27a9e3; color:#fff; +} +#sidebar > ul li ul { + background-color: #1e242b; +} +#sidebar > ul li ul li a{ color:#939da8} +#sidebar > ul li ul li a:hover, #sidebar > ul li ul li.active a { + color: #fff; + background-color: #28b779; +} + + +#search input[type=text] { + background-color: #47515b; color: #fff; +} +#search input[type=text]:focus { + color: #2e363f; color: #fff; box-shadow:none; +} +.dropdown-menu li a:hover, .dropdown-menu .active a, .dropdown-menu .active a:hover { + color: #eeeeee; + background:#666; + +} +.top_message{ float:right; padding:20px 12px; position:relative; top:-13px; border-left:1px solid #3D3A37; font-size:14px; line-height:20px; *line-height:20px; color:#333; text-align:center; vertical-align:middle; cursor:pointer; } +.top_message:hover{ background:#000} +.rightzero{ right:0px; display:none;} +@media (max-width: 480px) { + #sidebar > a { + background:#27a9e3; + + } + .quick-actions_homepage .quick-actions li{ min-width:100%;} +} +@media (min-width: 768px) and (max-width: 970px) {.quick-actions_homepage .quick-actions li{ min-width:20.5%;}} +@media (min-width: 481px) and (max-width: 767px) { + #sidebar > ul ul:before { + } + #sidebar > ul ul:after { + border-right: 6px solid #222222; + } + .quick-actions_homepage .quick-actions li{ min-width:47%;} +} +div.tagsinput { border:1px solid #CCC; background: #FFF; padding:5px; width:300px; height:100px; overflow-y: auto;} +div.tagsinput span.tag { border: 1px solid #a5d24a; -moz-border-radius:2px; -webkit-border-radius:2px; display: block; float: left; padding: 5px; text-decoration:none; background: #cde69c; color: #638421; margin-right: 5px; margin-bottom:5px;font-family: helvetica; font-size:13px;} +div.tagsinput span.tag a { font-weight: bold; color: #82ad2b; text-decoration:none; font-size: 11px; } +div.tagsinput input { width:80px; margin:0px; font-family: helvetica; font-size: 13px; border:1px solid transparent; padding:5px; background: transparent; color: #000; outline:0px; margin-right:5px; margin-bottom:5px; } +div.tagsinput div { display:block; float: left; } +.tags_clear { clear: both; width: 100%; height: 0px; } +.not_valid {background: #FBD8DB !important; color: #90111A !important;} diff --git a/src/main/webapp/resources/css/matrix-style.css b/src/main/webapp/resources/css/matrix-style.css new file mode 100644 index 0000000000000000000000000000000000000000..01bc69fdf72728f01bd94c7b6492a6e51c778d90 --- /dev/null +++ b/src/main/webapp/resources/css/matrix-style.css @@ -0,0 +1,1610 @@ +* { + outline:none !important; + -moz-outline: none !important; +} +td { + vertical-align: middle !important; +} +html, body{height:100%} +/* Main */ + +/*Bootstrap-overlay*/ + +body { + overflow-x: hidden; + margin-top: -10px; font-family: 'Open Sans', sans-serif; font-size:12px; color:#666; +} +a{color:#666;} +a:hover, a:focus { + text-decoration: none; color:#28b779; +} +.dropdown-menu .divider{ margin:4px 0px;} +.dropdown-menu{ min-width:180px;} +.dropdown-menu > li > a{ padding:3px 10px; color:#666; font-size:12px;} +.dropdown-menu > li > a i{ padding-right:3px;} +.userphoto img{ width:19px; height:19px;} +select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input, .label, .dropdown-menu, .btn, .well, .progress, .table-bordered, .btn-group > .btn:first-child, .btn-group > .btn:last-child, .btn-group > .btn:last-child, .btn-group > .dropdown-toggle, .alert{ border-radius:0px;} +.btn, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input{ box-shadow:none;} +.progress, .progress-success .bar, .progress .bar-success, .progress-warning .bar, .progress .bar-warning, .progress-danger .bar, .progress .bar-danger, .progress-info .bar, .progress .bar-info, .btn, .btn-primary{background-image:none;} +.accordion-heading h5{ width:70%; } +.form-horizontal .form-actions{ padding-left:20px; } +#footer{ padding:10px; text-align:center;} +hr{ border-top-color:#dadada;} +.carousel{ margin-bottom:0px;} +.fl { float:left} +.fr {float:right} +.label-important, .badge-important{ background:#f74d4d;} +.copyrights{text-indent:-9999px;height:0;line-height:0;font-size:0;overflow:hidden;} +/*Metro Background color class*/ +.bg_lb{ background:#27a9e3;} +.bg_db{ background:#2295c9;} +.bg_lg{ background:#28b779;} +.bg_dg{ background:#28b779;} +.bg_ly{ background:#ffb848;} +.bg_dy{ background:#da9628;} +.bg_ls{ background:#2255a4;} +.bg_lo{ background:#da542e;} +.bg_lr{ background:#f74d4d;} +.bg_lv{ background:#603bbc;} +.bg_lh{ background:#b6b3b3;} + +/* Header */ +#header { + height: 77px; + position: relative; + width: 100%; + z-index: -9; +} +#header h1 { + background: url("../img/logo.png") no-repeat scroll 0 0 transparent; + /* background-size: cover; */ + height: 31px; + left: 20px; + line-height: 600px; + overflow: hidden; + position: relative; + top: 26px; + width: 191px; +} +#header h1 a { + display: block; +} +/* Search input */ +#search { + position: absolute; + z-index: 25; + top: 6px; + right:10px; +} +#search input[type=text] { + padding: 4px 10px 5px; + border: 0; + width: 100px; +} +#search button { + border: 0; + margin-left:-3px; + margin-top: -11px; + padding: 5px 10px 4px; +} +#search button i { + opacity: 0.8; color:#fff; +} +#search button:hover i, #search button:active i { + opacity: 1; +} + + +/* Top user navigation */ +#user-nav { + position: absolute; + right: 0; + top:0px; + z-index: 20; + margin: 0; +} +#user-nav > ul { + margin: 0; + padding: 0; + list-style: none; border-right: 1px solid #2e363f;border-left: 1px solid #000; +} +#user-nav > ul > li { + float: left; + list-style-type: none; + margin: 0; + position: relative; + padding: 0; border-left: 1px solid #2e363f; border-right: 1px solid #000; +} +#user-nav > ul > li > a { + padding:9px 10px; + display: block; + font-size: 11px; +} +#user-nav > ul > li > a:hover, #user-nav > ul > li.open > a { + color: #ffffff; background:#000; +} +#user-nav > ul > li > a > i, #sidebar li a i { + opacity: .5; + margin-top: 2px; +} +#user-nav > ul > li > a:hover > i, #user-nav > ul > li.open > a > i { + opacity: 1; +} +#user-nav > ul > li > a > .label { + vertical-align: middle; + padding: 1px 4px 1px; + margin: -2px 4px 0; + display: inline-block; +} +#user-nav > ul ul > li > a { + text-align: left; +} +#user-nav > ul ul > li > a:hover { +} +/* Sidebar Navigation */ +#sidebar { + display: block; + float: left; + position: relative; + width: 220px; + z-index: 16; + font-size: 15px; +} +#sidebar > ul { + list-style: none; + margin: 0px 0 0; + padding: 0; + position: absolute; + width: 220px; +} +#sidebar > ul > li { + display: block; + position: relative; +} +#sidebar > ul > li > a { + padding: 10px 0 10px 15px; + display: block; + color: #939da8; +} +#sidebar > ul > li > a > i { + margin-right: 10px; +} +#sidebar > ul > li.active > a { + background: url("../img/menu-active.png") no-repeat scroll right center transparent !important; + text-decoration:none; +} +#sidebar > ul > li > a > .label { + margin: 0 20px 0 0; + float: right; + padding: 3px 5px 2px; +} +#sidebar > ul li ul { + display: none; + margin: 0; + padding: 0; +} +#sidebar > ul li.open ul { + display: block; +} +#sidebar > ul li ul li a { + padding: 10px 0 10px 25px; + display: block; + color: #777777; +} +#sidebar > ul li ul li:first-child a { + border-top: 0; +} +#sidebar > ul li ul li:last-child a { + border-bottom: 0; +} +/* Content */ +#content { + background: none repeat scroll 0 0 #eeeeee; + margin-left: 220px; + margin-right: 0; + padding-bottom: 25px; + position: relative; + min-height:100%; + width: auto; +} +#content-header { + position: abslute; + width: 100%; + margin-top: -38px; + z-index: 20; +} +#content-header h1 { + color: #555555; + font-size: 28px; + font-weight: normal; + float: none; + text-shadow: 0 1px 0 #ffffff; + margin-left: 20px; + position: relative; +} +#content-header .btn-group { + float: right; + right: 20px; + position: absolute; +} +#content-header h1, #content-header .btn-group { + margin-top: 20px; +} +#content-header .btn-group .btn { + padding: 11px 14px 9px; +} +#content-header .btn-group .btn .label { + position: absolute; + top: -7px; +} +.container-fluid .row-fluid:first-child { + margin-top: 20px; +} +/* Breadcrumb */ +#breadcrumb { + background-color: #fff; + border-bottom: 1px solid #e3ebed; +} +#breadcrumb a { + padding: 8px 20px 8px 10px; + display: inline-block; + background-image: url('../img/breadcrumb.png'); + background-position: center right; + background-repeat: no-repeat; + font-size: 11px; + color: #666666; +} +#breadcrumb a:hover { + color: #333333; +} +#breadcrumb a:last-child { + background-image:none; +} +#breadcrumb a.current { + font-weight: bold; + color: #444444; +} +#breadcrumb a i { + margin-right: 5px; + opacity: .6; +} +#breadcrumb a:hover i { + margin-right: 5px; + opacity: .8; +} +/*todo-list*/ +.todo ul { + list-style: none outside none; + margin: 0; +} +.todo li { + border-bottom: 1px solid #EBEBEB; + margin-bottom: 0; + padding: 10px 0; +} +.todo li:hover { + background: none repeat scroll 0 0 #FCFCFC; + border-color: #D9D9D9; +} +.todo li:last-child{ border-bottom:0px;} +.todo li .txt { + float: left; +} +.todo li .by { + margin-left: 10px; + margin-right: 10px; +} +.todo li .date { + margin-right: 10px; +} + +/* Stat boxes and quick actions */ +.quick-actions_homepage { + width:100%; + text-align:center; position:relative; + float:left; + margin-top:10px; +} +.stat-boxes, .quick-actions, .quick-actions-horizontal, .stats-plain { + display: block; + list-style: none outside none; + margin: 15px 0; + text-align: center; +} +.stat-boxes2 { + display: inline-block; + list-style: none outside none; + margin:0px; + text-align: center; +} +.stat-boxes2 li { + display: inline-block; + line-height: 18px; + margin: 0 10px 10px; + padding: 0 10px; background:#fff; border: 1px solid #DCDCDC +} +.stat-boxes2 li:hover{ background: #f6f6f6; } +.stat-boxes2 .left, .stat-boxes .right { + text-shadow: 0 1px 0 #fff; + float: left; +} +.stat-boxes2 .left { + border-right: 1px solid #DCDCDC; + box-shadow: 1px 0 0 0 #FFFFFF; + font-size: 10px; + font-weight: bold; + margin-right: 10px; + padding: 10px 14px 6px 4px; +} +.stat-boxes2 .right { + color: #666666; + font-size: 12px; + padding: 9px 10px 7px 0; + text-align: center; + min-width: 70px; float:left +} +.stat-boxes2 .left span, .stat-boxes2 .right strong { + display: block; +} +.stat-boxes2 .right strong { + font-size: 26px; + margin-bottom: 3px; + margin-top: 6px; +} +.quick-actions_homepage .quick-actions li{ position:relative;} +.quick-actions_homepage .quick-actions li .label{ position:absolute; padding:5px; top:-10px; right:-5px;} +.stats-plain { + width: 100%; +} +.stat-boxes li, .quick-actions li, .quick-actions-horizontal li { + float: left; + line-height: 18px; + margin: 0 10px 10px 0px; + padding: 0 10px; +} +.stat-boxes li a:hover, .quick-actions li a:hover, .quick-actions-horizontal li a:hover, .stat-boxes li:hover, .quick-actions li:hover, .quick-actions-horizontal li:hover { + background: #2E363F; +} +.quick-actions li { + min-width:14%; + min-height:70px; +} +.quick-actions_homepage .quick-actions .span3{ width:30%;} +.quick-actions li, .quick-actions-horizontal li { + padding: 0; +} +.stats-plain li { + padding: 0 30px; + display: inline-block; + margin: 0 10px 20px; +} +.quick-actions li a { + padding:10px 30px; +} +.stats-plain li h4 { + font-size: 40px; + margin-bottom: 15px; +} +.stats-plain li span { + font-size: 14px; + color: #fff; +} +.quick-actions-horizontal li a span { + padding: 10px 12px 10px 10px; + display: inline-block; +} +.quick-actions li a, .quick-actions-horizontal li a { + display: block; + color: #fff; font-size:14px; + font-weight:lighter; +} +.quick-actions li a i[class^="icon-"], .quick-actions li a i[class*=" icon-"] { + font-size:30px; + display: block; + margin: 0 auto 5px; +} +.quick-actions-horizontal li a i[class^="icon-"], .quick-actions-horizontal li a i[class*=" icon-"] { + background-repeat: no-repeat; + background-attachment: scroll; + background-position: center; + background-color: transparent; + width: 16px; + height: 16px; + display: inline-block; + margin: -2px 0 0 !important; + border-right: 1px solid #dddddd; + margin-right: 10px; + padding: 10px; + vertical-align: middle; +} + +.quick-actions li:active, .quick-actions-horizontal li:active { + background-image: -webkit-gradient(linear, 0 0%, 0 100%, from(#EEEEEE), to(#F4F4F4)); + background-image: -webkit-linear-gradient(top, #EEEEEE 0%, #F4F4F4 100%); + background-image: -moz-linear-gradient(top, #EEEEEE 0%, #F4F4F4 100%); + background-image: -ms-linear-gradient(top, #EEEEEE 0%, #F4F4F4 100%); + background-image: -o-linear-gradient(top, #EEEEEE 0%, #F4F4F4 100%); + background-image: linear-gradient(top, #EEEEEE 0%, #F4F4F4 100%); + box-shadow: 0 1px 4px 0 rgba(0,0,0,0.2) inset, 0 1px 0 rgba(255,255,255,0.4); +} +.stat-boxes .left, .stat-boxes .right { + text-shadow: 0 1px 0 #fff; + float: left; +} +.stat-boxes .left { + border-right: 1px solid #DCDCDC; + box-shadow: 1px 0 0 0 #FFFFFF; + font-size: 10px; + font-weight: bold; + margin-right: 10px; + padding: 10px 14px 6px 4px; +} +.stat-boxes .right { + color: #666666; + font-size: 12px; + padding: 9px 10px 7px 0; + text-align: center; + min-width: 70px; +} +.stat-boxes .left span, .stat-boxes .right strong { + display: block; +} +.stat-boxes .right strong { + font-size: 26px; + margin-bottom: 3px; + margin-top: 6px; +} +.stat-boxes .peity_bar_good, .stat-boxes .peity_line_good, { + color: #459D1C; +} +.stat-boxes .peity_bar_neutral, .stat-boxes .peity_line_neutral { + color: #757575; +} +.stat-boxes .peity_bar_bad, .stat-boxes .peity_line_bad { + color: #BA1E20; +} +.stats-plain { +} + +.site-stats { + margin: 0; + padding: 0; text-align:center; + list-style: none; +} +.site-stats li { + cursor: pointer; display:inline-block; + margin: 0 5px 10px; text-align:center; width:42%; + padding:10px 0; color:#fff; + position: relative; +} +.site-stats li i{ font-size:24px; clear:both} +.site-stats li:hover { background:#2E363F; +} + +.site-stats li i { + vertical-align: baseline; +} +.site-stats li strong { + font-weight: bold; + font-size: 20px; width:100%; float:left; + margin-left:0px; +} +.site-stats li small { + margin-left:0px; + font-size: 11px; + width:100%; float:left; +} +/* Charts & graphs **/ +.chart, .pie, .bars, #donut, #interactive, #placeholder, #placeholder2 { + height: 300px; + max-width: 100%; +} +#choices{ border-top:1px solid #dcdcdc; margin:10px 0; padding:10px;} +#choices br{ display:none;} +#choices input{ margin:-5px 5px 0 0;} +#choices label{ display:inline-block; padding-right:20px; } +#tooltip { + position: absolute; + display:none; + border: none; + padding: 3px 8px; + border-radius: 3px; + font-size: 10px; + background-color: #222222; + color: #ffffff; + z-index: 25; +} +/* Widgets */ +.widget-box { + background: none repeat scroll 0 0 #F9F9F9; + border-left: 1px solid #CDCDCD; + border-top: 1px solid #CDCDCD; + border-right: 1px solid #CDCDCD; + clear: both; + margin-top: 16px; + margin-bottom: 16px; + position: relative; +} +.widget-box.widget-calendar, .widget-box.widget-chat { + overflow:hidden !important; +} +.accordion .widget-box { + margin-top: -2px; + margin-bottom: 0; + border-radius: 0; +} +.widget-box.widget-plain { + background: transparent; + border: none; + margin-top: 0; + margin-bottom: 0; +} +.widget-title, .modal-header, .table th, div.dataTables_wrapper .ui-widget-header { + background:#efefef; + border-bottom: 1px solid #CDCDCD; + height: 36px; +} +.widget-title .nav-tabs { + border-bottom: 0 none; +} +.widget-title .nav-tabs li a { + border-bottom: medium none !important; + border-left: 1px solid #DDDDDD; + border-radius: 0 0 0 0; + border-right: 1px solid #DDDDDD; + border-top: medium none; + color: #999999; + margin: 0; + outline: medium none; + padding: 9px 10px 8px; + font-weight: bold; + text-shadow: 0 1px 0 #FFFFFF; +} +.widget-title .nav-tabs li:first-child a { + border-left: medium none !important; +} +.widget-title .nav-tabs li a:hover { + background-color: transparent !important; + border-color: #D6D6D6; + border-width: 0 1px; + color: #2b2b2b; +} +.widget-title .nav-tabs li.active a { + background-color: #F9F9F9 !important; + color: #444444; +} +.widget-title span.icon { + padding: 9px 10px 7px 11px; + float: left; border-right:1px solid #dadada; +} +.widget-title h5 { + color: #666; + float: left; + font-size: 12px; + font-weight: bold; + padding: 12px; + line-height: 12px; + margin: 0; +} +.widget-title .buttons { + float: right; + margin: 8px 10px 0 0; +} +.widget-title .label { + padding: 3px 5px 2px; + float: right; + margin: 9px 11px 0 0; + box-shadow: 0 1px 2px rgba(0,0,0,0.3) inset, 0 1px 0 #ffffff; +} +.widget-calendar .widget-title .label { + margin-right: 190px; +} +.widget-content { + padding:15px; + border-bottom: 1px solid #cdcdcd; +} +.widget-box.widget-plain .widget-content { + padding: 12px 0 0; +} +.widget-box.collapsible .collapse.in .widget-content { + border-bottom: 1px solid #CDCDCD; +} +.recent-posts, .recent-comments, .recent-users { + margin: 0; + padding: 0; +} +.recent-posts li, .recent-comments li, .article-post li, .recent-users li { + border-bottom: 1px dotted #AEBDC8; + list-style: none outside none; + padding: 10px; +} +.recent-posts li.viewall, .recent-comments li.viewall, .recent-users li.viewall { + padding: 0; +} +.recent-posts li.viewall a, .recent-comments li.viewall a, .recent-users li.viewall a { + padding: 5px; + text-align: center; + display: block; + color: #888888; +} +.recent-posts li.viewall a:hover, .recent-comments li.viewall a:hover, .recent-users li.viewall a:hover { + background-color: #eeeeee; +} +.recent-posts li:last-child, .recent-comments li:last-child, .recent-users li:last-child { + border-bottom: none !important; +} +.user-thumb { + background: none repeat scroll 0 0 #FFFFFF; + float: left; + height: 40px; + margin-right: 10px; + margin-top: 5px; + padding: 2px; + width: 40px; +} +.user-info { + color: #666666; + font-size: 11px; +} + +.invoice-content { + padding: 20px; +} +.invoice-action { + margin-bottom: 30px; +} +.invoice-head { + clear: both; + margin-bottom: 40px; + overflow: hidden; + width: auto; +} +.invoice-meta { + font-size: 18px; + margin-bottom: 40px; +} +.invoice-date { + float: right; + font-size: 80%; +} +.invoice-content h5 { + color: #333333; + font-size: 16px; + font-weight: normal; + margin-bottom: 10px; +} +.invoice-content ul { + list-style: none; + margin: 0; + padding: 0; +} +.invoice-to { + float: left; + width: 370px; +} +.invoice-from { + float: right; + width: 300px; +} +.invoice-to li, .invoice-from li { + clear: left; +} +.invoice-to li span, .invoice-from li span { + display: block; +} +.invoice-content th.total-label { + text-align: right; +} +.invoice-content th.total-amount { + text-align: left; +} +.amount-word { + color: #666666; + margin-bottom: 40px; + margin-top: 40px; +} +.amount-word span { + color: #5476A6; + font-weight: bold; + padding-left: 20px; +} +.panel-left { + margin-top:103px; +} +.panel-left2 { + margin-left:176px; +} +.panel-right { + width: 100%; + background-color: #fff; + border-bottom: 1px solid #dddddd; + position: absolute; + right: 0; + overflow:auto; + top:38px; + height:76px; +} +.panel-right2 { + width: 100%; + background-color: #fff; + border-right: 1px solid #dddddd; + position: absolute; + left: 0; + overflow:auto; + top:0px; + height:94%; + width:175px; +} +.panel-right .panel-title, .panel-right2 .panel-title { + width: 100%; + background-color: #ececec; + border-bottom: 1px solid #dddddd; +} +.panel-right .panel-title h5, .panel-right2 .panel-title h5 { + font-size: 12px; + color: #777777; + text-shadow: 0 1px 0 #ffffff; + padding: 6px 10px 5px; + margin: 0; +} +.panel-right .panel-content { + padding: 10px; +} +.chat-content { + height: 470px; + padding: 15px; +} +.chat-messages { + height: 420px; + overflow: auto; + position: relative; +} +.chat-message { + padding: 7px 15px; + margin: 7px 0 0; +} +.chat-message input[type=text] { + margin-bottom: 0 !important; + width: 100%; +} +.chat-message .input-box { + display: block; + margin-right: 90px; +} +.chat-message button { + float: right; +} +#chat-messages-inner p { + padding:0px; + margin: 10px 0 0 0; +} +#chat-messages-inner p img { + display: inline-block; + float: left; + vertical-align: middle; + width: 28px; + height: 28px; + margin-top:-1px; + margin-right:10px; +} +#chat-messages-inner .msg-block, #chat-messages-inner p.offline span { + background: none repeat scroll 0 0 #FFFFFF; + border: 1px solid #cccccc; + box-shadow: 1px 1px 0 1px rgba(0, 0, 0, 0.05); + display: block; + margin-left:0px; + padding: 10px; + position: relative; +} +#chat-messages-inner p.offline span { + background: none repeat scroll 0 0 #FFF5F5; +} +#chat-messages-inner .time { + color: #999999; + font-size: 11px; + float:right; +} +#chat-messages-inner .msg { + display: block; + margin-top: 13px; + border-top:1px solid #dadada; +} +#chat-messages-inner .msg-block:before { + border-right: 7px solid rgba(0,0,0,0.1); + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + content: ""; + display:none; + left: -7px; + position: absolute; + top: 11px; +} +#chat-messages-inner .msg-block:after { + border-right: 6px solid #ffffff; + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + content: ""; + display: none; + left: -6px; + position: absolute; + top: 12px; +} +.chat-users { + padding: 0 0 30px; +} +.chat-users .contact-list { + line-height: 21px; + list-style: none outside none; + margin: 0; + padding: 0; + font-size: 10px; +} +.chat-users .contact-list li { + border: 1px solid #DADADA; + margin:5px 5px; + padding: 1px; + position: relative; +} +.chat-users .contact-list li:hover { + background-color: #efefef; +} +.chat-users .contact-list li a { + color: #666666; + display: block; + padding: 8px 5px; +} +.chat-users .contact-list li.online a { + font-weight: bold; +} +.chat-users .contact-list li.new { + background-color: #eaeaea; +} +.chat-users .contact-list li.offline { + background-color: #EDE0E0; +} +.chat-users .contact-list li a img { + display: inline-block; + margin-right: 10px; + vertical-align: middle; + width: 28px; + height: 28px; +} +.chat-users .contact-list li .msg-count { + padding: 3px 5px; + position: absolute; + right: 10px; + top: 12px; +} +.taskDesc i { + margin: 1px 5px 0; +} +.taskStatus, .taskOptions { + text-align: center !important; +} +.taskStatus .in-progress { + color: #64909E; +} +.taskStatus .pending { + color: #AC6363; +} +.taskStatus .done { + color: #75B468; +} +.activity-list { + list-style: none outside none; + margin: 0; +} +.activity-list li { + border-bottom: 1px solid #EEEEEE; + display: block; +} +.activity-list li:last-child { + border-bottom: medium none; +} +.activity-list li a { + display: block; + padding: 7px 10px; +} +.activity-list li a:hover { + background-color: #FBFBFB; +} +.activity-list li a span { + color: #AAAAAA; + font-size: 11px; + font-style: italic; +} +.activity-list li a i { + margin-right: 10px; + opacity: 0.6; + vertical-align: middle; +} +.new-update { + border-top: 1px solid #DDDDDD; + padding: 10px 12px; +} +.new-update:first-child { + border-top: medium none; +} +.new-update span { + display:block; +} +.new-update i { + float: left; + margin-top: 3px; + margin-right: 13px; +} +.new-update .update-date { + color: #BBBBBB; + float: right; + margin: 4px -2px 0 0; + text-align: center; + width: 30px; +} +.new-update .update-date .update-day { + display: block; + font-size: 20px; + font-weight: bold; + margin-bottom: -4px; +} +.update-done, .update-alert, .update-notice { + display: block; + float: left; + max-width: 76%; +} +/* Tables */ +tr:hover{ background:#f6f6f6;} +span.icon .checker { + margin-top: -5px; + margin-right: 0; +} +.dataTables_length { + color: #878787; + margin: 7px 5px 0; + position: relative; + left:5px; width:50%; + top: -2px; +} +.dataTables_length div { + vertical-align: middle; +} +.dataTables_paginate { + line-height: 16px; + text-align: right; + margin-top: 5px; + margin-right: 10px; +} +.dataTables_paginate { + line-height: 16px; + text-align: right; + margin-top: 5px; + margin-right: 10px; +} +.dataTables_paginate .ui-button, .pagination.alternate li a { + font-size: 12px; + padding: 4px 10px !important; + border-style: solid; + border-width: 1px; + border-color: #dddddd #dddddd #cccccc; /* for IE < 9 */ + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + display: inline-block; + line-height: 16px; + background: #f5f5f5; + color: #333333; + text-shadow: 0 1px 0 #ffffff; +} +.dataTables_paginate .ui-button:hover, .pagination.alternate li a:hover { + background: #e8e8e8; + color: #222222; + text-shadow: 0 1px 0 #ffffff; + cursor: pointer; +} +.dataTables_paginate .first { + border-radius: 4px 0 0 4px; +} +.dataTables_paginate .last { + border-radius: 0 4px 4px 0; +} +.dataTables_paginate .ui-state-disabled, .fc-state-disabled, .pagination.alternate li.disabled a { + color: #AAAAAA !important; +} +.dataTables_paginate .ui-state-disabled:hover, .fc-state-disabled:hover, .pagination.alternate li.disabled a:hover { + background: #f5f5f5; + cursor: default !important; +} +.dataTables_paginate span .ui-state-disabled, .pagination.alternate li.active a { + background: #41BEDD !important; + color: #ffffff !important; + cursor: default !important; +} +div.dataTables_wrapper .ui-widget-header { + border-right: medium none; + border-top: 1px solid #D5D5D5; + font-weight: normal; + margin-top: -1px; +} +.dataTables_wrapper .ui-toolbar { + padding: 5px; +} +.dataTables_filter { + color: #878787; + font-size: 11px; + right: 0; top:37px; + margin: 4px 8px 2px 10px; + position: absolute; + text-align: left; +} +.dataTables_filter input { + margin-bottom: 0; +} +.table th { + height: auto; + font-size: 10px; + padding: 5px 10px 2px; + border-bottom: 0; + text-align: center; + color: #666666; +} +.table.with-check tr th:first-child, .table.with-check tr td:first-child { + width: 10px; +} +.table.with-check tr th:first-child i { + margin-top: -2px; + opacity: 0.6; +} +.table.with-check tr td:first-child .checker { + margin-right: 0; +} +.table tr.checked td { + background-color: #FFFFE3 !important; +} +/* Misc */ +.nopadding { + padding: 0 !important; +} +.nopadding .table { + margin-bottom: 0; +} +.nopadding .table-bordered { + border: 0; +} +.thumbnails { + margin-left: -2.12766% !important; +} +.thumbnails [class*="span"] { + margin-left: 2.12766% !important; + position: relative; +} +.thumbnails .actions { + width: auto; + height: 16px; + background-color:#000; + padding: 4px 8px 8px 8px; + position: absolute; + bottom:0%; + left:50%; + margin-top: -13px; + margin-left: -24px; + opacity: 0; top:10%; transition:1s ease-out; + -moz-transition: opacity 0.3s ease-in-out; +} +.thumbnails li:hover .actions,.thumbnails li:hover .actions a:hover{ + opacity: 1; color:#fff; top:50%; transition:1s ease-out; +} +.line { + background: url("../img/line.png") repeat-x scroll 0 0 transparent; + display: block; + height: 8px; +} +.modal { + z-index: 99999 !important; +} +.modal-backdrop { + z-index: 999 !important; +} +.modal-header { + height: auto; + padding: 8px 15px 5px; +} +.modal-header h3 { + font-size: 12px; + text-shadow: 0 1px 0 #ffffff; +} +.notify-ui ul { + list-style: none; + margin: 0; + padding: 0; +} +.notify-ui li { + background: #eeeeee; + margin-bottom: 5px; + padding: 5px 10px; + text-align: center; + border: 1px solid #dddddd; +} +.notify-ui li:hover { + cursor: pointer; + color: #777777; +} +/* Forms */ +form { + margin-bottom: 0; +} +.form-horizontal .control-group { + border-top: 1px solid #ffffff; + border-bottom: 1px solid #eeeeee; + margin-bottom: 0; +} +.form-horizontal .control-group:last-child { + border-bottom: 0; +} +.form-horizontal .control-label { + padding-top: 15px; + width: 180px; +} +.form-horizontal .controls { + margin-left: 200px; + padding: 10px 0; +} +.form-horizontal input[type=text], .form-horizontal input[type=password], .form-horizontal textarea { +} +.row-fluid .span20 { + width:97.8% +} +.form-horizontal .form-actions { + margin-top: 0; + margin-bottom: 0; +} +.help-block, .help-inline { + color: #999999; +} +/***********light-box***************/ +#lightbox { + position:fixed; /* keeps the lightbox window in the current viewport */ + top:0; + left:0; + width:100%; + height:100%; + background:url(overlay.png) repeat #000; + text-align:center; + z-index:9999; +} +#lightbox p { + position:absolute; + top:10px; + right:10px; + width:22px; + height:22px; + cursor:pointer; + z-index:22; + border:1px solid #fff; + border-radius:100%; + padding:2px; + text-align:center; + transition:0.5s; +} +#lightbox p:hover { + transform:rotate(180deg) +} +#imgbox { + position:absolute; /* keeps the lightbox window in the current viewport */ + left:0; + top:0px; + width:100%; + height:100%; + background:url(overlay.png) repeat #000; + text-align:center; + z-index:21; +} +#imgbox img { + margin-top:100px; + border:10px solid #fff; +} +/***********Error Page******************/ +.error_ex{ text-align:center;} +.error_ex h1{ font-size:140px; font-weight:bold; padding:50px 0; color:#28B779} + +#sidebar .content { + padding:10px; + position: relative; color:#939DA8; +} +#sidebar .percent { + font-weight: 700; + position: absolute; + right: 10px; + top:25px; +} +#sidebar .progress { + margin-bottom: 2px; + margin-top: 2px; + width: 70%; +} +#sidebar .progress-mini { + height: 6px; +} +#sidebar .stat { + font-size: 11px; +} +/***********light-box-end***************/ + +.btn-icon-pg ul { + margin:0px; + padding:0px; +} +.btn-icon-pg ul li { + margin:5px; + padding:5px; + list-style:none; + display:inline-block; + border:1px solid #dadada; + min-width:187px; + cursor:pointer +} +.btn-icon-pg ul li:hover i { + transition:0.3s; + -moz-transition:0.3s; + -webkit-transition:0.3s; + -o-transition:0.3s; + margin-left:8px; +} +.accordion { + margin-top:16px; +} +.fix_hgt { + height:115px; + overflow-x:auto; +} +.input-append .add-on:last-child, .input-append .btn:last-child { + border-radius:0px; + padding:6px 5px 2px; +} +.input-prepend input, .input-append input, .input-prepend input[class*="span"], .input-append input[class*="span"] { + width:none; +} +.input-append input, .input-append select, .input-prepend span, .input-prepend input { + border-radius:0px!important; +} +/***********pop-over********************/ +.bs-docs-tooltip-examples { + list-style: none outside none; + margin: 0 0 10px; + position:relative; + text-align: center; +} +.bs-docs-tooltip-examples li { + display: inline; + padding: 0 10px; + list-style:none; + position:relative; +} +/* Responsive design */ +@media (max-width: 480px) { +#header h1 { + top: 10px; left:5px; + margin: 3px auto; +} +#user-nav { + position: relative; + left: auto; + right: auto; + width: 100%; + margin-top: -31px; + border-top:1px solid #363E48; + margin-bottom: 0px; + background:#2E363F; + float:right; +} +.navbar > .nav { + float: none; +} +#my_menu { + display:none; +} +#my_menu_input { + display:block; +} +#user-nav > ul { + right: 0px; + margin-left:20%!important; + margin-top:0px; + width:100%; + background:#000; + position: relative; +} +#user-nav > ul > li { + padding:0px 0px; +} +#user-nav > ul > li > a { + padding:5px 10px; +} +#sidebar .content{ display:none;} +#content { + margin-left: 0 !important; + border-top-left-radius: 0; + margin-top:0px; +} +#content-header { + margin-top: 0; + text-align: center; +} +#content-header h1, #content-header .btn-group { + float: none; +} +#content-header h1 { + display: block; + text-align: center; + margin-left: auto; + margin-top: 0; + padding-top: 15px; + width: 100%; +} +#content-header .btn-group { + margin-top: 70px; + margin-bottom: 0; + margin-right: 0; + left: 30%; +} +#sidebar { + float: none; + width: 100% !important; + display:block; + position:relative; + top:0px; +} +#sidebar > ul { + margin:0px; + padding:0px; + width:100%; + display:block; + z-index:999; + position:relative +} +#sidebar > ul > li { + list-style-type:none; + display:block; + border-top:1px solid #41BEDD; + float:none !important; + margin:0px; + position:relative; + padding:2px 10px; + cursor:pointer +} +#sidebar > ul > li:hover ul { + display:none; +} +#sidebar > ul > li:hover { + background-color:#27a9e3; +} +#sidebar > ul > li:hover a { + background:none; +} +#sidebar > ul li ul { + margin:0px; + padding:0px; + top:35px; left:0px; + z-index:999; + display:none; + position:absolute; + width:100%; + min-width:100%; + border-radius:none; +} +#sidebar > ul li ul li { + list-style-type:none; + margin:0px; + font-size:12px; + line-height:30px; +} +#sidebar > ul li ul li a { + display:block; + padding:5px 10px; + color:#fff; + text-decoration:none; + font-weight:bold; +} +#sidebar > ul li ul li:hover a { + border-radius:0px; +} +#sidebar > ul li span { + cursor:pointer; + margin:0px 2px 0 5px; + font-weight:bold; + color:#fff; + font-size:12px; +} +#sidebar > ul li a i { + background-image: url("../img/glyphicons-halflings-white.png"); + margin-top:4px; + vertical-align: top; +} +#sidebar > a { + padding: 9px 20px 9px 15px; + display: block !important; + color: #eeeeee; + float:none !important; + font-size:12px; + font-weight:bold +} +#sidebar > ul > li > a { + padding:5px; + display:block; + color: #AAAAAA; +} +.widget-title .buttons > .btn { + width: 11px; + white-space: nowrap; + overflow: hidden; +} +.form-horizontal .control-label { + padding-left: 30px; +} +.form-horizontal .controls { + margin-left: 0; + padding: 10px 30px; +} +.form-actions { + text-align: center; +} +.panel-right2 { + width: 100%; + background-color: #fff; + border-right: 1px solid #dddddd; + position: relative; + left: 0; + overflow:auto; + top:0px; + height:87%; + width:100%; +} +.panel-left2 { + margin-left:0px; +} +.dataTables_paginate .ui-button, .pagination.alternate li a { + padding:4px 4px!important; +} +.table th { + padding: 5px 4px 2px; +} +} + @media (min-width: 481px) and (max-width: 970px) { +body { + background:#49CCED +} +#header h1 { + top:10px; left:35px; +} +#search { + top:5px +} +#my_menu { + display:none; +} +#my_menu_input { + display:block; +} +#content { + margin-top:0px; +} +#sidebar > ul > li { + float:none; +} +#sidebar > ul > li:hover ul { + display:block; +} +#sidebar, #sidebar > ul { + width: 43px; + display: block; + position: absolute; + height:100%; + z-index:1; +} +#sidebar > ul ul { + display: none; + position: absolute; + left:43px; + top: 0; + min-width: 150px; + list-style: none; +} +#sidebar > ul ul li a { + white-space: nowrap; + padding: 10px 25px; +} +#sidebar > ul ul:before { + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + content: ""; + display: inline-block; + left: -6px; + position: absolute; + top: 11px; +} +#sidebar > ul ul:after { + content: ""; + display: inline-block; + left: -5px; + position: absolute; + top: 12px; +} +#sidebar > a { + display: none !important; +} +#sidebar > ul > li.open.submenu > a { + border-bottom: none !important; +} +#sidebar > ul > li > a > span { + display: none; +} +#content { + margin-left: 43px; +} +#sidebar .content{ display:none;} +} +@media (max-width: 600px) { +.widget-title .buttons { + float: left; +} +.panel-left { + margin-right: 0; +} +.panel-right { + border-top: 1px solid #DDDDDD; + border-left: none; + position: relative; + top: auto; + right: auto; + height: auto; + width: auto; +} +#sidebar .content{ display:none;} +} +@media (max-width: 767px) { +body { + padding: 0 !important; +} +.container-fluid { + padding-left: 20px; + padding-right: 20px; +} +#search { + display: none; +} +#user-nav > ul > li > a > span.text { + display: none; +} +#sidebar .content{ display:none;} +} +@media (min-width: 768px) and (max-width: 979px) { + [class*="span"], .row-fluid [class*="span"] { + display: block; + float: none; + margin-left: 0; + width: auto; +} +} +@media (max-width: 979px) { +div.dataTables_wrapper .ui-widget-header { + height: 68px; +} +.dataTables_filter{ position:relative; top:0px;} +.dataTables_length{ width:100%; text-align:center;} +.dataTables_filter, .dataTables_paginate { + text-align: center; +} +#sidebar .content{ display:none;} +} + +table { + border-bottom: 1px solid #ddd !important; +} + +.v-select-dt, .v-page-goto { + display: none !important; +} + +.v-select, .v-dropdown, .v-dropdown--small, .v-page-select{ + display: none !important; +} +.dropdown-toggle:hover { + background: #20262d !important; + cursor: default; +} \ No newline at end of file diff --git a/src/main/webapp/resources/css/select2.css b/src/main/webapp/resources/css/select2.css new file mode 100644 index 0000000000000000000000000000000000000000..19d07059504e03c468092668c7fdb43f1dfae5a9 --- /dev/null +++ b/src/main/webapp/resources/css/select2.css @@ -0,0 +1,483 @@ +/* +Version: 3.2 Timestamp: Mon Sep 10 10:38:04 PDT 2012 +*/ +.select2-container { + position: relative; + display: inline-block; + /* inline-block for ie7 */ + zoom: 1; + *display: inline; + vertical-align: top; width:90%; +} +.dataTables_length .select2-container{ width:auto!important;} +.select2-container, +.select2-drop, +.select2-search, +.select2-search input{ + /* + Force border-box so that % widths fit the parent + container without overlap because of margin/padding. + + More Info : http://www.quirksmode.org/css/box.html + */ + -moz-box-sizing: border-box; /* firefox */ + -ms-box-sizing: border-box; /* ie */ + -webkit-box-sizing: border-box; /* webkit */ + -khtml-box-sizing: border-box; /* konqueror */ + box-sizing: border-box; /* css3 */ +} + +.select2-container .select2-choice { + background-color: #fff; + + -moz-background-clip: padding; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #aaa; + display: block; + overflow: hidden; + white-space: nowrap; + position: relative; + height: 26px; + line-height: 26px; + padding: 0 0 0 8px; + color: #444; + text-decoration: none; +} + +.select2-container.select2-drop-above .select2-choice +{ + border-bottom-color: #aaa; + +} + +.select2-container .select2-choice span { + margin-right: 26px; + display: block; + overflow: hidden; + white-space: nowrap; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + text-overflow: ellipsis; +} + +.select2-container .select2-choice abbr { + display: block; + position: absolute; + right: 26px; + top: 8px; + width: 12px; + height: 12px; + font-size: 1px; + background: url('../img/select2.png') right top no-repeat; + cursor: pointer; + text-decoration: none; + border:0; + outline: 0; +} +.select2-container .select2-choice abbr:hover { + background-position: right -11px; + cursor: pointer; +} + +.select2-drop { + background: #fff; + color: #000; + border: 1px solid #aaa; + border-top: 0; + position: absolute; + top: 100%; + -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + -o-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + z-index: 999999; + width:100%; + margin-top:-1px; + +} + +.select2-drop.select2-drop-above { + + margin-top:1px; + border-top: 1px solid #aaa; + border-bottom: 0; + + -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); + -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); + -o-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); +} + +.select2-container .select2-choice div { + + -moz-background-clip: padding; + -webkit-background-clip: padding-box; + background-clip: padding-box; + background: #ccc; + border-left: 1px solid #aaa; + position: absolute; + right: 0; + top: 0; + display: block; + height: 100%; + width: 18px; +} + +.select2-container .select2-choice div b { + background: url('../img/select2.png') no-repeat 0 1px; + display: block; + width: 100%; + height: 100%; +} + +.select2-search { + display: inline-block; + white-space: nowrap; + z-index: 10000; + min-height: 26px; + width: 100%; + margin: 0; + padding-left: 4px; + padding-right: 4px; +} + +.select2-search-hidden { + display: block; + position: absolute; + left: -10000px; +} + +.select2-search input { + background: #fff url('../img/select2.png') no-repeat 100% -22px; + background: url('../img/select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); + background: url('../img/select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%); + padding: 4px 20px 4px 5px; + outline: 0; + border: 1px solid #aaa; + font-family: sans-serif; + font-size: 1em; + width:100%; + margin:0; + height:auto !important; + min-height: 26px; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; +} + +.select2-drop.select2-drop-above .select2-search input +{ + margin-top:4px; +} + +.select2-search input.select2-active { + background: #fff url('../img/spinner.gif') no-repeat 100%; + background: url('../img/spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); + background: url('../img/spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); + background: url('../img/spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); + background: url('../img/spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%); +} + + +.select2-container-active .select2-choice, +.select2-container-active .select2-choices { + -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); + -moz-box-shadow : 0 0 5px rgba(0,0,0,.3); + -o-box-shadow : 0 0 5px rgba(0,0,0,.3); + box-shadow : 0 0 5px rgba(0,0,0,.3); + border: 1px solid #5897fb; + outline: none; +} + +.select2-dropdown-open .select2-choice { + border: 1px solid #aaa; + border-bottom-color: transparent; + -webkit-box-shadow: 0 1px 0 #fff inset; + -moz-box-shadow : 0 1px 0 #fff inset; + -o-box-shadow : 0 1px 0 #fff inset; + box-shadow : 0 1px 0 #fff inset; + background-color: #eee; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); + background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); + background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); + background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); + background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%); + -webkit-border-bottom-left-radius : 0; + -webkit-border-bottom-right-radius: 0; + -moz-border-radius-bottomleft : 0; + -moz-border-radius-bottomright: 0; + border-bottom-left-radius : 0; + border-bottom-right-radius: 0; +} + +.select2-dropdown-open .select2-choice div { + background: transparent; + border-left: none; +} +.select2-dropdown-open .select2-choice div b { + background-position: -18px 1px; +} + +/* results */ +.select2-results { + margin: 4px 4px 4px 0; + padding: 0 0 0 4px; + position: relative; + overflow-x: hidden; + overflow-y: auto; + max-height: 200px; +} + +.select2-results ul.select2-result-sub { + margin: 0 0 0 0; +} + +.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px } +.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px } + +.select2-results li { + list-style: none; + display: list-item; +} + +.select2-results li.select2-result-with-children > .select2-result-label { + font-weight: bold; +} + +.select2-results .select2-result-label { + padding: 3px 7px 4px; + margin: 0; + cursor: pointer; +} + +.select2-results .select2-highlighted { + background: #3875d7; + color: #fff; +} +.select2-results li em { + background: #feffde; + font-style: normal; +} +.select2-results .select2-highlighted em { + background: transparent; +} +.select2-results .select2-no-results, +.select2-results .select2-searching, +.select2-results .select2-selection-limit { + background: #f4f4f4; + display: list-item; +} + +/* +disabled look for already selected choices in the results dropdown +.select2-results .select2-disabled.select2-highlighted { + color: #666; + background: #f4f4f4; + display: list-item; + cursor: default; +} +.select2-results .select2-disabled { + background: #f4f4f4; + display: list-item; + cursor: default; +} +*/ +.select2-results .select2-disabled { + display: none; +} + +.select2-more-results.select2-active { + background: #f4f4f4 url('../img/spinner.gif') no-repeat 100%; +} + +.select2-more-results { + background: #f4f4f4; + display: list-item; +} + +/* disabled styles */ + +.select2-container.select2-container-disabled .select2-choice { + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container.select2-container-disabled .select2-choice div { + background-color: #f4f4f4; + background-image: none; + border-left: 0; +} + + +/* multiselect */ + +.select2-container-multi .select2-choices { + background-color: #fff; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%); + border: 1px solid #ccc; + margin: 0; + padding: 0; + cursor: text; + overflow: hidden; + height: auto !important; + height: 1%; + position: relative; width:100%; + +} + +.select2-container-multi .select2-choices { + min-height: 26px; +} + +.select2-container-multi.select2-container-active .select2-choices { + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow : 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px rgba(82, 168, 236, 0.6); + -o-box-shadow : 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow : 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px rgba(82, 168, 236, 0.6); + border: 1px solid #5897fb; + outline: none; +} +.select2-container-multi .select2-choices li { + float: left; + list-style: none; +} +.select2-container-multi .select2-choices .select2-search-field { + white-space: nowrap; + margin: 0; + padding: 0; +} + +.select2-container-multi .select2-choices .select2-search-field input { + color: #666; + background: transparent !important; + font-family: sans-serif; + font-size: 100%; + height: 15px; + padding: 5px; + margin: 1px 0; + outline: 0; + border: 0; + -webkit-box-shadow: none; + -moz-box-shadow : none; + -o-box-shadow : none; + box-shadow : none; +} + +.select2-container-multi .select2-choices .select2-search-field input.select2-active { + background: #fff url('../img/spinner.gif') no-repeat 100% !important; +} + +.select2-default { + color: #999 !important; +} + +.select2-container-multi .select2-choices .select2-search-choice { + -moz-background-clip : padding; + -webkit-background-clip: padding-box; + background-clip : padding-box; + background:#f9eae1; + -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + color: #333; + border: 1px solid #F77825; + line-height: 13px; + padding: 3px 5px 3px 18px; + margin: 3px 0 3px 5px; + position: relative; + cursor: default; +} +.select2-container-multi .select2-choices .select2-search-choice span { + cursor: default; +} +.select2-container-multi .select2-choices .select2-search-choice-focus { + background: #d4d4d4; +} + +.select2-search-choice-close { + display: block; + position: absolute; + right: 3px; + top: 4px; + width: 12px; + height: 13px; + font-size: 1px; + background: url('../img/select2.png') right top no-repeat; + outline: none; +} + +.select2-container-multi .select2-search-choice-close { + left: 3px; +} + + +.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { + background-position: right -11px; +} +.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close { + background-position: right -11px; +} + +/* disabled styles */ + +.select2-container-multi.select2-container-disabled .select2-choices{ + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice { + background-image: none; + background-color: #f4f4f4; + border: 1px solid #ddd; + padding: 3px 5px 3px 5px; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { + display: none; +} +/* end multiselect */ + +.select2-result-selectable .select2-match, +.select2-result-unselectable .select2-result-selectable .select2-match { text-decoration: underline; } +.select2-result-unselectable .select2-match { text-decoration: none; } + +.select2-offscreen { position: absolute; left: -10000px; } + +/* Retina-ize icons */ + +@media only screen and (-webkit-min-device-pixel-ratio: 1.5) { + .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b { + background-image: url(../img/select2x2.png) !important; + background-repeat: no-repeat !important; + background-size: 60px 40px !important; + } + .select2-search input { + background-position: 100% -21px !important; + } +} diff --git a/src/main/webapp/resources/css/uniform.css b/src/main/webapp/resources/css/uniform.css new file mode 100644 index 0000000000000000000000000000000000000000..c226e0cd5bc039e2232b3dab549302857395e200 --- /dev/null +++ b/src/main/webapp/resources/css/uniform.css @@ -0,0 +1,587 @@ +/* + +Uniform Theme: Uniform Default +Version: 1.6 +By: Josh Pyles +License: MIT License +--- +For use with the Uniform plugin: +http://pixelmatrixdesign.com/uniform/ +--- +Generated by Uniform Theme Generator: +http://pixelmatrixdesign.com/uniform/themer.html + +*/ + +/* Global Declaration */ + +div.selector, +div.selector span, +div.checker span, +div.radio span, +div.uploader, +div.uploader span.action, +div.button, +div.button span { + background-image: url(../img/sprite.png); + background-repeat: no-repeat; + -webkit-font-smoothing: antialiased; +} + +.selector, +.radio, +.checker, +.uploader, +.button, +.selector *, +.radio *, +.checker *, +.uploader *, +.button *{ + margin: 0; + padding: 0; +} + +/* INPUT & TEXTAREA */ + + + +input.text:focus, +input.email:focus, +input.password:focus, +textarea.uniform:focus { +} + +/* SPRITES */ + +/* Select */ + +div.selector { + background-position: -483px -130px; + line-height: 26px; + height: 26px; +} + +div.selector span { + background-position: right 0px; + height: 26px; + line-height: 26px; +} + +div.selector select { + /* change these to adjust positioning of select element */ + top: 0px; + left: 0px; +} + +div.selector:active, +div.selector.active { + background-position: -483px -156px; +} + +div.selector:active span, +div.selector.active span { + background-position: right -26px; +} + +div.selector.focus, div.selector.hover, div.selector:hover { + background-position: -483px -182px; +} + +div.selector.focus span, div.selector.hover span, div.selector:hover span { + background-position: right -52px; +} + +div.selector.focus:active, +div.selector.focus.active, +div.selector:hover:active, +div.selector.active:hover { + background-position: -483px -208px; +} + +div.selector.focus:active span, +div.selector:hover:active span, +div.selector.active:hover span, +div.selector.focus.active span { + background-position: right -78px; +} + +div.selector.disabled { + background-position: -483px -234px; +} + +div.selector.disabled span { + background-position: right -104px; +} + +/* Checkbox */ + +div.checker { + width: 19px; + height: 19px; +} + +div.checker input { + width: 19px; + height: 19px; +} + +div.checker span { + background-position: 0px -260px; + height: 19px; + width: 19px; +} + +div.checker:active span, +div.checker.active span { + background-position: -19px -260px; +} + +div.checker.focus span, +div.checker:hover span { + background-position: -38px -260px; +} + +div.checker.focus:active span, +div.checker:active:hover span, +div.checker.active:hover span, +div.checker.focus.active span { + background-position: -57px -260px; +} + +div.checker span.checked { + background-position: -76px -260px; +} + +div.checker:active span.checked, +div.checker.active span.checked { + background-position: -95px -260px; +} + +div.checker.focus span.checked, +div.checker:hover span.checked { + background-position: -114px -260px; +} + +div.checker.focus:active span.checked, +div.checker:hover:active span.checked, +div.checker.active:hover span.checked, +div.checker.active.focus span.checked { + background-position: -133px -260px; +} + +div.checker.disabled span, +div.checker.disabled:active span, +div.checker.disabled.active span { + background-position: -152px -260px; +} + +div.checker.disabled span.checked, +div.checker.disabled:active span.checked, +div.checker.disabled.active span.checked { + background-position: -171px -260px; +} + +/* Radio */ + +div.radio { + width: 18px; + height: 18px; +} + +div.radio input { + width: 18px; + height: 18px; +} + +div.radio span { + height: 18px; + width: 18px; + background-position: 0px -279px; +} + +div.radio:active span, +div.radio.active span { + background-position: -18px -279px; +} + +div.radio.focus span, +div.radio:hover span { + background-position: -36px -279px; +} + +div.radio.focus:active span, +div.radio:active:hover span, +div.radio.active:hover span, +div.radio.active.focus span { + background-position: -54px -279px; +} + +div.radio span.checked { + background-position: -72px -279px; +} + +div.radio:active span.checked, +div.radio.active span.checked { + background-position: -90px -279px; +} + +div.radio.focus span.checked, div.radio:hover span.checked { + background-position: -108px -279px; +} + +div.radio.focus:active span.checked, +div.radio:hover:active span.checked, +div.radio.focus.active span.checked, +div.radio.active:hover span.checked { + background-position: -126px -279px; +} + +div.radio.disabled span, +div.radio.disabled:active span, +div.radio.disabled.active span { + background-position: -144px -279px; +} + +div.radio.disabled span.checked, +div.radio.disabled:active span.checked, +div.radio.disabled.active span.checked { + background-position: -162px -279px; +} + +/* Uploader */ + +div.uploader { + background-position: 0px -297px; + height: 28px; +} + +div.uploader span.action { + background-position: right -409px; + height: 24px; + line-height: 24px; +} + +div.uploader span.filename { + height: 24px; + /* change this line to adjust positioning of filename area */ + margin: 2px 0px 2px 2px; + line-height: 24px; +} + +div.uploader.focus, +div.uploader.hover, +div.uploader:hover { + background-position: 0px -353px; +} + +div.uploader.focus span.action, +div.uploader.hover span.action, +div.uploader:hover span.action { + background-position: right -437px; +} + +div.uploader.active span.action, +div.uploader:active span.action { + background-position: right -465px; +} + +div.uploader.focus.active span.action, +div.uploader:focus.active span.action, +div.uploader.focus:active span.action, +div.uploader:focus:active span.action { + background-position: right -493px; +} + +div.uploader.disabled { + background-position: 0px -325px; +} + +div.uploader.disabled span.action { + background-position: right -381px; +} + +div.button { + background-position: 0px -523px; +} + +div.button span { + background-position: right -643px; +} + +div.button.focus, +div.button:focus, +div.button:hover, +div.button.hover { + background-position: 0px -553px; +} + +div.button.focus span, +div.button:focus span, +div.button:hover span, +div.button.hover span { + background-position: right -673px; +} + +div.button.active, +div.button:active { + background-position: 0px -583px; +} + +div.button.active span, +div.button:active span { + background-position: right -703px; + color: #555; +} + +div.button.disabled, +div.button:disabled { + background-position: 0px -613px; +} + +div.button.disabled span, +div.button:disabled span { + background-position: right -733px; + color: #bbb; + cursor: default; +} + +/* PRESENTATION */ + +/* Button */ + +div.button { + height: 30px; +} + +div.button span { + margin-left: 13px; + height: 22px; + padding-top: 8px; + font-weight: bold; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + letter-spacing: 1px; + text-transform: uppercase; + padding-left: 2px; + padding-right: 15px; +} + +/* Select */ +div.selector { + width: 190px; + font-size: 12px; +} + +div.selector select { + min-width: 190px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + border: solid 1px #fff; +} + +div.selector span { + padding: 0px 25px 0px 2px; + cursor: pointer; +} + +div.selector span { + color: #666; + width: 158px; + text-shadow: 0 1px 0 #fff; +} + +div.selector.disabled span { + color: #bbb; +} + +/* Checker */ +div.checker { + margin-right: 5px; +} + +/* Radio */ +div.radio { + margin-right: 3px; +} + +/* Uploader */ +div.uploader { + width: 190px; + cursor: pointer; +} + +div.uploader span.action { + width: 85px; + text-align: center; + text-shadow: #fff 0px 1px 0px; + background-color: #fff; + font-size: 11px; + font-weight: bold; +} + +div.uploader span.filename { + color: #777; + width: 82px; + border-right: solid 1px #bbb; + font-size: 11px; +} + +div.uploader input { + width: 190px; +} + +div.uploader.disabled span.action { + color: #aaa; +} + +div.uploader.disabled span.filename { + border-color: #ddd; + color: #aaa; +} +/* + +CORE FUNCTIONALITY + +Not advised to edit stuff below this line +----------------------------------------------------- +*/ + +.selector, +.checker, +.button, +.radio, +.uploader { + display: -moz-inline-box; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} + +.selector select:focus, .radio input:focus, .checker input:focus, .uploader input:focus { + outline: 0; +} + +/* Button */ + +div.button a, +div.button button, +div.button input { + position: absolute; +} + +div.button { + cursor: pointer; + position: relative; +} + +div.button span { + display: -moz-inline-box; + display: inline-block; + line-height: 1; + text-align: center; +} + +/* Select */ + +div.selector { + position: relative; + padding-left: 10px; + overflow: hidden; +} + +div.selector span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +div.selector select { + position: absolute; + opacity: 0; + filter: alpha(opacity:0); + height: 25px; + border: none; + background: none; +} + +/* Checker */ + +div.checker { + position: relative; +} + +div.checker span { + display: -moz-inline-box; + display: inline-block; + text-align: center; +} + +div.checker input { + opacity: 0; + filter: alpha(opacity:0); + display: inline-block; + background: none; +} + +/* Radio */ + +div.radio { + position: relative; +} + +div.radio span { + display: -moz-inline-box; + display: inline-block; + text-align: center; +} + +div.radio input { + opacity: 0; + filter: alpha(opacity:0); + text-align: center; + display: inline-block; + background: none; +} + +/* Uploader */ + +div.uploader { + position: relative; + overflow: hidden; + cursor: default; +} + +div.uploader span.action { + float: left; + display: inline; + padding: 2px 0px; + overflow: hidden; + cursor: pointer; +} + +div.uploader span.filename { + padding: 0px 10px; + float: left; + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: default; + position:relative; +} + +div.uploader input { + opacity: 0; + filter: alpha(opacity:0); + position: absolute; + top: 0; + right: 0; + bottom: 0; + float: right; + height: 25px; + border: none; + cursor: default; +} diff --git a/src/main/webapp/resources/font-awesome/css/Descr.WD3 b/src/main/webapp/resources/font-awesome/css/Descr.WD3 new file mode 100644 index 0000000000000000000000000000000000000000..331540eef186dc56f5fdbb493f35fe60b48685d8 Binary files /dev/null and b/src/main/webapp/resources/font-awesome/css/Descr.WD3 differ diff --git a/src/main/webapp/resources/font-awesome/css/font-awesome.css b/src/main/webapp/resources/font-awesome/css/font-awesome.css new file mode 100644 index 0000000000000000000000000000000000000000..496984924d3b614f17c419db316a0789c3d0a2d5 --- /dev/null +++ b/src/main/webapp/resources/font-awesome/css/font-awesome.css @@ -0,0 +1,469 @@ +/* Font Awesome 3.0 + the iconic font designed for use with Twitter Bootstrap + ------------------------------------------------------- + The full suite of pictographic icons, examples, and documentation + can be found at: http://fortawesome.github.com/Font-Awesome/ + + License + ------------------------------------------------------- + • The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL + • Font Awesome CSS, LESS, and SASS files are licensed under the MIT License - + http://opensource.org/licenses/mit-license.html + • The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/ + • Attribution is no longer required in Font Awesome 3.0, but much appreciated: + "Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome" + + Contact + ------------------------------------------------------- + Email: dave@davegandy.com + Twitter: http://twitter.com/fortaweso_me + Work: Lead Product Designer @ http://kyruus.com + + */ +@font-face { + font-family: 'FontAwesome'; + src: url('../font/fontawesome-webfont.eot'); + src: url('../font/fontawesome-webfont.eot@#iefix') format('embedded-opentype'), + url('../font/fontawesome-webfont.woff') format('woff'), + url('../font/fontawesome-webfont.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} +/* Font Awesome styles + ------------------------------------------------------- */ +/* includes sprites.less reset */ +[class^="icon-"], +[class*=" icon-"] { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + text-decoration: inherit; + display: inline; + width: auto; + height: auto; + line-height: normal; + vertical-align: baseline; + background-image: none !important; + background-position: 0% 0%; + background-repeat: repeat; +} +[class^="icon-"]:before, +[class*=" icon-"]:before { + text-decoration: inherit; + display: inline-block; + speak: none; +} +/* makes sure icons active on rollover in links */ +a [class^="icon-"], +a [class*=" icon-"] { + display: inline-block; +} +/* makes the font 33% larger relative to the icon container */ +.icon-large:before { + vertical-align: -10%; + font-size: 1.3333333333333333em; +} +.btn [class^="icon-"], +.nav [class^="icon-"], +.btn [class*=" icon-"], +.nav [class*=" icon-"] { + display: inline; + /* keeps button heights with and without icons the same */ + + line-height: .6em; +} +.btn [class^="icon-"].icon-spin, +.nav [class^="icon-"].icon-spin, +.btn [class*=" icon-"].icon-spin, +.nav [class*=" icon-"].icon-spin { + display: inline-block; +} +li [class^="icon-"], +li [class*=" icon-"] { + display: inline-block; + width: 1.25em; + text-align: center; +} +li [class^="icon-"].icon-large, +li [class*=" icon-"].icon-large { + /* increased font size for icon-large */ + + width: 1.5625em; +} +ul.icons { + list-style-type: none; + text-indent: -0.75em; +} +ul.icons li [class^="icon-"], +ul.icons li [class*=" icon-"] { + width: .75em; +} +.icon-muted { + color: #eeeeee; +} +.icon-border { + border: solid 1px #eeeeee; + padding: .2em .25em .15em; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.icon-2x { + font-size: 2em; +} +.icon-2x.icon-border { + border-width: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.icon-3x { + font-size: 3em; +} +.icon-3x.icon-border { + border-width: 3px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.icon-4x { + font-size: 4em; +} +.icon-4x.icon-border { + border-width: 4px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +[class^="icon-"].pull-left, +[class*=" icon-"].pull-left { + margin-right: .35em; +} +[class^="icon-"].pull-right, +[class*=" icon-"].pull-right { + margin-left: .35em; +} +.btn [class^="icon-"].pull-left.icon-2x, +.btn [class*=" icon-"].pull-left.icon-2x, +.btn [class^="icon-"].pull-right.icon-2x, +.btn [class*=" icon-"].pull-right.icon-2x { + margin-top: .35em; +} +.btn [class^="icon-"].icon-spin.icon-large, +.btn [class*=" icon-"].icon-spin.icon-large { + height: .75em; +} +.btn.btn-small [class^="icon-"].pull-left.icon-2x, +.btn.btn-small [class*=" icon-"].pull-left.icon-2x, +.btn.btn-small [class^="icon-"].pull-right.icon-2x, +.btn.btn-small [class*=" icon-"].pull-right.icon-2x { + margin-top: .45em; +} +.btn.btn-large [class^="icon-"].pull-left.icon-2x, +.btn.btn-large [class*=" icon-"].pull-left.icon-2x, +.btn.btn-large [class^="icon-"].pull-right.icon-2x, +.btn.btn-large [class*=" icon-"].pull-right.icon-2x { + margin-top: .2em; +} +.icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { -moz-transform: rotate(0deg); } + 100% { -moz-transform: rotate(359deg); } +} +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@-o-keyframes spin { + 0% { -o-transform: rotate(0deg); } + 100% { -o-transform: rotate(359deg); } +} +@-ms-keyframes spin { + 0% { -ms-transform: rotate(0deg); } + 100% { -ms-transform: rotate(359deg); } +} +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.icon-glass:before { content: "\f000"; } +.icon-music:before { content: "\f001"; } +.icon-search:before { content: "\f002"; } +.icon-envelope:before { content: "\f003"; } +.icon-heart:before { content: "\f004"; } +.icon-star:before { content: "\f005"; } +.icon-star-empty:before { content: "\f006"; } +.icon-user:before { content: "\f007"; } +.icon-film:before { content: "\f008"; } +.icon-th-large:before { content: "\f009"; } +.icon-th:before { content: "\f00a"; } +.icon-th-list:before { content: "\f00b"; } +.icon-ok:before { content: "\f00c"; } +.icon-remove:before { content: "\f00d"; } +.icon-zoom-in:before { content: "\f00e"; } + +.icon-zoom-out:before { content: "\f010"; } +.icon-off:before { content: "\f011"; } +.icon-signal:before { content: "\f012"; } +.icon-cog:before { content: "\f013"; } +.icon-trash:before { content: "\f014"; } +.icon-home:before { content: "\f015"; } +.icon-file:before { content: "\f016"; } +.icon-time:before { content: "\f017"; } +.icon-road:before { content: "\f018"; } +.icon-download-alt:before { content: "\f019"; } +.icon-download:before { content: "\f01a"; } +.icon-upload:before { content: "\f01b"; } +.icon-inbox:before { content: "\f01c"; } +.icon-play-circle:before { content: "\f01d"; } +.icon-repeat:before { content: "\f01e"; } + +/* \f020 doesn't work in Safari. all shifted one down */ +.icon-refresh:before { content: "\f021"; } +.icon-list-alt:before { content: "\f022"; } +.icon-lock:before { content: "\f023"; } +.icon-flag:before { content: "\f024"; } +.icon-headphones:before { content: "\f025"; } +.icon-volume-off:before { content: "\f026"; } +.icon-volume-down:before { content: "\f027"; } +.icon-volume-up:before { content: "\f028"; } +.icon-qrcode:before { content: "\f029"; } +.icon-barcode:before { content: "\f02a"; } +.icon-tag:before { content: "\f02b"; } +.icon-tags:before { content: "\f02c"; } +.icon-book:before { content: "\f02d"; } +.icon-bookmark:before { content: "\f02e"; } +.icon-print:before { content: "\f02f"; } + +.icon-camera:before { content: "\f030"; } +.icon-font:before { content: "\f031"; } +.icon-bold:before { content: "\f032"; } +.icon-italic:before { content: "\f033"; } +.icon-text-height:before { content: "\f034"; } +.icon-text-width:before { content: "\f035"; } +.icon-align-left:before { content: "\f036"; } +.icon-align-center:before { content: "\f037"; } +.icon-align-right:before { content: "\f038"; } +.icon-align-justify:before { content: "\f039"; } +.icon-list:before { content: "\f03a"; } +.icon-indent-left:before { content: "\f03b"; } +.icon-indent-right:before { content: "\f03c"; } +.icon-facetime-video:before { content: "\f03d"; } +.icon-picture:before { content: "\f03e"; } + +.icon-pencil:before { content: "\f040"; } +.icon-map-marker:before { content: "\f041"; } +.icon-adjust:before { content: "\f042"; } +.icon-tint:before { content: "\f043"; } +.icon-edit:before { content: "\f044"; } +.icon-share:before { content: "\f045"; } +.icon-check:before { content: "\f046"; } +.icon-move:before { content: "\f047"; } +.icon-step-backward:before { content: "\f048"; } +.icon-fast-backward:before { content: "\f049"; } +.icon-backward:before { content: "\f04a"; } +.icon-play:before { content: "\f04b"; } +.icon-pause:before { content: "\f04c"; } +.icon-stop:before { content: "\f04d"; } +.icon-forward:before { content: "\f04e"; } + +.icon-fast-forward:before { content: "\f050"; } +.icon-step-forward:before { content: "\f051"; } +.icon-eject:before { content: "\f052"; } +.icon-chevron-left:before { content: "\f053"; } +.icon-chevron-right:before { content: "\f054"; } +.icon-plus-sign:before { content: "\f055"; } +.icon-minus-sign:before { content: "\f056"; } +.icon-remove-sign:before { content: "\f057"; } +.icon-ok-sign:before { content: "\f058"; } +.icon-question-sign:before { content: "\f059"; } +.icon-info-sign:before { content: "\f05a"; } +.icon-screenshot:before { content: "\f05b"; } +.icon-remove-circle:before { content: "\f05c"; } +.icon-ok-circle:before { content: "\f05d"; } +.icon-ban-circle:before { content: "\f05e"; } + +.icon-arrow-left:before { content: "\f060"; } +.icon-arrow-right:before { content: "\f061"; } +.icon-arrow-up:before { content: "\f062"; } +.icon-arrow-down:before { content: "\f063"; } +.icon-share-alt:before { content: "\f064"; } +.icon-resize-full:before { content: "\f065"; } +.icon-resize-small:before { content: "\f066"; } +.icon-plus:before { content: "\f067"; } +.icon-minus:before { content: "\f068"; } +.icon-asterisk:before { content: "\f069"; } +.icon-exclamation-sign:before { content: "\f06a"; } +.icon-gift:before { content: "\f06b"; } +.icon-leaf:before { content: "\f06c"; } +.icon-fire:before { content: "\f06d"; } +.icon-eye-open:before { content: "\f06e"; } + +.icon-eye-close:before { content: "\f070"; } +.icon-warning-sign:before { content: "\f071"; } +.icon-plane:before { content: "\f072"; } +.icon-calendar:before { content: "\f073"; } +.icon-random:before { content: "\f074"; } +.icon-comment:before { content: "\f075"; } +.icon-magnet:before { content: "\f076"; } +.icon-chevron-up:before { content: "\f077"; } +.icon-chevron-down:before { content: "\f078"; } +.icon-retweet:before { content: "\f079"; } +.icon-shopping-cart:before { content: "\f07a"; } +.icon-folder-close:before { content: "\f07b"; } +.icon-folder-open:before { content: "\f07c"; } +.icon-resize-vertical:before { content: "\f07d"; } +.icon-resize-horizontal:before { content: "\f07e"; } + +.icon-bar-chart:before { content: "\f080"; } +.icon-twitter-sign:before { content: "\f081"; } +.icon-facebook-sign:before { content: "\f082"; } +.icon-camera-retro:before { content: "\f083"; } +.icon-key:before { content: "\f084"; } +.icon-cogs:before { content: "\f085"; } +.icon-comments:before { content: "\f086"; } +.icon-thumbs-up:before { content: "\f087"; } +.icon-thumbs-down:before { content: "\f088"; } +.icon-star-half:before { content: "\f089"; } +.icon-heart-empty:before { content: "\f08a"; } +.icon-signout:before { content: "\f08b"; } +.icon-linkedin-sign:before { content: "\f08c"; } +.icon-pushpin:before { content: "\f08d"; } +.icon-external-link:before { content: "\f08e"; } + +.icon-signin:before { content: "\f090"; } +.icon-trophy:before { content: "\f091"; } +.icon-github-sign:before { content: "\f092"; } +.icon-upload-alt:before { content: "\f093"; } +.icon-lemon:before { content: "\f094"; } +.icon-phone:before { content: "\f095"; } +.icon-check-empty:before { content: "\f096"; } +.icon-bookmark-empty:before { content: "\f097"; } +.icon-phone-sign:before { content: "\f098"; } +.icon-twitter:before { content: "\f099"; } +.icon-facebook:before { content: "\f09a"; } +.icon-github:before { content: "\f09b"; } +.icon-unlock:before { content: "\f09c"; } +.icon-credit-card:before { content: "\f09d"; } +.icon-rss:before { content: "\f09e"; } + +.icon-hdd:before { content: "\f0a0"; } +.icon-bullhorn:before { content: "\f0a1"; } +.icon-bell:before { content: "\f0a2"; } +.icon-certificate:before { content: "\f0a3"; } +.icon-hand-right:before { content: "\f0a4"; } +.icon-hand-left:before { content: "\f0a5"; } +.icon-hand-up:before { content: "\f0a6"; } +.icon-hand-down:before { content: "\f0a7"; } +.icon-circle-arrow-left:before { content: "\f0a8"; } +.icon-circle-arrow-right:before { content: "\f0a9"; } +.icon-circle-arrow-up:before { content: "\f0aa"; } +.icon-circle-arrow-down:before { content: "\f0ab"; } +.icon-globe:before { content: "\f0ac"; } +.icon-wrench:before { content: "\f0ad"; } +.icon-tasks:before { content: "\f0ae"; } + +.icon-filter:before { content: "\f0b0"; } +.icon-briefcase:before { content: "\f0b1"; } +.icon-fullscreen:before { content: "\f0b2"; } + +.icon-group:before { content: "\f0c0"; } +.icon-link:before { content: "\f0c1"; } +.icon-cloud:before { content: "\f0c2"; } +.icon-beaker:before { content: "\f0c3"; } +.icon-cut:before { content: "\f0c4"; } +.icon-copy:before { content: "\f0c5"; } +.icon-paper-clip:before { content: "\f0c6"; } +.icon-save:before { content: "\f0c7"; } +.icon-sign-blank:before { content: "\f0c8"; } +.icon-reorder:before { content: "\f0c9"; } +.icon-list-ul:before { content: "\f0ca"; } +.icon-list-ol:before { content: "\f0cb"; } +.icon-strikethrough:before { content: "\f0cc"; } +.icon-underline:before { content: "\f0cd"; } +.icon-table:before { content: "\f0ce"; } + +.icon-magic:before { content: "\f0d0"; } +.icon-truck:before { content: "\f0d1"; } +.icon-pinterest:before { content: "\f0d2"; } +.icon-pinterest-sign:before { content: "\f0d3"; } +.icon-google-plus-sign:before { content: "\f0d4"; } +.icon-google-plus:before { content: "\f0d5"; } +.icon-money:before { content: "\f0d6"; } +.icon-caret-down:before { content: "\f0d7"; } +.icon-caret-up:before { content: "\f0d8"; } +.icon-caret-left:before { content: "\f0d9"; } +.icon-caret-right:before { content: "\f0da"; } +.icon-columns:before { content: "\f0db"; } +.icon-sort:before { content: "\f0dc"; } +.icon-sort-down:before { content: "\f0dd"; } +.icon-sort-up:before { content: "\f0de"; } + +.icon-envelope-alt:before { content: "\f0e0"; } +.icon-linkedin:before { content: "\f0e1"; } +.icon-undo:before { content: "\f0e2"; } +.icon-legal:before { content: "\f0e3"; } +.icon-dashboard:before { content: "\f0e4"; } +.icon-comment-alt:before { content: "\f0e5"; } +.icon-comments-alt:before { content: "\f0e6"; } +.icon-bolt:before { content: "\f0e7"; } +.icon-sitemap:before { content: "\f0e8"; } +.icon-umbrella:before { content: "\f0e9"; } +.icon-paste:before { content: "\f0ea"; } +.icon-lightbulb:before { content: "\f0eb"; } +.icon-exchange:before { content: "\f0ec"; } +.icon-cloud-download:before { content: "\f0ed"; } +.icon-cloud-upload:before { content: "\f0ee"; } + +.icon-user-md:before { content: "\f0f0"; } +.icon-stethoscope:before { content: "\f0f1"; } +.icon-suitcase:before { content: "\f0f2"; } +.icon-bell-alt:before { content: "\f0f3"; } +.icon-coffee:before { content: "\f0f4"; } +.icon-food:before { content: "\f0f5"; } +.icon-file-alt:before { content: "\f0f6"; } +.icon-building:before { content: "\f0f7"; } +.icon-hospital:before { content: "\f0f8"; } +.icon-ambulance:before { content: "\f0f9"; } +.icon-medkit:before { content: "\f0fa"; } +.icon-fighter-jet:before { content: "\f0fb"; } +.icon-beer:before { content: "\f0fc"; } +.icon-h-sign:before { content: "\f0fd"; } +.icon-plus-sign-alt:before { content: "\f0fe"; } + +.icon-double-angle-left:before { content: "\f100"; } +.icon-double-angle-right:before { content: "\f101"; } +.icon-double-angle-up:before { content: "\f102"; } +.icon-double-angle-down:before { content: "\f103"; } +.icon-angle-left:before { content: "\f104"; } +.icon-angle-right:before { content: "\f105"; } +.icon-angle-up:before { content: "\f106"; } +.icon-angle-down:before { content: "\f107"; } +.icon-desktop:before { content: "\f108"; } +.icon-laptop:before { content: "\f109"; } +.icon-tablet:before { content: "\f10a"; } +.icon-mobile-phone:before { content: "\f10b"; } +.icon-circle-blank:before { content: "\f10c"; } +.icon-quote-left:before { content: "\f10d"; } +.icon-quote-right:before { content: "\f10e"; } + +.icon-spinner:before { content: "\f110"; } +.icon-circle:before { content: "\f111"; } +.icon-reply:before { content: "\f112"; } +.icon-github-alt:before { content: "\f113"; } +.icon-folder-close-alt:before { content: "\f114"; } +.icon-folder-open-alt:before { content: "\f115"; } diff --git a/src/main/webapp/resources/font-awesome/font/Descr.WD3 b/src/main/webapp/resources/font-awesome/font/Descr.WD3 new file mode 100644 index 0000000000000000000000000000000000000000..6808d4811caf6a50a080f32e709c3fa0e54af0ef Binary files /dev/null and b/src/main/webapp/resources/font-awesome/font/Descr.WD3 differ diff --git a/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.eot b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..7d81019e4f174caaf5ccd785fc361f6bff196b53 Binary files /dev/null and b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.eot differ diff --git a/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.eot@ b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.eot@ new file mode 100644 index 0000000000000000000000000000000000000000..7d81019e4f174caaf5ccd785fc361f6bff196b53 Binary files /dev/null and b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.eot@ differ diff --git a/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.ttf b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d46172476a3c7caf4f44946e3c40218559f3edfa Binary files /dev/null and b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.ttf differ diff --git a/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.woff b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..3c89ae09b88b38d3bc8563ca69f7f401b7301f45 Binary files /dev/null and b/src/main/webapp/resources/font-awesome/font/fontawesome-webfont.woff differ diff --git a/src/main/webapp/resources/font/fontello.eot b/src/main/webapp/resources/font/fontello.eot new file mode 100644 index 0000000000000000000000000000000000000000..d00285750745c9a2677a93153b7d8032f5b02789 Binary files /dev/null and b/src/main/webapp/resources/font/fontello.eot differ diff --git a/src/main/webapp/resources/font/fontello.svg b/src/main/webapp/resources/font/fontello.svg new file mode 100644 index 0000000000000000000000000000000000000000..db06416b0036d6cc1d97c3bacf6011ca8c206fcd --- /dev/null +++ b/src/main/webapp/resources/font/fontello.svg @@ -0,0 +1,64 @@ + + + +Copyright (C) 2018 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/font/fontello.ttf b/src/main/webapp/resources/font/fontello.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3676c9900515e2859848be1e61bf78c5d96069fe Binary files /dev/null and b/src/main/webapp/resources/font/fontello.ttf differ diff --git a/src/main/webapp/resources/font/fontello.woff b/src/main/webapp/resources/font/fontello.woff new file mode 100644 index 0000000000000000000000000000000000000000..05a3ae4378c1e47eaf1bfe0d438c5338161a650c Binary files /dev/null and b/src/main/webapp/resources/font/fontello.woff differ diff --git a/src/main/webapp/resources/font/fontello.woff2 b/src/main/webapp/resources/font/fontello.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9eeed0d4f0f678ab6afe13b896e1a222a7450c4f Binary files /dev/null and b/src/main/webapp/resources/font/fontello.woff2 differ diff --git a/src/main/webapp/resources/images/.DS_Store b/src/main/webapp/resources/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ad15ae628217ba3f10a57f0ee461c1fa2e75df41 Binary files /dev/null and b/src/main/webapp/resources/images/.DS_Store differ diff --git a/src/main/webapp/resources/images/backgrounds/Descr.WD3 b/src/main/webapp/resources/images/backgrounds/Descr.WD3 new file mode 100644 index 0000000000000000000000000000000000000000..072db7a9de7de6e10e0485b4e3ffb62ef83571c7 Binary files /dev/null and b/src/main/webapp/resources/images/backgrounds/Descr.WD3 differ diff --git a/src/main/webapp/resources/images/backgrounds/blank2 b/src/main/webapp/resources/images/backgrounds/blank2 new file mode 100644 index 0000000000000000000000000000000000000000..398700e09c4ec3745bd38b7d5e8d77b9a6facbb5 Binary files /dev/null and b/src/main/webapp/resources/images/backgrounds/blank2 differ diff --git a/src/main/webapp/resources/images/backgrounds/calActiveBg.html b/src/main/webapp/resources/images/backgrounds/calActiveBg.html new file mode 100644 index 0000000000000000000000000000000000000000..1730507810d929691a01b948f2483f2c1b6a61d7 --- /dev/null +++ b/src/main/webapp/resources/images/backgrounds/calActiveBg.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + Page not found - Theme Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HOME +ABOUT +WORK +PREMIUM THEMES +FREEBIES +CONTACT + + + + + + + + + + 404 Not Found + Apologies, but the page you requested could not be found. Perhaps searching will help. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/images/backgrounds/skype_3Asuniljoshi19@call b/src/main/webapp/resources/images/backgrounds/skype_3Asuniljoshi19@call new file mode 100644 index 0000000000000000000000000000000000000000..1730507810d929691a01b948f2483f2c1b6a61d7 --- /dev/null +++ b/src/main/webapp/resources/images/backgrounds/skype_3Asuniljoshi19@call @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + Page not found - Theme Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HOME +ABOUT +WORK +PREMIUM THEMES +FREEBIES +CONTACT + + + + + + + + + + 404 Not Found + Apologies, but the page you requested could not be found. Perhaps searching will help. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/images/gallery/imgbox3.html b/src/main/webapp/resources/images/gallery/imgbox3.html new file mode 100644 index 0000000000000000000000000000000000000000..1229715285cd5f52b299a9dcf7936157626237ff --- /dev/null +++ b/src/main/webapp/resources/images/gallery/imgbox3.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + Page not found - Theme Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HOME +ABOUT +WORK +PREMIUM THEMES +FREEBIES +CONTACT + + + + + + + + + + 404 Not Found + Apologies, but the page you requested could not be found. Perhaps searching will help. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/img/.DS_Store b/src/main/webapp/resources/img/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..57777b4277f3c6394ee890cb885ca0fe0dbce7c4 Binary files /dev/null and b/src/main/webapp/resources/img/.DS_Store differ diff --git a/src/main/webapp/resources/img/Descr.WD3 b/src/main/webapp/resources/img/Descr.WD3 new file mode 100644 index 0000000000000000000000000000000000000000..e410f477eea631fb9cd550c3343221ab07d1bf3b Binary files /dev/null and b/src/main/webapp/resources/img/Descr.WD3 differ diff --git a/src/main/webapp/resources/img/alpha.html b/src/main/webapp/resources/img/alpha.html new file mode 100644 index 0000000000000000000000000000000000000000..1229715285cd5f52b299a9dcf7936157626237ff --- /dev/null +++ b/src/main/webapp/resources/img/alpha.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + Page not found - Theme Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HOME +ABOUT +WORK +PREMIUM THEMES +FREEBIES +CONTACT + + + + + + + + + + 404 Not Found + Apologies, but the page you requested could not be found. Perhaps searching will help. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/img/bg.jpg b/src/main/webapp/resources/img/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d6651de5bb56b42a349b56b684ead751a153e7c Binary files /dev/null and b/src/main/webapp/resources/img/bg.jpg differ diff --git a/src/main/webapp/resources/img/breadcrumb.png b/src/main/webapp/resources/img/breadcrumb.png new file mode 100644 index 0000000000000000000000000000000000000000..d3462402e4f803860a6b11fdc9bff76f7e3a955d Binary files /dev/null and b/src/main/webapp/resources/img/breadcrumb.png differ diff --git a/src/main/webapp/resources/img/default.png b/src/main/webapp/resources/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..581c3c23d378f0ca755ea091ee914aa0e274788b Binary files /dev/null and b/src/main/webapp/resources/img/default.png differ diff --git a/src/main/webapp/resources/img/demo/Descr.WD3 b/src/main/webapp/resources/img/demo/Descr.WD3 new file mode 100644 index 0000000000000000000000000000000000000000..9388fbf80f192d66b19c0f0d09ddf0d6bda335b4 Binary files /dev/null and b/src/main/webapp/resources/img/demo/Descr.WD3 differ diff --git a/src/main/webapp/resources/img/demo/av1.jpg b/src/main/webapp/resources/img/demo/av1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3caaa76a520caca2e68f4f94c39bac7ad80a89e Binary files /dev/null and b/src/main/webapp/resources/img/demo/av1.jpg differ diff --git a/src/main/webapp/resources/img/demo/av2.jpg b/src/main/webapp/resources/img/demo/av2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73bbe80b7e030676588c670387aa497c29cca419 Binary files /dev/null and b/src/main/webapp/resources/img/demo/av2.jpg differ diff --git a/src/main/webapp/resources/img/demo/av3.jpg b/src/main/webapp/resources/img/demo/av3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73eef408fd21e539eb6764bb697282e873e6a70a Binary files /dev/null and b/src/main/webapp/resources/img/demo/av3.jpg differ diff --git a/src/main/webapp/resources/img/demo/av4.jpg b/src/main/webapp/resources/img/demo/av4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4271fc29b25813729dc874d6d4ef00cb6fc3d4af Binary files /dev/null and b/src/main/webapp/resources/img/demo/av4.jpg differ diff --git a/src/main/webapp/resources/img/demo/av5.jpg b/src/main/webapp/resources/img/demo/av5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dfa24fa5ab3ba4873690e49d2a5cd46ad579d340 Binary files /dev/null and b/src/main/webapp/resources/img/demo/av5.jpg differ diff --git a/src/main/webapp/resources/img/demo/demo-image1.jpg b/src/main/webapp/resources/img/demo/demo-image1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4a2191cc5e1bc0bf46bd90005dd24faa6f2e8b8 Binary files /dev/null and b/src/main/webapp/resources/img/demo/demo-image1.jpg differ diff --git a/src/main/webapp/resources/img/demo/demo-image2.jpg b/src/main/webapp/resources/img/demo/demo-image2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e63af85b568b77125a776a09fe6660d3d2aca31 Binary files /dev/null and b/src/main/webapp/resources/img/demo/demo-image2.jpg differ diff --git a/src/main/webapp/resources/img/demo/demo-image3.jpg b/src/main/webapp/resources/img/demo/demo-image3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..079da312559e982ce42cc2d27da7bf433c85a6b8 Binary files /dev/null and b/src/main/webapp/resources/img/demo/demo-image3.jpg differ diff --git a/src/main/webapp/resources/img/demo/envelope.png b/src/main/webapp/resources/img/demo/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..78c131c0ff2bf69fc04e537076ecc408c020cbb6 Binary files /dev/null and b/src/main/webapp/resources/img/demo/envelope.png differ diff --git a/src/main/webapp/resources/img/gallery/Descr.WD3 b/src/main/webapp/resources/img/gallery/Descr.WD3 new file mode 100644 index 0000000000000000000000000000000000000000..8ce58a45706c438fef50f4d35bac8d509205a708 Binary files /dev/null and b/src/main/webapp/resources/img/gallery/Descr.WD3 differ diff --git a/src/main/webapp/resources/img/gallery/imgbox1.jpg b/src/main/webapp/resources/img/gallery/imgbox1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba58811c73f31fd2ee98dc13988d70c2073264f8 Binary files /dev/null and b/src/main/webapp/resources/img/gallery/imgbox1.jpg differ diff --git a/src/main/webapp/resources/img/gallery/imgbox2.jpg b/src/main/webapp/resources/img/gallery/imgbox2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3dba1a5076b0f95323bfb158be130fff03275c7 Binary files /dev/null and b/src/main/webapp/resources/img/gallery/imgbox2.jpg differ diff --git a/src/main/webapp/resources/img/gallery/imgbox3.jpg b/src/main/webapp/resources/img/gallery/imgbox3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..182e7cbedf27d071bce4dcbe4965fa428e6f9e7f Binary files /dev/null and b/src/main/webapp/resources/img/gallery/imgbox3.jpg differ diff --git a/src/main/webapp/resources/img/gallery/imgbox4.jpg b/src/main/webapp/resources/img/gallery/imgbox4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2278036fe38014d1c5861f79e15c434a877d436 Binary files /dev/null and b/src/main/webapp/resources/img/gallery/imgbox4.jpg differ diff --git a/src/main/webapp/resources/img/gallery/imgbox5.jpg b/src/main/webapp/resources/img/gallery/imgbox5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa60cc5520f86328e5a5e7a58932603eb37a0ccd Binary files /dev/null and b/src/main/webapp/resources/img/gallery/imgbox5.jpg differ diff --git a/src/main/webapp/resources/img/glyphicons-halflings-white.png b/src/main/webapp/resources/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae Binary files /dev/null and b/src/main/webapp/resources/img/glyphicons-halflings-white.png differ diff --git a/src/main/webapp/resources/img/glyphicons-halflings.html b/src/main/webapp/resources/img/glyphicons-halflings.html new file mode 100644 index 0000000000000000000000000000000000000000..1229715285cd5f52b299a9dcf7936157626237ff --- /dev/null +++ b/src/main/webapp/resources/img/glyphicons-halflings.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + Page not found - Theme Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HOME +ABOUT +WORK +PREMIUM THEMES +FREEBIES +CONTACT + + + + + + + + + + 404 Not Found + Apologies, but the page you requested could not be found. Perhaps searching will help. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/img/gritter.png b/src/main/webapp/resources/img/gritter.png new file mode 100644 index 0000000000000000000000000000000000000000..4b84bf78f5f5d49afedbf5863ecccdb8ae95a6f6 Binary files /dev/null and b/src/main/webapp/resources/img/gritter.png differ diff --git a/src/main/webapp/resources/img/hue.png b/src/main/webapp/resources/img/hue.png new file mode 100644 index 0000000000000000000000000000000000000000..75957d0509be44f3caf317b832e44307950b0415 Binary files /dev/null and b/src/main/webapp/resources/img/hue.png differ diff --git a/src/main/webapp/resources/img/icon.png b/src/main/webapp/resources/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..861e030c0a577a4079c320bd6f74322b96b5f07d Binary files /dev/null and b/src/main/webapp/resources/img/icon.png differ diff --git a/src/main/webapp/resources/img/larrow.png b/src/main/webapp/resources/img/larrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a736809a1179d8b7741410ea3a8da0307fb223 Binary files /dev/null and b/src/main/webapp/resources/img/larrow.png differ diff --git a/src/main/webapp/resources/img/line.png b/src/main/webapp/resources/img/line.png new file mode 100644 index 0000000000000000000000000000000000000000..ef73f83f89755fb6894750705ce7d1b7af2bd9b0 Binary files /dev/null and b/src/main/webapp/resources/img/line.png differ diff --git a/src/main/webapp/resources/img/logo.png b/src/main/webapp/resources/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a4565c211a83ebd00b19309fc7e6e39e320f7b Binary files /dev/null and b/src/main/webapp/resources/img/logo.png differ diff --git a/src/main/webapp/resources/img/logoer.png b/src/main/webapp/resources/img/logoer.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3157942a279495aad476c8f966ce138b536595 Binary files /dev/null and b/src/main/webapp/resources/img/logoer.png differ diff --git a/src/main/webapp/resources/img/menu-active.png b/src/main/webapp/resources/img/menu-active.png new file mode 100644 index 0000000000000000000000000000000000000000..a62bbebd33e62993bc5f77af5a6cd87819223d61 Binary files /dev/null and b/src/main/webapp/resources/img/menu-active.png differ diff --git a/src/main/webapp/resources/img/rarrow.png b/src/main/webapp/resources/img/rarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9fdf832907b3ff66aee1f8bba36358f6781bd6 Binary files /dev/null and b/src/main/webapp/resources/img/rarrow.png differ diff --git a/src/main/webapp/resources/img/saturation.png b/src/main/webapp/resources/img/saturation.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e7fcd9c7712465e027166a37c4e82929f7f4d4 Binary files /dev/null and b/src/main/webapp/resources/img/saturation.png differ diff --git a/src/main/webapp/resources/img/select2.png b/src/main/webapp/resources/img/select2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba2d825b11fc34196a78340f058a75217a7be18 Binary files /dev/null and b/src/main/webapp/resources/img/select2.png differ diff --git a/src/main/webapp/resources/img/spinner.gif b/src/main/webapp/resources/img/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 Binary files /dev/null and b/src/main/webapp/resources/img/spinner.gif differ diff --git a/src/main/webapp/resources/img/sprite.png b/src/main/webapp/resources/img/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b27c3e3cab676d3c0702d71ac3500f91c3cd67 Binary files /dev/null and b/src/main/webapp/resources/img/sprite.png differ diff --git a/src/main/webapp/resources/js/.DS_Store b/src/main/webapp/resources/js/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5be668f349f8545f8af8782ab57dae295f47f3a2 Binary files /dev/null and b/src/main/webapp/resources/js/.DS_Store differ diff --git a/src/main/webapp/resources/js/bootstrap-colorpicker.js b/src/main/webapp/resources/js/bootstrap-colorpicker.js new file mode 100644 index 0000000000000000000000000000000000000000..6a0fc8adba0aa401be5edef94e87f6dd17a762ba --- /dev/null +++ b/src/main/webapp/resources/js/bootstrap-colorpicker.js @@ -0,0 +1,540 @@ +/* ========================================================= + * bootstrap-colorpicker.js + * http://www.eyecon.ro/bootstrap-colorpicker + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +!function( $ ) { + + // Color object + + var Color = function(val) { + this.value = { + h: 1, + s: 1, + b: 1, + a: 1 + }; + this.setColor(val); + }; + + Color.prototype = { + constructor: Color, + + //parse a string to HSB + setColor: function(val){ + val = val.toLowerCase(); + var that = this; + $.each( CPGlobal.stringParsers, function( i, parser ) { + var match = parser.re.exec( val ), + values = match && parser.parse( match ), + space = parser.space||'rgba'; + if ( values ) { + if (space === 'hsla') { + that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values)); + } else { + that.value = CPGlobal.RGBtoHSB.apply(null, values); + } + return false; + } + }); + }, + + setHue: function(h) { + this.value.h = 1- h; + }, + + setSaturation: function(s) { + this.value.s = s; + }, + + setLightness: function(b) { + this.value.b = 1- b; + }, + + setAlpha: function(a) { + this.value.a = parseInt((1 - a)*100, 10)/100; + }, + + // HSBtoRGB from RaphaelJS + // https://github.com/DmitryBaranovskiy/raphael/ + toRGB: function(h, s, b, a) { + if (!h) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = b * s; + X = C * (1 - Math.abs(h % 2 - 1)); + R = G = B = b - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return { + r: Math.round(R*255), + g: Math.round(G*255), + b: Math.round(B*255), + a: a||this.value.a + }; + }, + + toHex: function(h, s, b, a){ + var rgb = this.toRGB(h, s, b, a); + return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1); + }, + + toHSL: function(h, s, b, a){ + if (!h) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + } + var H = h, + L = (2 - s) * b, + S = s * b; + if (L > 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: H, + s: S, + l: L, + a: a||this.value.a + }; + } + }; + + // Picker object + + var Colorpicker = function(element, options){ + this.element = $(element); + var format = options.format||this.element.data('color-format')||'hex'; + this.format = CPGlobal.translateFormats[format]; + this.isInput = this.element.is('input'); + this.component = this.element.is('.color') ? this.element.find('.add-on') : false; + + this.picker = $(CPGlobal.template) + .appendTo('body') + .on('mousedown', $.proxy(this.mousedown, this)); + + if (this.isInput) { + this.element.on({ + 'focus': $.proxy(this.show, this), + 'keyup': $.proxy(this.update, this) + }); + } else if (this.component){ + this.component.on({ + 'click': $.proxy(this.show, this) + }); + } else { + this.element.on({ + 'click': $.proxy(this.show, this) + }); + } + if (format === 'rgba' || format === 'hsla') { + this.picker.addClass('alpha'); + this.alpha = this.picker.find('.colorpicker-alpha')[0].style; + } + + if (this.component){ + this.picker.find('.colorpicker-color').hide(); + this.preview = this.element.find('i')[0].style; + } else { + this.preview = this.picker.find('div:last')[0].style; + } + + this.base = this.picker.find('div:first')[0].style; + this.update(); + }; + + Colorpicker.prototype = { + constructor: Colorpicker, + + show: function(e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (!this.isInput) { + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + } + $(document).on({ + 'mousedown': $.proxy(this.hide, this) + }); + this.element.trigger({ + type: 'show', + color: this.color + }); + }, + + update: function(){ + this.color = new Color(this.isInput ? this.element.prop('value') : this.element.data('color')); + this.picker.find('i') + .eq(0).css({left: this.color.value.s*100, top: 100 - this.color.value.b*100}).end() + .eq(1).css('top', 100 * (1 - this.color.value.h)).end() + .eq(2).css('top', 100 * (1 - this.color.value.a)); + this.previewColor(); + }, + + setValue: function(newColor) { + this.color = new Color(newColor); + this.picker.find('i') + .eq(0).css({left: this.color.value.s*100, top: 100 - this.color.value.b*100}).end() + .eq(1).css('top', 100 * (1 - this.color.value.h)).end() + .eq(2).css('top', 100 * (1 - this.color.value.a)); + this.previewColor(); + this.element.trigger({ + type: 'changeColor', + color: this.color + }); + }, + + hide: function(){ + this.picker.hide(); + $(window).off('resize', this.place); + if (!this.isInput) { + $(document).off({ + 'mousedown': this.hide + }); + if (this.component){ + this.element.find('input').prop('value', this.format.call(this)); + } + this.element.data('color', this.format.call(this)); + } else { + this.element.prop('value', this.format.call(this)); + } + this.element.trigger({ + type: 'hide', + color: this.color + }); + }, + + place: function(){ + var offset = this.component ? this.component.offset() : this.element.offset(); + this.picker.css({ + top: offset.top + this.height, + left: offset.left + }); + }, + + //preview color change + previewColor: function(){ + try { + this.preview.backgroundColor = this.format.call(this); + } catch(e) { + this.preview.backgroundColor = this.color.toHex(); + } + //set the color for brightness/saturation slider + this.base.backgroundColor = this.color.toHex(this.color.value.h, 1, 1, 1); + //set te color for alpha slider + if (this.alpha) { + this.alpha.backgroundColor = this.color.toHex(); + } + }, + + pointer: null, + + slider: null, + + mousedown: function(e){ + e.stopPropagation(); + e.preventDefault(); + + var target = $(e.target); + + //detect the slider and set the limits and callbacks + var zone = target.closest('div'); + if (!zone.is('.colorpicker')) { + if (zone.is('.colorpicker-saturation')) { + this.slider = $.extend({}, CPGlobal.sliders.saturation); + } + else if (zone.is('.colorpicker-hue')) { + this.slider = $.extend({}, CPGlobal.sliders.hue); + } + else if (zone.is('.colorpicker-alpha')) { + this.slider = $.extend({}, CPGlobal.sliders.alpha); + } else { + return false; + } + var offset = zone.offset(); + //reference to knob's style + this.slider.knob = zone.find('i')[0].style; + this.slider.left = e.pageX - offset.left; + this.slider.top = e.pageY - offset.top; + this.pointer = { + left: e.pageX, + top: e.pageY + }; + //trigger mousemove to move the knob to the current position + $(document).on({ + mousemove: $.proxy(this.mousemove, this), + mouseup: $.proxy(this.mouseup, this) + }).trigger('mousemove'); + } + return false; + }, + + mousemove: function(e){ + e.stopPropagation(); + e.preventDefault(); + var left = Math.max( + 0, + Math.min( + this.slider.maxLeft, + this.slider.left + ((e.pageX||this.pointer.left) - this.pointer.left) + ) + ); + var top = Math.max( + 0, + Math.min( + this.slider.maxTop, + this.slider.top + ((e.pageY||this.pointer.top) - this.pointer.top) + ) + ); + this.slider.knob.left = left + 'px'; + this.slider.knob.top = top + 'px'; + if (this.slider.callLeft) { + this.color[this.slider.callLeft].call(this.color, left/100); + } + if (this.slider.callTop) { + this.color[this.slider.callTop].call(this.color, top/100); + } + this.previewColor(); + this.element.trigger({ + type: 'changeColor', + color: this.color + }); + return false; + }, + + mouseup: function(e){ + e.stopPropagation(); + e.preventDefault(); + $(document).off({ + mousemove: this.mousemove, + mouseup: this.mouseup + }); + return false; + } + } + + $.fn.colorpicker = function ( option ) { + return this.each(function () { + var $this = $(this), + data = $this.data('colorpicker'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('colorpicker', (data = new Colorpicker(this, $.extend({}, $.fn.colorpicker.defaults,options)))); + } + if (typeof option === 'string') data[option](); + }); + }; + + $.fn.colorpicker.defaults = { + }; + + $.fn.colorpicker.Constructor = Colorpicker; + + var CPGlobal = { + + // translate a format from Color object to a string + translateFormats: { + 'rgb': function(){ + var rgb = this.color.toRGB(); + return 'rgb('+rgb.r+','+rgb.g+','+rgb.b+')'; + }, + + 'rgba': function(){ + var rgb = this.color.toRGB(); + return 'rgba('+rgb.r+','+rgb.g+','+rgb.b+','+rgb.a+')'; + }, + + 'hsl': function(){ + var hsl = this.color.toHSL(); + return 'hsl('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%)'; + }, + + 'hsla': function(){ + var hsl = this.color.toHSL(); + return 'hsla('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%,'+hsl.a+')'; + }, + + 'hex': function(){ + return this.color.toHex(); + } + }, + + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setLightness' + }, + + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + + // HSBtoRGB from RaphaelJS + // https://github.com/DmitryBaranovskiy/raphael/ + RGBtoHSB: function (r, g, b, a){ + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return {h: H||1, s: S, b: V, a: a||1}; + }, + + HueToRGB: function (p, q, h) { + if (h < 0) + h += 1; + else if (h > 1) + h -= 1; + + if ((h * 6) < 1) + return p + (q - p) * h * 6; + else if ((h * 2) < 1) + return q; + else if ((h * 3) < 2) + return p + (q - p) * ((2 / 3) - h) * 6; + else + return p; + }, + + HSLtoRGB: function (h, s, l, a) + { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(CPGlobal.HueToRGB(p, q, tr) * 255); + var g = Math.round(CPGlobal.HueToRGB(p, q, tg) * 255); + var b = Math.round(CPGlobal.HueToRGB(p, q, tb) * 255); + return [r, g, b, a||1]; + }, + + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [ + { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ], + execResult[ 3 ], + execResult[ 4 ] + ]; + } + }, { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[ 4 ] + ]; + } + }, { + re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ], 16 ) + ]; + } + }, { + re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) + ]; + } + }, { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + space: 'hsla', + parse: function( execResult ) { + return [ + execResult[1]/360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + } + ], + template: ''+ + ''+ + ''+ + ''+ + ''+ + '' + }; + +}( window.jQuery ) \ No newline at end of file diff --git a/src/main/webapp/resources/js/bootstrap-datepicker.js b/src/main/webapp/resources/js/bootstrap-datepicker.js new file mode 100644 index 0000000000000000000000000000000000000000..8875ec124f84e1bfba038c242e502687f915bd4b --- /dev/null +++ b/src/main/webapp/resources/js/bootstrap-datepicker.js @@ -0,0 +1,454 @@ +/* ========================================================= + * bootstrap-datepicker.js + * http://www.eyecon.ro/bootstrap-datepicker + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +!function( $ ) { + + // Picker object + + var Datepicker = function(element, options){ + this.element = $(element); + this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy'); + this.picker = $(DPGlobal.template) + .appendTo('body') + .on({ + click: $.proxy(this.click, this), + mousedown: $.proxy(this.mousedown, this) + }); + this.isInput = this.element.is('input'); + this.component = this.element.is('.date') ? this.element.find('.add-on') : false; + + if (this.isInput) { + this.element.on({ + focus: $.proxy(this.show, this), + blur: $.proxy(this.hide, this), + keyup: $.proxy(this.update, this) + }); + } else { + if (this.component){ + this.component.on('click', $.proxy(this.show, this)); + } else { + this.element.on('click', $.proxy(this.show, this)); + } + } + this.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0; + if (typeof this.minViewMode === 'string') { + switch (this.minViewMode) { + case 'months': + this.minViewMode = 1; + break; + case 'years': + this.minViewMode = 2; + break; + default: + this.minViewMode = 0; + break; + } + } + this.viewMode = options.viewMode||this.element.data('date-viewmode')||0; + if (typeof this.viewMode === 'string') { + switch (this.viewMode) { + case 'months': + this.viewMode = 1; + break; + case 'years': + this.viewMode = 2; + break; + default: + this.viewMode = 0; + break; + } + } + this.startViewMode = this.viewMode; + this.weekStart = options.weekStart||this.element.data('date-weekstart')||0; + this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1; + this.fillDow(); + this.fillMonths(); + this.update(); + this.showMode(); + }; + + Datepicker.prototype = { + constructor: Datepicker, + + show: function(e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (e ) { + e.stopPropagation(); + e.preventDefault(); + } + if (!this.isInput) { + $(document).on('mousedown', $.proxy(this.hide, this)); + } + this.element.trigger({ + type: 'show', + date: this.date + }); + }, + + hide: function(){ + this.picker.hide(); + $(window).off('resize', this.place); + this.viewMode = this.startViewMode; + this.showMode(); + if (!this.isInput) { + $(document).off('mousedown', this.hide); + } + this.set(); + this.element.trigger({ + type: 'hide', + date: this.date + }); + }, + + set: function() { + var formated = DPGlobal.formatDate(this.date, this.format); + if (!this.isInput) { + if (this.component){ + this.element.find('input').prop('value', formated); + } + this.element.data('date', formated); + } else { + this.element.prop('value', formated); + } + }, + + setValue: function(newDate) { + if (typeof newDate === 'string') { + this.date = DPGlobal.parseDate(newDate, this.format); + } else { + this.date = new Date(newDate); + } + this.set(); + this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); + this.fill(); + }, + + place: function(){ + var offset = this.component ? this.component.offset() : this.element.offset(); + this.picker.css({ + top: offset.top + this.height, + left: offset.left + }); + }, + + update: function(newDate){ + this.date = DPGlobal.parseDate( + typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')), + this.format + ); + this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); + this.fill(); + }, + + fillDow: function(){ + var dowCnt = this.weekStart; + var html = ''; + while (dowCnt < this.weekStart + 7) { + html += ''+DPGlobal.dates.daysMin[(dowCnt++)%7]+''; + } + html += ''; + this.picker.find('.datepicker-days thead').append(html); + }, + + fillMonths: function(){ + var html = ''; + var i = 0 + while (i < 12) { + html += ''+DPGlobal.dates.monthsShort[i++]+''; + } + this.picker.find('.datepicker-months td').append(html); + }, + + fill: function() { + var d = new Date(this.viewDate), + year = d.getFullYear(), + month = d.getMonth(), + currentDate = this.date.valueOf(); + this.picker.find('.datepicker-days th:eq(1)') + .text(DPGlobal.dates.months[month]+' '+year); + var prevMonth = new Date(year, month-1, 28,0,0,0,0), + day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth()); + prevMonth.setDate(day); + prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7); + var nextMonth = new Date(prevMonth); + nextMonth.setDate(nextMonth.getDate() + 42); + nextMonth = nextMonth.valueOf(); + html = []; + var clsName; + while(prevMonth.valueOf() < nextMonth) { + if (prevMonth.getDay() === this.weekStart) { + html.push(''); + } + clsName = ''; + if (prevMonth.getMonth() < month) { + clsName += ' old'; + } else if (prevMonth.getMonth() > month) { + clsName += ' new'; + } + if (prevMonth.valueOf() === currentDate) { + clsName += ' active'; + } + html.push(''+prevMonth.getDate() + ''); + if (prevMonth.getDay() === this.weekEnd) { + html.push(''); + } + prevMonth.setDate(prevMonth.getDate()+1); + } + this.picker.find('.datepicker-days tbody').empty().append(html.join('')); + var currentYear = this.date.getFullYear(); + + var months = this.picker.find('.datepicker-months') + .find('th:eq(1)') + .text(year) + .end() + .find('span').removeClass('active'); + if (currentYear === year) { + months.eq(this.date.getMonth()).addClass('active'); + } + + html = ''; + year = parseInt(year/10, 10) * 10; + var yearCont = this.picker.find('.datepicker-years') + .find('th:eq(1)') + .text(year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + for (var i = -1; i < 11; i++) { + html += ''+year+''; + year += 1; + } + yearCont.html(html); + }, + + click: function(e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(e.target).closest('span, td, th'); + if (target.length === 1) { + switch(target[0].nodeName.toLowerCase()) { + case 'th': + switch(target[0].className) { + case 'switch': + this.showMode(1); + break; + case 'prev': + case 'next': + this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call( + this.viewDate, + this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) + + DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1) + ); + this.fill(); + this.set(); + break; + } + break; + case 'span': + if (target.is('.month')) { + var month = target.parent().find('span').index(target); + this.viewDate.setMonth(month); + } else { + var year = parseInt(target.text(), 10)||0; + this.viewDate.setFullYear(year); + } + if (this.viewMode !== 0) { + this.date = new Date(this.viewDate); + this.element.trigger({ + type: 'changeDate', + date: this.date, + viewMode: DPGlobal.modes[this.viewMode].clsName + }); + } + this.showMode(-1); + this.fill(); + this.set(); + break; + case 'td': + if (target.is('.day')){ + var day = parseInt(target.text(), 10)||1; + var month = this.viewDate.getMonth(); + if (target.is('.old')) { + month -= 1; + } else if (target.is('.new')) { + month += 1; + } + var year = this.viewDate.getFullYear(); + this.date = new Date(year, month, day,0,0,0,0); + this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0); + this.fill(); + this.set(); + this.element.trigger({ + type: 'changeDate', + date: this.date, + viewMode: DPGlobal.modes[this.viewMode].clsName + }); + } + break; + } + } + }, + + mousedown: function(e){ + e.stopPropagation(); + e.preventDefault(); + }, + + showMode: function(dir) { + if (dir) { + this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir)); + } + this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + } + }; + + $.fn.datepicker = function ( option, val ) { + return this.each(function () { + var $this = $(this), + data = $this.data('datepicker'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options)))); + } + if (typeof option === 'string') data[option](val); + }); + }; + + $.fn.datepicker.defaults = { + }; + $.fn.datepicker.Constructor = Datepicker; + + var DPGlobal = { + modes: [ + { + clsName: 'days', + navFnc: 'Month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'FullYear', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'FullYear', + navStep: 10 + }], + dates:{ + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + }, + isLeapYear: function (year) { + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) + }, + getDaysInMonth: function (year, month) { + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] + }, + parseFormat: function(format){ + var separator = format.match(/[.\/\-\s].*?/), + parts = format.split(/\W+/); + if (!separator || !parts || parts.length === 0){ + throw new Error("Invalid date format."); + } + return {separator: separator, parts: parts}; + }, + parseDate: function(date, format) { + var parts = date.split(format.separator), + date = new Date(), + val; + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + if (parts.length === format.parts.length) { + for (var i=0, cnt = format.parts.length; i < cnt; i++) { + val = parseInt(parts[i], 10)||1; + switch(format.parts[i]) { + case 'dd': + case 'd': + date.setDate(val); + break; + case 'mm': + case 'm': + date.setMonth(val - 1); + break; + case 'yy': + date.setFullYear(2000 + val); + break; + case 'yyyy': + date.setFullYear(val); + break; + } + } + } + return date; + }, + formatDate: function(date, format){ + var val = { + d: date.getDate(), + m: date.getMonth() + 1, + yy: date.getFullYear().toString().substring(2), + yyyy: date.getFullYear() + }; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + var date = []; + for (var i=0, cnt = format.parts.length; i < cnt; i++) { + date.push(val[format.parts[i]]); + } + return date.join(format.separator); + }, + headTemplate: ''+ + ''+ + '‹'+ + ''+ + '›'+ + ''+ + '', + contTemplate: '' + }; + DPGlobal.template = ''+ + ''+ + ''+ + DPGlobal.headTemplate+ + ''+ + ''+ + ''+ + ''+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + ''+ + ''+ + ''+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + ''+ + ''+ + ''; + +}( window.jQuery ) \ No newline at end of file diff --git a/src/main/webapp/resources/js/bootstrap-wysihtml5.js b/src/main/webapp/resources/js/bootstrap-wysihtml5.js new file mode 100644 index 0000000000000000000000000000000000000000..2c327b2e3f46b7c981f76920a456419dfa12f3e8 --- /dev/null +++ b/src/main/webapp/resources/js/bootstrap-wysihtml5.js @@ -0,0 +1,478 @@ +!function($, wysi) { + "use strict"; + + var tpl = { + "font-styles": function(locale, options) { + var size = (options && options.size) ? ' btn-'+options.size : ''; + return "" + + "" + + " " + locale.font_styles.normal + " " + + "" + + "" + + "" + locale.font_styles.normal + "" + + "" + locale.font_styles.h1 + "" + + "" + locale.font_styles.h2 + "" + + "" + locale.font_styles.h3 + "" + + "" + + ""; + }, + + "emphasis": function(locale, options) { + var size = (options && options.size) ? ' btn-'+options.size : ''; + return "" + + "" + + "" + locale.emphasis.bold + "" + + "" + locale.emphasis.italic + "" + + "" + locale.emphasis.underline + "" + + "" + + ""; + }, + + "lists": function(locale, options) { + var size = (options && options.size) ? ' btn-'+options.size : ''; + return "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + }, + + "link": function(locale, options) { + var size = (options && options.size) ? ' btn-'+options.size : ''; + return "" + + "" + + "" + + "" + + "" + locale.link.insert + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + }, + + "image": function(locale, options) { + var size = (options && options.size) ? ' btn-'+options.size : ''; + return "" + + "" + + "" + + "" + + "" + locale.image.insert + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + }, + + "html": function(locale, options) { + var size = (options && options.size) ? ' btn-'+options.size : ''; + return "" + + "" + + "" + + "" + + ""; + }, + + "color": function(locale, options) { + var size = (options && options.size) ? ' btn-'+options.size : ''; + return "" + + "" + + "" + locale.colours.black + " " + + "" + + "" + + "" + locale.colours.black + "" + + "" + locale.colours.silver + "" + + "" + locale.colours.gray + "" + + "" + locale.colours.maroon + "" + + "" + locale.colours.red + "" + + "" + locale.colours.purple + "" + + "" + locale.colours.green + "" + + "" + locale.colours.olive + "" + + "" + locale.colours.navy + "" + + "" + locale.colours.blue + "" + + "" + locale.colours.orange + "" + + "" + + ""; + } + }; + + var templates = function(key, locale, options) { + return tpl[key](locale, options); + }; + + + var Wysihtml5 = function(el, options) { + this.el = el; + var toolbarOpts = options || defaultOptions; + for(var t in toolbarOpts.customTemplates) { + tpl[t] = toolbarOpts.customTemplates[t]; + } + this.toolbar = this.createToolbar(el, toolbarOpts); + this.editor = this.createEditor(options); + + window.editor = this.editor; + + $('iframe.wysihtml5-sandbox').each(function(i, el){ + $(el.contentWindow).off('focus.wysihtml5').on({ + 'focus.wysihtml5' : function(){ + $('li.dropdown').removeClass('open'); + } + }); + }); + }; + + Wysihtml5.prototype = { + + constructor: Wysihtml5, + + createEditor: function(options) { + options = options || {}; + options.toolbar = this.toolbar[0]; + + var editor = new wysi.Editor(this.el[0], options); + + if(options && options.events) { + for(var eventName in options.events) { + editor.on(eventName, options.events[eventName]); + } + } + return editor; + }, + + createToolbar: function(el, options) { + var self = this; + var toolbar = $("", { + 'class' : "wysihtml5-toolbar", + 'style': "display:none" + }); + var culture = options.locale || defaultOptions.locale || "en"; + for(var key in defaultOptions) { + var value = false; + + if(options[key] !== undefined) { + if(options[key] === true) { + value = true; + } + } else { + value = defaultOptions[key]; + } + + if(value === true) { + toolbar.append(templates(key, locale[culture], options)); + + if(key === "html") { + this.initHtml(toolbar); + } + + if(key === "link") { + this.initInsertLink(toolbar); + } + + if(key === "image") { + this.initInsertImage(toolbar); + } + } + } + + if(options.toolbar) { + for(key in options.toolbar) { + toolbar.append(options.toolbar[key]); + } + } + + toolbar.find("a[data-wysihtml5-command='formatBlock']").click(function(e) { + var target = e.target || e.srcElement; + var el = $(target); + self.toolbar.find('.current-font').text(el.html()); + }); + + toolbar.find("a[data-wysihtml5-command='foreColor']").click(function(e) { + var target = e.target || e.srcElement; + var el = $(target); + self.toolbar.find('.current-color').text(el.html()); + }); + + this.el.before(toolbar); + + return toolbar; + }, + + initHtml: function(toolbar) { + var changeViewSelector = "a[data-wysihtml5-action='change_view']"; + toolbar.find(changeViewSelector).click(function(e) { + toolbar.find('a.btn').not(changeViewSelector).toggleClass('disabled'); + }); + }, + + initInsertImage: function(toolbar) { + var self = this; + var insertImageModal = toolbar.find('.bootstrap-wysihtml5-insert-image-modal'); + var urlInput = insertImageModal.find('.bootstrap-wysihtml5-insert-image-url'); + var insertButton = insertImageModal.find('a.btn-primary'); + var initialValue = urlInput.val(); + + var insertImage = function() { + var url = urlInput.val(); + urlInput.val(initialValue); + self.editor.currentView.element.focus(); + self.editor.composer.commands.exec("insertImage", url); + }; + + urlInput.keypress(function(e) { + if(e.which == 13) { + insertImage(); + insertImageModal.modal('hide'); + } + }); + + insertButton.click(insertImage); + + insertImageModal.on('shown', function() { + urlInput.focus(); + }); + + insertImageModal.on('hide', function() { + self.editor.currentView.element.focus(); + }); + + toolbar.find('a[data-wysihtml5-command=insertImage]').click(function() { + var activeButton = $(this).hasClass("wysihtml5-command-active"); + + if (!activeButton) { + insertImageModal.modal('show'); + insertImageModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) { + e.stopPropagation(); + }); + return false; + } + else { + return true; + } + }); + }, + + initInsertLink: function(toolbar) { + var self = this; + var insertLinkModal = toolbar.find('.bootstrap-wysihtml5-insert-link-modal'); + var urlInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-url'); + var insertButton = insertLinkModal.find('a.btn-primary'); + var initialValue = urlInput.val(); + + var insertLink = function() { + var url = urlInput.val(); + urlInput.val(initialValue); + self.editor.currentView.element.focus(); + self.editor.composer.commands.exec("createLink", { + href: url, + target: "_blank", + rel: "nofollow" + }); + }; + var pressedEnter = false; + + urlInput.keypress(function(e) { + if(e.which == 13) { + insertLink(); + insertLinkModal.modal('hide'); + } + }); + + insertButton.click(insertLink); + + insertLinkModal.on('shown', function() { + urlInput.focus(); + }); + + insertLinkModal.on('hide', function() { + self.editor.currentView.element.focus(); + }); + + toolbar.find('a[data-wysihtml5-command=createLink]').click(function() { + var activeButton = $(this).hasClass("wysihtml5-command-active"); + + if (!activeButton) { + insertLinkModal.appendTo('body').modal('show'); + insertLinkModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) { + e.stopPropagation(); + }); + return false; + } + else { + return true; + } + }); + } + }; + + // these define our public api + var methods = { + resetDefaults: function() { + $.fn.wysihtml5.defaultOptions = $.extend(true, {}, $.fn.wysihtml5.defaultOptionsCache); + }, + bypassDefaults: function(options) { + return this.each(function () { + var $this = $(this); + $this.data('wysihtml5', new Wysihtml5($this, options)); + }); + }, + shallowExtend: function (options) { + var settings = $.extend({}, $.fn.wysihtml5.defaultOptions, options || {}); + var that = this; + return methods.bypassDefaults.apply(that, [settings]); + }, + deepExtend: function(options) { + var settings = $.extend(true, {}, $.fn.wysihtml5.defaultOptions, options || {}); + var that = this; + return methods.bypassDefaults.apply(that, [settings]); + }, + init: function(options) { + var that = this; + return methods.shallowExtend.apply(that, [options]); + } + }; + + $.fn.wysihtml5 = function ( method ) { + if ( methods[method] ) { + return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.wysihtml5' ); + } + }; + + $.fn.wysihtml5.Constructor = Wysihtml5; + + var defaultOptions = $.fn.wysihtml5.defaultOptions = { + "font-styles": true, + "color": false, + "emphasis": true, + "lists": true, + "html": false, + "link": true, + "image": true, + events: {}, + parserRules: { + classes: { + // (path_to_project/lib/css/wysiwyg-color.css) + "wysiwyg-color-silver" : 1, + "wysiwyg-color-gray" : 1, + "wysiwyg-color-white" : 1, + "wysiwyg-color-maroon" : 1, + "wysiwyg-color-red" : 1, + "wysiwyg-color-purple" : 1, + "wysiwyg-color-fuchsia" : 1, + "wysiwyg-color-green" : 1, + "wysiwyg-color-lime" : 1, + "wysiwyg-color-olive" : 1, + "wysiwyg-color-yellow" : 1, + "wysiwyg-color-navy" : 1, + "wysiwyg-color-blue" : 1, + "wysiwyg-color-teal" : 1, + "wysiwyg-color-aqua" : 1, + "wysiwyg-color-orange" : 1 + }, + tags: { + "b": {}, + "i": {}, + "br": {}, + "ol": {}, + "ul": {}, + "li": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "blockquote": {}, + "u": 1, + "img": { + "check_attributes": { + "width": "numbers", + "alt": "alt", + "src": "url", + "height": "numbers" + } + }, + "a": { + set_attributes: { + target: "_blank", + rel: "nofollow" + }, + check_attributes: { + href: "url" // important to avoid XSS + } + }, + "span": 1, + "div": 1 + } + }, + stylesheets: ["./lib/css/wysiwyg-color.css"], // (path_to_project/lib/css/wysiwyg-color.css) + locale: "en" + }; + + if (typeof $.fn.wysihtml5.defaultOptionsCache === 'undefined') { + $.fn.wysihtml5.defaultOptionsCache = $.extend(true, {}, $.fn.wysihtml5.defaultOptions); + } + + var locale = $.fn.wysihtml5.locale = { + en: { + font_styles: { + normal: "普通文本", + h1: "一级标题", + h2: "二级标题", + h3: "三级标题" + }, + emphasis: { + bold: "粗体", + italic: "斜体", + underline: "下划线" + }, + lists: { + unordered: "无须列表", + ordered: "有序列表", + outdent: "向外缩进", + indent: "向内缩进" + }, + link: { + insert: "插入超链接", + cancel: "取消" + }, + image: { + insert: "插入图片", + cancel: "取消" + }, + html: { + edit: "编辑HTML" + }, + colours: { + black: "黑色", + silver: "银色", + gray: "灰色", + maroon: "Maroon", + red: "栗色", + purple: "紫色", + green: "绿色", + olive: "橄榄色", + navy: "深蓝色", + blue: "蓝色", + orange: "橙色" + } + } + }; + +}(window.jQuery, window.wysihtml5); \ No newline at end of file diff --git a/src/main/webapp/resources/js/bootstrap.min.js b/src/main/webapp/resources/js/bootstrap.min.js new file mode 100644 index 0000000000000000000000000000000000000000..55da8c39132a1550b593d04e48934bb7cc3671c5 --- /dev/null +++ b/src/main/webapp/resources/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! +* Bootstrap.js by @fat & @mdo +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0]});if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(document).on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.offset(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.detach(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);n[n.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover",title:"",delay:0,html:!1}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:''})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length"+t+""})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'',item:'',minLength:1},e.fn.typeahead.Constructor=t,e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))},e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file diff --git a/src/main/webapp/resources/js/components/navbar.js b/src/main/webapp/resources/js/components/navbar.js new file mode 100644 index 0000000000000000000000000000000000000000..8ab57cb7f4763a05b8d7f85035d9429803f406ac --- /dev/null +++ b/src/main/webapp/resources/js/components/navbar.js @@ -0,0 +1,150 @@ +var NavBar = (function() { + + var usrinfo = JSON.parse(localStorage.getItem('uinfo')); + var usrType = usrinfo.userSysType.toString(); + + var barTpl = { + 0: '\ + Dashboard\ + \ + Notices \ + Information \ + Bills \ + Private Settings \ + \ + ', + 1: '\ + Dashboard\ + \ + Notices \ + Information \ + Bills \ + Private Settings \ + \ + ', + 2: '\ + Dashboard\ + \ + Notices \ + \ + Add Notice\ + Notice Management\ + \ + \ + Students \ + Private Settings \ + \ + ', + 3: '\ + Dashboard\ + \ + Integrated Information \ + Users \ + \ + Add User\ + User Management\ + \ + \ + Notices \ + \ + Add Notice\ + Notice Management\ + \ + \ + Bills \ + \ + Bill Management\ + Add Bill\ + \ + \ + Private Settings \ + \ + ' + } + + var NavBar = { + template: barTpl[usrType], + props: { + active: { + default: 0 + } + } + }; + + return NavBar; +})(); +// Information \ +/* +var NavBar = (function() { + + var usrinfo = JSON.parse(localStorage.getItem('uinfo')); + var usrType = usrinfo.userSysType.toString(); + + var barTpl = { + 0: '\ + Dashboard\ + \ + 通知 \ + 个人信息 \ + 缴费记录 \ + 个人设置 \ + \ + ', + 1: '\ + Dashboard\ + \ + 通知 \ + 个人信息 \ + 缴费记录 \ + 个人设置 \ + \ + ', + 2: '\ + Dashboard\ + \ + 通知 \ + 个人信息 \ + 学生信息 \ + 个人设置 \ + \ + ', + 3: '\ + Dashboard\ + \ + 综合信息管理 Integrated Information Management \ + 用户 \ + \ + 添加用户\ + 用户管理\ + \ + \ + 通知 \ + \ + 添加通知\ + 通知管理\ + \ + \ + 账单 \ + \ + 账单管理\ + 添加账单\ + \ + \ + 个人设置 \ + \ + ' + } + + var NavBar = { + template: barTpl[usrType], + props: { + active: { + default: 0 + } + } + }; + + return NavBar; + })(); + +*/ \ No newline at end of file diff --git a/src/main/webapp/resources/js/et.js b/src/main/webapp/resources/js/et.js new file mode 100644 index 0000000000000000000000000000000000000000..995c054a8d889013bdfad33654e6c3fd609c265e --- /dev/null +++ b/src/main/webapp/resources/js/et.js @@ -0,0 +1 @@ +!function(e){function t(i){if(n[i])return n[i].exports;var module=n[i]={i:i,l:!1,exports:{}};return e[i].call(module.exports,module,module.exports,t),module.l=!0,module.exports}var n={};t.m=e,t.c=n,t.d=function(exports,e,n){t.o(exports,e)||Object.defineProperty(exports,e,{configurable:!1,enumerable:!0,get:n})},t.n=function(module){var e=module&&module.__esModule?function(){return module.default}:function(){return module};return t.d(e,"a",e),e},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=10)}([function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(2),n=function(e){return e&&e.__esModule?e:{default:e}}(t);exports.default={getViewportOffset:function(e){var t=document.documentElement,n=void 0!==e.getBoundingClientRect?e.getBoundingClientRect():0,i=(window.pageXOffset||t.scrollLeft)-(t.clientLeft||0),o=(window.pageYOffset||t.scrollTop)-(t.clientTop||0),r=n.left+window.pageXOffset,l=n.top+window.pageYOffset,s=r-i,a=l-o;return{left:s,top:a,right:window.document.documentElement.clientWidth-n.width-s,bottom:window.document.documentElement.clientHeight-n.height-a,right2:window.document.documentElement.clientWidth-s,bottom2:window.document.documentElement.clientHeight-a}},bind:function(e,t,n){e&&"undefined"!==e&&t&&n&&(t="mousewheel"===t?void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll":t,document.attachEvent?e.attachEvent("on"+t,n):e.addEventListener(t,n,!1))},unbind:function(e,t,n){if(e&&"undefined"!==e&&t&&n){t="mousewheel"===t?void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll":t;var i=[];Array.isArray(n)&&n.length>0?i=n:i.push(n),document.removeEventListener?i.forEach(function(n){e.removeEventListener(t,n,!1)}):i.forEach(function(n){e.removeEventListener("on"+t,n)})}},isHtml:function(e){return/<[a-z][\s\S]*>/i.test(e)},getDisplayValue:function(e){if(e)return e.currentStyle?e.currentStyle.display:getComputedStyle(e,null).display},hasHorizontalScrollBar:function(e){if(e)return e.scrollWidth>e.clientWidth},hasVerticalScrollBar:function(e){if(e)return e.scrollHeight>e.clientHeight},getScrollbarWidth:function(){var e=document.createElement("div");e.className=n.default.scrollbarClass,e.style.visibility="hidden",e.style.width="100px",e.style.position="absolute",e.style.top="-9999px",document.body.appendChild(e);var t=e.offsetWidth;e.style.overflow="scroll";var i=document.createElement("div");i.style.width="100%",e.appendChild(i);var o=i.offsetWidth;return e.parentNode.removeChild(e),t-o},getParentCompByName:function(e,t){for(var n=e.$parent;n;){if(n.$options.name===t)return n;n=n.$parent}return null},getChildCompsByName:function(e,t){for(var n=[],i=e.$children;i&&i.length>0;)i.forEach(function(e){i=e.$children?e.$children:null,e.$options.name===t&&n.push(e)});return n}}},function(module,exports){module.exports=function(e,t,n,i,o){var r,l=e=e||{},s=typeof e.default;"object"!==s&&"function"!==s||(r=e,l=e.default);var a="function"==typeof l?l.options:l;t&&(a.render=t.render,a.staticRenderFns=t.staticRenderFns),i&&(a._scopeId=i);var u;if(o?(u=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),n&&n.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(o)},a._ssrRegister=u):n&&(u=n),u){var c=a.functional,h=c?a.render:a.beforeCreate;c?a.render=function(e,t){return u.call(t),h(e,t)}:a.beforeCreate=h?[].concat(h,u):[u]}return{esModule:r,exports:l,options:a}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={sizeMaps:{large:40,middle:32,small:24},sizeMapDefault:32,scrollbarClass:"v-scrollbar-wrap"}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(43),n=function(e){return e&&e.__esModule?e:{default:e}}(t);n.default.install=function(e){e.component(n.default.name,n.default)},exports.default=n.default},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(46),n=function(e){return e&&e.__esModule?e:{default:e}}(t);n.default.install=function(e){e.component(n.default.name,n.default)},exports.default=n.default},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(49),n=function(e){return e&&e.__esModule?e:{default:e}}(t);n.default.install=function(e){e.component(n.default.name,n.default)},exports.default=n.default},function(module,exports,e){"use strict";function t(e,t){if(!e||!t)return!1;if(-1!==t.indexOf(" "))throw new Error("className should not contain space.");return e.classList?e.classList.contains(t):(" "+e.className+" ").indexOf(" "+t+" ")>-1}function n(e,t){if(e&&t)if(e.classList)e.classList.add(t);else{var n=e.className.split(" ");-1===n.indexOf(t)&&(e.className+=" "+t)}}function i(e,t){if(e&&t)if(e.classList)e.classList.remove(t);else{var n=new RegExp("(\\s|^)"+t+"(\\s|$)");e.className=e.className.replace(n," ")}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.hasClass=t,exports.addClass=n,exports.removeClass=i},function(module,exports,e){"use strict";(function(e,module){var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=function(){function n(e,t){return null!=t&&e instanceof t}function i(o,r,l,s,d){function f(o,l){if(null===o)return null;if(0===l)return o;var m,b;if("object"!=(void 0===o?"undefined":t(o)))return o;if(n(o,u))m=new u;else if(n(o,c))m=new c;else if(n(o,h))m=new h(function(e,t){o.then(function(t){e(f(t,l-1))},function(e){t(f(e,l-1))})});else if(i.__isArray(o))m=[];else if(i.__isRegExp(o))m=new RegExp(o.source,a(o)),o.lastIndex&&(m.lastIndex=o.lastIndex);else if(i.__isDate(o))m=new Date(o.getTime());else{if(v&&e.isBuffer(o))return m=new e(o.length),o.copy(m),m;n(o,Error)?m=Object.create(o):void 0===s?(b=Object.getPrototypeOf(o),m=Object.create(b)):(m=Object.create(s),b=s)}if(r){var w=p.indexOf(o);if(-1!=w)return g[w];p.push(o),g.push(m)}n(o,u)&&o.forEach(function(e,t){var n=f(t,l-1),i=f(e,l-1);m.set(n,i)}),n(o,c)&&o.forEach(function(e){var t=f(e,l-1);m.add(t)});for(var y in o){var C;b&&(C=Object.getOwnPropertyDescriptor(b,y)),C&&null==C.set||(m[y]=f(o[y],l-1))}if(Object.getOwnPropertySymbols)for(var _=Object.getOwnPropertySymbols(o),y=0;y<_.length;y++){var x=_[y],k=Object.getOwnPropertyDescriptor(o,x);(!k||k.enumerable||d)&&(m[x]=f(o[x],l-1),k.enumerable||Object.defineProperty(m,x,{enumerable:!1}))}if(d)for(var S=Object.getOwnPropertyNames(o),y=0;y1&&void 0!==arguments[1]&&arguments[1];e.component(i.default.name,i.default),e.component(r.default.name,r.default),e.component(s.default.name,s.default),e.component(u.default.name,u.default),e.component(h.default.name,h.default),e.component(f.default.name,f.default)}(window.Vue),module.exports={VPagination:r.default,VTable:i.default,VCheckbox:s.default,VCheckboxGroup:u.default,VSelect:h.default,VDropdown:f.default}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(14),n=function(e){return e&&e.__esModule?e:{default:e}}(t);n.default.install=function(e){e.component(n.default.name,n.default)},exports.default=n.default},function(module,exports,e){var t=e(1)(e(15),e(53),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-table\\src\\table.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] table.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0});var n=e(16),i=t(n),o=e(17),r=t(o),l=e(18),s=t(l),a=e(19),u=t(a),c=e(20),h=t(c),d=e(21),f=t(d),p=e(22),g=t(p),v=e(23),m=t(v),b=e(24),w=t(b),y=e(25),C=t(y),_=e(26),x=t(_),k=e(27),S=t(k),P=e(34),M=t(P),T=e(35),R=t(T),A=e(36),E=t(A),O=e(0),B=t(O),z=e(7),H=t(z),D=e(37),I=t(D),F=e(40),j=t(F),N=e(3),$=t(N),W=e(4),L=t(W),V=e(5),U=t(V);exports.default={name:"v-table",mixins:[i.default,u.default,s.default,r.default,h.default,f.default,g.default,m.default,w.default,C.default,x.default,S.default,M.default,R.default,E.default],components:{tableEmpty:I.default,loading:j.default,VCheckboxGroup:$.default,VCheckbox:L.default,VDropdown:U.default},data:function(){return{internalTableData:[],internalWidth:0,internalHeight:0,internalColumns:[],internalTitleRows:[],errorMsg:" V-Table error: ",maxWidth:5e3,hasFrozenColumn:!1,resizeTimer:null}},props:{width:[Number,String],minWidth:{type:Number,default:50},height:{type:Number,require:!1},minHeight:{type:Number,default:50},titleRowHeight:{type:Number,default:38},isHorizontalResize:{type:Boolean,default:!1},isVerticalResize:{type:Boolean,default:!1},verticalResizeOffset:{type:Number,default:0},tableBgColor:{type:String,default:"#fff"},titleBgColor:{type:String,default:"#fff"},oddBgColor:{type:String,default:""},evenBgColor:{type:String,default:""},rowHeight:{type:Number,default:40},multipleSort:{type:Boolean,default:!0},sortAlways:{type:Boolean,default:!1},columns:{type:Array,require:!0},titleRows:{type:Array,require:!0,default:function(){return[]}},tableData:{type:Array,require:!0,default:function(){return[]}},pagingIndex:Number,errorContent:{type:String,default:"暂无数据"},errorContentHeight:{type:Number,default:50},isLoading:{type:Boolean,default:!1},loadingContent:{type:String,default:''},rowHoverColor:{type:String},rowClickColor:{type:String},showVerticalBorder:{type:Boolean,default:!0},showHorizontalBorder:{type:Boolean,default:!0},footer:{type:Array,default:function(){return[]}},footerRowHeight:{type:Number,default:40},columnWidthDrag:{type:Boolean,default:!1},loadingOpacity:{type:Number,default:.6},columnCellClassName:Function,footerCellClassName:Function,rowClick:Function,rowDblclick:Function,titleClick:Function,titleDblclick:Function,rowMouseEnter:Function,rowMouseLeave:Function,cellEditDone:Function,cellMerge:Function,selectAll:Function,selectChange:Function,selectGroupChange:Function,filterMethod:Function},computed:{isComplexTitle:function(){return Array.isArray(this.internalTitleRows)&&this.internalTitleRows.length>0},getTableHeight:function(){return this.isTableEmpty?this.tableEmptyHeight:this.internalHeight},leftViewWidth:function(){var e=0;return this.hasFrozenColumn&&(e=this.frozenCols.reduce(function(e,t){return e+t.width},0)),e},rightViewWidth:function(){var e=this.internalWidth-this.leftViewWidth;return this.hasFrozenColumn?e-2:e},bodyViewHeight:function(){var e;return e=this.internalTitleRows.length>0?this.internalHeight-this.titleRowHeight*(this.internalTitleRows.length+this.getTitleRowspanTotalCount):this.internalHeight-this.titleRowHeight,e-=this.footerTotalHeight+1},totalColumnsWidth:function(){return this.internalColumns.reduce(function(e,t){return t.width?e+t.width:e},0)},totalNoFrozenColumnsWidth:function(){return this.noFrozenCols.reduce(function(e,t){return t.width?e+t.width:e},0)},getColumnsFields:function(){return this.internalColumns.map(function(e){return e.field})},getNoFrozenColumnsFields:function(){return this.internalColumns.filter(function(e){return!e.isFrozen}).map(function(e){return e.field})},getFrozenColumnsFields:function(){return this.internalColumns.filter(function(e){return e.isFrozen}).map(function(e){return e.field})}},methods:{customCompFunc:function(e){this.$emit("on-custom-comp",e)},trBgColor:function(e){if(this.evenBgColor&&this.evenBgColor.length>0||this.oddBgColor&&this.oddBgColor.length>0)return e%2==0?{"background-color":this.evenBgColor}:{"background-color":this.oddBgColor}},setColumnCellClassName:function(e,t,n){return this.columnCellClassName&&this.columnCellClassName(e,t,n)},titleColumnWidth:function(e){var t=0;if(Array.isArray(e)){t=this.internalColumns.filter(function(t,n){return e.some(function(e){return e===t.field})}).reduce(function(e,t){return e+t.width},0)}else console.error(this.errorMsg+"the fields attribute must be a array in titleRows");return t},titleColumnHeight:function(e){return e&&e>0?this.titleRowHeight*e:this.titleRowHeight},overflowTitle:function(e,t,n){var i="";if("function"==typeof n.formatter){var o=n.formatter(e,t,this.pagingIndex,n.field);i=B.default.isHtml(o)?"":o}else i=e[n.field];return i},getTotalColumnsHeight:function(){var e=this.internalTitleRows&&this.internalTitleRows.length>0?this.titleRowHeight*this.internalTitleRows.length:this.titleRowHeight;return(e+=this.footerTotalHeight)+this.internalTableData.length*this.rowHeight+1},initTableWidth:function(){this.internalWidth=this.isHorizontalResize?this.maxWidth:this.width},initColumns:function(){this.internalHeight=this.height,this.footerTotalHeight=this.getFooterTotalRowHeight,this.internalColumns=Array.isArray(this.columns)?(0,H.default)(this.columns):[],this.internalTitleRows=Array.isArray(this.titleRows)?(0,H.default)(this.titleRows):[],this.initColumnsFilters(),this.initResizeColumns(),this.hasFrozenColumn=this.internalColumns.some(function(e){return e.isFrozen}),this.initTableWidth(),this.setSortColumns();var e=this,t=0;e.internalWidth&&e.internalWidth>0&&e.internalColumns.map(function(n){n.width&&n.width>0||(t++,e.isHorizontalResize?console.error(e.errorMsg+"If you are using the isHorizontalResize property,Please set the value for each column's width"):n.width=e.internalWidth-e.totalColumnsWidth)}),t>1&&console.error(this.errorMsg+"Only allow one column is not set width")},initView:function(){this.internalWidth&&this.internalWidth>0||this.columns&&this.columns.length>0&&(this.internalWidth=this.columns.reduce(function(e,t){return e+t.width},0));var e=this.getTotalColumnsHeight();!(this.height&&this.height>0)||this.height>e?this.isVerticalResize||(this.internalHeight=e):this.height<=e&&(this.internalHeight=this.height)},initInternalTableData:function(){return Array.isArray(this.tableData)?(0,H.default)(this.tableData):[]},resize:function(){var e=this;this.resizeTimer=setTimeout(function(t){e.tableResize()})}},created:function(){this.internalTableData=this.initInternalTableData(this.tableData),Array.isArray(this.columns)&&this.columns.length>0&&this.initColumns(),this.updateCheckboxGroupModel(),this.initView()},mounted:function(){this.setScrollbarWidth(),this.tableEmpty(),this.tableResize(),Array.isArray(this.tableData)&&this.tableData.length>0&&this.scrollControl(),this.controlScrollBar()},watch:{columns:{handler:function(e){this.initColumns()},deep:!0},titleRows:{handler:function(e){this.initColumns()},deep:!0},tableData:{handler:function(e){this.skipRenderCells=[],this.internalTableData=this.initInternalTableData(e),this.updateCheckboxGroupModel(),this.tableEmpty(),Array.isArray(e)&&e.length>0&&(this.initView(),this.scrollControl()),this.resize()},deep:!0},pagingIndex:{handler:function(){this.clearCurrentRow(),this.bodyScrollTop()}}},beforeDestroy:function(){clearTimeout(this.resizeTimer)}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(2),n=function(e){return e&&e.__esModule?e:{default:e}}(t);exports.default={computed:{vTableRightBody:function(){var e={"v-table-rightview-special-border":!0};return e[n.default.scrollbarClass]=!0,e},vTableFooter:function(){var e={"v-table-rightview-special-border":!0};return e[n.default.scrollbarClass]=!0,e},vTableBodyInner:function(){return{"v-table-body-inner-pb":!this.hasTableFooter}},vTableBodyCell:function(){return{"vertical-border":this.showVerticalBorder,"horizontal-border":this.showHorizontalBorder}}},methods:{vTableFiltersIcon:function(e){var t=this;return{"v-icon-filter":!0,checked:e.some(function(e){return e.selected&&e.value!==t.filterSpecialValue})}}}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(0),n=function(e){return e&&e.__esModule?e:{default:e}}(t);exports.default={methods:{body1Mousewheel:function(e){var t=this.$el.querySelector(".v-table-rightview .v-table-body"),n=e.originalEvent||window.event||e,i=n.wheelDelta||-1*n.detail;t.scrollTop=t.scrollTop-i},bodyScrollTop:function(){var e=this.$el.querySelector(".v-table-leftview .v-table-body"),t=this.$el.querySelector(".v-table-rightview .v-table-body");e&&(e.scrollTop=0),t.scrollTop=0},body2Scroll:function(e){var t=this.$el.querySelector(".v-table-rightview"),n=this.$el.querySelector(".v-table-leftview .v-table-body"),i=this.$el.querySelector(".v-table-rightview .v-table-body");n&&(n.scrollTop=i.scrollTop),t.querySelector(".v-table-header").scrollLeft=i.scrollLeft},rightViewFooterScroll:function(){var e=this.$el.querySelector(".v-table-rightview"),t=this.$el.querySelector(".v-table-rightview .v-table-footer");e.querySelector(".v-table-header").scrollLeft=t.scrollLeft,e.querySelector(".v-table-body").scrollLeft=t.scrollLeft},scrollControl:function(){var e=this;this.unbindEvents(),setTimeout(function(t){var i=e.$el.querySelector(".v-table-leftview .v-table-body"),o=e.$el.querySelector(".v-table-rightview .v-table-body"),r=e.$el.querySelector(".v-table-rightview .v-table-footer");n.default.bind(i,"mousewheel",e.body1Mousewheel),n.default.bind(o,"scroll",e.body2Scroll),n.default.bind(r,"scroll",e.rightViewFooterScroll)})},unbindEvents:function(){var e=this.$el.querySelector(".v-table-leftview .v-table-body"),t=this.$el.querySelector(".v-table-rightview .v-table-body"),i=this.$el.querySelector(".v-table-rightview .v-table-footer");n.default.unbind(e,"mousewheel",this.body1Mousewheel),n.default.unbind(t,"scroll",this.body2Scroll),n.default.unbind(i,"scroll",this.rightViewFooterScroll)},scrollToTop:function(){this.bodyScrollTop()}},beforeDestroy:function(){this.unbindEvents()}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={computed:{frozenCols:function(){return this.internalColumns.filter(function(e){return!0===e.isFrozen})},noFrozenCols:function(){return this.internalColumns.filter(function(e){return!0!==e.isFrozen})},frozenTitleCols:function(){var e=[],t=this;if(this.internalTitleRows.length>0){var n=this.frozenCols.map(function(e){return e.field});this.internalTitleRows.forEach(function(i){var o=i.filter(function(e){if(Array.isArray(e.fields)&&e.fields.every(function(e){return-1!==n.indexOf(e)}))return!0});if(o.length>0){e.push(o);var r=t.getMinRowspan(o);if(r&&r>0)for(var l=0;l0){var n=this.noFrozenCols.map(function(e){return e.field});this.internalTitleRows.forEach(function(i){var o=i.filter(function(e){if(Array.isArray(e.fields))return e.fields.every(function(e){return-1!==n.indexOf(e)})});if(o.length>0){e.push(o);var r=t.getMinRowspan(o);if(r&&r>0)for(var l=0;l3&&e.tableResize()})},adjustHeight:function(e){if(!this.$el||this.isVerticalResize)return!1;var t=this.getTotalColumnsHeight(),n=this.scrollbarWidth;this.hasTableFooter?e?this.footerTotalHeight===this.getFooterTotalRowHeight&&(this.footerTotalHeight+=n,this.height&&this.height>0&&!(this.height>t)||(this.internalHeight+=n)):e||this.footerTotalHeight>this.getFooterTotalRowHeight&&(this.footerTotalHeight-=n,this.height&&this.height>0&&!(this.height>t)||(this.internalHeight-=n)):this.height&&this.height>0&&!(this.height>t)||(e&&this.internalHeight+20?this.height:e,o=this.minWidth,r=this.minHeight>e?e:this.minHeight,l=this.$el,s=n.default.getViewportOffset(l),a="undefined"!==l.getBoundingClientRect?l.getBoundingClientRect().width:l.clientWidth,u="undefined"!==l.getBoundingClientRect?l.getBoundingClientRect().height:l.clientHeight,c=window.document.documentElement.clientHeight-u-s.top-2,h=s.bottom2,d=this.scrollbarWidth;if(this.isHorizontalResize&&this.internalWidth&&this.internalWidth>0&&a>0&&(a=a>t?t:a,a=a0){if(c-=this.verticalResizeOffset,u+=c,u=u>i?i:u,u=ue+d?u+=d:f>0&&fthis.internalHeight&&(n-=this.scrollbarWidth),this.hasTableFooter?r.style.overflowX="hidden":o.style.overflowX="hidden",this.adjustHeight(!1)),this.hasFrozenColumn&&(n-=1),e>=i||n>0?this.setColumnsWidth(n):this.columns.forEach(function(e,n){e.isResize&&(t.internalColumns[n].width=e.width)}),this.containerWidthCheck()},setColumnsWidth:function(e){for(var t=this.resizeColumns.length,n=Math.floor(e/t),i=n*t,o=e-i,r=Math.floor(o),l=new Array(t).fill(n),s=0,a=0;a0&&e.internalTitleRows.filter(function(e){e.filter(function(e,t){"string"==typeof e.orderBy&&1===e.fields.length&&(e.field=e.fields[0],n.push(e))})}),(n.length>0?n:e.internalColumns).filter(function(n,i){e.enableSort(n.orderBy)&&(t[n.field]=n.orderBy)}),this.sortColumns=t,this.singleSortInit()},getCurrentSort:function(e){return this.sortColumns[e]},sortControl:function(e){var t=this.sortColumns[e];if(this.enableSort(t)){if(this.sortAlways?this.sortColumns[e]="asc"===t?"desc":"asc":this.sortColumns[e]="asc"===t?"desc":"desc"===this.sortColumns[e]?"":"asc",!this.multipleSort)for(var n in this.sortColumns)n!==e&&(this.sortColumns[n]="");this.$emit("sort-change",this.sortColumns)}},singleSortInit:function(){var e=this,t=!1;if(!e.multipleSort&&e.sortColumns)for(var n in e.sortColumns)t&&(e.sortColumns[n]=""),t=!0},resetOrder:function(){this.setSortColumns(),this.$emit("sort-change",this.sortColumns)}}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(0),n=function(e){return e&&e.__esModule?e:{default:e}}(t);exports.default={data:function(){return{isTableEmpty:!1,tableEmptyHeight:0}},methods:{tableEmpty:function(){var e=this,t=this.internalTableData,n=0;if(Array.isArray(t)&&t.length>0)return this.isTableEmpty=!1,!1;this.isTableEmpty=!0,n=this.getTotalColumnsHeight()+this.errorContentHeight,this.tableEmptyHeight=n,this.$nextTick(function(t){e.tableEmptyScroll()})},tableEmptyScrollEvent:function(e){var t=this.$el.querySelector(".v-table-rightview .v-table-header"),n=this.$el.querySelector(".v-table-empty .v-table-empty-scroll");n&&(t.scrollLeft=n.scrollLeft)},tableEmptyScroll:function(){var e=this.$el.querySelector(".v-table-empty .v-table-empty-scroll");n.default.bind(e,"scroll",this.tableEmptyScrollEvent)}},beforeDestroy:function(){var e=this.$el.querySelector(".v-table-empty .v-table-empty-scroll");n.default.unbind(e,"scroll",this.tableEmptyScrollEvent)}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(0),n=function(e){return e&&e.__esModule?e:{default:e}}(t),i=e(6);exports.default={data:function(){return{draggingColumn:null,isDragging:!1,draggingStartX:0,draggingEndX:0,minColumnWidth:15}},methods:{handleTitleMouseMove:function(e,t){if(!this.columnWidthDrag)return!1;var n=void 0,o=void 0;if(this.isDragging&&this.setDragLinePosition(e),Array.isArray(t)){if(t.length>1)return!1;t=t[0]}if(!this.showVerticalBorder)return!1;for(n=e.target;n&&(n.className&&!(0,i.hasClass)(n,"v-table-title-cell")||!n.className);)n=n.parentNode;o=n.getBoundingClientRect();var r=document.body.style;o.width>=this.minColumnWidth&&o.right-e.pageX<10?(this.isDragging||(this.draggingColumn=this.internalColumns.find(function(e){return e.field===t})),r.cursor="col-resize"):this.isDragging||(this.draggingColumn=null,r.cursor="")},handleTitleMouseOut:function(){this.isDragging||(document.body.style.cursor="")},handleTitleMouseDown:function(e,t){if(!this.draggingColumn||!this.showVerticalBorder)return!1;this.isDragging=!0,this.draggingStartX=e.clientX,this.setDragLinePosition(e),document.onselectstart=function(){return!1},document.ondragstart=function(){return!1},n.default.bind(document,"mousemove",this.handleDragMouseMove),n.default.bind(document,"mouseup",this.handleDragMouseUp)},handleDragMouseMove:function(e){if(!this.isDragging)return!1;this.setDragLinePosition(e)},setDragLinePosition:function(e){var t=n.default.getViewportOffset(this.$el).left,i=this.$el.querySelector(".v-table-drag-line"),o=e.clientX;this.draggingColumn.width+(o-this.draggingStartX)<=this.minColumnWidth||(i.style.left=o-t+"px")},handleDragMouseUp:function(e){if(!this.isDragging)return!1;this.draggingEndX=e.clientX;var t=this.draggingEndX-this.draggingStartX;if(Math.abs(t)>1){var o=this.draggingColumn;o.width+t1||o.rowSpan&&o.rowSpan>1)&&this.setSkipRenderCells(o.colSpan,o.rowSpan,e,t,i),!0},setSkipRenderCells:function(e,t,n,i,o){var r=o?this.getFrozenColumnsFields:this.getNoFrozenColumnsFields,l="",s=void 0,a=void 0,u=void 0,c=void 0;a=s=r.indexOf(i),e&&e>1&&(a=s+e-1),c=u=n,t&&t>1&&(c=n+t-1);for(var h=s;h<=a;h++)for(var d=u;d<=c;d++)h==s&&d==u||(l=d+"-"+r[h],-1===this.skipRenderCells.indexOf(l)&&this.skipRenderCells.push(l))},setColRowSpan:function(e,t,n){var i={colSpan:"",rowSpan:""},o=this.cellMerge&&this.cellMerge(e,n,t);return o&&(i={colSpan:o.colSpan?o.colSpan:"",rowSpan:o.rowSpan?o.rowSpan:""}),i},isCellMergeRender:function(e,t,n){var i=this.cellMerge&&this.cellMerge(e,n,t);return!(!i||!(i.colSpan&&i.colSpan>0||i.rowSpan&&i.rowSpan>0))},getRowHeightByRowSpan:function(e,t,n){var i=this.cellMerge&&this.cellMerge(e,n,t);return i&&i.rowSpan&&i.rowSpan>1?this.rowHeight*i.rowSpan:this.rowHeight},getRowWidthByColSpan:function(e,t,n){var i=void 0,o=void 0,r=this.getColumnsFields,l=this.cellMerge&&this.cellMerge(e,n,t),s=l.colSpan,a=0;if(l&&s&&s>=1){o=r.indexOf(t),i=o+s-1;for(var u=o;u<=i;u++)this.internalColumns.forEach(function(e){r[u]===e.field&&(a+=e.width)})}return a},cellMergeContentType:function(e,t,n){var i={isComponent:!1,isContent:!1},o=this.cellMerge&&this.cellMerge(e,n,t);return o&&(o.componentName&&"string"==typeof o.componentName&&o.componentName.length>0?i.isComponent=!0:o.content&&o.content.length>0&&(i.isContent=!0)),i}}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={computed:{getTitleRowspanTotalCount:function(){var e=this,t=0,n=0,i=void 0,o=void 0;return this.noFrozenTitleCols.forEach(function(n){i=e.getTitleRowspanCountArr(n),Array.isArray(i)&&i.length>0&&(o=Math.min.apply(null,i),t+=o-1)}),this.frozenTitleCols.forEach(function(t){i=e.getTitleRowspanCountArr(t),Array.isArray(i)&&i.length>0&&(o=Math.min.apply(null,i),n+=o-1)}),t1)&&(t.push(parseInt(e.rowspan)),!0)})?t:[]},getMinRowspan:function(e){var t=void 0,n=this.getTitleRowspanCountArr(e);return Array.isArray(n)&&n.length>0&&(t=Math.min.apply(null,n)),t-1}}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={data:function(){return{isAllChecked:!1,checkboxGroupModel:[],indeterminate:!1}},computed:{disabledUnChecked:function(){var e=[];return this.internalTableData.filter(function(t,n){t._disabled&&!t._checked&&e.push(n)}),e},getCheckedTableRow:function(){var e=this;return this.internalTableData.filter(function(t,n){return e.checkboxGroupModel.indexOf(n)>-1})},hasSelectionColumns:function(){return this.internalColumns.some(function(e){return e.type&&"selection"===e.type})}},methods:{isSelectionCol:function(e){return!(!Array.isArray(e)||1!==e.length)&&this.internalColumns.some(function(t){return t.field===e[0]&&"selection"===t.type})},disabledChecked:function(){var e=[];return this.internalTableData.filter(function(t,n){t._disabled&&t._checked&&e.push(n)}),e},handleCheckAll:function(){if(this.isAllChecked){this.checkboxGroupModel=[];var e=this.internalTableData.length;if(e>0)for(var t=0;t0&&e===t)&&(e>0&&e0&&e===t?(this.indeterminate=!1,this.isAllChecked=!0):e>0&&e0&&this.initInternalFooter.forEach(function(t){e.push(t.filter(function(e){return e.isFrozen}))}),e},noFrozenFooterCols:function(){var e=[];return this.initInternalFooter.length>0&&this.initInternalFooter.forEach(function(t){e.push(t.filter(function(e){return!e.isFrozen}))}),e},getFooterTotalRowHeight:function(){return Array.isArray(this.footer)&&this.footer.length>0?this.footer.length*this.footerRowHeight:0},hasTableFooter:function(){return Array.isArray(this.footer)&&this.footer.length},initInternalFooter:function(){if(!(Array.isArray(this.footer)&&this.footer.length>0))return[];var e,t=[],i=[];return e=(0,n.default)(this.internalColumns),e.sort(function(e,t){return e.isFrozen?-1:t.isFrozen?1:0}),this.footer.forEach(function(n,o){i=[],n.forEach(function(t,n){i.push({content:t,width:e[n].width,align:e[n].columnAlign,isFrozen:!!e[n].isFrozen})}),t.push(i)}),t}},methods:{setFooterCellClassName:function(e,t,n,i){var o=n;return!e&&this.hasFrozenColumn&&(o+=this.frozenCols.length),this.footerCellClassName&&this.footerCellClassName(t,o,i)}}}},function(module,exports,e){"use strict";(function(t){function n(){return o.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function i(e,t){if(n()=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function p(e){return+e!=e&&(e=0),o.alloc(+e)}function g(e,t){if(o.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return L(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return G(e).length;default:if(i)return L(e).length;t=(""+t).toLowerCase(),i=!0}}function v(e,t,n){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if(n>>>=0,t>>>=0,n<=t)return"";for(e||(e="utf8");;)switch(e){case"hex":return E(this,t,n);case"utf8":case"utf-8":return M(this,t,n);case"ascii":return R(this,t,n);case"latin1":case"binary":return A(this,t,n);case"base64":return P(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,n);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function m(e,t,n){var i=e[t];e[t]=e[n],e[n]=i}function b(e,t,n,i,r){if(0===e.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=r?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(r)return-1;n=e.length-1}else if(n<0){if(!r)return-1;n=0}if("string"==typeof t&&(t=o.from(t,i)),o.isBuffer(t))return 0===t.length?-1:w(e,t,n,i,r);if("number"==typeof t)return t&=255,o.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):w(e,[t],n,i,r);throw new TypeError("val must be string, number or Buffer")}function w(e,t,n,i,o){function r(e,t){return 1===l?e[t]:e.readUInt16BE(t*l)}var l=1,s=e.length,a=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;l=2,s/=2,a/=2,n/=2}var u;if(o){var c=-1;for(u=n;us&&(n=s-a),u=n;u>=0;u--){for(var h=!0,d=0;do&&(i=o):i=o;var r=t.length;if(r%2!=0)throw new TypeError("Invalid hex string");i>r/2&&(i=r/2);for(var l=0;l239?4:r>223?3:r>191?2:1;if(o+s<=n){var a,u,c,h;switch(s){case 1:r<128&&(l=r);break;case 2:a=e[o+1],128==(192&a)&&(h=(31&r)<<6|63&a)>127&&(l=h);break;case 3:a=e[o+1],u=e[o+2],128==(192&a)&&128==(192&u)&&(h=(15&r)<<12|(63&a)<<6|63&u)>2047&&(h<55296||h>57343)&&(l=h);break;case 4:a=e[o+1],u=e[o+2],c=e[o+3],128==(192&a)&&128==(192&u)&&128==(192&c)&&(h=(15&r)<<18|(63&a)<<12|(63&u)<<6|63&c)>65535&&h<1114112&&(l=h)}}null===l?(l=65533,s=1):l>65535&&(l-=65536,i.push(l>>>10&1023|55296),l=56320|1023&l),i.push(l),o+=s}return T(i)}function T(e){var t=e.length;if(t<=K)return String.fromCharCode.apply(String,e);for(var n="",i=0;ii)&&(n=i);for(var o="",r=t;rn)throw new RangeError("Trying to access beyond buffer length")}function z(e,t,n,i,r,l){if(!o.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||te.length)throw new RangeError("Index out of range")}function H(e,t,n,i){t<0&&(t=65535+t+1);for(var o=0,r=Math.min(e.length-n,2);o>>8*(i?o:1-o)}function D(e,t,n,i){t<0&&(t=4294967295+t+1);for(var o=0,r=Math.min(e.length-n,4);o>>8*(i?o:3-o)&255}function I(e,t,n,i,o,r){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function F(e,t,n,i,o){return o||I(e,t,n,4,3.4028234663852886e38,-3.4028234663852886e38),J.write(e,t,n,i,23,4),n+4}function j(e,t,n,i,o){return o||I(e,t,n,8,1.7976931348623157e308,-1.7976931348623157e308),J.write(e,t,n,i,52,8),n+8}function N(e){if(e=$(e).replace(Q,""),e.length<2)return"";for(;e.length%4!=0;)e+="=";return e}function $(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function W(e){return e<16?"0"+e.toString(16):e.toString(16)}function L(e,t){t=t||1/0;for(var n,i=e.length,o=null,r=[],l=0;l55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(l+1===i){(t-=3)>-1&&r.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&r.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&r.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;r.push(n)}else if(n<2048){if((t-=2)<0)break;r.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;r.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;r.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return r}function V(e){for(var t=[],n=0;n>8,o=n%256,r.push(o),r.push(i);return r}function G(e){return X.toByteArray(N(e))}function Y(e,t,n,i){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}function q(e){return e!==e}var X=e(30),J=e(31),Z=e(32);exports.Buffer=o,exports.SlowBuffer=p,exports.INSPECT_MAX_BYTES=50,o.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),exports.kMaxLength=n(),o.poolSize=8192,o._augment=function(e){return e.__proto__=o.prototype,e},o.from=function(e,t,n){return r(null,e,t,n)},o.TYPED_ARRAY_SUPPORT&&(o.prototype.__proto__=Uint8Array.prototype,o.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&o[Symbol.species]===o&&Object.defineProperty(o,Symbol.species,{value:null,configurable:!0})),o.alloc=function(e,t,n){return s(null,e,t,n)},o.allocUnsafe=function(e){return a(null,e)},o.allocUnsafeSlow=function(e){return a(null,e)},o.isBuffer=function(e){return!(null==e||!e._isBuffer)},o.compare=function(e,t){if(!o.isBuffer(e)||!o.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var n=e.length,i=t.length,r=0,l=Math.min(n,i);r0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),""},o.prototype.compare=function(e,t,n,i,r){if(!o.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===i&&(i=0),void 0===r&&(r=this.length),t<0||n>e.length||i<0||r>this.length)throw new RangeError("out of range index");if(i>=r&&t>=n)return 0;if(i>=r)return-1;if(t>=n)return 1;if(t>>>=0,n>>>=0,i>>>=0,r>>>=0,this===e)return 0;for(var l=r-i,s=n-t,a=Math.min(l,s),u=this.slice(i,r),c=e.slice(t,n),h=0;ho)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var r=!1;;)switch(i){case"hex":return y(this,e,t,n);case"utf8":case"utf-8":return C(this,e,t,n);case"ascii":return _(this,e,t,n);case"latin1":case"binary":return x(this,e,t,n);case"base64":return k(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(r)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),r=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var K=4096;o.prototype.slice=function(e,t){var n=this.length;e=~~e,t=void 0===t?n:~~t,e<0?(e+=n)<0&&(e=0):e>n&&(e=n),t<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(o*=256);)i+=this[e+--t]*o;return i},o.prototype.readUInt8=function(e,t){return t||B(e,1,this.length),this[e]},o.prototype.readUInt16LE=function(e,t){return t||B(e,2,this.length),this[e]|this[e+1]<<8},o.prototype.readUInt16BE=function(e,t){return t||B(e,2,this.length),this[e]<<8|this[e+1]},o.prototype.readUInt32LE=function(e,t){return t||B(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},o.prototype.readUInt32BE=function(e,t){return t||B(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},o.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||B(e,t,this.length);for(var i=this[e],o=1,r=0;++r=o&&(i-=Math.pow(2,8*t)),i},o.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||B(e,t,this.length);for(var i=t,o=1,r=this[e+--i];i>0&&(o*=256);)r+=this[e+--i]*o;return o*=128,r>=o&&(r-=Math.pow(2,8*t)),r},o.prototype.readInt8=function(e,t){return t||B(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},o.prototype.readInt16LE=function(e,t){t||B(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt16BE=function(e,t){t||B(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt32LE=function(e,t){return t||B(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},o.prototype.readInt32BE=function(e,t){return t||B(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},o.prototype.readFloatLE=function(e,t){return t||B(e,4,this.length),J.read(this,e,!0,23,4)},o.prototype.readFloatBE=function(e,t){return t||B(e,4,this.length),J.read(this,e,!1,23,4)},o.prototype.readDoubleLE=function(e,t){return t||B(e,8,this.length),J.read(this,e,!0,52,8)},o.prototype.readDoubleBE=function(e,t){return t||B(e,8,this.length),J.read(this,e,!1,52,8)},o.prototype.writeUIntLE=function(e,t,n,i){if(e=+e,t|=0,n|=0,!i){z(this,e,t,n,Math.pow(2,8*n)-1,0)}var o=1,r=0;for(this[t]=255&e;++r=0&&(r*=256);)this[t+o]=e/r&255;return t+n},o.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,1,255,0),o.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},o.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):H(this,e,t,!0),t+2},o.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):H(this,e,t,!1),t+2},o.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):D(this,e,t,!0),t+4},o.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):D(this,e,t,!1),t+4},o.prototype.writeIntLE=function(e,t,n,i){if(e=+e,t|=0,!i){var o=Math.pow(2,8*n-1);z(this,e,t,n,o-1,-o)}var r=0,l=1,s=0;for(this[t]=255&e;++r>0)-s&255;return t+n},o.prototype.writeIntBE=function(e,t,n,i){if(e=+e,t|=0,!i){var o=Math.pow(2,8*n-1);z(this,e,t,n,o-1,-o)}var r=n-1,l=1,s=0;for(this[t+r]=255&e;--r>=0&&(l*=256);)e<0&&0===s&&0!==this[t+r+1]&&(s=1),this[t+r]=(e/l>>0)-s&255;return t+n},o.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,1,127,-128),o.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},o.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):H(this,e,t,!0),t+2},o.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):H(this,e,t,!1),t+2},o.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,4,2147483647,-2147483648),o.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):D(this,e,t,!0),t+4},o.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||z(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):D(this,e,t,!1),t+4},o.prototype.writeFloatLE=function(e,t,n){return F(this,e,t,!0,n)},o.prototype.writeFloatBE=function(e,t,n){return F(this,e,t,!1,n)},o.prototype.writeDoubleLE=function(e,t,n){return j(this,e,t,!0,n)},o.prototype.writeDoubleBE=function(e,t,n){return j(this,e,t,!1,n)},o.prototype.copy=function(e,t,n,i){if(n||(n=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t=0;--r)e[r+t]=this[r+n];else if(l<1e3||!o.TYPED_ARRAY_SUPPORT)for(r=0;r>>=0,n=void 0===n?this.length:n>>>0,e||(e=0);var l;if("number"==typeof e)for(l=t;l0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function n(e){return 3*e.length/4-t(e)}function i(e){var n,i,o,r,l,s=e.length;r=t(e),l=new u(3*s/4-r),i=r>0?s-4:s;var c=0;for(n=0;n>16&255,l[c++]=o>>8&255,l[c++]=255&o;return 2===r?(o=a[e.charCodeAt(n)]<<2|a[e.charCodeAt(n+1)]>>4,l[c++]=255&o):1===r&&(o=a[e.charCodeAt(n)]<<10|a[e.charCodeAt(n+1)]<<4|a[e.charCodeAt(n+2)]>>2,l[c++]=o>>8&255,l[c++]=255&o),l}function o(e){return s[e>>18&63]+s[e>>12&63]+s[e>>6&63]+s[63&e]}function r(e,t,n){for(var i,r=[],l=t;lu?u:a+16383));return 1===i?(t=e[n-1],o+=s[t>>2],o+=s[t<<4&63],o+="=="):2===i&&(t=(e[n-2]<<8)+e[n-1],o+=s[t>>10],o+=s[t>>4&63],o+=s[t<<2&63],o+="="),l.push(o),l.join("")}exports.byteLength=n,exports.toByteArray=i,exports.fromByteArray=l;for(var s=[],a=[],u="undefined"!=typeof Uint8Array?Uint8Array:Array,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",h=0,d=c.length;h>1,c=-7,h=n?o-1:0,d=n?-1:1,f=e[t+h];for(h+=d,r=f&(1<<-c)-1,f>>=-c,c+=s;c>0;r=256*r+e[t+h],h+=d,c-=8);for(l=r&(1<<-c)-1,r>>=-c,c+=i;c>0;l=256*l+e[t+h],h+=d,c-=8);if(0===r)r=1-u;else{if(r===a)return l?NaN:1/0*(f?-1:1);l+=Math.pow(2,i),r-=u}return(f?-1:1)*l*Math.pow(2,r-i)},exports.write=function(e,t,n,i,o,r){var l,s,a,u=8*r-o-1,c=(1<>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:r-1,p=i?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,l=c):(l=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-l))<1&&(l--,a*=2),t+=l+h>=1?d/a:d*Math.pow(2,1-h),t*a>=2&&(l++,a/=2),l+h>=c?(s=0,l=c):l+h>=1?(s=(t*a-1)*Math.pow(2,o),l+=h):(s=t*Math.pow(2,h-1)*Math.pow(2,o),l=0));o>=8;e[n+f]=255&s,f+=p,s/=256,o-=8);for(l=l<0;e[n+f]=255&l,f+=p,l/=256,u-=8);e[n+f-p]|=128*g}},function(module,exports){var e={}.toString;module.exports=Array.isArray||function(t){return"[object Array]"==e.call(t)}},function(module,exports){module.exports=function(module){return module.webpackPolyfill||(module.deprecate=function(){},module.paths=[],module.children||(module.children=[]),Object.defineProperty(module,"loaded",{enumerable:!0,get:function(){return module.l}}),Object.defineProperty(module,"id",{enumerable:!0,get:function(){return module.i}}),module.webpackPolyfill=1),module}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(0),n=function(e){return e&&e.__esModule?e:{default:e}}(t);exports.default={data:function(){return{scrollbarWidth:0}},methods:{controlScrollBar:function(){if(this.hasTableFooter){this.$el.querySelector(".v-table-rightview .v-table-body").style.overflowX="hidden"}},setScrollbarWidth:function(){this.scrollbarWidth=n.default.getScrollbarWidth()}}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={data:function(){return{hoverRowIndex:-1,clickRowIndex:-1}},methods:{handleMouseEnter:function(e){this.rowHoverColor&&this.rowHoverColor.length>0&&(this.hoverRowIndex=e),this.rowMouseEnter&&this.rowMouseEnter(e)},handleMouseOut:function(e){this.rowHoverColor&&this.rowHoverColor.length>0&&(this.hoverRowIndex=-1),this.rowMouseLeave&&this.rowMouseLeave(e)},titleCellClick:function(e,t){this.titleClick&&this.titleClick(t,e)},titleCellDblClick:function(e,t){this.titleDblclick&&this.titleDblclick(t,e)},rowCellClick:function(e,t,n){this.rowClickColor&&this.rowClickColor.length>0&&(this.clickRowIndex=e),this.rowClick&&this.rowClick(e,t,n)},rowCellDbClick:function(e,t,n){this.rowDblclick&&this.rowDblclick(e,t,n)},getHighPriorityBgColor:function(e){var t="";return this.clickRowIndex===e?t=this.rowClickColor:this.hoverRowIndex===e&&(t=this.rowHoverColor),t.length<=0&&(this.evenBgColor&&this.evenBgColor.length>0||this.oddBgColor&&this.oddBgColor.length>0)&&(t=(e+1)%2==0?this.evenBgColor:this.oddBgColor),t.length<=0&&(t=this.tableBgColor),t},setRowBgColor:function(e,t,n){var i=this,o=this.$el;if(!o)return!1;var r=[],l=void 0,s=void 0;this.hasFrozenColumn&&r.push(o.querySelectorAll(".v-table-leftview .v-table-row")),r.push(o.querySelectorAll(".v-table-rightview .v-table-row")),r.forEach(function(o){l=o[t],s=o[e],l&&(l.style.backgroundColor=i.getHighPriorityBgColor(t)),s&&(s.style.backgroundColor=n)})},clearCurrentRow:function(){this.clickRowIndex=-1}},watch:{hoverRowIndex:function(e,t){this.setRowBgColor(e,t,this.rowHoverColor)},clickRowIndex:function(e,t){this.setRowBgColor(e,t,this.rowClickColor)}}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={data:function(){return{filterSpecialValue:"__all__"}},methods:{initColumnsFilters:function(){var e=this;this.isComplexTitle?this.internalTitleRows.forEach(function(t){t.forEach(function(t){e.enableFilters(t.filters,t.fields)&&!t.filterMultiple&&t.filters.unshift({label:"全部",value:e.filterSpecialValue,selected:!0})})}):this.internalColumns.map(function(t){e.enableFilters(t.filters)&&!t.filterMultiple&&t.filters.unshift({label:"全部",value:e.filterSpecialValue,selected:!0})})},filterConditionChange:function(e){e||this.filterSummary()},enableFilters:function(e,t){var n=!1;return Array.isArray(t)&&t.length>1&&(n=!1),Array.isArray(e)&&e.length>0&&(n=!0),n},filterEvent:function(){this.filterSummary()},filterSummary:function(){var e=this,t={},n=[],i=[];this.isComplexTitle?(n=this.internalTitleRows,n.forEach(function(n){n.forEach(function(n){i=[],e.enableFilters(n.filters,n.fields)&&(n.filters.forEach(function(t){t.selected&&t.value!==e.filterSpecialValue&&i.push(t.value)}),t[n.fields[0]]=i.length>0?i:null)})})):(n=this.internalColumns,n.forEach(function(n){i=[],e.enableFilters(n.filters)&&(n.filters.forEach(function(t){t.selected&&t.value!==e.filterSpecialValue&&i.push(t.value)}),t[n.field]=i.length>0?i:null)})),this.filterMethod&&this.filterMethod(t)}}}},function(module,exports,e){var t=e(1)(e(38),e(39),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-table\\src\\table-empty.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] table-empty.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(0);!function(e){e&&e.__esModule}(t);exports.default={props:{titleHeight:[Number,String],contentHeight:[Number,String],width:[Number,String],totalColumnsWidth:[Number,String],errorContent:{type:[String]},isLoading:[Boolean]},computed:{getCurrentContent:function(){var e="";return this.isLoading||(e=this.errorContent),e}}}},function(module,exports,e){module.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"v-table-empty"},[n("div",{staticClass:"v-table-empty-content",style:{height:e.contentHeight+"px",width:e.width+"px",top:e.titleHeight+"px"}},[n("div",{staticClass:"v-table-empty-inner",style:{height:e.contentHeight+"px",width:"100%","line-height":e.contentHeight+"px"},domProps:{innerHTML:e._s(e.getCurrentContent)}})]),e._v(" "),n("div",{staticClass:"v-table-empty-scroll",style:{height:e.contentHeight+"px",width:e.width+"px",top:e.titleHeight+"px"}},[n("div",{staticClass:"v-table-empty-inner",style:{height:"1px",width:e.totalColumnsWidth+"px"}})])])},staticRenderFns:[]},module.exports.render._withStripped=!0},function(module,exports,e){var t=e(1)(e(41),e(42),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-table\\src\\loading.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] loading.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={props:{loadingContent:[String],loadingOpacity:[Number],titleRows:[Array],titleRowHeight:[Number],columns:[Array]},methods:{setPosition:function(){var e=this.$el,t=this.$el.querySelector(".v-table-loading-content"),n=0;this.columns&&this.columns.length>0&&(n=this.titleRows&&this.titleRows.length>0?this.titleRows.length*this.titleRowHeight:this.titleRowHeight),t.style.top=(e.clientHeight+n)/2-t.clientHeight/2+"px"}},mounted:function(){var e=this;this.$nextTick(function(t){e.setPosition()})}}},function(module,exports,e){module.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticStyle:{width:"100%",height:"100%"}},[n("div",{staticClass:"v-table-loading",style:{opacity:e.loadingOpacity}}),e._v(" "),n("div",{staticClass:"v-table-loading-content",domProps:{innerHTML:e._s(e.loadingContent)}})])},staticRenderFns:[]},module.exports.render._withStripped=!0},function(module,exports,e){var t=e(1)(e(44),e(45),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-checkbox-group\\src\\checkbox-group.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] checkbox-group.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(0),n=function(e){return e&&e.__esModule?e:{default:e}}(t);exports.default={name:"v-checkbox-group",props:{value:{type:Array,default:function(){return[]}},isVerticalShow:{type:Boolean,default:!1}},methods:{updateModel:function(e,t){var n=this.value.indexOf(e);n>-1?t||this.value.splice(n,1):t&&this.value.push(e),this.$emit("input",this.value),this.$emit("change")}},watch:{value:function(e){var t=n.default.getChildCompsByName(this,"v-checkbox");t.length>0&&t.forEach(function(t){t.updateModelByGroup(e)})}}}},function(module,exports,e){module.exports={render:function(){var e=this,t=e.$createElement;return(e._self._c||t)("div",{staticClass:"v-checkbox-group"},[e._t("default")],2)},staticRenderFns:[]},module.exports.render._withStripped=!0},function(module,exports,e){var t=e(1)(e(47),e(48),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-checkbox\\src\\checkbox.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] checkbox.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(exports,"__esModule",{value:!0});var n=e(0),i=function(e){return e&&e.__esModule?e:{default:e}}(n);exports.default={name:"v-checkbox",props:{value:{type:[String,Number,Boolean]},label:{type:[String,Number],require:!0},disabled:Boolean,indeterminate:Boolean,showSlot:{type:Boolean,default:!0}},data:function(){return{model:this.value,_checkboxGroup:{}}},computed:{checkboxClasses:function(){var e;return["v-checkbox",(e={},t(e,"v-checkbox-checked",this.model),t(e,"v-checkbox-disabled",this.disabled),t(e,"v-checkbox-indeterminate",this.indeterminate),e)]},isCheckBoxGroup:function(){return this._checkboxGroup=i.default.getParentCompByName(this,"v-checkbox-group"),!!this._checkboxGroup},displayType:function(){var e="inline-block";return this._checkboxGroup&&(e=this._checkboxGroup.isVerticalShow?"block":"inline-block"),e}},methods:{change:function(e){if(this.disabled)return this.model=!this.model,!1;var t=e.target.checked;this.$emit("input",t),this.$emit("change"),this.isCheckBoxGroup&&this._checkboxGroup.updateModel(this.label,t)},initModel:function(){if(this.isCheckBoxGroup){var e=this._checkboxGroup;Array.isArray(e.value)&&e.value.length>0&&e.value.indexOf(this.label)>-1&&(this.model=!0)}else this.model=this.value},updateModelBySingle:function(){this.disabled||(this.model=this.value)},updateModelByGroup:function(e){e.indexOf(this.label)>-1?this.disabled||(this.model=!0):this.disabled||(this.model=!1)}},created:function(){this.initModel()},watch:{value:function(e){this.updateModelBySingle()}}}},function(module,exports,e){module.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("label",{staticClass:"v-checkbox-wrapper",style:{display:e.displayType}},[n("span",{class:e.checkboxClasses},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.model,expression:"model"}],staticClass:"v-checkbox-input",attrs:{type:"checkbox"},domProps:{value:e.label,checked:Array.isArray(e.model)?e._i(e.model,e.label)>-1:e.model},on:{change:[function(t){var n=e.model,i=t.target,o=!!i.checked;if(Array.isArray(n)){var r=e.label,l=e._i(n,r);i.checked?l<0&&(e.model=n.concat([r])):l>-1&&(e.model=n.slice(0,l).concat(n.slice(l+1)))}else e.model=o},e.change]}}),e._v(" "),n("span",{staticClass:"v-checkbox-inner"})]),e._v(" "),n("span",[e.showSlot?e._t("default",[e._v(e._s(e.label))]):e._e()],2)])},staticRenderFns:[]},module.exports.render._withStripped=!0},function(module,exports,e){var t=e(1)(e(50),e(52),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-dropdown\\src\\dropdown.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] dropdown.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0});var n=e(2),i=t(n),o=e(51),r=t(o),l=e(3),s=t(l),a=e(4),u=t(a),c=e(8),h=t(c);exports.default={name:"v-dropdown",components:{VCheckboxGroup:s.default,VCheckbox:u.default},mixins:[h.default],directives:{"click-outside":r.default},data:function(){return{visible:!1,internalOptions:[],checkboxGroupList:[],textAlignPrefix:"v-dropdown-items-li-a-",inputValue:"",isOperationChange:null}},props:{isSelect:{type:Boolean,default:!1},showOperation:{type:Boolean,default:!1},size:{type:String},width:{type:Number,default:90},maxWidth:{type:Number},isMultiple:{type:Boolean,default:!1},value:[Object,Array],placeholder:{type:String,default:"请选择",validator:function(e){return e.length>0}},textAlign:{type:String,default:"left"},min:{type:Number,default:0},max:{type:Number,default:999},isInput:{type:Boolean,default:!1}},computed:{sizeClass:function(){var e=i.default.sizeMaps[this.size]||i.default.sizeMapDefault;return e===i.default.sizeMaps.large?" v-dropdown--large":e===i.default.sizeMaps.middle?" v-dropdown--middle":" v-dropdown--small"},getMaxWidth:function(){var e=1/0,t=this.maxWidth,n=this.width;return t&&t>0&&t>n&&(e=t),e}},methods:{init:function(){this.internalOptions=Object.assign([],this.value),this.checkboxGroupList=this.selectedLabels(),this.isInput&&this.setInputValue()},confirm:function(){this.isOperationChange&&(this.$emit("on-filter-method",this.internalOptions),this.isOperationChange=!1),this.hideDropDown()},rest:function(){var e=this;this.internalOptions.some(function(e){return e.selected})&&(this.internalOptions.map(function(e){return e.selected&&(e.selected=!1),e}),this.checkboxGroupList=[],this.$emit("input",this.internalOptions),this.$emit("change")),setTimeout(function(t){e.hideDropDown()},50)},hideDropDown:function(){this.showOperation&&this.isOperationChange&&(this.$emit("on-filter-method",this.internalOptions),this.isOperationChange=!1),this.visible=!1},showDropDown:function(){this.visible=!0},setInputValue:function(){var e,t;t=this.selectedLabels(),Array.isArray(t)&&t.length>0&&(e=t.join()),this.inputValue=e},checkboxGroupChange:function(){this.selectOptionClick()},toggleItems:function(){var e=this;this.visible?this.hideDropDown():(this.showDropDown(),this.$nextTick(function(t){e.dropDownClick()}))},selectOptionClick:function(e){var t=this;this.isMultiple?this.internalOptions.map(function(e){return t.checkboxGroupList.includes(e.label)?e.selected=!0:e.selected=!1,e}):this.internalOptions.map(function(t){return e.label===t.label?t.selected=!0:t.selected=!1,t}),this.isMultiple||this.toggleItems(),this.isInput&&this.setInputValue(),this.$emit("input",this.internalOptions),this.$emit("change")},getTextAlignClass:function(){return this.textAlignPrefix+this.textAlign},selectedLabels:function(){return this.internalOptions.filter(function(e){return e.selected}).map(function(e){if(e.selected)return e.label})},clickOutside:function(){this.hideDropDown()},dropDownClick:function(){var e=this.$el.querySelector(".v-dropdown-dt"),t=this.$el.querySelector(".v-dropdown-items");return this.layerAdjustmentOnce(t,e,2),!1},dropdownAdjust:function(){var e=this.$el.querySelector(".v-dropdown-dt"),t=this.$el.querySelector(".v-dropdown-items");this.layerAdjustmentBind(t,e,2)}},created:function(){this.init()},mounted:function(){this.dropdownAdjust()},watch:{value:function(e){this.init()},internalOptions:function(e){this.isOperationChange=!(!this.showOperation||null===this.isOperationChange)}}}},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={bind:function(e,t,n){if("function"!=typeof t.value){var i="in [clickoutside] directives, provided expression '"+t.expression+"' is not a function ",o=n.context.name;o&&(i+="in "+o),console.error(i)}var r=function(n){if(e.contains(n.target)||e===n.target)return!1;t.value(n)};e.__clickOutSide__=r,document.addEventListener("click",r,!0)},unbind:function(e){document.removeEventListener("click",e.__clickOutSide__,!0),e.__clickOutSide__=null}}},function(module,exports,e){module.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("dl",{directives:[{name:"click-outside",rawName:"v-click-outside",value:e.clickOutside,expression:"clickOutside"}],class:["v-dropdown",e.sizeClass]},[n("dt",{staticClass:"v-dropdown-dt"},[n("a",{class:[e.isSelect?"v-dropdown-selected":""],style:{width:e.width+"px"},on:{click:function(t){t.stopPropagation(),t.preventDefault(),e.toggleItems()}}},[e._t("default")],2)]),e._v(" "),n("dd",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],staticClass:"v-dropdown-dd"},[n("ul",{staticClass:"v-dropdown-items",style:{"min-width":e.width+"px","max-width":e.getMaxWidth+"px"}},[e.isMultiple?[n("v-checkbox-group",{attrs:{"is-vertical-show":"",min:e.min,max:e.max},on:{change:e.checkboxGroupChange},model:{value:e.checkboxGroupList,callback:function(t){e.checkboxGroupList=t},expression:"checkboxGroupList"}},e._l(e.internalOptions,function(t){return n("li",{class:["v-dropdown-items-multiple",e.getTextAlignClass()]},[n("v-checkbox",{key:t.label,attrs:{label:t.label,showLine:t.showLine}})],1)}))]:e._l(e.internalOptions,function(t){return n("li",{class:["v-dropdown-items-li",t.selected?"active":""],on:{click:function(n){n.stopPropagation(),e.selectOptionClick(t)}}},[n("a",{class:["v-dropdown-items-li-a",e.getTextAlignClass()],attrs:{href:"javascript:void(0);"}},[e._v(e._s(t.label))])])}),e._v(" "),e.showOperation?n("li",{staticClass:"v-dropdown-operation"},[n("a",{staticClass:"v-dropdown-operation-item",attrs:{href:"javascript:void(0)"},on:{click:function(t){t.stopPropagation(),e.confirm(t)}}},[e._v("确认")]),e._v(" "),n("a",{staticClass:"v-dropdown-operation-item",attrs:{href:"javascript:void(0)"},on:{click:function(t){t.stopPropagation(),e.rest(t)}}},[e._v("重置")])]):e._e()],2)])])},staticRenderFns:[]},module.exports.render._withStripped=!0},function(module,exports,e){module.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"v-table-views v-table-class",style:{width:e.internalWidth+"px",height:e.getTableHeight+"px","background-color":e.tableBgColor}},[e.frozenCols.length>0?[n("div",{staticClass:"v-table-leftview",style:{width:e.leftViewWidth+"px"}},[n("div",{staticClass:"v-table-header v-table-title-class",style:{width:e.leftViewWidth+"px","background-color":e.titleBgColor}},[n("div",{staticClass:"v-table-header-inner",staticStyle:{display:"block"}},[n("table",{staticClass:"v-table-htable",attrs:{border:"0",cellspacing:"0",cellpadding:"0"}},[n("tbody",[e.frozenTitleCols.length>0?e._l(e.frozenTitleCols,function(t){return n("tr",e._l(t,function(t){return n("td",{class:[t.titleCellClassName],attrs:{colspan:t.colspan,rowspan:t.rowspan},on:{mousemove:function(n){n.stopPropagation(),e.handleTitleMouseMove(n,t.fields)},mousedown:function(t){t.stopPropagation(),e.handleTitleMouseDown(t)},mouseout:function(t){t.stopPropagation(),e.handleTitleMouseOut()},click:function(n){n.stopPropagation(),e.titleCellClick(t.fields,t.title)},dblclick:function(n){n.stopPropagation(),e.titleCellDblClick(t.fields,t.title)}}},[n("div",{class:["v-table-title-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:e.titleColumnWidth(t.fields)+"px",height:e.titleColumnHeight(t.rowspan)+"px","text-align":t.titleAlign}},[n("span",{staticClass:"table-title"},[e.isSelectionCol(t.fields)?n("span",[n("v-checkbox",{attrs:{indeterminate:e.indeterminate,"show-slot":!1,label:"check-all"},on:{change:e.handleCheckAll},model:{value:e.isAllChecked,callback:function(t){e.isAllChecked=t},expression:"isAllChecked"}})],1):n("span",{domProps:{innerHTML:e._s(t.title)}}),e._v(" "),e.enableSort(t.orderBy)?n("span",{staticClass:"v-table-sort-icon",on:{click:function(n){n.stopPropagation(),e.sortControl(t.fields[0])}}},[n("i",{class:["v-icon-up-dir","asc"===e.getCurrentSort(t.fields[0])?"checked":""]}),e._v(" "),n("i",{class:["v-icon-down-dir","desc"===e.getCurrentSort(t.fields[0])?"checked":""]})]):e._e()]),e._v(" "),e.enableFilters(t.filters,t.fields)?n("v-dropdown",{staticClass:"v-table-dropdown",attrs:{"show-operation":t.filterMultiple,"is-multiple":t.filterMultiple},on:{"on-filter-method":e.filterEvent,change:function(n){e.filterConditionChange(t.filterMultiple)}},model:{value:t.filters,callback:function(n){e.$set(t,"filters",n)},expression:"col.filters"}},[n("i",{class:["v-table-filter-icon",e.vTableFiltersIcon(t.filters)]})]):e._e()],1)])}))}):[n("tr",{staticClass:"v-table-header-row"},e._l(e.frozenCols,function(t){return n("td",{class:[t.titleCellClassName],on:{mousemove:function(n){n.stopPropagation(),e.handleTitleMouseMove(n,t.field)},mousedown:function(t){t.stopPropagation(),e.handleTitleMouseDown(t)},mouseout:function(t){t.stopPropagation(),e.handleTitleMouseOut()},click:function(n){n.stopPropagation(),e.titleCellClick(t.field,t.title)},dblclick:function(n){n.stopPropagation(),e.titleCellDblClick(t.field,t.title)}}},[n("div",{class:["v-table-title-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:t.width+"px",height:e.titleRowHeight+"px","text-align":t.titleAlign}},[n("span",{staticClass:"table-title"},["selection"===t.type?n("span",[n("v-checkbox",{attrs:{indeterminate:e.indeterminate,"show-slot":!1,label:"check-all"},on:{change:e.handleCheckAll},model:{value:e.isAllChecked,callback:function(t){e.isAllChecked=t},expression:"isAllChecked"}})],1):n("span",{domProps:{innerHTML:e._s(t.title)}}),e._v(" "),e.enableSort(t.orderBy)?n("span",{staticClass:"v-table-sort-icon",on:{click:function(n){n.stopPropagation(),e.sortControl(t.field)}}},[n("i",{class:["v-icon-up-dir","asc"===e.getCurrentSort(t.field)?"checked":""]}),e._v(" "),n("i",{class:["v-icon-down-dir","desc"===e.getCurrentSort(t.field)?"checked":""]})]):e._e()]),e._v(" "),e.enableFilters(t.filters)?n("v-dropdown",{staticClass:"v-table-dropdown",attrs:{"show-operation":t.filterMultiple,"is-multiple":t.filterMultiple},on:{"on-filter-method":e.filterEvent,change:function(n){e.filterConditionChange(t.filterMultiple)}},model:{value:t.filters,callback:function(n){e.$set(t,"filters",n)},expression:"col.filters"}},[n("i",{class:["v-table-filter-icon",e.vTableFiltersIcon(t.filters)]})]):e._e()],1)])}))]],2)])])]),e._v(" "),n("div",{staticClass:"v-table-body v-table-body-class",style:{width:e.leftViewWidth+"px",height:e.bodyViewHeight+"px"}},[n("div",{class:["v-table-body-inner",e.vTableBodyInner]},[n("v-checkbox-group",{on:{change:e.handleCheckGroupChange},model:{value:e.checkboxGroupModel,callback:function(t){e.checkboxGroupModel=t},expression:"checkboxGroupModel"}},[n("table",{staticClass:"v-table-btable",attrs:{cellspacing:"0",cellpadding:"0",border:"0"}},[n("tbody",e._l(e.internalTableData,function(t,i){return n("tr",{staticClass:"v-table-row",style:[e.trBgColor(i+1)],on:{mouseenter:function(t){t.stopPropagation(),e.handleMouseEnter(i)},mouseleave:function(t){t.stopPropagation(),e.handleMouseOut(i)}}},e._l(e.frozenCols,function(o,r){return e.cellMergeInit(i,o.field,t,!0)?n("td",{key:r,class:[e.setColumnCellClassName(i,o.field,t)],attrs:{colSpan:e.setColRowSpan(i,o.field,t).colSpan,rowSpan:e.setColRowSpan(i,o.field,t).rowSpan}},[e.isCellMergeRender(i,o.field,t)?n("div",{class:["v-table-body-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:e.getRowWidthByColSpan(i,o.field,t)+"px",height:e.getRowHeightByRowSpan(i,o.field,t)+"px","line-height":e.getRowHeightByRowSpan(i,o.field,t)+"px","text-align":o.columnAlign},attrs:{title:o.overflowTitle?e.overflowTitle(t,i,o):""},on:{click:function(n){n.stopPropagation(),e.rowCellClick(i,t,o),e.cellEditClick(n,o.isEdit,t,o.field,i)},dblclick:function(n){n.stopPropagation(),e.rowCellDbClick(i,t,o)}}},[e.cellMergeContentType(i,o.field,t).isComponent?n("span",[n(e.cellMerge(i,t,o.field).componentName,{tag:"component",attrs:{rowData:t,field:o.field?o.field:"",index:i},on:{"on-custom-comp":e.customCompFunc}})],1):n("span",{domProps:{innerHTML:e._s(e.cellMerge(i,t,o.field).content)}})]):n("div",{class:["v-table-body-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:o.width+"px",height:e.rowHeight+"px","line-height":e.rowHeight+"px","text-align":o.columnAlign},attrs:{title:o.overflowTitle?e.overflowTitle(t,i,o):""},on:{click:function(n){n.stopPropagation(),e.rowCellClick(i,t,o),e.cellEditClick(n,o.isEdit,t,o.field,i)},dblclick:function(n){n.stopPropagation(),e.rowCellDbClick(i,t,o)}}},["string"==typeof o.componentName&&o.componentName.length>0?n("span",[n(o.componentName,{tag:"component",attrs:{rowData:t,field:o.field?o.field:"",index:i},on:{"on-custom-comp":e.customCompFunc}})],1):"function"==typeof o.formatter?n("span",{domProps:{innerHTML:e._s(o.formatter(t,i,e.pagingIndex,o.field))}}):"selection"===o.type?n("span",[n("v-checkbox",{attrs:{"show-slot":!1,disabled:t._disabled,label:i},on:{change:function(n){e.handleCheckChange(t)}}})],1):n("span",[e._v("\n "+e._s(t[o.field])+"\n ")])])]):e._e()}))}))])])],1)]),e._v(" "),e.frozenFooterCols.length>0?n("div",{class:["v-table-footer","v-table-footer-class"],style:{width:e.leftViewWidth+"px",height:e.footerTotalHeight}},[n("table",{staticClass:"v-table-ftable",attrs:{cellspacing:"0",cellpadding:"0",border:"0"}},e._l(e.frozenFooterCols,function(t,i){return n("tr",{staticClass:"v-table-row"},e._l(t,function(t,o){return n("td",{class:e.setFooterCellClassName(!0,i,o,t.content)},[n("div",{class:["v-table-body-cell",e.vTableBodyCell],style:{height:e.footerRowHeight+"px","line-height":e.footerRowHeight+"px",width:t.width+"px","text-align":t.align},domProps:{innerHTML:e._s(t.content)}})])}))}))]):e._e()])]:e._e(),e._v(" "),n("div",{staticClass:"v-table-rightview",style:{width:e.rightViewWidth+"px"}},[n("div",{staticClass:"v-table-header v-table-title-class",style:{width:e.rightViewWidth-1+"px","background-color":e.titleBgColor}},[n("div",{staticClass:"v-table-header-inner",staticStyle:{display:"block"}},[n("table",{staticClass:"v-table-htable",attrs:{border:"0",cellspacing:"0",cellpadding:"0"}},[n("tbody",[e.noFrozenTitleCols.length>0?e._l(e.noFrozenTitleCols,function(t){return n("tr",e._l(t,function(t){return n("td",{class:[t.titleCellClassName],attrs:{colspan:t.colspan,rowspan:t.rowspan},on:{mousemove:function(n){n.stopPropagation(),e.handleTitleMouseMove(n,t.fields)},mousedown:function(t){t.stopPropagation(),e.handleTitleMouseDown(t)},mouseout:function(t){t.stopPropagation(),e.handleTitleMouseOut()},click:function(n){n.stopPropagation(),e.titleCellClick(t.fields,t.title)},dblclick:function(n){n.stopPropagation(),e.titleCellDblClick(t.fields,t.title)}}},[n("div",{class:["v-table-title-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:e.titleColumnWidth(t.fields)+"px",height:e.titleColumnHeight(t.rowspan)+"px","text-align":t.titleAlign}},[n("span",{staticClass:"table-title"},[e.isSelectionCol(t.fields)?n("span",[n("v-checkbox",{attrs:{indeterminate:e.indeterminate,"show-slot":!1,label:"check-all"},on:{change:e.handleCheckAll},model:{value:e.isAllChecked,callback:function(t){e.isAllChecked=t},expression:"isAllChecked"}})],1):n("span",{domProps:{innerHTML:e._s(t.title)}}),e._v(" "),e.enableSort(t.orderBy)?n("span",{staticClass:"v-table-sort-icon",on:{click:function(n){n.stopPropagation(),e.sortControl(t.fields[0])}}},[n("i",{class:["v-icon-up-dir","asc"===e.getCurrentSort(t.fields[0])?"checked":""]}),e._v(" "),n("i",{class:["v-icon-down-dir","desc"===e.getCurrentSort(t.fields[0])?"checked":""]})]):e._e()]),e._v(" "),e.enableFilters(t.filters,t.fields)?n("v-dropdown",{staticClass:"v-table-dropdown",attrs:{"show-operation":t.filterMultiple,"is-multiple":t.filterMultiple},on:{"on-filter-method":e.filterEvent,change:function(n){e.filterConditionChange(t.filterMultiple)}},model:{value:t.filters,callback:function(n){e.$set(t,"filters",n)},expression:"col.filters"}},[n("i",{class:["v-table-filter-icon",e.vTableFiltersIcon(t.filters)]})]):e._e()],1)])}))}):[n("tr",{staticClass:"v-table-header-row"},e._l(e.noFrozenCols,function(t,i){return n("td",{class:[t.titleCellClassName],on:{mousemove:function(n){n.stopPropagation(),e.handleTitleMouseMove(n,t.field)},mousedown:function(t){t.stopPropagation(),e.handleTitleMouseDown(t)},mouseout:function(t){t.stopPropagation(),e.handleTitleMouseOut()},click:function(n){n.stopPropagation(),e.titleCellClick(t.field,t.title)},dblclick:function(n){n.stopPropagation(),e.titleCellDblClick(t.field,t.title)}}},[n("div",{class:["v-table-title-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:t.width+"px",height:e.titleRowHeight+"px","text-align":t.titleAlign}},[n("span",{staticClass:"table-title"},["selection"===t.type?n("span",[n("v-checkbox",{attrs:{indeterminate:e.indeterminate,"show-slot":!1,label:"check-all"},on:{change:e.handleCheckAll},model:{value:e.isAllChecked,callback:function(t){e.isAllChecked=t},expression:"isAllChecked"}})],1):n("span",{domProps:{innerHTML:e._s(t.title)}}),e._v(" "),e.enableSort(t.orderBy)?n("span",{staticClass:"v-table-sort-icon",on:{click:function(n){n.stopPropagation(),e.sortControl(t.field)}}},[n("i",{class:["v-icon-up-dir","asc"===e.getCurrentSort(t.field)?"checked":""]}),e._v(" "),n("i",{class:["v-icon-down-dir","desc"===e.getCurrentSort(t.field)?"checked":""]})]):e._e(),e._v(" "),e.enableFilters(t.filters)?n("v-dropdown",{staticClass:"v-table-dropdown",attrs:{"show-operation":t.filterMultiple,"is-multiple":t.filterMultiple},on:{"on-filter-method":e.filterEvent,change:function(n){e.filterConditionChange(t.filterMultiple)}},model:{value:t.filters,callback:function(n){e.$set(t,"filters",n)},expression:"col.filters"}},[n("i",{class:["v-table-filter-icon",e.vTableFiltersIcon(t.filters)]})]):e._e()],1)])])}))]],2)])])]),e._v(" "),n("div",{class:["v-table-body v-table-body-class",e.vTableRightBody],style:{width:e.rightViewWidth+"px",height:e.bodyViewHeight+"px"}},[n("v-checkbox-group",{on:{change:e.handleCheckGroupChange},model:{value:e.checkboxGroupModel,callback:function(t){e.checkboxGroupModel=t},expression:"checkboxGroupModel"}},[n("table",{staticClass:"v-table-btable",attrs:{cellspacing:"0",cellpadding:"0",border:"0"}},[n("tbody",e._l(e.internalTableData,function(t,i){return n("tr",{key:i,staticClass:"v-table-row",style:[e.trBgColor(i+1)],on:{mouseenter:function(t){t.stopPropagation(),e.handleMouseEnter(i)},mouseleave:function(t){t.stopPropagation(),e.handleMouseOut(i)}}},e._l(e.noFrozenCols,function(o,r){return e.cellMergeInit(i,o.field,t,!1)?n("td",{key:r,class:[e.setColumnCellClassName(i,o.field,t)],attrs:{colSpan:e.setColRowSpan(i,o.field,t).colSpan,rowSpan:e.setColRowSpan(i,o.field,t).rowSpan}},[e.isCellMergeRender(i,o.field,t)?n("div",{class:["v-table-body-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:e.getRowWidthByColSpan(i,o.field,t)+"px",height:e.getRowHeightByRowSpan(i,o.field,t)+"px","line-height":e.getRowHeightByRowSpan(i,o.field,t)+"px","text-align":o.columnAlign},attrs:{title:o.overflowTitle?e.overflowTitle(t,i,o):""},on:{click:function(n){n.stopPropagation(),e.rowCellClick(i,t,o),e.cellEditClick(n,o.isEdit,t,o.field,i)},dblclick:function(n){n.stopPropagation(),e.rowCellDbClick(i,t,o)}}},[e.cellMergeContentType(i,o.field,t).isComponent?n("span",[n(e.cellMerge(i,t,o.field).componentName,{tag:"component",attrs:{rowData:t,field:o.field?o.field:"",index:i},on:{"on-custom-comp":e.customCompFunc}})],1):n("span",{domProps:{innerHTML:e._s(e.cellMerge(i,t,o.field).content)}})]):n("div",{class:["v-table-body-cell",e.showVerticalBorder?"vertical-border":"",e.showHorizontalBorder?"horizontal-border":""],style:{width:o.width+"px",height:e.rowHeight+"px","line-height":e.rowHeight+"px","text-align":o.columnAlign},attrs:{title:o.overflowTitle?e.overflowTitle(t,i,o):""},on:{click:function(n){n.stopPropagation(),e.rowCellClick(i,t,o),e.cellEditClick(n,o.isEdit,t,o.field,i)},dblclick:function(n){n.stopPropagation(),e.rowCellDbClick(i,t,o)}}},["string"==typeof o.componentName&&o.componentName.length>0?n("span",[n(o.componentName,{tag:"component",attrs:{rowData:t,field:o.field?o.field:"",index:i},on:{"on-custom-comp":e.customCompFunc}})],1):"function"==typeof o.formatter?n("span",{domProps:{innerHTML:e._s(o.formatter(t,i,e.pagingIndex,o.field))}}):"selection"===o.type?n("span",[n("v-checkbox",{attrs:{"show-slot":!1,disabled:t._disabled,label:i},on:{change:function(n){e.handleCheckChange(t)}}})],1):n("span",[e._v("\n "+e._s(t[o.field])+"\n ")])])]):e._e()}))}))])])],1),e._v(" "),e.noFrozenFooterCols.length>0?n("div",{class:["v-table-footer","v-table-footer-class",e.vTableFooter],style:{width:e.rightViewWidth+"px",height:e.footerTotalHeight}},[n("table",{staticClass:"v-table-ftable",attrs:{cellspacing:"0",cellpadding:"0",border:"0"}},e._l(e.noFrozenFooterCols,function(t,i){return n("tr",{staticClass:"v-table-row"},e._l(t,function(t,o){return n("td",{class:e.setFooterCellClassName(!1,i,o,t.content)},[n("div",{class:["v-table-body-cell",e.vTableBodyCell],style:{height:e.footerRowHeight+"px","line-height":e.footerRowHeight+"px",width:t.width+"px","text-align":t.align},domProps:{innerHTML:e._s(t.content)}})])}))}))]):e._e()]),e._v(" "),e.isTableEmpty?n("table-empty",{attrs:{width:e.internalWidth,"total-columns-width":e.totalColumnsWidth,"content-height":e.errorContentHeight,"title-height":e.getTotalColumnsHeight(),"error-content":e.errorContent,"is-loading":e.isLoading}}):e._e(),e._v(" "),e.isLoading?n("loading",{attrs:{"loading-content":e.loadingContent,"title-rows":e.internalTitleRows,"title-row-height":e.titleRowHeight,columns:e.internalColumns,"loading-opacity":e.loadingOpacity}}):e._e(),e._v(" "),n("div",{directives:[{name:"show",rawName:"v-show",value:e.isDragging,expression:"isDragging"}],staticClass:"v-table-drag-line"})],2)},staticRenderFns:[]},module.exports.render._withStripped=!0},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=e(55),n=function(e){return e&&e.__esModule?e:{default:e}}(t);n.default.install=function(e){e.component(n.default.name,n.default)},exports.default=n.default},function(module,exports,e){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0});var n=e(56),i=t(n),o=e(9),r=t(o),l=e(2),s=t(l);exports.default={name:"v-pagination",props:{layout:{type:Array,default:function(){return["total","prev","pager","next","sizer","jumper"]}},size:{type:String},total:{type:Number,require:!0},pageIndex:{type:Number},showPagingCount:{type:Number,default:5},pageSize:{type:Number,default:10},pageSizeOption:{type:Array,default:function(){return[10,20,30]}}},data:function(){return{newPageIndex:this.pageIndex&&this.pageIndex>0?parseInt(this.pageIndex):1,newPageSize:this.pageSize,newPageSizeOption:[]}},computed:{pageCount:function(){return Math.ceil(this.total/this.newPageSize)}},render:function(e){var t=e("ul",{class:"v-page-ul"},[]),n={total:e("total",null,[]),prev:e("prev",null,[]),pager:e("pager",{attrs:{pageCount:this.pageCount,pageIndex:this.newPageIndex,showPagingCount:this.showPagingCount},on:{jumpPageHandler:this.jumpPageHandler}},[]),next:e("next",null,[]),sizer:e("sizer",null,[]),jumper:e("jumper",{on:{jumpPageHandler:this.jumpPageHandler}},[])};this.layout.forEach(function(e){t.children.push(n[e])});var i=s.default.sizeMaps[this.size]||s.default.sizeMapDefault,o=i===s.default.sizeMaps.large?" v-page--large":i===s.default.sizeMaps.middle?" v-page--middle":" v-page--small";return t.data.class+=o,t},components:{Total:{render:function(e){return e("span",{class:"v-page-total"},[" 共 ",this.$parent.total," 条 "])}},Prev:{render:function(e){return e("li",{on:{click:this.$parent.prevPage},class:[1===this.$parent.newPageIndex?"v-page-disabled":"","v-page-li","v-page-prev"]},[e("a",null,[e("i",{class:"v-icon-angle-left"},[])])])}},pager:i.default,Next:{render:function(e){return e("li",{on:{click:this.$parent.nextPage},class:[this.$parent.newPageIndex===this.$parent.pageCount?"v-page-disabled":"","v-page-li","v-page-next"]},[e("a",null,[e("i",{class:"v-icon-angle-right"},[])])])}},Sizer:{components:{VSelect:r.default},render:function(e){return e("v-select",{attrs:{size:this.$parent.size,value:this.$parent.newPageSizeOption},class:"v-page-select",on:{input:this.handleChange},directives:[{name:"model",value:this.$parent.newPageSizeOption}]},[])},methods:{handleChange:function(e){if(Array.isArray(e)&&e.length>0){var t=e.find(function(e){return e.selected});t&&this.$parent.pageSizeChangeHandler(t.value)}}},created:function(){}},Jumper:{methods:{jumperEnter:function(e){if(13===e.keyCode){var t=this.$parent.getValidNum(e.target.value);this.$parent.newPageIndex=t,this.$emit("jumpPageHandler",t)}}},render:function(e){return e("span",{class:"v-page-goto"},[" 前往 ",e("input",{class:"v-page-goto-input",domProps:{value:this.$parent.newPageIndex},on:{keyup:this.jumperEnter},attrs:{type:"input"}},[])," 页 "])}}},methods:{getValidNum:function(e){return e=parseInt(e,10),isNaN(e)||e<1?1:e<1?1:e>this.pageCount?this.pageCount:e},jumpPageHandler:function(e){this.newPageIndex=e,this.$emit("page-change",this.newPageIndex)},prevPage:function(){this.newPageIndex>1&&(this.newPageIndex=this.newPageIndex-1,this.$emit("page-change",this.newPageIndex))},nextPage:function(){this.newPageIndex0?parseInt(this.pageIndex):1},goBackPageSize:function(){this.pageSize>0&&(this.newPageSize=this.pageSize,this.initSelectOption())}},watch:{pageIndex:function(e,t){this.newPageIndex=e},pageSize:function(e,t){this.newPageSize=e,this.initSelectOption()}},created:function(){this.initSelectOption()}}},function(module,exports,e){var t=e(1)(e(57),e(58),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-pagination\\src\\pager.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] pager.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={props:{pageCount:Number,pageIndex:Number,showPagingCount:Number},computed:{numOffset:function(){return Math.floor((this.showPagingCount+2)/2)-1},showJumpPrev:function(){return this.pageCount>this.showPagingCount+2&&this.pageIndex>this.showPagingCount},showJumpNext:function(){return this.pageCount>this.showPagingCount+2&&this.pageIndex<=this.pageCount-this.showPagingCount},pagingCounts:function(){var e=this,t=void 0,n=[],i=e.showJumpPrev,o=e.showJumpNext;if(i&&!o){t=e.pageCount-e.showPagingCount;for(var r=t;r1?n("li",{class:[e.pageIndex===e.pageCount?"v-page-li-active":"","v-page-li"],on:{click:function(t){t.stopPropagation(),t.preventDefault(),e.jumpPage(e.pageCount)}}},[n("a",[e._v(e._s(e.pageCount))])]):e._e()],2)},staticRenderFns:[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("a",[n("i",{staticClass:"v-icon-angle-double-left"})])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("a",[n("i",{staticClass:"v-icon-angle-double-right"})])}]},module.exports.render._withStripped=!0},function(module,exports,e){var t=e(1)(e(60),e(61),null,null,null);t.options.__file="D:\\MySpace\\PracticePro\\vue-easytable-sync\\vue-easytable\\packages\\v-select\\src\\select.vue",t.esModule&&Object.keys(t.esModule).some(function(e){return"default"!==e&&"__"!==e.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),t.options.functional&&console.error("[vue-loader] select.vue: functional components are not supported with templates, they should use render functions."),module.exports=t.exports},function(module,exports,e){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0});var n=e(0),i=(t(n),e(2)),o=(t(i),e(8)),r=t(o),l=e(5),s=t(l);exports.default={name:"v-select",components:{VDropdown:s.default},mixins:[r.default],data:function(){return{visible:!1,internalOptions:[],textAlignPrefix:"v-select-items-li-a-",inputValue:""}},props:{size:{type:String},width:{type:Number,default:90},maxWidth:{type:Number},isMultiple:{type:Boolean,default:!1},value:[Object,Array],placeholder:{type:String,default:"请选择",validator:function(e){return e.length>0}},textAlign:{type:String,default:"left"},min:{type:Number,default:0},max:{type:Number,default:999},isInput:{type:Boolean,default:!1}},methods:{init:function(){this.internalOptions=Object.assign([],this.value),this.isInput&&this.setInputValue()},showSelectInfo:function(){var e;return e=this.selectedLabels(),Array.isArray(e)&&e.length>0?e.join():this.placeholder},selectedLabels:function(){return this.internalOptions.filter(function(e){return e.selected}).map(function(e){if(e.selected)return e.label})},dropdownChange:function(){this.$emit("input",this.internalOptions),this.$emit("change")}},created:function(){this.init()},watch:{value:function(e){this.init()}}}},function(module,exports,e){module.exports={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dropdown",{staticClass:"v-select",style:{width:e.width},attrs:{"is-select":"",size:e.size,width:e.width,maxWidth:e.maxWidth,isMultiple:e.isMultiple,textAlign:e.textAlign,min:e.min,max:e.max,isInput:e.isInput},on:{change:e.dropdownChange},model:{value:e.internalOptions,callback:function(t){e.internalOptions=t},expression:"internalOptions"}},[n("span",[e.isInput?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.inputValue,expression:"inputValue"}],staticClass:"v-select-input",attrs:{placeholder:e.placeholder,type:"text"},domProps:{value:e.inputValue},on:{input:function(t){t.target.composing||(e.inputValue=t.target.value)}}})]:[n("span",{staticClass:"v-select-selected-span"},[e._v(e._s(e.showSelectInfo()))])],e._v(" "),n("i",{staticClass:"v-select-selected-i v-icon-down-dir"})],2)])},staticRenderFns:[]},module.exports.render._withStripped=!0}]); \ No newline at end of file diff --git a/src/main/webapp/resources/js/excanvas.min.js b/src/main/webapp/resources/js/excanvas.min.js new file mode 100644 index 0000000000000000000000000000000000000000..12c74f7bea844f60953021cadc8468297712f0df --- /dev/null +++ b/src/main/webapp/resources/js/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/src/main/webapp/resources/js/fullcalendar.min.js b/src/main/webapp/resources/js/fullcalendar.min.js new file mode 100644 index 0000000000000000000000000000000000000000..091c046b92ca64a71b5c520eea33897c74ef78b1 --- /dev/null +++ b/src/main/webapp/resources/js/fullcalendar.min.js @@ -0,0 +1,98 @@ + +(function(m,oa){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();ma();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(na);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",na);C.destroy(); +E.remove();a.removeClass("fc fc-rtl ui-widget")}function j(){return i.offsetWidth!==0}function t(){return m("body")[0].offsetWidth!==0}function y(k){if(!n||k!=n.name){F++;pa();var D=n,Z;if(D){(D.beforeHide||xb)();Za(E,E.height());D.element.hide()}else Za(E,1);E.css("overflow","hidden");if(n=Y[k])n.element.show();else n=Y[k]=new Ja[k](Z=s=m("").appendTo(E),X);D&&C.deactivateButton(D.name);C.activateButton(k);S();E.css("overflow","");D&& +Za(E,1);Z||(n.afterShow||xb)();F--}}function S(k){if(j()){F++;pa();o===oa&&u();var D=false;if(!n.start||k||r=n.end){n.render(r,k||0);fa(true);D=true}else if(n.sizeDirty){n.clearEvents();fa();D=true}else if(n.eventsDirty){n.clearEvents();D=true}n.sizeDirty=false;n.eventsDirty=false;ga(D);W=a.outerWidth();C.updateTitle(n.title);k=new Date;k>=n.start&&k").append(m("").append(f("left")).append(f("center")).append(f("right")))}function d(){Q.remove()}function f(u){var fa=m("");(u=b.header[u])&&m.each(u.split(" "),function(na){na>0&&fa.append("");var ga; +m.each(this.split(","),function(ra,sa){if(sa=="title"){fa.append(" ");ga&&ga.addClass(q+"-corner-right");ga=null}else{var ha;if(a[sa])ha=a[sa];else if(Ja[sa])ha=function(){ma.removeClass(q+"-state-hover");a.changeView(sa)};if(ha){ra=b.theme?jb(b.buttonIcons,sa):null;var da=jb(b.buttonText,sa),ma=m(""+(ra?"":da)+"");if(ma){ma.click(function(){ma.hasClass(q+"-state-disabled")||ha()}).mousedown(function(){ma.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-down")}).mouseup(function(){ma.removeClass(q+"-state-down")}).hover(function(){ma.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-hover")},function(){ma.removeClass(q+"-state-hover").removeClass(q+"-state-down")}).appendTo(fa); +ga||ma.addClass(q+"-corner-left");ga=ma}}}});ga&&ga.addClass(q+"-corner-right")});return fa}function g(u){Q.find("strong").html(u)}function l(u){Q.find("span.fc-button-"+u).addClass(q+"-state-active")}function j(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-active")}function t(u){Q.find("span.fc-button-"+u).addClass(q+"-state-disabled")}function y(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-disabled")}var S=this;S.render=e;S.destroy=d;S.updateTitle=g;S.activateButton=l;S.deactivateButton= +j;S.disableButton=t;S.enableButton=y;var Q=m([]),q}function $b(a,b){function e(c,z){return!ca||cka}function d(c,z){ca=c;ka=z;L=[];c=++qa;G=z=U.length;for(var H=0;Hl;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.starte&&td){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e=0;e--){d=a[b[e].toLowerCase()];if(d!== +oa)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")} +function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a= +[a];if(a){var d,f;for(d=0;d";for(aa=0;aa";R+="";for(aa=0;aa";for(V=0;V"+(I?"":"")+" ";R+=""}R+="";w= +m(R).appendTo(a);K=w.find("thead");i=K.find("th");C=w.find("tbody");P=C.find("tr");E=C.find("td");B=E.filter(":first-child");n=P.eq(0).find("div.fc-day-content div");ab(K.add(K.find("tr")));ab(P);P.eq(0).addClass("fc-first");y(E);Y=m("").appendTo(a)}function l(w){var I=w||v==1,R=p.start.getMonth(),V=Ka(new Date),ea,aa,va;I&&i.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);ea.html(ya(aa,$));rb(ea,aa)});E.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);aa.getMonth()== +R?ea.removeClass("fc-other-month"):ea.addClass("fc-other-month");+aa==+V?ea.addClass(la+"-state-highlight fc-today"):ea.removeClass(la+"-state-highlight fc-today");ea.find("div.fc-day-number").text(aa.getDate());I&&rb(ea,aa)});P.each(function(wa,Ga){va=m(Ga);if(wa div"),(ea==v-1?R:I)-Sa(V))}})}function t(w){W=w;M.clear();s=Math.floor(W/F);Va(i.slice(0,-1),s)}function y(w){w.click(S).mousedown(X)}function S(w){if(!L("selectable")){var I=parseInt(this.className.match(/fc\-day(\d+)/)[1]);I=ca(I);c("dayClick",this,I,true,w)}}function Q(w,I,R){R&&r.build();R=N(p.visStart);for(var V=ba(N(R),F),ea=0;ea ";for(A=0;A";x+=" ";for(A=0;A ";x+=" ";v=m(x).appendTo(a);F=v.find("thead");r=F.find("th").slice(1,-1);J=v.find("tbody");M=J.find("td").slice(0,-1);k=M.find("div.fc-day-content div");D=M.eq(0);Z=D.find("> div");ab(F.add(F.find("tr")));ab(J.add(J.find("tr")));aa=F.find("th:first");va=v.find(".fc-agenda-gutter");ja=m("").appendTo(a); +if(i("allDaySlot")){ia=m("").appendTo(ja);x=""+i("allDayText")+" ";la=m(x).appendTo(ja);$=la.find("tr");q($.find("td"));aa=aa.add(la.find("th:first"));va=va.add(la.find("th.fc-agenda-gutter"));ja.append("")}else ia=m([]);w=m("").appendTo(ja);I=m("").appendTo(w);R=m("").appendTo(I);x="";ta=zb();za=xa(N(ta),bb);xa(ta,La);for(A=tb=0;ta"+(!Ea||!Da?s(ta,i("axisFormat")):" ")+" ";xa(ta,i("slotMinutes"));tb++}x+="";V=m(x).appendTo(I);ea=V.find("div:first");u(V.find("td"));aa=aa.add(V.find("th:first"))}function l(){var h,O,x,A,ta=Ka(new Date);for(h=0;h=0&&xa(O,La+h*i("slotMinutes"));return O}function ua(h){return ba(N(K.visStart),h*Ha+Ia)}function pa(h){return i("allDaySlot")&&!h.row}function U(h){return(h-Math.max(Tb,Sb)+Ba)%Ba*Ha+Ia}function ca(h,O){h=N(h,true);if(O=xa(N(h),bb))return V.height(); +h=i("slotMinutes");O=O.getHours()*60+O.getMinutes()-La;var x=Math.floor(O/h),A=ub[x];if(A===oa)A=ub[x]=V.find("tr:eq("+x+") td div")[0].offsetTop;return Math.max(0,Math.round(A-1+Xa*(O%h/h)))}function ka(){return{left:Ma,right:Ga-vb}}function qa(){return $}function G(h){var O=N(h.start);if(h.allDay)return O;return xa(O,i("defaultEventMinutes"))}function p(h,O){if(O)return N(h);return xa(N(h),i("slotMinutes"))}function L(h,O,x){if(x)i("allDaySlot")&&na(h,ba(N(O),1),true);else c(h,O)}function c(h,O){var x= +i("selectHelper");Na.build();if(x){var A=Ca(h,K.visStart)*Ha+Ia;if(A>=0&&Ata){A.top=ta;A.height=za-ta;A.left+=2;A.width-=5;if(m.isFunction(x)){if(h=x(h,O)){A.position="absolute";A.zIndex=8;wa=m(h).css(A).appendTo(I)}}else{A.isStart=true;A.isEnd=true;wa=m(o({title:"",start:h,end:O,className:["fc-select-helper"],editable:false},A));wa.css("opacity",i("dragOpacity"))}if(wa){u(wa);I.append(wa);Va(wa,A.width,true);Eb(wa,A.height,true)}}}}else ra(h, +O)}function z(){B();if(wa){wa.remove();wa=null}}function H(h){if(h.which==1&&i("selectable")){Y(h);var O;Ra.start(function(x,A){z();if(x&&x.col==A.col&&!pa(x)){A=ma(A);x=ma(x);O=[A,xa(N(A),i("slotMinutes")),x,xa(N(x),i("slotMinutes"))].sort(Gb);c(O[0],O[3])}else O=null},h);m(document).one("mouseup",function(x){Ra.stop();if(O){+O[0]==+O[1]&&T(O[0],false,x);n(O[0],O[3],false,x)}})}}function T(h,O,x){C("dayClick",M[U(h.getDay())],h,O,x)}function X(h,O){Ra.start(function(x){B();if(x)if(pa(x))ga(x.row, +x.col,x.row,x.col);else{x=ma(x);var A=xa(N(x),i("defaultEventMinutes"));ra(x,A)}},O)}function ya(h,O,x){var A=Ra.stop();B();A&&C("drop",h,ma(A),pa(A),O,x)}var K=this;K.renderAgenda=d;K.setWidth=t;K.setHeight=j;K.beforeHide=S;K.afterShow=Q;K.defaultEventEnd=G;K.timePosition=ca;K.dayOfWeekCol=U;K.dateCell=da;K.cellDate=ma;K.cellIsAllDay=pa;K.allDayRow=qa;K.allDayBounds=ka;K.getHoverListener=function(){return Ra};K.colContentLeft=sa;K.colContentRight=ha;K.getDaySegmentContainer=function(){return ia}; +K.getSlotSegmentContainer=function(){return R};K.getMinMinute=function(){return La};K.getMaxMinute=function(){return bb};K.getBodyContent=function(){return I};K.getRowCnt=function(){return 1};K.getColCnt=function(){return Ba};K.getColWidth=function(){return db};K.getSlotHeight=function(){return Xa};K.defaultSelectionEnd=p;K.renderDayOverlay=na;K.renderSelection=L;K.clearSelection=z;K.reportDayClick=T;K.dragStart=X;K.dragStop=ya;Kb.call(K,a,b,e);Lb.call(K);Mb.call(K);sc.call(K);var i=K.opt,C=K.trigger, +P=K.clearEvents,E=K.renderOverlay,B=K.clearOverlays,n=K.reportSelection,Y=K.unselect,W=K.daySelectionMousedown,o=K.slotSegHtml,s=b.formatDate,v,F,r,J,M,k,D,Z,ja,ia,la,$,w,I,R,V,ea,aa,va,wa,Ga,Wb,Ma,db,vb,Xa,Xb,Ba,tb,Na,Ra,cb,ub={},Wa,Tb,Sb,Ub,Ha,Ia,La,bb,Vb;qb(a.addClass("fc-agenda"));Na=new Nb(function(h,O){function x(eb){return Math.max(Ea,Math.min(tc,eb))}var A,ta,za;r.each(function(eb,uc){A=m(uc);ta=A.offset().left;if(eb)za[1]=ta;za=[ta];O[eb]=za});za[1]=ta+A.outerWidth();if(i("allDaySlot")){A= +$;ta=A.offset().top;h[0]=[ta,ta+A.outerHeight()]}for(var Da=I.offset().top,Ea=w.offset().top,tc=Ea+w.outerHeight(),fb=0;fb"+Qa(W(o.start,o.end,u("timeFormat")))+""+Qa(o.title)+"";if(s.isEnd&&ga(o))v+="="; +v+=""+(F?"a":"div")+">";return v}function j(o,s,v){na(o)&&y(o,s,v.isStart);v.isEnd&&ga(o)&&c(o,s,v);da(o,s)}function t(o,s,v){var F=s.find("div.fc-event-time");na(o)&&S(o,s,F);v.isEnd&&ga(o)&&Q(o,s,F);da(o,s)}function y(o,s,v){function F(){if(!M){s.width(r).height("").draggable("option","grid",null);M=true}}var r,J,M=true,k,D=u("isRTL")?-1:1,Z=U(),ja=H(),ia=T(),la=ka();s.draggable({zIndex:9,opacity:u("dragOpacity","month"),revertDuration:u("dragRevertDuration"),start:function($,w){fa("eventDragStart", +s,o,$,w);i(o,s);r=s.width();Z.start(function(I,R,V,ea){B();if(I){J=false;k=ea*D;if(I.row)if(v){if(M){s.width(ja-10);Eb(s,ia*Math.round((o.end?(o.end-o.start)/wc:u("defaultEventMinutes"))/u("slotMinutes")));s.draggable("option","grid",[ja,1]);M=false}}else J=true;else{E(ba(N(o.start),k),ba(Ua(o),k));F()}J=J||M&&!k}else{F();J=true}s.draggable("option","revert",J)},$,"drag")},stop:function($,w){Z.stop();B();fa("eventDragStop",s,o,$,w);if(J){F();s.css("filter","");K(o,s)}else{var I=0;M||(I=Math.round((s.offset().top- +X().offset().top)/ia)*u("slotMinutes")+la-(o.start.getHours()*60+o.start.getMinutes()));C(this,o,k,I,M,$,w)}}})}function S(o,s,v){function F(I){var R=xa(N(o.start),I),V;if(o.end)V=xa(N(o.end),I);v.text(W(R,V,u("timeFormat")))}function r(){if(M){v.css("display","");s.draggable("option","grid",[$,w]);M=false}}var J,M=false,k,D,Z,ja=u("isRTL")?-1:1,ia=U(),la=z(),$=H(),w=T();s.draggable({zIndex:9,scroll:false,grid:[$,w],axis:la==1?"y":false,opacity:u("dragOpacity"),revertDuration:u("dragRevertDuration"), +start:function(I,R){fa("eventDragStart",s,o,I,R);i(o,s);J=s.position();D=Z=0;ia.start(function(V,ea,aa,va){s.draggable("option","revert",!V);B();if(V){k=va*ja;if(u("allDaySlot")&&!V.row){if(!M){M=true;v.hide();s.draggable("option","grid",null)}E(ba(N(o.start),k),ba(Ua(o),k))}else r()}},I,"drag")},drag:function(I,R){D=Math.round((R.position.top-J.top)/w)*u("slotMinutes");if(D!=Z){M||F(D);Z=D}},stop:function(I,R){var V=ia.stop();B();fa("eventDragStop",s,o,I,R);if(V&&(k||D||M))C(this,o,k,M?0:D,M,I,R); +else{r();s.css("filter","");s.css(J);F(0);K(o,s)}}})}function Q(o,s,v){var F,r,J=T();s.resizable({handles:{s:"div.ui-resizable-s"},grid:J,start:function(M,k){F=r=0;i(o,s);s.css("z-index",9);fa("eventResizeStart",this,o,M,k)},resize:function(M,k){F=Math.round((Math.max(J,s.height())-k.originalSize.height)/J);if(F!=r){v.text(W(o.start,!F&&!o.end?null:xa(ra(o),u("slotMinutes")*F),u("timeFormat")));r=F}},stop:function(M,k){fa("eventResizeStop",this,o,M,k);if(F)P(this,o,0,u("slotMinutes")*F,M,k);else{s.css("z-index", +8);K(o,s)}}})}var q=this;q.renderEvents=a;q.compileDaySegs=e;q.clearEvents=b;q.slotSegHtml=l;q.bindDaySeg=j;Qb.call(q);var u=q.opt,fa=q.trigger,na=q.isEventDraggable,ga=q.isEventResizable,ra=q.eventEnd,sa=q.reportEvents,ha=q.reportEventClear,da=q.eventElementHandlers,ma=q.setHeight,ua=q.getDaySegmentContainer,pa=q.getSlotSegmentContainer,U=q.getHoverListener,ca=q.getMaxMinute,ka=q.getMinMinute,qa=q.timePosition,G=q.colContentLeft,p=q.colContentRight,L=q.renderDaySegs,c=q.resizableDayEvent,z=q.getColCnt, +H=q.getColWidth,T=q.getSlotHeight,X=q.getBodyContent,ya=q.reportEventElement,K=q.showEvents,i=q.hideEvents,C=q.eventDrop,P=q.eventResize,E=q.renderDayOverlay,B=q.clearOverlays,n=q.calendar,Y=n.formatDate,W=n.formatDates}function vc(a){var b,e,d,f,g,l;for(b=a.length-1;b>0;b--){f=a[b];for(e=0;e"),B=z(),n=i.length,Y;E[0].innerHTML=e(i);E=E.children();B.append(E);d(i,E);l(i);j(i);t(i);Q(i,S(y()));E=[];for(B=0;B";if(!n.allDay&&B.isStart)k+=""+Qa(T(n.start,n.end,fa("timeFormat")))+" ";k+=""+Qa(n.title)+"";if(B.isEnd&&ra(n))k+=" ";k+=""+(Y? +"a":"div")+">";B.left=r;B.outerWidth=J-r;B.startCol=v;B.endCol=F+1}return k}function d(i,C){var P,E=i.length,B,n,Y;for(P=0;P div");return P}function S(i){var C,P=i.length,E=[];for(C=0;C"));j[0].parentNode!=l[0]&&j.appendTo(l);d.push(j.css(g).show());return j}function b(){for(var g;g=d.shift();)f.push(g.hide().unbind())}var e=this;e.renderOverlay=a;e.clearOverlays=b;var d=[],f=[]}function Nb(a){var b=this,e,d;b.build=function(){e=[];d=[];a(e,d)};b.cell=function(f,g){var l=e.length,j=d.length, +t,y=-1,S=-1;for(t=0;t=e[t][0]&&g=d[t][0]&&f=0&&S>=0?{row:y,col:S}:null};b.rect=function(f,g,l,j,t){t=t.offset();return{top:e[f][0]-t.top,left:d[g][0]-t.left,width:d[j][1]-d[g][0],height:e[l][1]-e[f][0]}}}function Ob(a){function b(j){j=a.cell(j.pageX,j.pageY);if(!j!=!l||j&&(j.row!=l.row||j.col!=l.col)){if(j){g||(g=j);f(j,g,j.row-g.row,j.col-g.col)}else f(j,g);l=j}}var e=this,d,f,g,l;e.start=function(j,t,y){f=j;g=l=null; +a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===oa?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===oa?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true, +lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '—'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday", +"Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:"",next:"",prevYear:" << ",nextYear:" >> ",today:"",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},xc={header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:" ► ",next:" ◄ ", +prevYear:" >> ",nextYear:" << "},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.2"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,b);if(e===oa)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==oa)return e;return this}var d=a.eventSources||[]; +delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===oa&&Ya.isRTL?xc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc= +6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]}, +M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Oa(a, +"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st","nd","rd"][a%10-1]||"th"}};Aa.applyAll=$a;Ja.month=mc;Ja.basicWeek=nc;Ja.basicDay=oc;wb({weekMode:"fixed"});Ja.agendaWeek=qc;Ja.agendaDay=rc;wb({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0,maxTime:24})})(jQuery); diff --git a/src/main/webapp/resources/js/jquery.dataTables.min.js b/src/main/webapp/resources/js/jquery.dataTables.min.js new file mode 100644 index 0000000000000000000000000000000000000000..36452f6e9c6502eb6cd3b251ccca96dbee197b9e --- /dev/null +++ b/src/main/webapp/resources/js/jquery.dataTables.min.js @@ -0,0 +1,12100 @@ +/** + * @summary DataTables + * @description Paginate, search and sort HTML tables + * @version 1.9.4 + * @file jquery.dataTables.js + * @author Allan Jardine (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * + * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved. + * + * This source file is free software, under either the GPL v2 license or a + * BSD style license, available at: + * http://datatables.net/license_gpl2 + * http://datatables.net/license_bsd + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +/*jslint evil: true, undef: true, browser: true */ +/*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/ + +(/** @lends */function( window, document, undefined ) { + +(function( factory ) { + "use strict"; + + // Define as an AMD module if possible + if ( typeof define === 'function' && define.amd ) + { + define( ['jquery'], factory ); + } + /* Define using browser globals otherwise + * Prevent multiple instantiations if the script is loaded twice + */ + else if ( jQuery && !jQuery.fn.dataTable ) + { + factory( jQuery ); + } +} +(/** @lends */function( $ ) { + "use strict"; + /** + * DataTables is a plug-in for the jQuery Javascript library. It is a + * highly flexible tool, based upon the foundations of progressive + * enhancement, which will add advanced interaction controls to any + * HTML table. For a full list of features please refer to + * DataTables.net. + * + * Note that the DataTable object is not a global variable but is + * aliased to jQuery.fn.DataTable and jQuery.fn.dataTable through which + * it may be accessed. + * + * @class + * @param {object} [oInit={}] Configuration object for DataTables. Options + * are defined by {@link DataTable.defaults} + * @requires jQuery 1.3+ + * + * @example + * // Basic initialisation + * $(document).ready( function { + * $('#example').dataTable(); + * } ); + * + * @example + * // Initialisation with configuration options - in this case, disable + * // pagination and sorting. + * $(document).ready( function { + * $('#example').dataTable( { + * "bPaginate": false, + * "bSort": false + * } ); + * } ); + */ + var DataTable = function( oInit ) + { + + + /** + * Add a column to the list used for the table with default values + * @param {object} oSettings dataTables settings object + * @param {node} nTh The th element for this column + * @memberof DataTable#oApi + */ + function _fnAddColumn( oSettings, nTh ) + { + var oDefaults = DataTable.defaults.columns; + var iCol = oSettings.aoColumns.length; + var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { + "sSortingClass": oSettings.oClasses.sSortable, + "sSortingClassJUI": oSettings.oClasses.sSortJUI, + "nTh": nTh ? nTh : document.createElement('th'), + "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', + "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], + "mData": oDefaults.mData ? oDefaults.oDefaults : iCol + } ); + oSettings.aoColumns.push( oCol ); + + /* Add a column specific filter */ + if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null ) + { + oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch ); + } + else + { + var oPre = oSettings.aoPreSearchCols[ iCol ]; + + /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */ + if ( oPre.bRegex === undefined ) + { + oPre.bRegex = true; + } + + if ( oPre.bSmart === undefined ) + { + oPre.bSmart = true; + } + + if ( oPre.bCaseInsensitive === undefined ) + { + oPre.bCaseInsensitive = true; + } + } + + /* Use the column options function to initialise classes etc */ + _fnColumnOptions( oSettings, iCol, null ); + } + + + /** + * Apply options for a column + * @param {object} oSettings dataTables settings object + * @param {int} iCol column index to consider + * @param {object} oOptions object with sType, bVisible and bSearchable etc + * @memberof DataTable#oApi + */ + function _fnColumnOptions( oSettings, iCol, oOptions ) + { + var oCol = oSettings.aoColumns[ iCol ]; + + /* User specified column options */ + if ( oOptions !== undefined && oOptions !== null ) + { + /* Backwards compatibility for mDataProp */ + if ( oOptions.mDataProp && !oOptions.mData ) + { + oOptions.mData = oOptions.mDataProp; + } + + if ( oOptions.sType !== undefined ) + { + oCol.sType = oOptions.sType; + oCol._bAutoType = false; + } + + $.extend( oCol, oOptions ); + _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); + + /* iDataSort to be applied (backwards compatibility), but aDataSort will take + * priority if defined + */ + if ( oOptions.iDataSort !== undefined ) + { + oCol.aDataSort = [ oOptions.iDataSort ]; + } + _fnMap( oCol, oOptions, "aDataSort" ); + } + + /* Cache the data get and set functions for speed */ + var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null; + var mData = _fnGetObjectDataFn( oCol.mData ); + + oCol.fnGetData = function (oData, sSpecific) { + var innerData = mData( oData, sSpecific ); + + if ( oCol.mRender && (sSpecific && sSpecific !== '') ) + { + return mRender( innerData, sSpecific, oData ); + } + return innerData; + }; + oCol.fnSetData = _fnSetObjectDataFn( oCol.mData ); + + /* Feature sorting overrides column specific when off */ + if ( !oSettings.oFeatures.bSort ) + { + oCol.bSortable = false; + } + + /* Check that the class assignment is correct for sorting */ + if ( !oCol.bSortable || + ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableNone; + oCol.sSortingClassJUI = ""; + } + else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortable; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI; + } + else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableAsc; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed; + } + else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableDesc; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed; + } + } + + + /** + * Adjust the table column widths for new data. Note: you would probably want to + * do a redraw after calling this function! + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnAdjustColumnSizing ( oSettings ) + { + /* Not interested in doing column width calculation if auto-width is disabled */ + if ( oSettings.oFeatures.bAutoWidth === false ) + { + return false; + } + + _fnCalculateColumnWidths( oSettings ); + for ( var i=0 , iLen=oSettings.aoColumns.length ; i=0 ; i-- ) + { + /* Each definition can target multiple columns, as it is an array */ + var aTargets = aoColDefs[i].aTargets; + if ( !$.isArray( aTargets ) ) + { + _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) ); + } + + for ( j=0, jLen=aTargets.length ; j= 0 ) + { + /* Add columns that we don't yet know about */ + while( oSettings.aoColumns.length <= aTargets[j] ) + { + _fnAddColumn( oSettings ); + } + + /* Integer, basic index */ + fn( aTargets[j], aoColDefs[i] ); + } + else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 ) + { + /* Negative integer, right to left column counting */ + fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] ); + } + else if ( typeof aTargets[j] === 'string' ) + { + /* Class name matching on TH element */ + for ( k=0, kLen=oSettings.aoColumns.length ; k=0 if successful (index of new aoData entry), -1 if failed + * @memberof DataTable#oApi + */ + function _fnAddData ( oSettings, aDataSupplied ) + { + var oCol; + + /* Take an independent copy of the data source so we can bash it about as we wish */ + var aDataIn = ($.isArray(aDataSupplied)) ? + aDataSupplied.slice() : + $.extend( true, {}, aDataSupplied ); + + /* Create the object for storing information about this new row */ + var iRow = oSettings.aoData.length; + var oData = $.extend( true, {}, DataTable.models.oRow ); + oData._aData = aDataIn; + oSettings.aoData.push( oData ); + + /* Create the cells */ + var nTd, sThisType; + for ( var i=0, iLen=oSettings.aoColumns.length ; i iTarget ) + { + a[i]--; + } + } + + if ( iTargetIndex != -1 ) + { + a.splice( iTargetIndex, 1 ); + } + } + + + /** + * Call the developer defined fnRender function for a given cell (row/column) with + * the required parameters and return the result. + * @param {object} oSettings dataTables settings object + * @param {int} iRow aoData index for the row + * @param {int} iCol aoColumns index for the column + * @returns {*} Return of the developer's fnRender function + * @memberof DataTable#oApi + */ + function _fnRender( oSettings, iRow, iCol ) + { + var oCol = oSettings.aoColumns[iCol]; + + return oCol.fnRender( { + "iDataRow": iRow, + "iDataColumn": iCol, + "oSettings": oSettings, + "aData": oSettings.aoData[iRow]._aData, + "mDataProp": oCol.mData + }, _fnGetCellData(oSettings, iRow, iCol, 'display') ); + } + /** + * Create a new TR element (and it's TD children) for a row + * @param {object} oSettings dataTables settings object + * @param {int} iRow Row to consider + * @memberof DataTable#oApi + */ + function _fnCreateTr ( oSettings, iRow ) + { + var oData = oSettings.aoData[iRow]; + var nTd; + + if ( oData.nTr === null ) + { + oData.nTr = document.createElement('tr'); + + /* Use a private property on the node to allow reserve mapping from the node + * to the aoData array for fast look up + */ + oData.nTr._DT_RowIndex = iRow; + + /* Special parameters can be given by the data source to be used on the row */ + if ( oData._aData.DT_RowId ) + { + oData.nTr.id = oData._aData.DT_RowId; + } + + if ( oData._aData.DT_RowClass ) + { + oData.nTr.className = oData._aData.DT_RowClass; + } + + /* Process each column */ + for ( var i=0, iLen=oSettings.aoColumns.length ; i
Apologies, but the page you requested could not be found. Perhaps searching will help.
+