diff --git a/README.md b/README.md index f1814153..1ee14f4b 100644 --- a/README.md +++ b/README.md @@ -4,19 +4,17 @@ JeeSite 是一个 Java EE 企业级快速开发平台,基于经典技术组合 JeeSite 快速开发平台的主要目的是能够让初级的研发人员快速的开发出复杂的业务功能(经典架构会的人多),让开发者注重专注业务,其余有平台来封装技术细节,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。 -JeeSite 自 2013 年发布以来已被广大爱好者用到了企业、政府、医疗、金融、互联网等各个领域中,JeeSite 依架构简单精良、易于扩展、大众思维的设计模式,深入开发者的内心,并得到一致好评,于[2016](http://www.oschina.net/project/top_cn_2016?sort=1)和[2017](http://www.oschina.net/project/top_cn_2017?sort=1)连续两年获得开源中国《最受欢迎中国开源软件》奖杯,期间也帮助了不少刚毕业的大学生作为入门教材,快速的去实践。 +JeeSite 1.x 自 2013 年发布以来已被广大爱好者用到了企业、政府、医疗、金融、互联网等各个领域中,JeeSite 依架构简单精良、易于扩展、大众思维的设计模式,深入开发者的内心,并得到一致好评,于[2016](http://www.oschina.net/project/top_cn_2016?sort=1)和[2017](http://www.oschina.net/project/top_cn_2017?sort=1)连续两年获得开源中国《最受欢迎中国开源软件》奖杯,期间也帮助了不少刚毕业的大学生作为入门教材,快速的去实践。 -4.x 的升级,作者结合了多年总结和经验,以及各方面的应用案例,对架构完成了一次全部重构,也纳入很多新的思想。不管是从开发者模式、底层架构、逻辑处理还是到用户界面,用户交互体验上都有很大的进步,在不忘学习成本、提高开发效率的情况下,安全方面也做和很多工作,包括:身份认证、密码策略、安全审计、日志收集。 +JeeSite 4.x 的升级,作者结合了多年总结和经验,以及各方面的应用案例,对架构完成了一次全部重构,也纳入很多新的思想。不管是从开发者模式、底层架构、逻辑处理还是到用户界面,用户交互体验上都有很大的进步,在不忘学习成本、提高开发效率的情况下,安全方面也做和很多工作,包括:身份认证、密码策略、安全审计、日志收集。 -### 4.x 新特性: - -* **我们的优势:** 整体架构清晰、稳定技术先进、入门简单、易于维护、易于扩展、安全稳定。 +### 4.x 的新特性及优势: ## 技术选型 * 主框架:Spring Boot 2.0、Spring Framework 5.0、Apache Shiro 1.4、J2Cache * 持久层:Apache MyBatis 3.4、Hibernate Validation 6.0、Alibaba Druid 1.1 -* 视图层:Spring MVC 5.0、Beetl 2.7 替换JSP、Bootstrap 3.3、AdminLTE 2.4 +* 视图层:Spring MVC 5.0、Beetl 2.9 替换JSP、Bootstrap 3.3、AdminLTE 2.4 * 前端组件:jQuery 1.12、jqGrid 4.7、layer 3.0、zTree 3.5、jquery-validation * 工具组件:Apache Commons、Logback 1.1、Jackson 2.8、POI 3.14、Quartz 2.2 * 技术选型详情: @@ -54,19 +52,40 @@ JeeSite 自 2013 年发布以来已被广大爱好者用到了企业、政府、 1. 部署运行: 2. 常见问题: -## 开发手册 +## 在线文档 -* 代码生成 / 快速入门 (Guide): -* 持久层 / 数据库操作 (MyBatis): -* 业务层 / 数据权限 (Service): -* 视图层 / 表单组件 (Beetl): -* 功能权限基础文档 (Shiro): -* 常用JS类库API (jeesite.js): -* 数据表格API (DataGrid.js): -* 修改 (默认) 视图,新增主题: -* 手机 API 接口调用、前后分离: -* 消息提醒中心使用手册: -* 常见问题: +* + +## 授权协议声明 + +1. 已开源的代码,授权协议采用 AGPL v3 + Apache Licence v2 进行发行。 +2. 您可以免费使用、修改和衍生代码,但不允许修改后和衍生的代码做为闭源软件发布。 +3. 修改后和衍生的代码必须也按照AGPL协议进行流通,对修改后和衍生的代码必须向社会公开。 +4. 如果您修改了代码,需要在被修改的文件中进行说明,并遵守代码格式规范,帮助他人更好的理解您的用意。 +5. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、版权声明和其他原作者规定需要包含的说明(请尊重原作者的著作权,不要删除或修改文件中的`@author`信息)。 +6. 您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品)。 +7. 关系平台的发展战略考虑,底层部分代码暂未开源,但这不影响您的二次开发。 +8. 请知悉社区版,用户数不可超过100个,最大允许20个用户同时在线(不含匿名)。 + +## 技术服务与支持 + +* 没有资金的支撑就很难得到发展,特别是一个好的产品,如果 JeeSite 帮助了您,请为我们点赞。支持我们,您可以得到一些回报,有了这些我们会把公益事业做的更好,回报社区和社会,请给我们一些动力吧,在此非常感谢已支持我们的朋友! +* **联系方式(官方商务)QQ:[1766571055](http://sighttp.qq.com/msgrd?v=1&uin=1766571055)** +* 技术服务支持网页: + +# 技术交流方式 + +* QQ 群号:`127515876`、`209330483`、`223507718`、`709534275`、`730390092`、`183903863(外包)` +* 问题反馈:  [【新手必读】](http://www.dianbo.org/9238/stone/tiwendezhihui.htm) +* 码云Gitee: +* GitHub: +* 作者博客: +* **技术服务:** +* 官方网站: +* 官方论坛: +* 微信公众号: + +![JeeSite4微信公众号](https://static.oschina.net/uploads/space/2018/0302/145133_OGZf_941661.jpg "JeeSite4微信公众号") ## 今后如何升级? @@ -80,34 +99,6 @@ JeeSite的小版本(4.1.x)升级是非常便捷的,你只需要将 pom.xml 如果进行相对大的版本(4.x.x)升级这里我们会附加一个声明,帮助你进行迁移操作。 -## 授权协议声明 - -1. 已开源的代码,授权协议采用 AGPL v3 + Apache Licence v2 进行发行。 -2. 您可以免费使用、修改和衍生代码,但不允许修改后和衍生的代码做为闭源软件发布。 -3. 修改后和衍生的代码必须也按照AGPL协议进行流通,对修改后和衍生的代码必须向社会公开。 -4. 如果您修改了代码,需要在被修改的文件中进行说明,并遵守代码格式规范,帮助他人更好的理解您的用意。 -5. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、版权声明和其他原作者规定需要包含的说明(请尊重原作者的著作权,不要删除或修改文件中的`@author`信息)。 -6. 您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品)。 -7. 关系平台的发展战略考虑,底层部分代码暂未开源,但这不影响您的二次开发。 -8. 请知悉社区版,用户数不可超过100个,最大允许10个用户同时在线(不含匿名)。 - -### 获得技术服务支持: - -* 我们深知,没有资金的支撑就很难得到发展,特别是一个好的产品,如果 JeeSite 帮助了您,请为我们点赞。支持我们,您可以得到一些回报,有了这些我们会把开源事业做的更好,回报社区和社会,请给我们一些动力吧,在此非常感谢已支持我们的朋友! - -# 技术交流方式 - -* QQ 群号:`127515876`、`209330483`、`223507718`、`709534275`、`730390092`、`183903863(外包)` -* 问题反馈:  [【新手必读】](http://www.dianbo.org/9238/stone/tiwendezhihui.htm) -* 码云Gitee: -* GitHub: -* 作者博客: -* 官方网站: -* 官方论坛: -* 微信公众号: - -![JeeSite4微信公众号](https://static.oschina.net/uploads/space/2018/0302/145133_OGZf_941661.jpg "JeeSite4微信公众号") - # Git 全局设置技巧 ``` diff --git a/common/pom.xml b/common/pom.xml index a2456780..06d516a0 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -6,7 +6,7 @@ com.jeesite jeesite-parent - 4.1.3-SNAPSHOT + 4.1.4-SNAPSHOT ../parent/pom.xml diff --git a/common/src/main/resources/static/adminlte/css/AdminLTE.css b/common/src/main/resources/static/adminlte/css/AdminLTE.css index f5f21c42..1b5033cb 100644 --- a/common/src/main/resources/static/adminlte/css/AdminLTE.css +++ b/common/src/main/resources/static/adminlte/css/AdminLTE.css @@ -94,7 +94,7 @@ body { background: #fff; padding: 15px; color: #444; - border-top: 1px solid #d2d6de; + border-top: 1px solid #caced6; } /* Fixed layout */ .fixed .main-header, @@ -350,7 +350,7 @@ a:focus { top: 0; right: 0; float: none; - background: #d2d6de; + background: #caced6; padding-left: 10px; } .content-header > .breadcrumb li:before { @@ -859,10 +859,10 @@ a:focus { .control-sidebar-light, .control-sidebar-light + .control-sidebar-bg { background: #f9fafc; - border-left: 1px solid #d2d6de; + border-left: 1px solid #caced6; } .control-sidebar-light .nav-tabs.control-sidebar-tabs { - border-bottom: #d2d6de; + border-bottom: #caced6; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { background: #e8ecf4; @@ -871,8 +871,8 @@ a:focus { .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { - border-left-color: #d2d6de; - border-bottom-color: #d2d6de; + border-left-color: #caced6; + border-bottom-color: #caced6; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, @@ -1235,7 +1235,7 @@ a:focus { .form-control { /*border-radius: 0;*/ box-shadow: none; - border-color: #d2d6de; + border-color: #caced6; } .form-control:focus { border-color: #3c8dbc; @@ -1288,7 +1288,7 @@ a:focus { /* Input group */ .input-group .input-group-addon { /*border-radius: 0;*/ - border-color: #d2d6de; + border-color: #caced6; background-color: #fff; } /* button groups */ @@ -1530,7 +1530,7 @@ a:focus { position: relative; border-radius: 3px; background: #ffffff; - border-top: 3px solid #d2d6de; + border-top: 3px solid #caced6; margin-bottom: 20px; width: 100%; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); @@ -1551,7 +1551,7 @@ a:focus { border-top-color: #00a65a; } .box.box-default { - border-top-color: #d2d6de; + border-top-color: #caced6; } .box.collapsed-box .box-body, .box.collapsed-box .box-footer { @@ -1585,12 +1585,12 @@ a:focus { background: rgba(0, 0, 0, 0.1); } .box.box-solid.box-default { - border: 1px solid #d2d6de; + border: 1px solid #caced6; } .box.box-solid.box-default > .box-header { color: #444444; - background: #d2d6de; - background-color: #d2d6de; + background: #caced6; + background-color: #caced6; } .box.box-solid.box-default > .box-header a, .box.box-solid.box-default > .box-header .btn { @@ -1913,7 +1913,7 @@ a:focus { font-weight: 500; } .todo-list > li.done .label { - background: #d2d6de !important; + background: #caced6 !important; } .todo-list .danger { border-left-color: #dd4b39; @@ -2150,7 +2150,7 @@ a:focus { line-height: 30px; position: absolute; color: #666; - background: #d2d6de; + background: #caced6; border-radius: 50%; text-align: center; left: 18px; @@ -2573,7 +2573,7 @@ a:focus { border-top-color: #00a65a; } .nav-tabs-custom.tab-default > .nav-tabs > li.active { - border-top-color: #d2d6de; + border-top-color: #caced6; } /* PAGINATION */ .pagination > li > a { @@ -2691,7 +2691,7 @@ table.text-center th { * ---------------- */ .label-default { - background-color: #d2d6de; + background-color: #caced6; color: #444; } /* @@ -2746,8 +2746,8 @@ table.text-center th { border-radius: 5px; position: relative; padding: 5px 10px; - background: #d2d6de; - border: 1px solid #d2d6de; + background: #caced6; + border: 1px solid #caced6; margin: 5px 0 0 50px; color: #444444; } @@ -2757,7 +2757,7 @@ table.text-center th { right: 100%; top: 15px; border: solid transparent; - border-right-color: #d2d6de; + border-right-color: #caced6; content: ' '; height: 0; width: 0; @@ -2780,7 +2780,7 @@ table.text-center th { right: auto; left: 100%; border-right-color: transparent; - border-left-color: #d2d6de; + border-left-color: #caced6; } .direct-chat-img { border-radius: 50%; @@ -3169,7 +3169,7 @@ table.text-center th { */ /* ADD THIS CLASS TO THE TAG */ .lockscreen { - background: #d2d6de; + background: #caced6; } .lockscreen-logo { font-size: 35px; @@ -3246,7 +3246,7 @@ table.text-center th { } .login-page, .register-page { - background: #d2d6de; + background: #caced6; } .login-box, .register-box { @@ -3344,14 +3344,14 @@ table.text-center th { margin: 0 auto; width: 100px; padding: 3px; - border: 3px solid #d2d6de; + border: 3px solid #caced6; } .profile-username { font-size: 21px; margin-top: 5px; } .post { - border-bottom: 1px solid #d2d6de; + border-bottom: 1px solid #caced6; margin-bottom: 15px; padding-bottom: 15px; color: #666; @@ -4231,7 +4231,7 @@ table.text-center th { } .select2-container--default .select2-selection--single, .select2-selection .select2-selection--single { - border: 1px solid #d2d6de; + border: 1px solid #caced6; /*border-radius: 0;*/ padding: 6px 12px; height: 34px; @@ -4240,7 +4240,7 @@ table.text-center th { border-color: #3c8dbc; } .select2-dropdown { - border: 1px solid #d2d6de; + border: 1px solid #caced6; /*border-radius: 0;*/ } .select2-container--default .select2-results__option--highlighted[aria-selected] { @@ -4271,7 +4271,7 @@ table.text-center th { } .select2-dropdown .select2-search__field, .select2-search--inline .select2-search__field { - border: 1px solid #d2d6de; + border: 1px solid #caced6; } .select2-dropdown .select2-search__field:focus, .select2-search--inline .select2-search__field:focus { @@ -4292,14 +4292,14 @@ table.text-center th { color: #444; } .select2-container--default .select2-selection--multiple { - border: 1px solid #d2d6de; + border: 1px solid #caced6; /*border-radius: 0;*/ } .select2-container--default .select2-selection--multiple:focus { border-color: #3c8dbc; } .select2-container--default.select2-container--focus .select2-selection--multiple { - border-color: #d2d6de; + border-color: #caced6; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #3c8dbc; @@ -4441,7 +4441,7 @@ table.text-center th { } .bg-gray { color: #000; - background-color: #d2d6de !important; + background-color: #caced6 !important; } .bg-gray-light { background-color: #f7f7f7; @@ -4595,7 +4595,7 @@ table.text-center th { color: #00a65a !important; } .text-gray { - color: #d2d6de !important; + color: #caced6 !important; } .text-navy { color: #001f3f !important; @@ -4868,11 +4868,11 @@ table.text-center th { margin-left: 110px; } .img-bordered { - border: 3px solid #d2d6de; + border: 3px solid #caced6; padding: 3px; } .img-bordered-sm { - border: 2px solid #d2d6de; + border: 2px solid #caced6; padding: 2px; } .attachment-block { diff --git a/common/src/main/resources/static/adminlte/css/AdminLTE.min.css b/common/src/main/resources/static/adminlte/css/AdminLTE.min.css index 18e24ac9..1b708d5a 100644 --- a/common/src/main/resources/static/adminlte/css/AdminLTE.min.css +++ b/common/src/main/resources/static/adminlte/css/AdminLTE.min.css @@ -1,4 +1,4 @@ -html,body{height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative;overflow-x:hidden;overflow-y:auto}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer{margin-left:0}@media(max-width:767px){.content-wrapper,.main-footer{margin-left:0}}@media(min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer{margin-left:0}}@media(max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .main-footer{-webkit-transform:translate(230px,0);-ms-transform:translate(230px,0);-o-transform:translate(230px,0);transform:translate(230px,0)}}.content-wrapper{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media(max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .right-side,.hold-transition .main-footer,.hold-transition .main-sidebar,.hold-transition .left-side,.hold-transition .main-header .navbar,.hold-transition .main-header .logo,.hold-transition .menu-open .fa-angle-left{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:0;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:0;min-height:50px}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media(max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media(max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media(max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media(max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media(max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media(max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media(max-width:767px){.main-sidebar{padding-top:100px}}@media(max-width:767px){.main-sidebar{-webkit-transform:translate(-230px,0);-ms-transform:translate(-230px,0);-o-transform:translate(-230px,0);transform:translate(-230px,0)}}@media(min-width:768px){.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px,0);-ms-transform:translate(-230px,0);-o-transform:translate(-230px,0);transform:translate(-230px,0)}}@media(max-width:767px){.sidebar-open .main-sidebar{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media(min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative!important;float:right;width:auto!important;left:180px!important;top:-22px!important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-expanded-on-hover .main-footer,.sidebar-expanded-on-hover .content-wrapper{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{box-shadow:3px 0 8px rgba(0,0,0,0.125)}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media(max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media(min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:0;border-right:0;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:0;border-right:0;border-bottom:0}@media(max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#fff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eee;color:#444!important;text-align:center}@media(max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #ddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444!important}@media(max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#444!important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666}@media(max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media(max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible!important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media(max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-color:#d2d6de;background-color:#fff}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{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:-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-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{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:-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-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{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:-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-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{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:-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-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{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:-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)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media(max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#fff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:0}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:0}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media(max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de!important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:4px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:0}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:0;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0!important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.direct-chat-messages{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.direct-chat-contacts{-webkit-transform:translate(101%,0);-ms-transform:translate(101%,0);-o-transform:translate(101%,0);transform:translate(101%,0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:0}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media(min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:0;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.pull-right-container>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.fa-angle-down{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media(max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media(max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media(max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media(max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media(max-width:991px){.error-page>.error-content>h3{text-align:center}} -.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:0;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:0}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:0}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc!important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.box .datepicker-inline,.box .datepicker-inline .datepicker-days,.box .datepicker-inline>table,.box .datepicker-inline .datepicker-days>table{width:100%}.box .datepicker-inline td:hover,.box .datepicker-inline .datepicker-days td:hover,.box .datepicker-inline>table td:hover,.box .datepicker-inline .datepicker-days>table td:hover{background-color:rgba(255,255,255,0.3)}.box .datepicker-inline td.day.old,.box .datepicker-inline .datepicker-days td.day.old,.box .datepicker-inline>table td.day.old,.box .datepicker-inline .datepicker-days>table td.day.old,.box .datepicker-inline td.day.new,.box .datepicker-inline .datepicker-days td.day.new,.box .datepicker-inline>table td.day.new,.box .datepicker-inline .datepicker-days>table td.day.new{color:#777}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff!important}.bg-gray{color:#000;background-color:#d2d6de!important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111!important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39!important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12!important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef!important}.bg-blue{background-color:#0073b7!important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc!important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a!important}.bg-navy{background-color:#001f3f!important}.bg-teal{background-color:#39cccc!important}.bg-olive{background-color:#3d9970!important}.bg-lime{background-color:#01ff70!important}.bg-orange{background-color:#ff851b!important}.bg-fuchsia{background-color:#f012be!important}.bg-purple{background-color:#605ca8!important}.bg-maroon{background-color:#d81b60!important}.bg-gray-active{color:#000;background-color:#b5bbc8!important}.bg-black-active{background-color:#000!important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724!important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b!important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0!important}.bg-blue-active{background-color:#005384!important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5!important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c!important}.bg-navy-active{background-color:#001a35!important}.bg-teal-active{background-color:#30bbbb!important}.bg-olive-active{background-color:#368763!important}.bg-lime-active{background-color:#00e765!important}.bg-orange-active{background-color:#ff7701!important}.bg-fuchsia-active{background-color:#db0ead!important}.bg-purple-active{background-color:#555299!important}.bg-maroon-active{background-color:#ca195a!important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39!important}.text-yellow{color:#f39c12!important}.text-aqua{color:#00c0ef!important}.text-blue{color:#0073b7!important}.text-black{color:#111!important}.text-light-blue{color:#3c8dbc!important}.text-green{color:#00a65a!important}.text-gray{color:#d2d6de!important}.text-navy{color:#001f3f!important}.text-teal{color:#39cccc!important}.text-olive{color:#3d9970!important}.text-lime{color:#01ff70!important}.text-orange{color:#ff851b!important}.text-fuchsia{color:#f012be!important}.text-purple{color:#605ca8!important}.text-maroon{color:#d81b60!important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none!important}.no-border{border:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-shadow{box-shadow:none!important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;padding-left:0;padding-right:0}.flat{border-radius:0!important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#39cccc),color-stop(1,#7adddd))!important;background:-ms-linear-gradient(bottom,#39cccc,#7adddd)!important;background:-moz-linear-gradient(center bottom,#39cccc 0,#7adddd 100%)!important;background:-o-linear-gradient(#7adddd,#39cccc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd',endColorstr='#39cccc',GradientType=0)!important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#3c8dbc),color-stop(1,#67a8ce))!important;background:-ms-linear-gradient(bottom,#3c8dbc,#67a8ce)!important;background:-moz-linear-gradient(center bottom,#3c8dbc 0,#67a8ce 100%)!important;background:-o-linear-gradient(#67a8ce,#3c8dbc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce',endColorstr='#3c8dbc',GradientType=0)!important;color:#fff}.bg-blue-gradient{background:#0073b7!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#0073b7),color-stop(1,#0089db))!important;background:-ms-linear-gradient(bottom,#0073b7,#0089db)!important;background:-moz-linear-gradient(center bottom,#0073b7 0,#0089db 100%)!important;background:-o-linear-gradient(#0089db,#0073b7)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db',endColorstr='#0073b7',GradientType=0)!important;color:#fff}.bg-aqua-gradient{background:#00c0ef!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00c0ef),color-stop(1,#14d1ff))!important;background:-ms-linear-gradient(bottom,#00c0ef,#14d1ff)!important;background:-moz-linear-gradient(center bottom,#00c0ef 0,#14d1ff 100%)!important;background:-o-linear-gradient(#14d1ff,#00c0ef)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff',endColorstr='#00c0ef',GradientType=0)!important;color:#fff}.bg-yellow-gradient{background:#f39c12!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#f39c12),color-stop(1,#f7bc60))!important;background:-ms-linear-gradient(bottom,#f39c12,#f7bc60)!important;background:-moz-linear-gradient(center bottom,#f39c12 0,#f7bc60 100%)!important;background:-o-linear-gradient(#f7bc60,#f39c12)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60',endColorstr='#f39c12',GradientType=0)!important;color:#fff}.bg-purple-gradient{background:#605ca8!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#605ca8),color-stop(1,#9491c4))!important;background:-ms-linear-gradient(bottom,#605ca8,#9491c4)!important;background:-moz-linear-gradient(center bottom,#605ca8 0,#9491c4 100%)!important;background:-o-linear-gradient(#9491c4,#605ca8)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4',endColorstr='#605ca8',GradientType=0)!important;color:#fff}.bg-green-gradient{background:#00a65a!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00a65a),color-stop(1,#00ca6d))!important;background:-ms-linear-gradient(bottom,#00a65a,#00ca6d)!important;background:-moz-linear-gradient(center bottom,#00a65a 0,#00ca6d 100%)!important;background:-o-linear-gradient(#00ca6d,#00a65a)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d',endColorstr='#00a65a',GradientType=0)!important;color:#fff}.bg-red-gradient{background:#dd4b39!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4b39),color-stop(1,#e47365))!important;background:-ms-linear-gradient(bottom,#dd4b39,#e47365)!important;background:-moz-linear-gradient(center bottom,#dd4b39 0,#e47365 100%)!important;background:-o-linear-gradient(#e47365,#dd4b39)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365',endColorstr='#dd4b39',GradientType=0)!important;color:#fff}.bg-black-gradient{background:#111!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#111),color-stop(1,#2b2b2b))!important;background:-ms-linear-gradient(bottom,#111,#2b2b2b)!important;background:-moz-linear-gradient(center bottom,#111 0,#2b2b2b 100%)!important;background:-o-linear-gradient(#2b2b2b,#111)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b',endColorstr='#111111',GradientType=0)!important;color:#fff}.bg-maroon-gradient{background:#d81b60!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#d81b60),color-stop(1,#e73f7c))!important;background:-ms-linear-gradient(bottom,#d81b60,#e73f7c)!important;background:-moz-linear-gradient(center bottom,#d81b60 0,#e73f7c 100%)!important;background:-o-linear-gradient(#e73f7c,#d81b60)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c',endColorstr='#d81b60',GradientType=0)!important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px} -.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100%!important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none!important}.content-wrapper,.right-side,.main-footer{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0,0)!important;-ms-transform:translate(0,0)!important;-o-transform:translate(0,0)!important;transform:translate(0,0)!important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal!important}} \ No newline at end of file +html,body{height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{height:100%;position:relative;overflow-x:hidden;overflow-y:auto}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer{margin-left:0}@media(max-width:767px){.content-wrapper,.main-footer{margin-left:0}}@media(min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer{margin-left:0}}@media(max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .main-footer{-webkit-transform:translate(230px,0);-ms-transform:translate(230px,0);-o-transform:translate(230px,0);transform:translate(230px,0)}}.content-wrapper{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #caced6}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media(max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}.fixed .wrapper{overflow:hidden}.hold-transition .content-wrapper,.hold-transition .right-side,.hold-transition .main-footer,.hold-transition .main-sidebar,.hold-transition .left-side,.hold-transition .main-header .navbar,.hold-transition .main-header .logo,.hold-transition .menu-open .fa-angle-left{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:0;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:0;min-height:50px}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media(max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media(max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media(max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#caced6;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media(max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media(max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media(max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media(max-width:767px){.main-sidebar{padding-top:100px}}@media(max-width:767px){.main-sidebar{-webkit-transform:translate(-230px,0);-ms-transform:translate(-230px,0);-o-transform:translate(-230px,0);transform:translate(-230px,0)}}@media(min-width:768px){.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px,0);-ms-transform:translate(-230px,0);-o-transform:translate(-230px,0);transform:translate(-230px,0)}}@media(max-width:767px){.sidebar-open .main-sidebar{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu .menu-open>a>.fa-angle-left,.sidebar-menu .menu-open>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu .active>.treeview-menu{display:block}@media(min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative!important;float:right;width:auto!important;left:180px!important;top:-22px!important;z-index:900}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-expanded-on-hover .main-footer,.sidebar-expanded-on-hover .content-wrapper{margin-left:50px}.sidebar-expanded-on-hover .main-sidebar{box-shadow:3px 0 8px rgba(0,0,0,0.125)}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media(max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media(min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.fixed .control-sidebar{position:fixed;height:100%;overflow-y:auto;padding-bottom:50px}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:0;border-right:0;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:0;border-right:0;border-bottom:0}@media(max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #caced6}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#caced6}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#caced6;border-bottom-color:#caced6}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#fff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eee;color:#444!important;text-align:center}@media(max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #ddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444!important}@media(max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#444!important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666}@media(max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media(max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible!important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media(max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{box-shadow:none;border-color:#caced6}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-color:#caced6;background-color:#fff}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{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:-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-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{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:-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-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{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:-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-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{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:-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-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{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:-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)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media(max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#fff;border-top:3px solid #caced6;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#caced6}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:0}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #caced6}.box.box-solid.box-default>.box-header{color:#444;background:#caced6;background-color:#caced6}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:0}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media(max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#caced6!important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#caced6;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:4px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:0}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:0;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li.disabled>a{color:#777}.nav-tabs-custom>.nav-tabs>li>a{color:#444}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#caced6}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0!important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#caced6;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.direct-chat-messages{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#caced6;border:1px solid #caced6;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#caced6;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#caced6}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.direct-chat-contacts{-webkit-transform:translate(101%,0);-ms-transform:translate(101%,0);-o-transform:translate(101%,0);transform:translate(101%,0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:0}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media(min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:0;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.treeview-menu .treeview-menu{padding-left:20px}.treeview-menu>li{margin:0}.treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.treeview-menu>li>a>.fa,.treeview-menu>li>a>.glyphicon,.treeview-menu>li>a>.ion{width:20px}.treeview-menu>li>a>.pull-right-container>.fa-angle-left,.treeview-menu>li>a>.pull-right-container>.fa-angle-down,.treeview-menu>li>a>.fa-angle-left,.treeview-menu>li>a>.fa-angle-down{width:auto}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#caced6}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#caced6}.login-box,.register-box{width:360px;margin:7% auto}@media(max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media(max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media(max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media(max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media(max-width:991px){.error-page>.error-content>h3{text-align:center}} +.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #caced6}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #caced6;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:0;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:0}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #caced6;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #caced6}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #caced6}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:0}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc!important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #caced6}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#caced6}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.box .datepicker-inline,.box .datepicker-inline .datepicker-days,.box .datepicker-inline>table,.box .datepicker-inline .datepicker-days>table{width:100%}.box .datepicker-inline td:hover,.box .datepicker-inline .datepicker-days td:hover,.box .datepicker-inline>table td:hover,.box .datepicker-inline .datepicker-days>table td:hover{background-color:rgba(255,255,255,0.3)}.box .datepicker-inline td.day.old,.box .datepicker-inline .datepicker-days td.day.old,.box .datepicker-inline>table td.day.old,.box .datepicker-inline .datepicker-days>table td.day.old,.box .datepicker-inline td.day.new,.box .datepicker-inline .datepicker-days td.day.new,.box .datepicker-inline>table td.day.new,.box .datepicker-inline .datepicker-days>table td.day.new{color:#777}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff!important}.bg-gray{color:#000;background-color:#caced6!important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111!important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39!important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12!important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef!important}.bg-blue{background-color:#0073b7!important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc!important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a!important}.bg-navy{background-color:#001f3f!important}.bg-teal{background-color:#39cccc!important}.bg-olive{background-color:#3d9970!important}.bg-lime{background-color:#01ff70!important}.bg-orange{background-color:#ff851b!important}.bg-fuchsia{background-color:#f012be!important}.bg-purple{background-color:#605ca8!important}.bg-maroon{background-color:#d81b60!important}.bg-gray-active{color:#000;background-color:#b5bbc8!important}.bg-black-active{background-color:#000!important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724!important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b!important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0!important}.bg-blue-active{background-color:#005384!important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5!important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c!important}.bg-navy-active{background-color:#001a35!important}.bg-teal-active{background-color:#30bbbb!important}.bg-olive-active{background-color:#368763!important}.bg-lime-active{background-color:#00e765!important}.bg-orange-active{background-color:#ff7701!important}.bg-fuchsia-active{background-color:#db0ead!important}.bg-purple-active{background-color:#555299!important}.bg-maroon-active{background-color:#ca195a!important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39!important}.text-yellow{color:#f39c12!important}.text-aqua{color:#00c0ef!important}.text-blue{color:#0073b7!important}.text-black{color:#111!important}.text-light-blue{color:#3c8dbc!important}.text-green{color:#00a65a!important}.text-gray{color:#caced6!important}.text-navy{color:#001f3f!important}.text-teal{color:#39cccc!important}.text-olive{color:#3d9970!important}.text-lime{color:#01ff70!important}.text-orange{color:#ff851b!important}.text-fuchsia{color:#f012be!important}.text-purple{color:#605ca8!important}.text-maroon{color:#d81b60!important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none!important}.no-border{border:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-shadow{box-shadow:none!important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;padding-left:0;padding-right:0}.flat{border-radius:0!important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#39cccc),color-stop(1,#7adddd))!important;background:-ms-linear-gradient(bottom,#39cccc,#7adddd)!important;background:-moz-linear-gradient(center bottom,#39cccc 0,#7adddd 100%)!important;background:-o-linear-gradient(#7adddd,#39cccc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd',endColorstr='#39cccc',GradientType=0)!important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#3c8dbc),color-stop(1,#67a8ce))!important;background:-ms-linear-gradient(bottom,#3c8dbc,#67a8ce)!important;background:-moz-linear-gradient(center bottom,#3c8dbc 0,#67a8ce 100%)!important;background:-o-linear-gradient(#67a8ce,#3c8dbc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce',endColorstr='#3c8dbc',GradientType=0)!important;color:#fff}.bg-blue-gradient{background:#0073b7!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#0073b7),color-stop(1,#0089db))!important;background:-ms-linear-gradient(bottom,#0073b7,#0089db)!important;background:-moz-linear-gradient(center bottom,#0073b7 0,#0089db 100%)!important;background:-o-linear-gradient(#0089db,#0073b7)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db',endColorstr='#0073b7',GradientType=0)!important;color:#fff}.bg-aqua-gradient{background:#00c0ef!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00c0ef),color-stop(1,#14d1ff))!important;background:-ms-linear-gradient(bottom,#00c0ef,#14d1ff)!important;background:-moz-linear-gradient(center bottom,#00c0ef 0,#14d1ff 100%)!important;background:-o-linear-gradient(#14d1ff,#00c0ef)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff',endColorstr='#00c0ef',GradientType=0)!important;color:#fff}.bg-yellow-gradient{background:#f39c12!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#f39c12),color-stop(1,#f7bc60))!important;background:-ms-linear-gradient(bottom,#f39c12,#f7bc60)!important;background:-moz-linear-gradient(center bottom,#f39c12 0,#f7bc60 100%)!important;background:-o-linear-gradient(#f7bc60,#f39c12)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60',endColorstr='#f39c12',GradientType=0)!important;color:#fff}.bg-purple-gradient{background:#605ca8!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#605ca8),color-stop(1,#9491c4))!important;background:-ms-linear-gradient(bottom,#605ca8,#9491c4)!important;background:-moz-linear-gradient(center bottom,#605ca8 0,#9491c4 100%)!important;background:-o-linear-gradient(#9491c4,#605ca8)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4',endColorstr='#605ca8',GradientType=0)!important;color:#fff}.bg-green-gradient{background:#00a65a!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00a65a),color-stop(1,#00ca6d))!important;background:-ms-linear-gradient(bottom,#00a65a,#00ca6d)!important;background:-moz-linear-gradient(center bottom,#00a65a 0,#00ca6d 100%)!important;background:-o-linear-gradient(#00ca6d,#00a65a)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d',endColorstr='#00a65a',GradientType=0)!important;color:#fff}.bg-red-gradient{background:#dd4b39!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4b39),color-stop(1,#e47365))!important;background:-ms-linear-gradient(bottom,#dd4b39,#e47365)!important;background:-moz-linear-gradient(center bottom,#dd4b39 0,#e47365 100%)!important;background:-o-linear-gradient(#e47365,#dd4b39)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365',endColorstr='#dd4b39',GradientType=0)!important;color:#fff}.bg-black-gradient{background:#111!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#111),color-stop(1,#2b2b2b))!important;background:-ms-linear-gradient(bottom,#111,#2b2b2b)!important;background:-moz-linear-gradient(center bottom,#111 0,#2b2b2b 100%)!important;background:-o-linear-gradient(#2b2b2b,#111)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b',endColorstr='#111111',GradientType=0)!important;color:#fff}.bg-maroon-gradient{background:#d81b60!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#d81b60),color-stop(1,#e73f7c))!important;background:-ms-linear-gradient(bottom,#d81b60,#e73f7c)!important;background:-moz-linear-gradient(center bottom,#d81b60 0,#e73f7c 100%)!important;background:-o-linear-gradient(#e73f7c,#d81b60)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c',endColorstr='#d81b60',GradientType=0)!important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px} +.img-bordered{border:3px solid #caced6;padding:3px}.img-bordered-sm{border:2px solid #caced6;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100%!important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none!important}.content-wrapper,.right-side,.main-footer{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0,0)!important;-ms-transform:translate(0,0)!important;-o-transform:translate(0,0)!important;transform:translate(0,0)!important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal!important}} \ No newline at end of file diff --git a/common/src/main/resources/static/common/base64.js b/common/src/main/resources/static/common/base64.js new file mode 100644 index 00000000..af766b54 --- /dev/null +++ b/common/src/main/resources/static/common/base64.js @@ -0,0 +1,108 @@ +(function() { + + this.Base64 = new Base64(); + + function Base64() { + + // private property + _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + + // public method for encoding + this.encode = function (input) { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + input = _utf8_encode(input); + while (i < input.length) { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + output = output + + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); + } + return output; + } + + // public method for decoding + this.decode = function (input) { + var output = ""; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + while (i < input.length) { + enc1 = _keyStr.indexOf(input.charAt(i++)); + enc2 = _keyStr.indexOf(input.charAt(i++)); + enc3 = _keyStr.indexOf(input.charAt(i++)); + enc4 = _keyStr.indexOf(input.charAt(i++)); + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + output = output + String.fromCharCode(chr1); + if (enc3 != 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 != 64) { + output = output + String.fromCharCode(chr3); + } + } + output = _utf8_decode(output); + return output; + } + + // private method for UTF-8 encoding + _utf8_encode = function (string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + if (c < 128) { + utftext += String.fromCharCode(c); + } else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + return utftext; + } + + // private method for UTF-8 decoding + _utf8_decode = function (utftext) { + var string = ""; + var i = 0; + var c = c1 = c2 = 0; + while ( i < utftext.length ) { + c = utftext.charCodeAt(i); + if (c < 128) { + string += String.fromCharCode(c); + i++; + } else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + } + return string; + } + } +})(); \ No newline at end of file diff --git a/common/src/main/resources/static/icheck/1.0/minimal/grey.png b/common/src/main/resources/static/icheck/1.0/minimal/grey.png index bb1a0fe7..dc8e6833 100644 Binary files a/common/src/main/resources/static/icheck/1.0/minimal/grey.png and b/common/src/main/resources/static/icheck/1.0/minimal/grey.png differ diff --git a/common/src/main/resources/static/icheck/1.0/minimal/grey.psd b/common/src/main/resources/static/icheck/1.0/minimal/grey.psd index 660ea8bf..f946fa5c 100644 Binary files a/common/src/main/resources/static/icheck/1.0/minimal/grey.psd and b/common/src/main/resources/static/icheck/1.0/minimal/grey.psd differ diff --git a/modules/core/db/core.erm b/modules/core/db/core.erm index 29733dfa..306608eb 100644 --- a/modules/core/db/core.erm +++ b/modules/core/db/core.erm @@ -11,7 +11,7 @@ 0 1.0 - 2606 + 2677 1945 128 @@ -1447,6 +1447,22 @@ file_md5 varchar(n) + + e2e0369af3191a268fc1d03ea0eef107d0392be0 + 255 + null + false + null + false + false + false + + false + + 文件信息(JSON格式) + file_meta + varchar(n) + 7295c82faa1ac317a2e7b0e11fbc9b7f8a1bc1e4 500 @@ -1671,6 +1687,22 @@ id varchar(n) + + f69037f9c9f1c4e8dd771b537b5cf3bc26d7ac3f + 64 + null + false + null + false + false + false + + false + + 集群的实例名字 + instance_name + varchar(n) + e2663716e6af40682333d3e8495a04bceff16647 1000 @@ -3112,7 +3144,7 @@ clob - a70dd4133cc6302307f8a0ac828a6049c401db58 + 0fa4e2d76aa9a87670cb1345202c5fbc44183cfe 1 null false @@ -3122,8 +3154,8 @@ false false - 接受者类型(1用户 2部门 3角色 4岗位) - 接受者类型(1用户 2部门 3角色 4岗位) + 接受者类型(0全部 1用户 2部门 3角色 4岗位) + 接受者类型(0全部 1用户 2部门 3角色 4岗位) receive_type character(n) @@ -4121,8 +4153,8 @@ - ba99318947626ff9e4c0d0b58ec3bf4e7a260f75 - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 + 8ea7ed753c560f6973c842ad64a3b10501a27877 + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 f285b2e9350856442d3f491d08a9f2f79f706a2b -1 -1 @@ -4209,7 +4241,7 @@ ffde396c7b349d700fe1b7891694ac538d00bf6d 22d38cfee95536d3e3af5fdd444b027a85d95432 - ba99318947626ff9e4c0d0b58ec3bf4e7a260f75 + 8ea7ed753c560f6973c842ad64a3b10501a27877 @@ -4664,7 +4696,7 @@ false true false - true + false @@ -4815,6 +4847,39 @@ 0 + + e2e0369af3191a268fc1d03ea0eef107d0392be0 + c1a441e7ef57c97818f59db365d7162fda7cc0df + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + @@ -4865,7 +4930,7 @@ - 2e69f023ad8cecebbe06f5330a9d65c6524a5b39 + 21533fba2463605c6cca43bbbb642eeaa8530a5b 6ce90f0c465f8e4480cf489e2f1cfcb423be63d9 bee7bb4881e285bf50f380b8829edff3c2a1ddbf -1 @@ -4930,7 +4995,7 @@ fc44d466dd6009e48b5222d1d71e38d025194ff0 54b86f255d95078898534902087fb704b4265b60 - 2e69f023ad8cecebbe06f5330a9d65c6524a5b39 + 21533fba2463605c6cca43bbbb642eeaa8530a5b @@ -5664,13 +5729,13 @@ - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 - 359 - 452 + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 + 438 + 548Segoe UI9 - 1610 - 468 + 1622 + 492 128 128 @@ -5994,7 +6059,7 @@ - cadeedfda6891fa00cbe3578c497d9cb94402772 + dedcc43c72ee436685481fa079d465594380905e 519d64ec10e7c0df51e0b14489d6666c04b93e34 a66af690ade469b3b4b472b1680bdc1923d5c972 -1 @@ -6059,7 +6124,7 @@ f385f23b1163beb8b239a67f5a262c83fb46cae6 5eecd1e4e1dc132da52de1bd1f59b13dd13a3587 - cadeedfda6891fa00cbe3578c497d9cb94402772 + dedcc43c72ee436685481fa079d465594380905e 所属消息 所属消息 @@ -8270,7 +8335,7 @@ - 7d511abc9d985f7c911dcafd7fe2eec93ccbd8a4 + 78c6c210e1b15ba33ee65931a26f8a40512ba11c cf06de3277f0d1dbf7ef6dc8750ad12ff49c8c9c f32de7f0ee93167beb39e00a9bacf941b9e09eb5 -1 @@ -8335,7 +8400,7 @@ 6d5f3e5ef4d28e57966c33c4b4ef424f1dc42b7b 55c7d0a9ab8650c264a75bb1bf958cac2fe68152 - 7d511abc9d985f7c911dcafd7fe2eec93ccbd8a4 + 78c6c210e1b15ba33ee65931a26f8a40512ba11c @@ -8369,7 +8434,7 @@ 91110163a8a31ee61a4153360707026b5498dd65 443772d4627c23aef484c324c8e431121b921a44 - 7d511abc9d985f7c911dcafd7fe2eec93ccbd8a4 + 78c6c210e1b15ba33ee65931a26f8a40512ba11c @@ -12785,8 +12850,8 @@ - 034713cef6fc23366672cb01ceb39788739f3ada - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 + 611309bafbfe0264d77a6bc7de24b53acfe213d6 + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 58be1ca8c00baf293ef16f69d782da2b79da6ec2 -1 -1 @@ -12817,7 +12882,7 @@ 7e2f59707205419c8556876dc854aeff0fbf7b57 22d38cfee95536d3e3af5fdd444b027a85d95432 - 034713cef6fc23366672cb01ceb39788739f3ada + 611309bafbfe0264d77a6bc7de24b53acfe213d6 控制角色编码 @@ -13166,565 +13231,6 @@
- - 519d64ec10e7c0df51e0b14489d6666c04b93e34 - 443 - 484 - Segoe UI - 9 - 2682 - 1950 - - 128 - 128 - 192 - - - - js_sys_msg_inner - 内部消息 - - - - - - - 869fc70cf3a4e92e8056b40814df8e03f9f9efde - 5eecd1e4e1dc132da52de1bd1f59b13dd13a3587 - - - - - varchar(n) - - - false - false - true - true - false - - - - - - - - - - - false - false - false - - - 0 - - - - a304841afc9968e7c8768979fe2ba3f2f315db78 - cbbb279fbb0f0ea5d67536332ce7d9a8b3d70e36 - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - a654ac8de54e8c19cfdba4bcf6d636ab760799b9 - 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe - - - - - character(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 31410c3d884588423ca2a5803e78d0934412f458 - 10a8ef0d67bd3c9a90e9c67dc86953fefb8f8755 - - - - - character(n) - - - false - false - false - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 98eb079aebd2f56c461cb92d97ab4d56f603b840 - 48bf7c9cb90d62b9cba0283d51bf94980e9fea92 - - - - - clob - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - a70dd4133cc6302307f8a0ac828a6049c401db58 - 5b256d59f963bf2a76cf35c847634b1188154874 - - - - - character(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 5797ae3ca5da40a8a45dfd0071f3589585c2517f - fe9b7e3236d284db50cb1d4cda9a77d1d8de40d2 - - - - - clob - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 86b915810d6436eb5c60062abbe4f8910c86f89c - b21a2db1cf685edc44c2bf252785aabc4cfb0794 - - - - - clob - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - c5364fcf3327275d038d229e22f80ce97c28d402 - b0959f0c2f737aa49188e57cc71afb3242e9e97b - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 949f48cec7229094875af06d5c3ee4e7efbba1e0 - 8d09d0b4b174964fb858b7ccb77ed9e14767de65 - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 5e197b7f106763a6952e72203fcc902cea793853 - d492c41633035ed8c33c89c5c704ef2dd5d7d32c - - - - - datetime - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - da74a37a1025119cd79a05644781c76b606352d3 - 0390e069a393fa7b2f2de0531b12470c299317f8 - - - - - character(n) - - - false - false - false - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 81e89a36c985a9f69710177677cd7be6ed6ea089 - fd262e1d867fb854931a86728233eec74fc0099b - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 20092a8f08bbf1304383014693172e4fc863277d - 6d885df5f4956aeb6b228e769b8d037459d7a7d7 - - - - - character(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - 85024a2953cf3e3c9c1cce49b2351853ab0d125b - - - - false - true - idx_sys_msg_inner_cb - - - - - e5355faba5ec3c9128507dd4c48ea9230631cf83 - false - - - - - false - true - idx_sys_msg_inner_status - - - - - 6d885df5f4956aeb6b228e769b8d037459d7a7d7 - false - - - - - false - true - idx_sys_msg_inner_cl - - - - - 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe - false - - - - - false - true - idx_sys_msg_inner_sc - - - - - b0959f0c2f737aa49188e57cc71afb3242e9e97b - false - - - - - false - true - idx_sys_msg_inner_sd - - - - - d492c41633035ed8c33c89c5c704ef2dd5d7d32c - false - - - - - - - - - -
9ab9e19921654f64fedac3e4a117a6109afc4e41506 @@ -15539,6 +15045,392 @@
+ + bccc82daf981c93b1f698f012a4fbbe4aa9f728a + 360 + 383 + Segoe UI + 9 + 1615 + 1885 + + 128 + 128 + 192 + + + + js_sys_module + 模块表 + + + + + + + 446f3cd3b9b1dd50fa5989a256c401a193a3706c + d964f7c50e480b77047f79d1107c95d0bbe9717c + + + + + varchar(n) + + + false + false + true + true + false + + + + + + + + + + + false + false + false + + + 0 + + + + 2f27eb5025ffc1dddc8dd8f526bc9ba3fddd976b + 4c086c0ba92da3a70e70b9771d6af64841cc5080 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + f7114401c278a134ec74f1836c0f4afeed91cf0f + 9d82192f942304d0060c53ac9a03769df6797ff0 + + + + + nvarchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a349e3aeee90969e1e0c7f6ad8481b209eb691f3 + 35d6215c6b80d8640b1632e1b8b2139f10d0cec1 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + f1196b5a1e9072ac4cc990c913b774e777b09a46 + 33577148015618b442b625836cf90ba27ace9621 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + cc6e1b3ebd5a36ac1f844bc246537c6f1e99c3af + 6281abb4d5813839a39d7d75ce39843c4467c390 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + 35ae805d1da92afdb99b2fe8c536d1649356fccd + + + + false + true + idx_sys_module_status + + + + + f0036584bd8711715579d21994a0105935605a7e + false + + + + + + + + + +
+ + 2692f98d54cb6b15c3c537e3fda8eedf24bc9e19 + 100 + 321 + Segoe UI + 9 + 2064 + 1296 + + 128 + 128 + 192 + + + + cbde37ca64bc9ba898ee5f83f212c7f3163cdf5a + f10bd927f4651e79dbe30cb0fecaeaeb8ec18ac4 + 2692f98d54cb6b15c3c537e3fda8eedf24bc9e19 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + + 1..n + 1 + true + + RESTRICT + RESTRICT + null + null + + + 61454f5c66b50fe69ecab419245b6c0011698f4b + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 + 2692f98d54cb6b15c3c537e3fda8eedf24bc9e19 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + + 1..n + 1 + true + + RESTRICT + RESTRICT + null + null + + + js_sys_role_menu + 角色与菜单关联表 + + + + + + + 136c2841a88ba120cd1f0bb13f7ba446474de69e + 22d38cfee95536d3e3af5fdd444b027a85d95432 + 61454f5c66b50fe69ecab419245b6c0011698f4b + + + + + varchar(n) + + + false + true + true + true + false + + + + + + + + + + + false + false + false + + + 0 + + + + 1882f53a36409270c8622486740876fcb2af9842 + e84c40cdf5ffdb2ba4d59630d98abb5972d74795 + cbde37ca64bc9ba898ee5f83f212c7f3163cdf5a + + + + + varchar(n) + + + false + true + true + true + false + + + + + + + + + + + false + false + false + + + 0 + + + + + + + + + + +
cf06de3277f0d1dbf7ef6dc8750ad12ff49c8c9c386 @@ -15792,6 +15684,39 @@ 0 + + f69037f9c9f1c4e8dd771b537b5cf3bc26d7ac3f + 599b9798d287db98af97bda02a378aa97b0c62c4 + + + + + varchar(n) + + JeeSiteScheduler + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + 481c1a6225e0f2a86dbf4f752e9455afac57f897 644c88074f6f9cbe4b29b12b9633f4e238a2761b @@ -15849,13 +15774,13 @@
- bccc82daf981c93b1f698f012a4fbbe4aa9f728a - 360 - 383 + 519d64ec10e7c0df51e0b14489d6666c04b93e34 + 443 + 484Segoe UI9 - 1615 - 1885 + 2682 + 1950 128 128 @@ -15863,16 +15788,16 @@ - js_sys_module - 模块表 + js_sys_msg_inner + 内部消息 - 446f3cd3b9b1dd50fa5989a256c401a193a3706c - d964f7c50e480b77047f79d1107c95d0bbe9717c + 869fc70cf3a4e92e8056b40814df8e03f9f9efde + 5eecd1e4e1dc132da52de1bd1f59b13dd13a3587 @@ -15904,8 +15829,8 @@ - 2f27eb5025ffc1dddc8dd8f526bc9ba3fddd976b - 4c086c0ba92da3a70e70b9771d6af64841cc5080 + a304841afc9968e7c8768979fe2ba3f2f315db78 + cbbb279fbb0f0ea5d67536332ce7d9a8b3d70e36 @@ -15937,13 +15862,46 @@ - f7114401c278a134ec74f1836c0f4afeed91cf0f - 9d82192f942304d0060c53ac9a03769df6797ff0 + a654ac8de54e8c19cfdba4bcf6d636ab760799b9 + 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe - nvarchar(n) + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 31410c3d884588423ca2a5803e78d0934412f458 + 10a8ef0d67bd3c9a90e9c67dc86953fefb8f8755 + + + + + character(n) false @@ -15970,8 +15928,140 @@ - a349e3aeee90969e1e0c7f6ad8481b209eb691f3 - 35d6215c6b80d8640b1632e1b8b2139f10d0cec1 + 98eb079aebd2f56c461cb92d97ab4d56f603b840 + 48bf7c9cb90d62b9cba0283d51bf94980e9fea92 + + + + + clob + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 0fa4e2d76aa9a87670cb1345202c5fbc44183cfe + 5b256d59f963bf2a76cf35c847634b1188154874 + + + + + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 5797ae3ca5da40a8a45dfd0071f3589585c2517f + fe9b7e3236d284db50cb1d4cda9a77d1d8de40d2 + + + + + clob + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 86b915810d6436eb5c60062abbe4f8910c86f89c + b21a2db1cf685edc44c2bf252785aabc4cfb0794 + + + + + clob + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + c5364fcf3327275d038d229e22f80ce97c28d402 + b0959f0c2f737aa49188e57cc71afb3242e9e97b @@ -16003,8 +16093,8 @@ - f1196b5a1e9072ac4cc990c913b774e777b09a46 - 33577148015618b442b625836cf90ba27ace9621 + 949f48cec7229094875af06d5c3ee4e7efbba1e0 + 8d09d0b4b174964fb858b7ccb77ed9e14767de65 @@ -16036,8 +16126,74 @@ - cc6e1b3ebd5a36ac1f844bc246537c6f1e99c3af - 6281abb4d5813839a39d7d75ce39843c4467c390 + 5e197b7f106763a6952e72203fcc902cea793853 + d492c41633035ed8c33c89c5c704ef2dd5d7d32c + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + da74a37a1025119cd79a05644781c76b606352d3 + 0390e069a393fa7b2f2de0531b12470c299317f8 + + + + + character(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 81e89a36c985a9f69710177677cd7be6ed6ea089 + fd262e1d867fb854931a86728233eec74fc0099b @@ -16068,165 +16224,107 @@ 0 - 35ae805d1da92afdb99b2fe8c536d1649356fccd + + 20092a8f08bbf1304383014693172e4fc863277d + 6d885df5f4956aeb6b228e769b8d037459d7a7d7 + + + + + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + 85024a2953cf3e3c9c1cce49b2351853ab0d125b false true - idx_sys_module_status + idx_sys_msg_inner_cb - f0036584bd8711715579d21994a0105935605a7e + e5355faba5ec3c9128507dd4c48ea9230631cf83 false - - - - - - -
- - 18ad211a33ec95af9104d9e6b843d74227b914ce - 100 - 321 - Segoe UI - 9 - 2076 - 1320 - - 128 - 128 - 192 - - - - 6a79d6669a1b4809994f42c602cb55c6f0651136 - f10bd927f4651e79dbe30cb0fecaeaeb8ec18ac4 - 18ad211a33ec95af9104d9e6b843d74227b914ce - -1 - -1 - -1 - -1 - - 0 - 0 - 0 - - 1..n - 1 - true - - RESTRICT - RESTRICT - null - null - - - 15ed391c4abb14bb54345a177fd0c39682f87e48 - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 - 18ad211a33ec95af9104d9e6b843d74227b914ce - -1 - -1 - -1 - -1 - - 0 - 0 - 0 - - 1..n - 1 - true - - RESTRICT - RESTRICT - null - null - - - js_sys_role_menu - 角色与菜单关联表 - - - - - - - 136c2841a88ba120cd1f0bb13f7ba446474de69e - 22d38cfee95536d3e3af5fdd444b027a85d95432 - 15ed391c4abb14bb54345a177fd0c39682f87e48 + + false + true + idx_sys_msg_inner_status + - - - - varchar(n) - - - false - true - true - true - false - - - - - - - - - - - false - false - false - - - 0 - - - - 1882f53a36409270c8622486740876fcb2af9842 - e84c40cdf5ffdb2ba4d59630d98abb5972d74795 - 6a79d6669a1b4809994f42c602cb55c6f0651136 + + + 6d885df5f4956aeb6b228e769b8d037459d7a7d7 + false + + + + + false + true + idx_sys_msg_inner_cl + - - - - varchar(n) - - - false - true - true - true - false - - - - - - - - - - - false - false - false - - - 0 - - - - + + + 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe + false + + + + + false + true + idx_sys_msg_inner_sc + + + + + b0959f0c2f737aa49188e57cc71afb3242e9e97b + false + + + + + false + true + idx_sys_msg_inner_sd + + + + + d492c41633035ed8c33c89c5c704ef2dd5d7d32c + false + + + diff --git a/modules/core/db/db2/core.sql b/modules/core/db/db2/core.sql index d70e74f8..0a9c0737 100644 --- a/modules/core/db/db2/core.sql +++ b/modules/core/db/db2/core.sql @@ -43,7 +43,7 @@ CREATE TABLE js_gen_table ( table_name varchar(64) NOT NULL, class_name varchar(100) NOT NULL, - comments varchar(500) NOT NULL, + comments vargraphic(500) NOT NULL, parent_table_name varchar(64), parent_table_fk_name varchar(64), data_source_name varchar(64), @@ -51,16 +51,16 @@ CREATE TABLE js_gen_table package_name varchar(500), module_name varchar(30), sub_module_name varchar(30), - function_name varchar(200), - function_name_simple varchar(50), - function_author varchar(50), - gen_base_dir varchar(1000), - options varchar(1000), + function_name vargraphic(200), + function_name_simple vargraphic(50), + function_author vargraphic(50), + gen_base_dir vargraphic(1000), + options vargraphic(1000), create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (table_name) ); @@ -73,8 +73,8 @@ CREATE TABLE js_gen_table_column column_name varchar(64) NOT NULL, column_sort decimal(10), column_type varchar(100) NOT NULL, - column_label varchar(50), - comments varchar(500) NOT NULL, + column_label vargraphic(50), + comments vargraphic(500) NOT NULL, attr_name varchar(200) NOT NULL, attr_type varchar(200) NOT NULL, is_pk char(1), @@ -86,7 +86,7 @@ CREATE TABLE js_gen_table_column query_type varchar(200), is_edit char(1), show_type varchar(200), - options varchar(1000), + options vargraphic(1000), PRIMARY KEY (id) ); @@ -102,14 +102,14 @@ CREATE TABLE js_sys_area tree_leaf char(1) NOT NULL, tree_level decimal(4) NOT NULL, tree_names varchar(1000) NOT NULL, - area_name varchar(100) NOT NULL, + area_name vargraphic(100) NOT NULL, area_type char(1), status char(1) DEFAULT '0' NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (area_code) ); @@ -126,25 +126,25 @@ CREATE TABLE js_sys_company tree_level decimal(4) NOT NULL, tree_names varchar(1000) NOT NULL, view_code varchar(100) NOT NULL, - company_name varchar(200) NOT NULL, - full_name varchar(200) NOT NULL, + company_name vargraphic(200) NOT NULL, + full_name vargraphic(200) NOT NULL, area_code varchar(100), status char(1) DEFAULT '0' NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, - extend_s1 varchar(500), - extend_s2 varchar(500), - extend_s3 varchar(500), - extend_s4 varchar(500), - extend_s5 varchar(500), - extend_s6 varchar(500), - extend_s7 varchar(500), - extend_s8 varchar(500), + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, + extend_s1 vargraphic(500), + extend_s2 vargraphic(500), + extend_s3 vargraphic(500), + extend_s4 vargraphic(500), + extend_s5 vargraphic(500), + extend_s6 vargraphic(500), + extend_s7 vargraphic(500), + extend_s8 vargraphic(500), extend_i1 decimal(19), extend_i2 decimal(19), extend_i3 decimal(19), @@ -174,15 +174,15 @@ CREATE TABLE js_sys_company_office CREATE TABLE js_sys_config ( id varchar(64) NOT NULL, - config_name varchar(100) NOT NULL, + config_name vargraphic(100) NOT NULL, config_key varchar(100) NOT NULL, - config_value varchar(1000), + config_value vargraphic(1000), is_sys char(1) NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (id) ); @@ -198,29 +198,29 @@ CREATE TABLE js_sys_dict_data tree_leaf char(1) NOT NULL, tree_level decimal(4) NOT NULL, tree_names varchar(1000) NOT NULL, - dict_label varchar(100) NOT NULL, + dict_label vargraphic(100) NOT NULL, dict_value varchar(100) NOT NULL, dict_type varchar(100) NOT NULL, is_sys char(1) NOT NULL, - description varchar(500), - css_style varchar(500), - css_class varchar(500), + description vargraphic(500), + css_style vargraphic(500), + css_class vargraphic(500), status char(1) DEFAULT '0' NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, - extend_s1 varchar(500), - extend_s2 varchar(500), - extend_s3 varchar(500), - extend_s4 varchar(500), - extend_s5 varchar(500), - extend_s6 varchar(500), - extend_s7 varchar(500), - extend_s8 varchar(500), + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, + extend_s1 vargraphic(500), + extend_s2 vargraphic(500), + extend_s3 vargraphic(500), + extend_s4 vargraphic(500), + extend_s5 vargraphic(500), + extend_s6 vargraphic(500), + extend_s7 vargraphic(500), + extend_s8 vargraphic(500), extend_i1 decimal(19), extend_i2 decimal(19), extend_i3 decimal(19), @@ -241,7 +241,7 @@ CREATE TABLE js_sys_dict_data CREATE TABLE js_sys_dict_type ( id varchar(64) NOT NULL, - dict_name varchar(100) NOT NULL, + dict_name vargraphic(100) NOT NULL, dict_type varchar(100) NOT NULL, is_sys char(1) NOT NULL, status char(1) DEFAULT '0' NOT NULL, @@ -249,7 +249,7 @@ CREATE TABLE js_sys_dict_type create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (id) ); @@ -258,20 +258,20 @@ CREATE TABLE js_sys_dict_type CREATE TABLE js_sys_employee ( emp_code varchar(64) NOT NULL, - emp_name varchar(100) NOT NULL, + emp_name vargraphic(100) NOT NULL, emp_name_en varchar(100), office_code varchar(64) NOT NULL, - office_name varchar(100) NOT NULL, + office_name vargraphic(100) NOT NULL, company_code varchar(64), - company_name varchar(200), + company_name vargraphic(200), status char(1) NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, PRIMARY KEY (emp_code) ); @@ -289,11 +289,12 @@ CREATE TABLE js_sys_employee_post CREATE TABLE js_sys_file_entity ( file_id varchar(64) NOT NULL, - file_md5 varchar(64) NOT NULL UNIQUE, - file_path varchar(1000) NOT NULL, + file_md5 varchar(64) NOT NULL, + file_path vargraphic(1000) NOT NULL, file_content_type varchar(200) NOT NULL, file_extension varchar(100) NOT NULL, file_size decimal(31) NOT NULL, + file_meta varchar(255), PRIMARY KEY (file_id) ); @@ -303,7 +304,7 @@ CREATE TABLE js_sys_file_upload ( id varchar(64) NOT NULL, file_id varchar(64) NOT NULL, - file_name varchar(500) NOT NULL, + file_name vargraphic(500) NOT NULL, file_type varchar(20) NOT NULL, biz_key varchar(64), biz_type varchar(64), @@ -312,7 +313,7 @@ CREATE TABLE js_sys_file_upload create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (id) ); @@ -322,17 +323,18 @@ CREATE TABLE js_sys_job ( job_name varchar(64) NOT NULL, job_group varchar(64) NOT NULL, - description varchar(100) NOT NULL, - invoke_target varchar(1000) NOT NULL, + description vargraphic(100) NOT NULL, + invoke_target vargraphic(1000) NOT NULL, cron_expression varchar(255) NOT NULL, misfire_instruction decimal(1) NOT NULL, concurrent char(1) NOT NULL, + instance_name varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL, status char(1) NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (job_name, job_group) ); @@ -358,14 +360,14 @@ CREATE TABLE js_sys_lang ( id varchar(64) NOT NULL, module_code varchar(64) NOT NULL, - lang_code varchar(500) NOT NULL, - lang_text varchar(500) NOT NULL, + lang_code vargraphic(500) NOT NULL, + lang_text vargraphic(500) NOT NULL, lang_type varchar(50) NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (id) ); @@ -375,11 +377,11 @@ CREATE TABLE js_sys_log ( id varchar(64) NOT NULL, log_type varchar(50) NOT NULL, - log_title varchar(500) NOT NULL, + log_title vargraphic(500) NOT NULL, create_by varchar(64) NOT NULL, - create_by_name varchar(100) NOT NULL, + create_by_name vargraphic(100) NOT NULL, create_date timestamp NOT NULL, - request_uri varchar(500), + request_uri vargraphic(500), request_method varchar(10), request_params clob, diff_modify_data clob, @@ -389,12 +391,12 @@ CREATE TABLE js_sys_log server_addr varchar(255) NOT NULL, is_exception char(1), exception_info clob, - user_agent varchar(500), + user_agent vargraphic(500), device_name varchar(100), browser_name varchar(100), execute_time decimal(19), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, PRIMARY KEY (id) ); @@ -426,15 +428,15 @@ CREATE TABLE js_sys_menu create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), - extend_s1 varchar(500), - extend_s2 varchar(500), - extend_s3 varchar(500), - extend_s4 varchar(500), - extend_s5 varchar(500), - extend_s6 varchar(500), - extend_s7 varchar(500), - extend_s8 varchar(500), + remarks vargraphic(500), + extend_s1 vargraphic(500), + extend_s2 vargraphic(500), + extend_s3 vargraphic(500), + extend_s4 vargraphic(500), + extend_s5 vargraphic(500), + extend_s6 vargraphic(500), + extend_s7 vargraphic(500), + extend_s8 vargraphic(500), extend_i1 decimal(19), extend_i2 decimal(19), extend_i3 decimal(19), @@ -456,7 +458,7 @@ CREATE TABLE js_sys_module ( module_code varchar(64) NOT NULL, module_name varchar(100) NOT NULL, - description varchar(500), + description vargraphic(500), main_class_name varchar(500), current_version varchar(50), upgrade_info varchar(300), @@ -465,7 +467,7 @@ CREATE TABLE js_sys_module create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (module_code) ); @@ -479,19 +481,19 @@ CREATE TABLE js_sys_msg_inner content_type char(1), msg_content clob NOT NULL, receive_type char(1) NOT NULL, - receive_codes clob NOT NULL, - receive_names clob NOT NULL, - send_user_code varchar(64) NOT NULL, - send_user_name varchar(100) NOT NULL, - send_date timestamp NOT NULL, + receive_codes clob, + receive_names clob, + send_user_code varchar(64), + send_user_name varchar(100), + send_date timestamp, is_attac char(1), - notify_types varchar(100) NOT NULL, + notify_types varchar(100), status char(1) NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (id) ); @@ -574,7 +576,7 @@ CREATE TABLE js_sys_msg_template id varchar(64) NOT NULL, module_code varchar(64), tpl_key varchar(100) NOT NULL, - tpl_name varchar(100) NOT NULL, + tpl_name vargraphic(100) NOT NULL, tpl_type varchar(16) NOT NULL, tpl_content clob NOT NULL, status char(1) DEFAULT '0' NOT NULL, @@ -582,7 +584,7 @@ CREATE TABLE js_sys_msg_template create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), PRIMARY KEY (id) ); @@ -599,7 +601,7 @@ CREATE TABLE js_sys_office tree_level decimal(4) NOT NULL, tree_names varchar(1000) NOT NULL, view_code varchar(100) NOT NULL, - office_name varchar(100) NOT NULL, + office_name vargraphic(100) NOT NULL, full_name varchar(200) NOT NULL, office_type char(1) NOT NULL, leader varchar(100), @@ -612,17 +614,17 @@ CREATE TABLE js_sys_office create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, - extend_s1 varchar(500), - extend_s2 varchar(500), - extend_s3 varchar(500), - extend_s4 varchar(500), - extend_s5 varchar(500), - extend_s6 varchar(500), - extend_s7 varchar(500), - extend_s8 varchar(500), + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, + extend_s1 vargraphic(500), + extend_s2 vargraphic(500), + extend_s3 vargraphic(500), + extend_s4 vargraphic(500), + extend_s5 vargraphic(500), + extend_s6 vargraphic(500), + extend_s7 vargraphic(500), + extend_s8 vargraphic(500), extend_i1 decimal(19), extend_i2 decimal(19), extend_i3 decimal(19), @@ -651,9 +653,9 @@ CREATE TABLE js_sys_post create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, PRIMARY KEY (post_code) ); @@ -673,9 +675,9 @@ CREATE TABLE js_sys_role create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, PRIMARY KEY (role_code) ); @@ -712,7 +714,7 @@ CREATE TABLE js_sys_user phone varchar(100), sex char(1), avatar varchar(1000), - sign varchar(200), + sign vargraphic(200), wx_openid varchar(100), mobile_imei varchar(100), user_type varchar(16) NOT NULL, @@ -739,17 +741,17 @@ CREATE TABLE js_sys_user create_date timestamp NOT NULL, update_by varchar(64) NOT NULL, update_date timestamp NOT NULL, - remarks varchar(500), + remarks vargraphic(500), corp_code varchar(64) DEFAULT '0' NOT NULL, - corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL, - extend_s1 varchar(500), - extend_s2 varchar(500), - extend_s3 varchar(500), - extend_s4 varchar(500), - extend_s5 varchar(500), - extend_s6 varchar(500), - extend_s7 varchar(500), - extend_s8 varchar(500), + corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL, + extend_s1 vargraphic(500), + extend_s2 vargraphic(500), + extend_s3 vargraphic(500), + extend_s4 vargraphic(500), + extend_s5 vargraphic(500), + extend_s6 vargraphic(500), + extend_s7 vargraphic(500), + extend_s8 vargraphic(500), extend_i1 decimal(19), extend_i2 decimal(19), extend_i3 decimal(19), diff --git a/modules/core/db/mssql/core.sql b/modules/core/db/mssql/core.sql index 213e0e98..593862fd 100644 --- a/modules/core/db/mssql/core.sql +++ b/modules/core/db/mssql/core.sql @@ -289,11 +289,12 @@ CREATE TABLE [js_sys_employee_post] CREATE TABLE [js_sys_file_entity] ( [file_id] varchar(64) NOT NULL, - [file_md5] varchar(64) NOT NULL UNIQUE, + [file_md5] varchar(64) NOT NULL, [file_path] nvarchar(1000) NOT NULL, [file_content_type] varchar(200) NOT NULL, [file_extension] varchar(100) NOT NULL, [file_size] decimal(31) NOT NULL, + [file_meta] varchar(255), PRIMARY KEY ([file_id]) ); @@ -327,6 +328,7 @@ CREATE TABLE [js_sys_job] [cron_expression] varchar(255) NOT NULL, [misfire_instruction] decimal(1) NOT NULL, [concurrent] char(1) NOT NULL, + [instance_name] varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL, [status] char(1) NOT NULL, [create_by] varchar(64) NOT NULL, [create_date] datetime NOT NULL, @@ -479,13 +481,13 @@ CREATE TABLE [js_sys_msg_inner] [content_type] char(1), [msg_content] text NOT NULL, [receive_type] char(1) NOT NULL, - [receive_codes] text NOT NULL, - [receive_names] text NOT NULL, - [send_user_code] varchar(64) NOT NULL, - [send_user_name] varchar(100) NOT NULL, - [send_date] datetime NOT NULL, + [receive_codes] text, + [receive_names] text, + [send_user_code] varchar(64), + [send_user_name] varchar(100), + [send_date] datetime, [is_attac] char(1), - [notify_types] varchar(100) NOT NULL, + [notify_types] varchar(100), [status] char(1) NOT NULL, [create_by] varchar(64) NOT NULL, [create_date] datetime NOT NULL, diff --git a/modules/core/db/mysql/core.sql b/modules/core/db/mysql/core.sql index 3a70049c..cf0b337a 100644 --- a/modules/core/db/mysql/core.sql +++ b/modules/core/db/mysql/core.sql @@ -295,8 +295,8 @@ CREATE TABLE js_sys_file_entity file_content_type varchar(200) NOT NULL COMMENT '文件内容类型', file_extension varchar(100) NOT NULL COMMENT '文件后缀扩展名', file_size decimal(31) NOT NULL COMMENT '文件大小(单位B)', - PRIMARY KEY (file_id), - UNIQUE (file_md5) + file_meta varchar(255) COMMENT '文件信息(JSON格式)', + PRIMARY KEY (file_id) ) COMMENT = '文件实体表'; @@ -329,6 +329,7 @@ CREATE TABLE js_sys_job cron_expression varchar(255) NOT NULL COMMENT 'Cron执行表达式', misfire_instruction decimal(1) NOT NULL COMMENT '计划执行错误策略', concurrent char(1) NOT NULL COMMENT '是否并发执行', + instance_name varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL COMMENT '集群的实例名字', status char(1) NOT NULL COMMENT '状态(0正常 1删除 2暂停)', create_by varchar(64) NOT NULL COMMENT '创建者', create_date datetime NOT NULL COMMENT '创建时间', @@ -480,14 +481,14 @@ CREATE TABLE js_sys_msg_inner content_level char(1) NOT NULL COMMENT '内容级别(1普通 2一般 3紧急)', content_type char(1) COMMENT '内容类型(1公告 2新闻 3会议 4其它)', msg_content text NOT NULL COMMENT '消息内容', - receive_type char(1) NOT NULL COMMENT '接受者类型(1用户 2部门 3角色 4岗位)', - receive_codes text NOT NULL COMMENT '接受者字符串', - receive_names text NOT NULL COMMENT '接受者名称字符串', - send_user_code varchar(64) NOT NULL COMMENT '发送者用户编码', - send_user_name varchar(100) NOT NULL COMMENT '发送者用户姓名', - send_date datetime NOT NULL COMMENT '发送时间', + receive_type char(1) NOT NULL COMMENT '接受者类型(0全部 1用户 2部门 3角色 4岗位)', + receive_codes text COMMENT '接受者字符串', + receive_names text COMMENT '接受者名称字符串', + send_user_code varchar(64) COMMENT '发送者用户编码', + send_user_name varchar(100) COMMENT '发送者用户姓名', + send_date datetime COMMENT '发送时间', is_attac char(1) COMMENT '是否有附件', - notify_types varchar(100) NOT NULL COMMENT '通知类型(PC APP 短信 邮件 微信)多选', + notify_types varchar(100) COMMENT '通知类型(PC APP 短信 邮件 微信)多选', status char(1) NOT NULL COMMENT '状态(0正常 1删除 4审核 5驳回 9草稿)', create_by varchar(64) NOT NULL COMMENT '创建者', create_date datetime NOT NULL COMMENT '创建时间', diff --git a/modules/core/db/oracle/core.sql b/modules/core/db/oracle/core.sql index 0caed7d0..9943b4e1 100644 --- a/modules/core/db/oracle/core.sql +++ b/modules/core/db/oracle/core.sql @@ -289,11 +289,12 @@ CREATE TABLE js_sys_employee_post CREATE TABLE js_sys_file_entity ( file_id varchar2(64) NOT NULL, - file_md5 varchar2(64) NOT NULL UNIQUE, + file_md5 varchar2(64) NOT NULL, file_path nvarchar2(1000) NOT NULL, file_content_type varchar2(200) NOT NULL, file_extension varchar2(100) NOT NULL, file_size number(31) NOT NULL, + file_meta varchar2(255), PRIMARY KEY (file_id) ); @@ -327,6 +328,7 @@ CREATE TABLE js_sys_job cron_expression varchar2(255) NOT NULL, misfire_instruction number(1) NOT NULL, concurrent char(1) NOT NULL, + instance_name varchar2(64) DEFAULT 'JeeSiteScheduler' NOT NULL, status char(1) NOT NULL, create_by varchar2(64) NOT NULL, create_date timestamp NOT NULL, @@ -479,13 +481,13 @@ CREATE TABLE js_sys_msg_inner content_type char(1), msg_content clob NOT NULL, receive_type char(1) NOT NULL, - receive_codes clob NOT NULL, - receive_names clob NOT NULL, - send_user_code varchar2(64) NOT NULL, - send_user_name varchar2(100) NOT NULL, - send_date timestamp NOT NULL, + receive_codes clob, + receive_names clob, + send_user_code varchar2(64), + send_user_name varchar2(100), + send_date timestamp, is_attac char(1), - notify_types varchar2(100) NOT NULL, + notify_types varchar2(100), status char(1) NOT NULL, create_by varchar2(64) NOT NULL, create_date timestamp NOT NULL, @@ -1112,6 +1114,7 @@ COMMENT ON COLUMN js_sys_file_entity.file_path IS '文件相对路径'; COMMENT ON COLUMN js_sys_file_entity.file_content_type IS '文件内容类型'; COMMENT ON COLUMN js_sys_file_entity.file_extension IS '文件后缀扩展名'; COMMENT ON COLUMN js_sys_file_entity.file_size IS '文件大小(单位B)'; +COMMENT ON COLUMN js_sys_file_entity.file_meta IS '文件信息(JSON格式)'; COMMENT ON TABLE js_sys_file_upload IS '文件上传表'; COMMENT ON COLUMN js_sys_file_upload.id IS '编号'; COMMENT ON COLUMN js_sys_file_upload.file_id IS '文件编号'; @@ -1133,6 +1136,7 @@ COMMENT ON COLUMN js_sys_job.invoke_target IS '调用目标字符串'; COMMENT ON COLUMN js_sys_job.cron_expression IS 'Cron执行表达式'; COMMENT ON COLUMN js_sys_job.misfire_instruction IS '计划执行错误策略'; COMMENT ON COLUMN js_sys_job.concurrent IS '是否并发执行'; +COMMENT ON COLUMN js_sys_job.instance_name IS '集群的实例名字'; COMMENT ON COLUMN js_sys_job.status IS '状态(0正常 1删除 2暂停)'; COMMENT ON COLUMN js_sys_job.create_by IS '创建者'; COMMENT ON COLUMN js_sys_job.create_date IS '创建时间'; @@ -1248,7 +1252,7 @@ COMMENT ON COLUMN js_sys_msg_inner.msg_title IS '消息标题'; COMMENT ON COLUMN js_sys_msg_inner.content_level IS '内容级别(1普通 2一般 3紧急)'; COMMENT ON COLUMN js_sys_msg_inner.content_type IS '内容类型(1公告 2新闻 3会议 4其它)'; COMMENT ON COLUMN js_sys_msg_inner.msg_content IS '消息内容'; -COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(1用户 2部门 3角色 4岗位)'; +COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(0全部 1用户 2部门 3角色 4岗位)'; COMMENT ON COLUMN js_sys_msg_inner.receive_codes IS '接受者字符串'; COMMENT ON COLUMN js_sys_msg_inner.receive_names IS '接受者名称字符串'; COMMENT ON COLUMN js_sys_msg_inner.send_user_code IS '发送者用户编码'; diff --git a/modules/core/db/postgresql/core.sql b/modules/core/db/postgresql/core.sql index b0cf5453..0a0403c5 100644 --- a/modules/core/db/postgresql/core.sql +++ b/modules/core/db/postgresql/core.sql @@ -289,11 +289,12 @@ CREATE TABLE js_sys_employee_post CREATE TABLE js_sys_file_entity ( file_id varchar(64) NOT NULL, - file_md5 varchar(64) NOT NULL UNIQUE, + file_md5 varchar(64) NOT NULL, file_path varchar(1000) NOT NULL, file_content_type varchar(200) NOT NULL, file_extension varchar(100) NOT NULL, file_size decimal(31) NOT NULL, + file_meta varchar(255), PRIMARY KEY (file_id) ) WITHOUT OIDS; @@ -327,6 +328,7 @@ CREATE TABLE js_sys_job cron_expression varchar(255) NOT NULL, misfire_instruction decimal(1) NOT NULL, concurrent char(1) NOT NULL, + instance_name varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL, status char(1) NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, @@ -479,13 +481,13 @@ CREATE TABLE js_sys_msg_inner content_type char(1), msg_content text NOT NULL, receive_type char(1) NOT NULL, - receive_codes text NOT NULL, - receive_names text NOT NULL, - send_user_code varchar(64) NOT NULL, - send_user_name varchar(100) NOT NULL, - send_date timestamp NOT NULL, + receive_codes text, + receive_names text, + send_user_code varchar(64), + send_user_name varchar(100), + send_date timestamp, is_attac char(1), - notify_types varchar(100) NOT NULL, + notify_types varchar(100), status char(1) NOT NULL, create_by varchar(64) NOT NULL, create_date timestamp NOT NULL, @@ -1112,6 +1114,7 @@ COMMENT ON COLUMN js_sys_file_entity.file_path IS '文件相对路径'; COMMENT ON COLUMN js_sys_file_entity.file_content_type IS '文件内容类型'; COMMENT ON COLUMN js_sys_file_entity.file_extension IS '文件后缀扩展名'; COMMENT ON COLUMN js_sys_file_entity.file_size IS '文件大小(单位B)'; +COMMENT ON COLUMN js_sys_file_entity.file_meta IS '文件信息(JSON格式)'; COMMENT ON TABLE js_sys_file_upload IS '文件上传表'; COMMENT ON COLUMN js_sys_file_upload.id IS '编号'; COMMENT ON COLUMN js_sys_file_upload.file_id IS '文件编号'; @@ -1133,6 +1136,7 @@ COMMENT ON COLUMN js_sys_job.invoke_target IS '调用目标字符串'; COMMENT ON COLUMN js_sys_job.cron_expression IS 'Cron执行表达式'; COMMENT ON COLUMN js_sys_job.misfire_instruction IS '计划执行错误策略'; COMMENT ON COLUMN js_sys_job.concurrent IS '是否并发执行'; +COMMENT ON COLUMN js_sys_job.instance_name IS '集群的实例名字'; COMMENT ON COLUMN js_sys_job.status IS '状态(0正常 1删除 2暂停)'; COMMENT ON COLUMN js_sys_job.create_by IS '创建者'; COMMENT ON COLUMN js_sys_job.create_date IS '创建时间'; @@ -1248,7 +1252,7 @@ COMMENT ON COLUMN js_sys_msg_inner.msg_title IS '消息标题'; COMMENT ON COLUMN js_sys_msg_inner.content_level IS '内容级别(1普通 2一般 3紧急)'; COMMENT ON COLUMN js_sys_msg_inner.content_type IS '内容类型(1公告 2新闻 3会议 4其它)'; COMMENT ON COLUMN js_sys_msg_inner.msg_content IS '消息内容'; -COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(1用户 2部门 3角色 4岗位)'; +COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(0全部 1用户 2部门 3角色 4岗位)'; COMMENT ON COLUMN js_sys_msg_inner.receive_codes IS '接受者字符串'; COMMENT ON COLUMN js_sys_msg_inner.receive_names IS '接受者名称字符串'; COMMENT ON COLUMN js_sys_msg_inner.send_user_code IS '发送者用户编码'; diff --git a/modules/core/pom.xml b/modules/core/pom.xml index da5d32c8..def35ee4 100644 --- a/modules/core/pom.xml +++ b/modules/core/pom.xml @@ -6,7 +6,7 @@ com.jeesite jeesite-parent - 4.1.3-SNAPSHOT + 4.1.4-SNAPSHOT ../../parent/pom.xml diff --git a/modules/core/src/main/java/com/jeesite/common/shiro/filter/CasAuthenticationFilter.java b/modules/core/src/main/java/com/jeesite/common/shiro/filter/CasAuthenticationFilter.java index 34df47fc..dcb8126e 100644 --- a/modules/core/src/main/java/com/jeesite/common/shiro/filter/CasAuthenticationFilter.java +++ b/modules/core/src/main/java/com/jeesite/common/shiro/filter/CasAuthenticationFilter.java @@ -38,12 +38,8 @@ public class CasAuthenticationFilter extends org.apache.shiro.cas.CasFilter { // 登录成功后初始化授权信息并处理登录后的操作 authorizingRealm.onLoginSuccess((LoginInfo)subject.getPrincipal(), (HttpServletRequest)request); - String url = request.getParameter("__url"); - if (StringUtils.isNotBlank(url)) { - WebUtils.issueRedirect(request, response, url, null, true); - } else { - WebUtils.issueRedirect(request, response, getSuccessUrl(), null, true); - } + // AJAX不支持Redirect改用Forward + request.getRequestDispatcher(getSuccessUrl()).forward(request, response); return false; } @@ -55,12 +51,8 @@ public class CasAuthenticationFilter extends org.apache.shiro.cas.CasFilter { Subject subject = getSubject(request, response); if (subject.isAuthenticated() || subject.isRemembered()) { try { - String url = request.getParameter("__url"); - if (StringUtils.isNotBlank(url)) { - WebUtils.issueRedirect(request, response, url, null, true); - } else { - WebUtils.issueRedirect(request, response, getSuccessUrl(), null, true); - } + // AJAX不支持Redirect改用Forward + request.getRequestDispatcher(getSuccessUrl()).forward(request, response); } catch (Exception e) { e.printStackTrace(); } diff --git a/modules/core/src/main/java/com/jeesite/common/shiro/filter/FormAuthenticationFilter.java b/modules/core/src/main/java/com/jeesite/common/shiro/filter/FormAuthenticationFilter.java index bc69ba63..1c2f32f9 100644 --- a/modules/core/src/main/java/com/jeesite/common/shiro/filter/FormAuthenticationFilter.java +++ b/modules/core/src/main/java/com/jeesite/common/shiro/filter/FormAuthenticationFilter.java @@ -95,7 +95,7 @@ public class FormAuthenticationFilter extends org.apache.shiro.web.filter.authc. } // 登录成功后,判断是否需要记住用户名 if (WebUtils.isTrue(request, DEFAULT_REMEMBER_USERCODE_PARAM)) { - rememberUserCodeCookie.setValue(EncodeUtils.xssFilter(username)); + rememberUserCodeCookie.setValue(EncodeUtils.encodeUrl(EncodeUtils.xssFilter(username))); rememberUserCodeCookie.saveTo((HttpServletRequest)request, (HttpServletResponse)response); } else { rememberUserCodeCookie.removeFrom((HttpServletRequest)request, (HttpServletResponse)response); @@ -235,19 +235,8 @@ public class FormAuthenticationFilter extends org.apache.shiro.web.filter.authc. // 登录成功后初始化授权信息并处理登录后的操作 authorizingRealm.onLoginSuccess((LoginInfo)subject.getPrincipal(), (HttpServletRequest) request); - // 登录操作如果是Ajax操作,直接返回登录信息字符串。 - if (ServletUtils.isAjaxRequest((HttpServletRequest) request)) { - request.getRequestDispatcher(getSuccessUrl()).forward(request, response); // AJAX不支持Redirect改用Forward - } - // 登录成功直接返回到首页 - else { - String url = request.getParameter("__url"); - if (StringUtils.isNotBlank(url)) { - WebUtils.issueRedirect(request, response, url, null, true); - } else { - WebUtils.issueRedirect(request, response, getSuccessUrl(), null, true); - } - } + // AJAX不支持Redirect改用Forward + request.getRequestDispatcher(getSuccessUrl()).forward(request, response); return false; } diff --git a/modules/core/src/main/java/com/jeesite/common/shiro/realm/AuthorizingRealm.java b/modules/core/src/main/java/com/jeesite/common/shiro/realm/AuthorizingRealm.java index 4f1e7d1a..83b4167c 100644 --- a/modules/core/src/main/java/com/jeesite/common/shiro/realm/AuthorizingRealm.java +++ b/modules/core/src/main/java/com/jeesite/common/shiro/realm/AuthorizingRealm.java @@ -5,8 +5,6 @@ package com.jeesite.common.shiro.realm; import javax.servlet.http.HttpServletRequest; -import org.apache.shiro.authc.credential.HashedCredentialsMatcher; - import com.jeesite.common.codec.EncodeUtils; import com.jeesite.common.codec.Sha1Utils; import com.jeesite.common.utils.SpringUtils; @@ -31,10 +29,10 @@ public class AuthorizingRealm extends BaseAuthorizingRealm { public AuthorizingRealm() { super(); - // 设定密码校验的Hash算法与迭代次数 - HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(HASH_ALGORITHM); - matcher.setHashIterations(HASH_INTERATIONS); - this.setCredentialsMatcher(matcher); +// // 设定密码校验的Hash算法与迭代次数(V4.1.4及以上版本不需要了,统一使用validatePassword验证密码) +// HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(HASH_ALGORITHM); +// matcher.setHashIterations(HASH_INTERATIONS); +// this.setCredentialsMatcher(matcher); } /** diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerDao.java b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerDao.java new file mode 100644 index 00000000..8c010032 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerDao.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.msg.entity.MsgInner; + +/** + * 内部消息DAO接口 + * @author ThinkGem + * @version 2019-03-12 + */ +@MyBatisDao +public interface MsgInnerDao extends CrudDao { + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerRecordDao.java b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerRecordDao.java new file mode 100644 index 00000000..dff9ab26 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerRecordDao.java @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.msg.entity.MsgInnerRecord; + +/** + * 内部消息发送记录表DAO接口 + * @author ThinkGem + * @version 2019-03-12 + */ +@MyBatisDao +public interface MsgInnerRecordDao extends CrudDao { + + /** + * 根据消息编号和接受者用户名更新读取状态 + */ + public long updateReadStatus(MsgInnerRecord msgInnerRecord); + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInner.java b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInner.java new file mode 100644 index 00000000..faed61fb --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInner.java @@ -0,0 +1,214 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.entity; + +import java.util.Date; + +import javax.validation.constraints.NotBlank; + +import org.hibernate.validator.constraints.Length; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.lang.DateUtils; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; + +/** + * 内部消息Entity + * @author ThinkGem + * @version 2019-03-12 + */ +@Table(name="${_prefix}sys_msg_inner", alias="a", columns={ + @Column(name="id", attrName="id", label="编号", isPK=true), + @Column(name="msg_title", attrName="msgTitle", label="消息标题", queryType=QueryType.LIKE), + @Column(name="content_level", attrName="contentLevel", label="内容等级", comment="内容等级(1普通 2一般 3紧急)"), + @Column(name="content_type", attrName="contentType", label="内容类型", comment="内容类型(1公告 2新闻 3会议 4其它)"), + @Column(name="msg_content", attrName="msgContent", label="消息内容"), + @Column(name="receive_type", attrName="receiveType", label="接受者类型", comment="接受者类型(1用户 2部门 3角色 4岗位)"), + @Column(name="receive_codes", attrName="receiveCodes", label="接受者字符串"), + @Column(name="receive_names", attrName="receiveNames", label="接受者名称字符串", queryType=QueryType.LIKE), + @Column(name="send_user_code", attrName="sendUserCode", label="发送者用户编码"), + @Column(name="send_user_name", attrName="sendUserName", label="发送者用户姓名", queryType=QueryType.LIKE), + @Column(name="send_date", attrName="sendDate", label="发送时间"), + @Column(name="is_attac", attrName="isAttac", label="是否有附件"), + @Column(name="notify_types", attrName="notifyTypes", label="通知类型", comment="通知类型(PC APP 短信 邮件 微信)多选"), + @Column(includeEntity=DataEntity.class, comment="状态(0正常 1删除 4审核 5驳回 9草稿)"), + }, orderBy="a.update_date DESC" +) +public class MsgInner extends DataEntity { + + // 接受者类型(0所有 1用户 2部门 3角色 4岗位) + public static final String RECEIVE_TYPE_ALL = "0"; + public static final String RECEIVE_TYPE_USER = "1"; + public static final String RECEIVE_TYPE_OFFICE = "2"; + public static final String RECEIVE_TYPE_ROLE = "3"; + public static final String RECEIVE_TYPE_POST = "4"; + + // 内容级别(1普通 2一般 3紧急) + public static final String CONTENT_LEVEL_1 = "1"; + public static final String CONTENT_LEVEL_2 = "2"; + public static final String CONTENT_LEVEL_3 = "3"; + + private static final long serialVersionUID = 1L; + private String msgTitle; // 消息标题 + private String contentLevel; // 内容等级(1普通 2一般 3紧急) + private String contentType; // 内容类型(1公告 2新闻 3会议 4其它) + private String msgContent; // 消息内容 + private String receiveType; // 接受者类型(1用户 2部门 3角色 4岗位) + private String receiveCodes; // 接受者字符串 + private String receiveNames; // 接受者名称字符串 + private String sendUserCode; // 发送者用户编码 + private String sendUserName; // 发送者用户姓名 + private Date sendDate; // 发送时间 + private String isAttac; // 是否有附件 + private String notifyTypes; // 通知类型(PC APP 短信 邮件 微信)多选 + + private MsgInnerRecord record; // 消息记录状态 + + public MsgInner() { + this(null); + } + + public MsgInner(String id){ + super(id); + } + + @NotBlank(message="消息标题不能为空") + @Length(min=0, max=200, message="消息标题长度不能超过 200 个字符") + public String getMsgTitle() { + return msgTitle; + } + + public void setMsgTitle(String msgTitle) { + this.msgTitle = msgTitle; + } + + @NotBlank(message="内容级别不能为空") + @Length(min=0, max=1, message="内容级别长度不能超过 1 个字符") + public String getContentLevel() { + return contentLevel; + } + + public void setContentLevel(String contentLevel) { + this.contentLevel = contentLevel; + } + + @Length(min=0, max=1, message="内容类型长度不能超过 1 个字符") + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + @NotBlank(message="消息内容不能为空") + public String getMsgContent() { + return msgContent; + } + + public void setMsgContent(String msgContent) { + this.msgContent = msgContent; + } + + @NotBlank(message="接受者类型不能为空") + @Length(min=0, max=1, message="接受者类型长度不能超过 1 个字符") + public String getReceiveType() { + return receiveType; + } + + public void setReceiveType(String receiveType) { + this.receiveType = receiveType; + } + + public String getReceiveCodes() { + return receiveCodes; + } + + public void setReceiveCodes(String receiveCodes) { + this.receiveCodes = receiveCodes; + } + + public String getReceiveNames() { + return receiveNames; + } + + public void setReceiveNames(String receiveNames) { + this.receiveNames = receiveNames; + } + + @Length(min=0, max=64, message="发送者用户编码长度不能超过 64 个字符") + public String getSendUserCode() { + return sendUserCode; + } + + public void setSendUserCode(String sendUserCode) { + this.sendUserCode = sendUserCode; + } + + @Length(min=0, max=100, message="发送者用户姓名长度不能超过 100 个字符") + public String getSendUserName() { + return sendUserName; + } + + public void setSendUserName(String sendUserName) { + this.sendUserName = sendUserName; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getSendDate() { + return sendDate; + } + + public void setSendDate(Date sendDate) { + this.sendDate = sendDate; + } + + public Date getSendDate_gte() { + return sqlMap.getWhere().getValue("send_date", QueryType.GTE); + } + + public void setSendDate_gte(Date sendDate) { + sendDate = DateUtils.getOfDayFirst(sendDate); + sqlMap.getWhere().and("send_date", QueryType.GTE, sendDate); + } + + public Date getSendDate_lte() { + return sqlMap.getWhere().getValue("send_date", QueryType.LTE); + } + + public void setSendDate_lte(Date sendDate) { + sendDate = DateUtils.getOfDayLast(sendDate); + sqlMap.getWhere().and("send_date", QueryType.LTE, sendDate); + } + + @Length(min=0, max=1, message="是否有附件长度不能超过 1 个字符") + public String getIsAttac() { + return isAttac; + } + + public void setIsAttac(String isAttac) { + this.isAttac = isAttac; + } + + @Length(min=0, max=100, message="通知类型长度不能超过 100 个字符") + public String getNotifyTypes() { + return notifyTypes; + } + + public void setNotifyTypes(String notifyTypes) { + this.notifyTypes = notifyTypes; + } + + public MsgInnerRecord getRecord() { + return record; + } + + public void setRecord(MsgInnerRecord record) { + this.record = record; + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInnerRecord.java b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInnerRecord.java new file mode 100644 index 00000000..c4adf6f3 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInnerRecord.java @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.entity; + +import java.util.Date; + +import javax.validation.constraints.NotBlank; + +import org.hibernate.validator.constraints.Length; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; + +/** + * 内部消息发送记录表Entity + * @author ThinkGem + * @version 2019-03-12 + */ +@Table(name="${_prefix}sys_msg_inner_record", alias="a", columns={ + @Column(name="id", attrName="id", label="编号", isPK=true), + @Column(name="msg_inner_id", attrName="msgInnerId", label="所属消息"), + @Column(name="receive_user_code", attrName="receiveUserCode", label="接受者用户编码"), + @Column(name="receive_user_name", attrName="receiveUserName", label="接受者用户姓名", queryType=QueryType.LIKE), + @Column(name="read_status", attrName="readStatus", label="读取状态", comment="读取状态(0未送达 1已读 2未读)"), + @Column(name="read_date", attrName="readDate", label="阅读时间"), + @Column(name="is_star", attrName="isStar", label="是否标星"), + }, orderBy="a.read_date ASC, a.id ASC" +) +public class MsgInnerRecord extends DataEntity { + + // 读取状态(0未送达 1已读 2未读) + public static final String READ_STATUS_READ = "1"; + public static final String READ_STATUS_UNREAD = "2"; + + private static final long serialVersionUID = 1L; + private String msgInnerId; // 所属消息 + private String receiveUserCode; // 接受者用户编码 + private String receiveUserName; // 接受者用户姓名 + private String readStatus; // 读取状态(0未送达 1已读 2未读) + private Date readDate; // 阅读时间 + private String isStar; // 是否标星 + + public MsgInnerRecord() { + this(null); + } + + public MsgInnerRecord(String id){ + super(id); + } + + @NotBlank(message="所属消息不能为空") + @Length(min=0, max=64, message="所属消息长度不能超过 64 个字符") + public String getMsgInnerId() { + return msgInnerId; + } + + public void setMsgInnerId(String msgInnerId) { + this.msgInnerId = msgInnerId; + } + + @Length(min=0, max=64, message="接受者用户编码长度不能超过 64 个字符") + public String getReceiveUserCode() { + return receiveUserCode; + } + + public void setReceiveUserCode(String receiveUserCode) { + this.receiveUserCode = receiveUserCode; + } + + @NotBlank(message="接受者用户姓名不能为空") + @Length(min=0, max=100, message="接受者用户姓名长度不能超过 100 个字符") + public String getReceiveUserName() { + return receiveUserName; + } + + public void setReceiveUserName(String receiveUserName) { + this.receiveUserName = receiveUserName; + } + + @NotBlank(message="读取状态不能为空") + @Length(min=0, max=1, message="读取状态长度不能超过 1 个字符") + public String getReadStatus() { + return readStatus; + } + + public void setReadStatus(String readStatus) { + this.readStatus = readStatus; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getReadDate() { + return readDate; + } + + public void setReadDate(Date readDate) { + this.readDate = readDate; + } + + @Length(min=0, max=1, message="是否标星长度不能超过 1 个字符") + public String getIsStar() { + return isStar; + } + + public void setIsStar(String isStar) { + this.isStar = isStar; + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/send/EmailSendService.java b/modules/core/src/main/java/com/jeesite/modules/msg/send/EmailSendService.java new file mode 100644 index 00000000..875df7fc --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/send/EmailSendService.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.send; + +import org.apache.commons.mail.HtmlEmail; +import org.springframework.stereotype.Service; + +import com.jeesite.common.config.Global; +import com.jeesite.common.lang.ExceptionUtils; +import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.service.BaseService; +import com.jeesite.modules.msg.entity.MsgPush; +import com.jeesite.modules.msg.entity.content.EmailMsgContent; +import com.jeesite.modules.msg.send.MsgSendService; + +/** + * 电子邮件发送服务实现 + * @author ThinkGem + * @version 2018年5月13日 + */ +@Service +public class EmailSendService extends BaseService implements MsgSendService{ + + @Override + public void sendMessage(MsgPush msgPush) { + try{ + String fromAddress = Global.getProperty("msg.email.fromAddress"); + String fromPassword = Global.getProperty("msg.email.fromPassword"); + String fromHostName = Global.getProperty("msg.email.fromHostName"); + Integer smtpPort = Global.getPropertyToInteger("msg.email.smtpPort", "25"); + String sslOnConnect = Global.getProperty("msg.email.sslOnConnect", "false"); + String sslSmtpPort = Global.getProperty("msg.email.sslSmtpPort", "465"); + + HtmlEmail htmlEmail = new HtmlEmail(); + htmlEmail.setCharset("utf-8"); + htmlEmail.setFrom(fromAddress); + htmlEmail.setAuthentication(fromAddress, fromPassword); + htmlEmail.setHostName(fromHostName); + htmlEmail.setSmtpPort(smtpPort); + if ("true".equals(sslOnConnect)) { + htmlEmail.setSSLOnConnect(true); + htmlEmail.setSslSmtpPort(sslSmtpPort); + } + htmlEmail.addTo(msgPush.getReceiveCode(), msgPush.getReceiveUserName()); + + // 内容 + EmailMsgContent content = msgPush.parseMsgContent(EmailMsgContent.class); + htmlEmail.setSubject(content.getTitle()); + htmlEmail.setMsg(content.getContent()); + + // 抄送 + if (StringUtils.isNotBlank(content.getCc())) { + for (String email : content.getCc().split(";")) { + htmlEmail.addCc(email); + } + } + // 密送 + if (StringUtils.isNotBlank(content.getBcc())) { + for (String email : content.getBcc().split(";")) { + htmlEmail.addBcc(email); + } + } + + // 发送邮件 + String result = htmlEmail.send(); + + // 发送成功 + msgPush.setPushStatus(MsgPush.PUSH_STATUS_SUCCESS); + msgPush.addPushReturnContent(result); + + } catch (Exception ex) { + logger.error("发送邮件失败! ", ex); + msgPush.setPushStatus(MsgPush.PUSH_STATUS_FAIL); + msgPush.addPushReturnContent(ExceptionUtils.getStackTraceAsString(ex)); + } + } +} diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/send/SmsSendService.java b/modules/core/src/main/java/com/jeesite/modules/msg/send/SmsSendService.java new file mode 100644 index 00000000..4f9cd0f0 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/send/SmsSendService.java @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.send; + +import java.util.Date; +import java.util.Map; + +import org.springframework.stereotype.Service; + +import com.jeesite.common.lang.ExceptionUtils; +import com.jeesite.common.lang.ObjectUtils; +import com.jeesite.common.mapper.JsonMapper; +import com.jeesite.common.msg.SmsUtils; +import com.jeesite.common.service.BaseService; +import com.jeesite.modules.msg.entity.MsgPush; +import com.jeesite.modules.msg.entity.content.SmsMsgContent; +import com.jeesite.modules.msg.send.MsgSendService; + +/** + * 短信发送服务实现 + * @author ThinkGem + * @version 2018年5月13日 + */ +@Service +public class SmsSendService extends BaseService implements MsgSendService{ + + @Override + public void sendMessage(MsgPush msgPush) { + try{ +// String url = Global.getProperty("msg.sms.url"); +// String data = Global.getProperty("msg.sms.data"); +// String prefix = Global.getProperty("msg.sms.prefix", ""); +// String suffix = Global.getProperty("msg.sms.suffix", ""); +// Connection conn = Jsoup.connect(url); +// conn.postDataCharset("UTF-8"); +// conn.method(Method.POST); +// for (String param : StringUtils.split(data, "&")){ +// String[] ss = StringUtils.split(param, "="); +// if (ss.length == 1){ +// conn.data(ss[0], ""); +// }else if (ss.length == 2){ +// conn.data(ss[0], ss[1]); +// } +// } +// // 手机号码 +// conn.data("mobile", msgPush.getReceiveCode()); +// // 短信内容 +// SmsMsgContent content = msgPush.parseMsgContent(SmsMsgContent.class); +// conn.data("content", prefix + content.getContent() + suffix); +// // 发送短信 +// String result = conn.execute().body(); +// String result = "{result:0,message:\"ok\"}"; // 模拟发送结果 +// Map map = JsonMapper.fromJson(result, Map.class); + + // 发送短信 + SmsMsgContent content = msgPush.parseMsgContent(SmsMsgContent.class); + String result = SmsUtils.send(content.getContent(), msgPush.getReceiveCode()); + Map map = JsonMapper.fromJson(result, Map.class); + + // 发送成功 + if (ObjectUtils.toInteger(map.get("result")) == 0){ + msgPush.setPushStatus(MsgPush.PUSH_STATUS_SUCCESS); + msgPush.addPushReturnContent(result); + } + // 发送失败 + else{ + throw new RuntimeException(result); + } + + } catch (Exception ex) { + logger.error("发送短信失败! ", ex); + msgPush.setPushDate(new Date()); + msgPush.setPushStatus(MsgPush.PUSH_STATUS_FAIL); + msgPush.addPushReturnContent(ExceptionUtils.getStackTraceAsString(ex)); + } + } + +} diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java b/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java new file mode 100644 index 00000000..2a014ce2 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java @@ -0,0 +1,243 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.service; + +import java.util.Date; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.jeesite.common.callback.MethodCallback; +import com.jeesite.common.collect.ListUtils; +import com.jeesite.common.config.Global; +import com.jeesite.common.entity.Page; +import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.service.CrudService; +import com.jeesite.common.web.http.ServletUtils; +import com.jeesite.modules.file.utils.FileUploadUtils; +import com.jeesite.modules.msg.dao.MsgInnerDao; +import com.jeesite.modules.msg.dao.MsgInnerRecordDao; +import com.jeesite.modules.msg.entity.MsgInner; +import com.jeesite.modules.msg.entity.MsgInnerRecord; +import com.jeesite.modules.msg.entity.MsgPush; +import com.jeesite.modules.msg.entity.content.AppMsgContent; +import com.jeesite.modules.msg.entity.content.BaseMsgContent; +import com.jeesite.modules.msg.entity.content.EmailMsgContent; +import com.jeesite.modules.msg.entity.content.PcMsgContent; +import com.jeesite.modules.msg.entity.content.SmsMsgContent; +import com.jeesite.modules.msg.utils.MsgPushUtils; +import com.jeesite.modules.sys.entity.EmpUser; +import com.jeesite.modules.sys.entity.User; +import com.jeesite.modules.sys.service.EmpUserService; + +/** + * 内部消息Service + * @author ThinkGem + * @version 2019-03-12 + */ +@Service +@Transactional(readOnly=true) +public class MsgInnerService extends CrudService { + + @Autowired + private EmpUserService empUserService; + @Autowired + private MsgInnerRecordDao msgInnerRecordDao; + + /** + * 获取单条数据 + * @param msgInner + * @return + */ + @Override + public MsgInner get(MsgInner msgInner) { + return super.get(msgInner); + } + + /** + * 查询分页数据 + * @param msgInner 查询条件 + * @param msgInner.page 分页对象 + * @return + */ + @Override + public Page findPage(MsgInner msgInner) { + return super.findPage(msgInner); + } + + /** + * 查询消息记录数据 + */ + public List findRecordList(MsgInnerRecord msgInnerRecord){ + return msgInnerRecordDao.findList(msgInnerRecord); + } + + /** + * 保存数据(插入或更新) + * @param msgInner + */ + @Override + @Transactional(readOnly=false) + public void save(MsgInner msgInner) { + if (msgInner.getIsNewRecord()){ + User user = msgInner.getCurrentUser(); + msgInner.setSendUserCode(user.getUserCode()); + msgInner.setSendUserName(user.getUserName()); + // 没有设置状态,则默认新增后是草稿状态 + if (StringUtils.isBlank(msgInner.getStatus())){ + msgInner.setStatus(MsgInner.STATUS_DRAFT); + } + } + msgInner.setSendDate(new Date()); + msgInner.setIsAttac(StringUtils.isNotBlank(ServletUtils.getParameter("msgInner_file"))?Global.YES:Global.NO); + super.save(msgInner); + // 保存上传附件 + FileUploadUtils.saveFileUpload(msgInner.getId(), "msgInner_file"); + // 发送内部消息 + if (MsgInner.STATUS_NORMAL.equals(msgInner.getStatus())){ + this.updateStatus(msgInner); // 更新状态 + List empUserList = null; + if (MsgInner.RECEIVE_TYPE_ALL.equals(msgInner.getReceiveType())){ + EmpUser empUser = new EmpUser(); + empUser.setCodes(new String[]{}); + empUserList = empUserService.findUserList(empUser); + }else{ + String[] codes = StringUtils.split(msgInner.getReceiveCodes(), ","); + String[] names = StringUtils.split(msgInner.getReceiveNames(), ","); + if (codes != null && names != null && codes.length > 0 && codes.length == names.length){ + EmpUser empUser = new EmpUser(); + empUser.setCodes(codes); + switch(msgInner.getReceiveType()){ + case MsgInner.RECEIVE_TYPE_USER: + empUserList = ListUtils.newArrayList(); + for (int i=0; i empUserList){ + if (empUserList == null || empUserList.size() <= 0){ + return; + } + String[] notifyTypes = StringUtils.split(msgInner.getNotifyTypes(), ","); + List recordList = ListUtils.newArrayList(); + empUserList.forEach(user -> { + MsgInnerRecord r = new MsgInnerRecord(); + r.setMsgInnerId(msgInner.getId()); + r.setReceiveUserCode(user.getUserCode()); + r.setReceiveUserName(user.getUserName()); + r.setReadStatus(MsgInnerRecord.READ_STATUS_UNREAD); + recordList.add(r); + // 发送消息通知(消息推送) + if (notifyTypes != null){ + for (String type : notifyTypes){ + BaseMsgContent msgContent = null; + if (MsgPush.TYPE_PC.equals(type)){ + msgContent = new PcMsgContent(); + msgContent.setContent("你有一条内部消息,点击“详情”进行查阅。"); + ((PcMsgContent)msgContent).addButton(new String[]{ + "详情", "/a/msg/msgInner/view?id="+msgInner.getId()}); + }else if (MsgPush.TYPE_APP.equals(type)){ + msgContent = new AppMsgContent(); + }else if (MsgPush.TYPE_SMS.equals(type)){ + msgContent = new SmsMsgContent(); + }else if (MsgPush.TYPE_EMAIL.equals(type)){ + msgContent = new EmailMsgContent(); + } + if (msgContent != null){ + msgContent.setTitle(msgInner.getMsgTitle()); + if (msgContent.getContent() == null){ + msgContent.setContent("你有一条内部消息请查阅:" + + StringUtils.abbr(msgInner.getMsgTitle(), 30)); + } + msgContent.setMsgPush(new MsgPush()); + msgContent.getMsgPush().setIsRealtimePush(false); // 关闭实时推送,改为手动推送 + MsgPushUtils.push(msgContent, msgInner.getId(), + MsgInner.class.getSimpleName(), user.getUserCode()); + } + } + } + }); + ListUtils.pageList(recordList, 100, new MethodCallback() { + @Override + @SuppressWarnings("unchecked") + public Object execute(Object... objs) { + msgInnerRecordDao.insertBatch((List)objs[0]); + return null; + } + }); + // 手动触发消息推送任务 + if (Global.TRUE.equals(Global.getProperty("msg.realtime.enabled"))){ + new Thread(){ + public void run() { + try{ + MsgPushUtils.getMsgPushTask().execute(); + }catch(Exception ex){ + logger.error("实时消息发送失败,推送服务配置不正确。", ex); + } + } + }.start(); + } + } + + /** + * 根据消息编号和接受者用户名读取内部消息 + */ + @Transactional(readOnly=false) + public void readMsgInnerRecord(MsgInner msgInner){ + MsgInnerRecord msgInnerRecord = new MsgInnerRecord(); + msgInnerRecord.setMsgInnerId(msgInner.getId()); + msgInnerRecord.setReceiveUserCode(msgInner.getCurrentUser().getUserCode()); + msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_READ); + msgInnerRecord.setReadDate(new Date()); + msgInnerRecordDao.updateReadStatus(msgInnerRecord); + // 将关联的内部消息通知更新为已读(消息推送) + MsgPushUtils.readMsgByBiz(msgInner.getId(), MsgInner.class.getSimpleName(), + msgInnerRecord.getReceiveUserCode()); + } + + /** + * 更新状态 + * @param msgInner + */ + @Override + @Transactional(readOnly=false) + public void updateStatus(MsgInner msgInner) { + super.updateStatus(msgInner); + } + + /** + * 删除数据 + * @param msgInner + */ + @Override + @Transactional(readOnly=false) + public void delete(MsgInner msgInner) { + super.delete(msgInner); + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/web/MsgInnerController.java b/modules/core/src/main/java/com/jeesite/modules/msg/web/MsgInnerController.java new file mode 100644 index 00000000..44c2d648 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/web/MsgInnerController.java @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.modules.msg.web; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.jeesite.common.config.Global; +import com.jeesite.common.entity.Page; +import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.web.BaseController; +import com.jeesite.modules.msg.entity.MsgInner; +import com.jeesite.modules.msg.entity.MsgInnerRecord; +import com.jeesite.modules.msg.entity.MsgPush; +import com.jeesite.modules.msg.service.MsgInnerService; + +/** + * 内部消息Controller + * @author ThinkGem + * @version 2019-03-12 + */ +@Controller +@RequestMapping(value = "${adminPath}/msg/msgInner") +public class MsgInnerController extends BaseController { + + @Autowired + private MsgInnerService msgInnerService; + + /** + * 获取数据 + */ + @ModelAttribute + public MsgInner get(String id, boolean isNewRecord) { + return msgInnerService.get(id, isNewRecord); + } + + /** + * 查询列表 + */ + @RequiresPermissions("msg:msgInner:view") + @RequestMapping(value = {"list", ""}) + public String list(MsgInner msgInner, Model model) { + model.addAttribute("msgInner", msgInner); + return "modules/msg/msgInnerList"; + } + + /** + * 查询列表数据 + */ + @RequiresPermissions("msg:msgInner:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(MsgInner msgInner, HttpServletRequest request, HttpServletResponse response) { + msgInner.setPage(new Page<>(request, response)); + msgInner.setRecord(new MsgInnerRecord()); + msgInner.getRecord().setReceiveUserCode(msgInner.getCurrentUser().getUserCode()); + Page page = msgInnerService.findPage(msgInner); + return page; + } + + /** + * 查看编辑表单 + */ + @RequiresPermissions("msg:msgInner:view") + @RequestMapping(value = "form") + public String form(MsgInner msgInner, Model model) { + if (StringUtils.isBlank(msgInner.getNotifyTypes())){ + msgInner.setNotifyTypes(MsgPush.TYPE_PC); + } + if (StringUtils.isBlank(msgInner.getContentLevel())){ + msgInner.setContentLevel(MsgInner.CONTENT_LEVEL_1); + } + if (StringUtils.isBlank(msgInner.getReceiveType())){ + msgInner.setReceiveType(MsgInner.RECEIVE_TYPE_USER); + } + model.addAttribute("msgInner", msgInner); + return "modules/msg/msgInnerForm"; + } + + /** + * 查看编辑表单 + */ + @RequiresPermissions("msg:msgInner:view") + @RequestMapping(value = "view") + public String view(MsgInner msgInner, Model model) { + model.addAttribute("msgInner", msgInner); + // 根据消息编号和接受者用户名读取内部消息 + msgInnerService.readMsgInnerRecord(msgInner); + // 查询已读和未读用户列表数据 + MsgInnerRecord msgInnerRecord = new MsgInnerRecord(); + msgInnerRecord.setMsgInnerId(msgInner.getId()); + msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_READ); + model.addAttribute("readList", msgInnerService.findRecordList(msgInnerRecord)); + msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_UNREAD); + model.addAttribute("unReadList", msgInnerService.findRecordList(msgInnerRecord)); + return "modules/msg/msgInnerView"; + } + + /** + * 保存消息 + */ + @RequiresPermissions("msg:msgInner:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated MsgInner msgInner, HttpServletRequest request) { + MsgInner old = super.getWebDataBinderSource(request); + if (old != null && MsgInner.STATUS_NORMAL.equals(old.getStatus())){ + return renderResult(Global.FALSE, "数据已发布,不允许修改!"); + } + msgInnerService.save(msgInner); + return renderResult(Global.TRUE, text("保存消息成功!")); + } + + /** + * 删除消息 + */ + @RequiresPermissions("msg:msgInner:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(MsgInner msgInner, HttpServletRequest request) { + MsgInner old = super.getWebDataBinderSource(request); + if (old != null && MsgInner.STATUS_NORMAL.equals(old.getStatus())){ + return renderResult(Global.FALSE, "数据已发布,不允许删除!"); + } + msgInnerService.delete(msgInner); + return renderResult(Global.TRUE, text("删除消息成功!")); + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/dao/EmpUserDao.java b/modules/core/src/main/java/com/jeesite/modules/sys/dao/EmpUserDao.java index b320d9f3..d26eac69 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/dao/EmpUserDao.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/dao/EmpUserDao.java @@ -3,6 +3,8 @@ */ package com.jeesite.modules.sys.dao; +import java.util.List; + import com.jeesite.common.dao.CrudDao; import com.jeesite.common.datasource.DataSourceHolder; import com.jeesite.common.mybatis.annotation.MyBatisDao; @@ -16,4 +18,24 @@ import com.jeesite.modules.sys.entity.EmpUser; @MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT) public interface EmpUserDao extends CrudDao { + /** + * 查询全部用户,仅返回基本信息 + */ + public List findUserList(EmpUser empUser); + + /** + * 根据部门编码查询用户,仅返回基本信息 + */ + public List findUserListByOfficeCodes(EmpUser empUser); + + /** + * 根据角色编码查询用户,仅返回基本信息 + */ + public List findUserListByRoleCodes(EmpUser empUser); + + /** + * 根据岗位编码查询用户,仅返回基本信息 + */ + public List findUserListByPostCodes(EmpUser empUser); + } \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/db/InitCoreData.xlsx b/modules/core/src/main/java/com/jeesite/modules/sys/db/InitCoreData.xlsx index 4628dc8c..1cb5495a 100644 Binary files a/modules/core/src/main/java/com/jeesite/modules/sys/db/InitCoreData.xlsx and b/modules/core/src/main/java/com/jeesite/modules/sys/db/InitCoreData.xlsx differ diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java b/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java index 22fbf587..6e576c52 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java @@ -68,7 +68,9 @@ import com.jeesite.common.utils.excel.fieldtype.OfficeType; public class EmpUser extends User { private static final long serialVersionUID = 1L; - + + private String[] codes; // 查询用 + public EmpUser() { this(null); } @@ -103,5 +105,13 @@ public class EmpUser extends User { public void setEmployee(Employee employee){ super.setRefObj(employee); } + + public String[] getCodes() { + return codes; + } + + public void setCodes(String[] codes) { + this.codes = codes; + } } \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/entity/Post.java b/modules/core/src/main/java/com/jeesite/modules/sys/entity/Post.java index a9a2b8a5..735a4c4a 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/entity/Post.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/entity/Post.java @@ -19,7 +19,7 @@ import com.jeesite.common.mybatis.mapper.query.QueryType; @Column(name="post_name", attrName="postName", label="岗位名称"), @Column(name="post_type", attrName="postType", label="岗位分类", comment="岗位分类(高管、中层、基层)"), @Column(name="post_sort", attrName="postSort", label="岗位排序", comment="岗位排序(升序)"), - }, orderBy="a.update_date DESC" + }, orderBy="a.post_sort ASC" ) public class Post extends DataEntity { diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/service/EmpUserService.java b/modules/core/src/main/java/com/jeesite/modules/sys/service/EmpUserService.java index a89e9121..4114d7ed 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/service/EmpUserService.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/service/EmpUserService.java @@ -3,6 +3,8 @@ */ package com.jeesite.modules.sys.service; +import java.util.List; + import org.springframework.web.multipart.MultipartFile; import com.jeesite.common.entity.Page; @@ -35,6 +37,26 @@ public interface EmpUserService extends CrudServiceApi { */ @Override public Page findPage(EmpUser empUser); + + /** + * 查询全部用户,仅返回基本信息 + */ + public List findUserList(EmpUser empUser); + + /** + * 根据部门编码查询用户,仅返回基本信息 + */ + public List findUserListByOfficeCodes(EmpUser empUser); + + /** + * 根据角色编码查询用户,仅返回基本信息 + */ + public List findUserListByRoleCodes(EmpUser empUser); + + /** + * 根据岗位编码查询用户,仅返回基本信息 + */ + public List findUserListByPostCodes(EmpUser empUser); /** * 保存用户员工 diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/service/support/EmpUserServiceSupport.java b/modules/core/src/main/java/com/jeesite/modules/sys/service/support/EmpUserServiceSupport.java index 8f0a0ef5..0e0198fc 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/service/support/EmpUserServiceSupport.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/service/support/EmpUserServiceSupport.java @@ -74,6 +74,34 @@ public class EmpUserServiceSupport extends CrudService return super.findPage(empUser); } + /** + * 查询全部用户,仅返回基本信息 + */ + public List findUserList(EmpUser empUser){ + return dao.findUserList(empUser); + } + + /** + * 根据部门编码查询用户,仅返回基本信息 + */ + public List findUserListByOfficeCodes(EmpUser empUser){ + return dao.findUserListByOfficeCodes(empUser); + } + + /** + * 根据角色编码查询用户,仅返回基本信息 + */ + public List findUserListByRoleCodes(EmpUser empUser){ + return dao.findUserListByRoleCodes(empUser); + } + + /** + * 根据岗位编码查询用户,仅返回基本信息 + */ + public List findUserListByPostCodes(EmpUser empUser){ + return dao.findUserListByPostCodes(empUser); + } + /** * 保存用户员工 */ diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java b/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java index 6e055a21..de522cc7 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java @@ -252,10 +252,10 @@ public class LoginController extends BaseController{ } } - // 获取登录成功页面 - String successUrl = Global.getProperty("shiro.successUrl"); - if (!StringUtils.contains(successUrl, "://")){ - successUrl = request.getContextPath() + successUrl; + // 获取登录成功后跳转的页面 + String successUrl = request.getParameter("__url"); + if (StringUtils.isBlank(successUrl)){ + successUrl = Global.getProperty("shiro.successUrl"); } // 登录操作如果是Ajax操作,直接返回登录信息字符串。 @@ -268,6 +268,9 @@ public class LoginController extends BaseController{ model.addAttribute("message", text("sys.login.getInfo")); } model.addAttribute("sessionid", (String)session.getId()); + if (!StringUtils.contains(successUrl, "://")){ + successUrl = request.getContextPath() + successUrl; + } model.addAttribute("__url", successUrl); // 告诉浏览器登录后跳转的页面 return ServletUtils.renderObject(response, model); } @@ -301,6 +304,11 @@ public class LoginController extends BaseController{ return null; } + // 非无类型用户,自动根据用户类型设置默认菜单的归属系统(个性化示例) + //if (!User.USER_TYPE_NONE.equals(user.getUserType())){ + // session.setAttribute("sysCode", user.getUserType()); + //} + // 返回指定用户类型的首页视图 String view = UserUtils.getUserTypeValue(user.getUserType(), "indexView"); if(StringUtils.isNotBlank(view)){ diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/web/PostController.java b/modules/core/src/main/java/com/jeesite/modules/sys/web/PostController.java index 26d9f077..8a5e62e8 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/web/PostController.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/web/PostController.java @@ -3,6 +3,9 @@ */ package com.jeesite.modules.sys.web; +import java.util.List; +import java.util.Map; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -17,8 +20,11 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import com.jeesite.common.collect.ListUtils; +import com.jeesite.common.collect.MapUtils; import com.jeesite.common.config.Global; import com.jeesite.common.entity.Page; +import com.jeesite.common.lang.StringUtils; import com.jeesite.common.web.BaseController; import com.jeesite.modules.sys.entity.Post; import com.jeesite.modules.sys.service.PostService; @@ -122,5 +128,29 @@ public class PostController extends BaseController { } return Global.FALSE; } + + /** + * 获取岗位树结构数据 + * @param isAll 是否显示所有机构(true:不进行权限过滤) + * @param isShowCode 是否显示编码(true or 1:显示在左侧;2:显示在右侧;false or null:不显示) + * @return + */ + @RequiresPermissions("user") + @RequestMapping(value = "treeData") + @ResponseBody + public List> treeData(String userType, String isShowCode, String ctrlPermi) { + List> mapList = ListUtils.newArrayList(); + Post where = new Post(); + where.setStatus(Post.STATUS_NORMAL); + List list = postService.findList(where); + list.forEach(e -> { + Map map = MapUtils.newHashMap(); + map.put("id", e.getId()); + map.put("pId", "0"); + map.put("name", StringUtils.getTreeNodeName(isShowCode, e.getPostCode(), e.getPostName())); + mapList.add(map); + }); + return mapList; + } } \ No newline at end of file diff --git a/modules/core/src/main/resources/config/jeesite-core.yml b/modules/core/src/main/resources/config/jeesite-core.yml index d0e50737..3408d311 100644 --- a/modules/core/src/main/resources/config/jeesite-core.yml +++ b/modules/core/src/main/resources/config/jeesite-core.yml @@ -47,6 +47,8 @@ jdbc: # JTA 分布式事务(v4.0.4+) jta: enabled: false + # 事务超时时间,单位毫秒(3分钟) + transactionTimeout: 180000 # 表名前缀 tablePrefix: js_ @@ -498,7 +500,14 @@ file: # application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document, # application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, # application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation - + + # 是否开启分片上传 + chunked: false + # 分片大小,单位字节(10M) + chunkSize: 10485760 + # 最大上传线程数 + threads: 1 + # 是否用文件流方式下载(支持断点续传) isFileStreamDown: true diff --git a/modules/core/src/main/resources/db/upgrade/core/mssql/mssql_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/mssql/mssql_4.1.4.sql new file mode 100644 index 00000000..af304f40 --- /dev/null +++ b/modules/core/src/main/resources/db/upgrade/core/mssql/mssql_4.1.4.sql @@ -0,0 +1,27 @@ + +-- 删除sys_file_entity表的file_md5唯一索引 +-- ALTER TABLE [${_prefix}sys_file_entity] DROP CONSTRAINT [UQ__${_prefix}sys_f__3BD63C9E32E0915F]; + +-- 增加文件信息字段(可存储图片大小) +ALTER TABLE [${_prefix}sys_file_entity] ADD [file_meta] varchar(64) NULL; + +-- 集群的实例名字 +ALTER TABLE [${_prefix}sys_job] ADD [instance_name] varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL; + +-- 内部消息菜单 +INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4) +VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', getdate(), 'system', getdate(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 内部消息新增字典数据 +INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks) +VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', getdate(), 'system', getdate(), ''); +INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4) +VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', getdate(), 'system', getdate(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 取消内部消息部分字段必填选项 +ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [receive_codes] text NULL; +ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [receive_names] text NULL; +ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_user_code] varchar(64) NULL; +ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_user_name] varchar(100) NULL; +ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_date] datetime NULL; +ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [notify_types] varchar(100) NULL; diff --git a/modules/core/src/main/resources/db/upgrade/core/mysql/mysql_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/mysql/mysql_4.1.4.sql new file mode 100644 index 00000000..e8b82c99 --- /dev/null +++ b/modules/core/src/main/resources/db/upgrade/core/mysql/mysql_4.1.4.sql @@ -0,0 +1,32 @@ + +-- 删除sys_file_entity表的file_md5唯一索引 +ALTER TABLE `${_prefix}sys_file_entity` +DROP INDEX `file_md5`, +ADD INDEX `file_md5`(`file_md5`); + +-- 增加文件信息字段(可存储图片大小) +ALTER TABLE `${_prefix}sys_file_entity` +ADD COLUMN `file_meta` varchar(255) NULL COMMENT '文件信息(JSON格式)' AFTER `file_size`; + +-- 集群的实例名字 +ALTER TABLE `${_prefix}sys_job` +ADD COLUMN `instance_name` varchar(64) NOT NULL DEFAULT 'JeeSiteScheduler' COMMENT '集群的实例名字' AFTER `concurrent`; + +-- 内部消息菜单 +INSERT INTO `${_prefix}sys_menu`(`menu_code`, `parent_code`, `parent_codes`, `tree_sort`, `tree_sorts`, `tree_leaf`, `tree_level`, `tree_names`, `menu_name`, `menu_type`, `menu_href`, `menu_target`, `menu_icon`, `menu_color`, `permission`, `weight`, `is_show`, `sys_code`, `module_codes`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `extend_s1`, `extend_s2`, `extend_s3`, `extend_s4`, `extend_s5`, `extend_s6`, `extend_s7`, `extend_s8`, `extend_i1`, `extend_i2`, `extend_i3`, `extend_i4`, `extend_f1`, `extend_f2`, `extend_f3`, `extend_f4`, `extend_d1`, `extend_d2`, `extend_d3`, `extend_d4`) +VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', now(), 'system', now(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 内部消息新增字典数据 +INSERT INTO `${_prefix}sys_dict_type`(`id`, `dict_name`, `dict_type`, `is_sys`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`) +VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', now(), 'system', now(), ''); +INSERT INTO `${_prefix}sys_dict_data`(`dict_code`, `parent_code`, `parent_codes`, `tree_sort`, `tree_sorts`, `tree_leaf`, `tree_level`, `tree_names`, `dict_label`, `dict_value`, `dict_type`, `is_sys`, `description`, `css_style`, `css_class`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `corp_code`, `corp_name`, `extend_s1`, `extend_s2`, `extend_s3`, `extend_s4`, `extend_s5`, `extend_s6`, `extend_s7`, `extend_s8`, `extend_i1`, `extend_i2`, `extend_i3`, `extend_i4`, `extend_f1`, `extend_f2`, `extend_f3`, `extend_f4`, `extend_d1`, `extend_d2`, `extend_d3`, `extend_d4`) +VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 取消内部消息部分字段必填选项 +ALTER TABLE `${_prefix}sys_msg_inner` +MODIFY COLUMN `receive_codes` text NULL COMMENT '接受者字符串' AFTER `receive_type`, +MODIFY COLUMN `receive_names` text NULL COMMENT '接受者名称字符串' AFTER `receive_codes`, +MODIFY COLUMN `send_user_code` varchar(64) NULL COMMENT '发送者用户编码' AFTER `receive_names`, +MODIFY COLUMN `send_user_name` varchar(100) NULL COMMENT '发送者用户姓名' AFTER `send_user_code`, +MODIFY COLUMN `send_date` datetime(0) NULL COMMENT '发送时间' AFTER `send_user_name`, +MODIFY COLUMN `notify_types` varchar(100) NULL COMMENT '通知类型(PC APP 短信 邮件 微信)多选' AFTER `is_attac`; diff --git a/modules/core/src/main/resources/db/upgrade/core/oracle/oracle_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/oracle/oracle_4.1.4.sql new file mode 100644 index 00000000..9db5c09d --- /dev/null +++ b/modules/core/src/main/resources/db/upgrade/core/oracle/oracle_4.1.4.sql @@ -0,0 +1,32 @@ + +-- 删除sys_file_entity表的file_md5唯一索引 +-- ALTER TABLE ${_prefix}SYS_FILE_ENTITY DROP CONSTRAINT SYS_C0019398 + +-- 增加文件信息字段(可存储图片大小) +ALTER TABLE ${_prefix}SYS_FILE_ENTITY +ADD (file_meta VARCHAR2(64) NULL ); +COMMENT ON COLUMN ${_prefix}SYS_FILE_ENTITY.file_meta IS '文件信息(JSON格式)'; + +-- 集群的实例名字 +ALTER TABLE ${_prefix}SYS_JOB +ADD (instance_name VARCHAR2(64) DEFAULT 'JeeSiteScheduler' NOT NULL ); +COMMENT ON COLUMN ${_prefix}SYS_JOB.instance_name IS '集群的实例名字'; + +-- 内部消息菜单 +INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4) +VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', sysdate, 'system', sysdate, '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 内部消息新增字典数据 +INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks) +VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', sysdate, 'system', sysdate, ''); +INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4) +VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', sysdate, 'system', sysdate, '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 取消内部消息部分字段必填选项 +ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (RECEIVE_CODES NULL ); +ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (RECEIVE_NAMES NULL ); +ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_USER_CODE NULL ); +ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_USER_NAME NULL ); +ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_DATE NULL ); +ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (NOTIFY_TYPES NULL ); + diff --git a/modules/core/src/main/resources/db/upgrade/core/postgresql/postgresql_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/postgresql/postgresql_4.1.4.sql new file mode 100644 index 00000000..9d33d6b8 --- /dev/null +++ b/modules/core/src/main/resources/db/upgrade/core/postgresql/postgresql_4.1.4.sql @@ -0,0 +1,34 @@ + +-- 删除sys_file_entity表的file_md5唯一索引 +ALTER TABLE ${_prefix}sys_file_entity +DROP CONSTRAINT ${_prefix}sys_file_entity_file_md5_key; + +-- 增加文件信息字段(可存储图片大小) +ALTER TABLE ${_prefix}sys_file_entity +ADD COLUMN file_meta varchar(255) NULL; +COMMENT ON COLUMN ${_prefix}sys_file_entity.file_meta IS '文件信息(JSON格式)'; + +-- 集群的实例名字 +ALTER TABLE ${_prefix}sys_job +ADD COLUMN instance_name varchar(255) NOT NULL DEFAULT 'JeeSiteScheduler'; +COMMENT ON COLUMN ${_prefix}sys_job.instance_name IS '集群的实例名字'; + +-- 内部消息菜单 +INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4) +VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', now(), 'system', now(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 内部消息新增字典数据 +INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks) +VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', now(), 'system', now(), ''); +INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4) +VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- 取消内部消息部分字段必填选项 +ALTER TABLE ${_prefix}sys_msg_inner + ALTER COLUMN receive_codes DROP NOT NULL, + ALTER COLUMN receive_names DROP NOT NULL, + ALTER COLUMN send_user_code DROP NOT NULL, + ALTER COLUMN send_user_name DROP NOT NULL, + ALTER COLUMN send_date DROP NOT NULL, + ALTER COLUMN notify_types DROP NOT NULL; + \ No newline at end of file diff --git a/modules/core/src/main/resources/db/upgrade/core/versions b/modules/core/src/main/resources/db/upgrade/core/versions index 65e4973c..a33d2623 100644 --- a/modules/core/src/main/resources/db/upgrade/core/versions +++ b/modules/core/src/main/resources/db/upgrade/core/versions @@ -9,4 +9,5 @@ 4.1.0 4.1.1 4.1.2 -4.1.3 \ No newline at end of file +4.1.3 +4.1.4 \ No newline at end of file diff --git a/modules/core/src/main/resources/i18n/core/common/i18n_en.properties b/modules/core/src/main/resources/i18n/core/common/i18n_en.properties index 4e606c29..df92d158 100644 --- a/modules/core/src/main/resources/i18n/core/common/i18n_en.properties +++ b/modules/core/src/main/resources/i18n/core/common/i18n_en.properties @@ -1,4 +1,3 @@ - # =========== 登录登出相关 =========== sys.login.notLongIn=No login or login timeout.Please login again, thank you! @@ -59,7 +58,7 @@ sys.error.returnButton=Previous page # =========== 文件上传相关 =========== -sys.file.uploadFileIsEmpty=This is a new file, please upload file! +sys.file.uploadFileIsEmpty=No files to upload! sys.file.uploadValidNotBlank=File md5 and file name cannot be empty! sys.file.uploadValidImage=Can only upload images ({0}) sys.file.uploadValidVideo=Can only upload video ({0}) @@ -70,3 +69,4 @@ sys.file.uploadValidContent=File content format not allowed! sys.file.uploadSuccessSeconds=Seconds upload success , time {0} sys.file.uploadSuccess=Upload success {0} sys.file.downloadFileNotExist=File lost or non-existent! +sys.file.chunkUploading=Uploading {0}/{1} diff --git a/modules/core/src/main/resources/i18n/core/common/i18n_zh_CN.properties b/modules/core/src/main/resources/i18n/core/common/i18n_zh_CN.properties index c3440dfa..31e46b3b 100644 --- a/modules/core/src/main/resources/i18n/core/common/i18n_zh_CN.properties +++ b/modules/core/src/main/resources/i18n/core/common/i18n_zh_CN.properties @@ -60,7 +60,7 @@ sys.error.returnButton=返回上一页 # =========== 文件上传相关 =========== -sys.file.uploadFileIsEmpty=没有找到上传的文件! +sys.file.uploadFileIsEmpty=服务器上没有这个文件! sys.file.uploadValidNotBlank=文件校验码和文件名不能为空! sys.file.uploadValidImage=只能上传图片({0}) sys.file.uploadValidVideo=只能上传视频({0}) @@ -71,3 +71,4 @@ sys.file.uploadValidContent=文件内容格式不允许! sys.file.uploadSuccessSeconds=秒传成功,用时{0} sys.file.uploadSuccess=上传成功,用时{0} sys.file.downloadFileNotExist=文件已丢失或不存在! +sys.file.chunkUploading=正在上传 {0}/{1} diff --git a/modules/core/src/main/resources/i18n/core/sys/i18n_en.properties b/modules/core/src/main/resources/i18n/core/sys/i18n_en.properties index 3e5bf84b..dfd14635 100644 --- a/modules/core/src/main/resources/i18n/core/sys/i18n_en.properties +++ b/modules/core/src/main/resources/i18n/core/sys/i18n_en.properties @@ -103,11 +103,11 @@ 您还未设置过密保问题,您可以根据登录密码设置新的密保问题及答案。=You have not set up the security problem, you can set up the new security problem and answer according to the login password. 旧的密保问题及答案=Old secret questions and answers -旧保密问题=Old secret questions -旧保密问题答案=Old secret answers +旧密保问题=Old secret questions +旧密保问题答案=Old secret answers 新的密保问题及答案=New secret questions and answers -新保密问题=New secret questions -新保密问题答案=New secret answers +新密保问题=New secret questions +新密保问题答案=New secret answers # =========== 用户管理 =========== diff --git a/modules/core/src/main/resources/mappings/modules/msg/MsgInnerDao.xml b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerDao.xml new file mode 100644 index 00000000..0caee9b0 --- /dev/null +++ b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerDao.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/core/src/main/resources/mappings/modules/msg/MsgInnerRecordDao.xml b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerRecordDao.xml new file mode 100644 index 00000000..55cb9413 --- /dev/null +++ b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerRecordDao.xml @@ -0,0 +1,24 @@ + + + + + + + + UPDATE ${_prefix}sys_msg_inner_record SET + read_status = #{readStatus}, + read_date = #{readDate} + WHERE msg_inner_id = #{msgInnerId} + AND receive_user_code = #{receiveUserCode} + AND read_date is null + + + \ No newline at end of file diff --git a/modules/core/src/main/resources/mappings/modules/sys/EmpUserDao.xml b/modules/core/src/main/resources/mappings/modules/sys/EmpUserDao.xml index f9d499b7..78990e14 100644 --- a/modules/core/src/main/resources/mappings/modules/sys/EmpUserDao.xml +++ b/modules/core/src/main/resources/mappings/modules/sys/EmpUserDao.xml @@ -24,4 +24,81 @@ ORDER BY ${sqlMap.order.toSql()} + + a.user_code as "userCode", + a.user_name as "userName" + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/core/src/main/resources/mybatis/mybatis-config.xml b/modules/core/src/main/resources/mybatis/mybatis-config.xml index b66bc042..764d897d 100644 --- a/modules/core/src/main/resources/mybatis/mybatis-config.xml +++ b/modules/core/src/main/resources/mybatis/mybatis-config.xml @@ -37,6 +37,9 @@ + + + diff --git a/modules/core/src/main/resources/views/modules/msg/msgInnerForm.html b/modules/core/src/main/resources/views/modules/msg/msgInnerForm.html new file mode 100644 index 00000000..67f93ecc --- /dev/null +++ b/modules/core/src/main/resources/views/modules/msg/msgInnerForm.html @@ -0,0 +1,177 @@ +<% layout('/layouts/default.html', {title: '站内消息', libs: ['validate','fileupload','ueditor']}){ %> +
+
+
+
+ ${text(msgInner.isNewRecord ? '发送消息' : '编辑消息')} +
+
+ +
+
+ <#form:form id="inputForm" model="${msgInner}" action="${ctx}/msg/msgInner/save" method="post" class="form-horizontal"> +
+
${text('基本信息')}
+ <#form:hidden path="id"/> + <#form:hidden path="status"/> +
+
+
+ +
+ <#form:input path="msgTitle" maxlength="200" class="form-control required text-ruler"/> +
+
+
+
+
+
+
+ +
+ <#form:radio path="contentLevel" dictType="msg_inner_content_level" class="form-control required" /> +
+
+
+
+
+ +
+ <#form:radio path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control" /> +
+
+
+
+
+
+
+ +
+ <#form:ueditor path="msgContent" rows="4" class="form-control required" simpleToolbars="true"/> +
+
+
+
+
+
+
+ +
+ <#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file" + uploadType="all" class="" readonly="false"/> +
+
+
+
+
${text('接受者信息')}
+
+
+
+ +
+ <#form:radio path="receiveType" dictType="msg_inner_receiver_type" class="form-control required" /> + <#form:treeselect id="receive" title="${text('接受者选择')}" + path="receiveCodes" labelPath="receiveNames" + url="${ctx}/sys/office/treeData?isLoadUser=true" + class=" required" allowClear="true" checkbox="true"/> +
+
+
+
+
+
+
+ +
+ <#form:checkbox path="notifyTypes" dictType="sys_msg_type" class="form-control required" /> + <% if(__info_type == '0'){ %>(专业版功能)<% } %> +
+
+
+
+ <% if(!msgInner.isNewRecord){ %> +
${text('发送者信息')}
+
+
+
+ +
+ <#form:input path="sendUserName" readonly="true" maxlength="100" class="form-control required"/> +
+
+
+
+
+ +
+ <#form:input path="sendDate" dataFormat="datetime" readonly="true" maxlength="20" class="form-control required"/> +
+
+
+
+ <% } %> +
+ + +
+
+<% } %> + \ No newline at end of file diff --git a/modules/core/src/main/resources/views/modules/msg/msgInnerList.html b/modules/core/src/main/resources/views/modules/msg/msgInnerList.html new file mode 100644 index 00000000..b7dc2a1f --- /dev/null +++ b/modules/core/src/main/resources/views/modules/msg/msgInnerList.html @@ -0,0 +1,107 @@ +<% layout('/layouts/default.html', {title: '站内消息', libs: ['dataGrid']}){ %> +
+
+
+
+ ${text('站内消息')} +
+
+ ${text('查询')} + <% if(hasPermi('msg:msgInner:edit')){ %> + ${text('新增')} + <% } %> +
+
+
+ <#form:form id="searchForm" model="${msgInner}" action="${ctx}/msg/msgInner/listData" method="post" class="form-inline hide" + data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}"> +
+ +
+ <#form:input path="msgTitle" maxlength="200" class="form-control width-120"/> +
+
+
+ +
+ <#form:select path="contentLevel" dictType="msg_inner_content_level" blankOption="true" class="form-control"/> +
+
+
+ +
+ <#form:select path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control"/> +
+
+
+ +
+ <#form:input path="sendDate_gte" readonly="true" maxlength="20" class="form-control Wdate-date" + dataFormat="date" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false,onpicked:function(){sendDate_lte.click()}});"/> +  --  + <#form:input path="sendDate_lte" readonly="true" maxlength="20" class="form-control Wdate-date" + dataFormat="date" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/> +
+
+
+ +
+ <#form:select path="status" dictType="msg_inner_msg_status" blankOption="true" class="form-control"/> +
+
+
+ + +
+ +
+
+ + + +<% } %> + \ No newline at end of file diff --git a/modules/core/src/main/resources/views/modules/msg/msgInnerView.html b/modules/core/src/main/resources/views/modules/msg/msgInnerView.html new file mode 100644 index 00000000..96573a0a --- /dev/null +++ b/modules/core/src/main/resources/views/modules/msg/msgInnerView.html @@ -0,0 +1,50 @@ +<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved. */ %> +<% layout('/layouts/default.html', {title: '查看消息', libs: ['validate','fileupload']}){ %> +
+
+
+
+ ${text('查看消息')} +
+
+ +
+
+
+

${msgInner.msgTitle}

+
+ + ${msgInner.msgContent} + <% if(msgInner.isAttac == @Global.YES){ %> +
+ <#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file" + uploadType="all" class="" readonly="true" preview="weboffice"/> +
+ <% } %> +
+ + <% if (readList! != null && readList.~size > 0){ %> + <% } %> + <% if (unReadList! != null && unReadList.~size > 0){ %> + <% } %> +
+ +
+
+<% } %> \ No newline at end of file diff --git a/modules/core/src/main/resources/views/modules/sys/user/empUserIndex.html b/modules/core/src/main/resources/views/modules/sys/user/empUserIndex.html index c4b17ba9..dc75620f 100644 --- a/modules/core/src/main/resources/views/modules/sys/user/empUserIndex.html +++ b/modules/core/src/main/resources/views/modules/sys/user/empUserIndex.html @@ -29,6 +29,7 @@ \ No newline at end of file