Browse Source

超欠供明细部分代码

user5 3 years atrás
parent
commit
20e829f324
18 changed files with 17699 additions and 83 deletions
  1. 30 25
      pom.xml
  2. 27 0
      src/main/java/com/jeeplus/modules/supply/particulars/entity/SupplyParticulars.java
  3. 28 4
      src/main/java/com/jeeplus/modules/supply/particulars/service/SupplyParticularsService.java
  4. 31 1
      src/main/java/com/jeeplus/modules/supply/particulars/web/SupplyParticularsController.java
  5. 674 0
      src/main/webapp/static/plugin/editable/bootstrap-editable/css/bootstrap-editable.css
  6. BIN
      src/main/webapp/static/plugin/editable/bootstrap-editable/img/clear.png
  7. BIN
      src/main/webapp/static/plugin/editable/bootstrap-editable/img/loading.gif
  8. 7083 0
      src/main/webapp/static/plugin/editable/bootstrap-editable/js/bootstrap-editable.js
  9. 7 0
      src/main/webapp/static/plugin/editable/bootstrap-editable/js/bootstrap-editable.min.js
  10. 180 0
      src/main/webapp/static/plugin/editable/bootstrap-table-editable.js
  11. 1917 0
      src/main/webapp/static/plugin/editable/bootstrap3-editable/bootstrap-table-editable.js
  12. 676 0
      src/main/webapp/static/plugin/editable/bootstrap3-editable/css/bootstrap-editable.css
  13. BIN
      src/main/webapp/static/plugin/editable/bootstrap3-editable/img/clear.png
  14. BIN
      src/main/webapp/static/plugin/editable/bootstrap3-editable/img/loading.gif
  15. 6883 0
      src/main/webapp/static/plugin/editable/bootstrap3-editable/js/bootstrap-editable.js
  16. 7 0
      src/main/webapp/static/plugin/editable/bootstrap3-editable/js/bootstrap-editable.min.js
  17. 151 53
      src/main/webapp/webpage/modules/supply/particulars/supplyParticularsList.js
  18. 5 0
      src/main/webapp/webpage/modules/supply/particulars/supplyParticularsList.jsp

+ 30 - 25
pom.xml

@@ -56,7 +56,7 @@
         <downloadSources>true</downloadSources>
 
     </properties>
-	
+
 	<!-- 设定仓库 -->
 	<repositories>
 		<repository>
@@ -94,7 +94,7 @@
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
-	
+
 		<repository>
 			<id>bitwalker.user-agent-utils.mvn.repo</id>
 			<url>https://nexus.jackpinetech.com/nexus/content/groups/public</url>
@@ -120,31 +120,31 @@
 			</resource>
 		</resources>
         <plugins>
-           
+
            <!-- tomcat6插件 -->
 			<plugin>
 				<groupId>org.apache.tomcat.maven</groupId>
 				<artifactId>tomcat6-maven-plugin</artifactId>
-				<version>${tomcat.version}</version> 
+				<version>${tomcat.version}</version>
 				<configuration>
 					<port>${webserver.port}</port>
 					<path>/${project.artifactId}</path>
 					<uriEncoding>${project.build.sourceEncoding}</uriEncoding>
 				</configuration>
 			</plugin>
-			
+
 			<!-- tomcat7插件 -->
 			<plugin>
 				<groupId>org.apache.tomcat.maven</groupId>
 				<artifactId>tomcat7-maven-plugin</artifactId>
-				<version>${tomcat.version}</version> 
+				<version>${tomcat.version}</version>
 				<configuration>
 					<port>${webserver.port}</port>
 					<path>/${project.artifactId}</path>
 					<uriEncoding>${project.build.sourceEncoding}</uriEncoding>
 				</configuration>
 			</plugin>
-           
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
@@ -235,17 +235,17 @@
             <artifactId>spring-jdbc</artifactId>
             <version>${spring.version}</version>
         </dependency>
-        
-        <!-- spring websocket--> 
-		<dependency>  
-           <groupId>org.springframework</groupId>  
-           <artifactId>spring-websocket</artifactId>  
-           <version>${spring.version}</version>  
-        </dependency>  
-        <dependency>  
-           <groupId>org.springframework</groupId>  
-           <artifactId>spring-messaging</artifactId>  
-           <version>${spring.version}</version>  
+
+        <!-- spring websocket-->
+		<dependency>
+           <groupId>org.springframework</groupId>
+           <artifactId>spring-websocket</artifactId>
+           <version>${spring.version}</version>
+        </dependency>
+        <dependency>
+           <groupId>org.springframework</groupId>
+           <artifactId>spring-messaging</artifactId>
+           <version>${spring.version}</version>
         </dependency>
 
         <!-- bean validate -->
@@ -385,7 +385,7 @@
             <artifactId>jsp-api</artifactId>
             <version>2.2</version>
             <scope>provided</scope>
-        </dependency>--> 
+        </dependency>-->
 
 
         <!-- J2CACHE begin -->
@@ -519,7 +519,7 @@
 			<artifactId>activiti-diagram-rest</artifactId>
 			<version>${activiti.version}</version>
 		</dependency>
-		
+
 		<!-- 支持activiti缓存 -->
 		<!-- <dependency>
 			<groupId>org.infinispan</groupId>
@@ -617,7 +617,7 @@
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
             <version>${fastjson.version}</version>
-        </dependency> 
+        </dependency>
 
         <!-- xstream xml -->
         <dependency>
@@ -695,7 +695,7 @@
             <systemPath>${lib.path}/batik-util-1.7.jar</systemPath>
             <scope>system</scope>
         </dependency>
-        
+
         <!-- quartz -->
 		<dependency>
 			<groupId>org.quartz-scheduler</groupId>
@@ -726,7 +726,7 @@
             <systemPath>${lib.path}/org.jeeframework.gencode-2.0-tomcat7.0.jar</systemPath>
             <scope>system</scope>
         </dependency>
-        
+
 	 <!-- Echarts图表依赖包开始 -->
         <!-- https://mvnrepository.com/artifact/com.github.abel533/ECharts -->
         <dependency>
@@ -740,7 +740,7 @@
 	        <version>2.6.2</version>
 	    </dependency>
 	    <!-- Echarts图表依赖包结束 -->
-		
+
         <!-- TEST begin -->
         <dependency>
             <groupId>junit</groupId>
@@ -791,7 +791,7 @@
             <systemPath>${lib.path}/QRCode.jar</systemPath>
             <scope>system</scope>
         </dependency>
-       
+
         <!-- UTILS begin -->
         <dependency>
             <groupId>com.google.guava</groupId>
@@ -811,6 +811,11 @@
             <artifactId>postgresql</artifactId>
             <version>42.1.1</version>
         </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
 
         <!-- UTILS end -->
     </dependencies>

+ 27 - 0
src/main/java/com/jeeplus/modules/supply/particulars/entity/SupplyParticulars.java

@@ -38,6 +38,9 @@ public class SupplyParticulars extends DataEntity<SupplyParticulars> {
     private String projectDefinition;       //varchar(255) 项目定义号
     private String submittalsId;            //varchar(255) 送审id
     private String materialsType;            //varchar(255) 材料类型
+    private String index;
+    private String flag;
+    private String showType;
 
 
     @ExcelField(title="批次", align=2, sort=1)
@@ -190,4 +193,28 @@ public class SupplyParticulars extends DataEntity<SupplyParticulars> {
     public void setMaterialsType(String materialsType) {
         this.materialsType = materialsType;
     }
+
+    public String getIndex() {
+        return index;
+    }
+
+    public void setIndex(String index) {
+        this.index = index;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public String getShowType() {
+        return showType;
+    }
+
+    public void setShowType(String showType) {
+        this.showType = showType;
+    }
 }

+ 28 - 4
src/main/java/com/jeeplus/modules/supply/particulars/service/SupplyParticularsService.java

@@ -60,12 +60,15 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
         //对超欠供明细数据进行分组
         Map<String, List<SupplyParticulars>> supplyParticularsListMap = this.groupByMaterialsType(supplyParticularsList);
         List<SupplyParticulars> particularsList = disposeDataMapByMaterialsType(supplyParticularsListMap);
-        SupplyParticulars supplyParticularsCollect = disposeDataCollect(supplyParticularsList);
-        particularsList.add(supplyParticularsCollect);
+        if(supplyParticularsList.size() > 0){
+            SupplyParticulars supplyParticularsCollect = disposeDataCollect(supplyParticularsList);
+            particularsList.add(supplyParticularsCollect);
+        }
         int size = 0;
         for (SupplyParticulars info : particularsList) {
             size ++;
             info.setId(String.valueOf(size));
+            info.setIndex(String.valueOf(size));
         }
         page.setList(particularsList);
         return page;
@@ -146,18 +149,21 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
                     List<SupplyParticulars> facilityList = supplyParticularsMap.get("设备");
                     supplyParticularsList.addAll(facilityList);
                     SupplyParticulars facility = disposeDataByMaterialsType(facilityList, "设备");
+                    facility.setShowType("设备");
                     supplyParticularsList.add(facility);
                     break;
                 case "材料":
                     List<SupplyParticulars> materialsList = supplyParticularsMap.get("材料");
                     supplyParticularsList.addAll(materialsList);
                     SupplyParticulars materials = disposeDataByMaterialsType(materialsList, "材料");
+                    materials.setShowType("材料");
                     supplyParticularsList.add(materials);
                     break;
                 case "-":
                     List<SupplyParticulars> otherList = supplyParticularsMap.get("-");
                     supplyParticularsList.addAll(otherList);
                     SupplyParticulars other = disposeDataByMaterialsType(otherList, "-");
+                    other.setShowType("-");
                     supplyParticularsList.add(other);
                     break;
             }
@@ -177,7 +183,13 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
         BigDecimal planMoneyB = new BigDecimal(0);
         BigDecimal practicalMoneyB = new BigDecimal(0);
         for (SupplyParticulars facility : supplyParticularsList) {
-            BigDecimal supplyMoney = new BigDecimal(facility.getSupplyMoney());
+            BigDecimal supplyMoney;
+            if("-".equals(facility.getSupplyMoney())){
+                supplyMoney = new BigDecimal(0);
+            }else{
+                supplyMoney = new BigDecimal(facility.getSupplyMoney());
+            }
+
             BigDecimal planMoney = new BigDecimal(facility.getPlanMoney());
             BigDecimal practicalMoney = new BigDecimal(facility.getPracticalMoney());
             supplyMoneyB = supplyMoneyB.add(supplyMoney);
@@ -220,6 +232,7 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
         supplyParticulars.setPracticalMoney(practicalMoneyBIntegerStr + "." + practicalMoneyBStrSS[1]);
         supplyParticulars.setSupplyReason("");
         supplyParticulars.setRemarks("");
+        supplyParticulars.setFlag("false");
         return supplyParticulars;
     }
     /**
@@ -232,7 +245,12 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
         BigDecimal planMoneyB = new BigDecimal(0);
         BigDecimal practicalMoneyB = new BigDecimal(0);
         for (SupplyParticulars facility : supplyParticularsList) {
-            BigDecimal supplyMoney = new BigDecimal(facility.getSupplyMoney());
+            BigDecimal supplyMoney;
+            if("-".equals(facility.getSupplyMoney())){
+                supplyMoney = new BigDecimal(0);
+            }else{
+                supplyMoney = new BigDecimal(facility.getSupplyMoney());
+            }
             BigDecimal planMoney = new BigDecimal(facility.getPlanMoney());
             BigDecimal practicalMoney = new BigDecimal(facility.getPracticalMoney());
             supplyMoneyB = supplyMoneyB.add(supplyMoney);
@@ -265,6 +283,8 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
         supplyParticulars.setPracticalMoney(practicalMoneyBIntegerStr + "." + practicalMoneyBStrSS[1]);
         supplyParticulars.setSupplyReason("");
         supplyParticulars.setRemarks("");
+        supplyParticulars.setShowType("汇总");
+        supplyParticulars.setFlag("false");
         return supplyParticulars;
     }
 
@@ -422,6 +442,7 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
                     supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
                     supplyParticulars.setProjectDefinition("");
                     supplyParticulars.setRemarks("");
+                    supplyParticulars.setFlag("true");
                     supplyParticularsList.add(supplyParticulars);
 
                 }else {
@@ -493,6 +514,7 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
                         supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
                         supplyParticulars.setProjectDefinition("");
                         supplyParticulars.setRemarks("");
+                        supplyParticulars.setFlag("true");
 
                         supplyParticularsList.add(supplyParticulars);
 
@@ -549,6 +571,7 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
                 supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
                 supplyParticulars.setProjectDefinition("");
                 supplyParticulars.setRemarks("");
+                supplyParticulars.setFlag("true");
                 supplyParticularsList.add(supplyParticulars);
 
             }
@@ -613,6 +636,7 @@ public class SupplyParticularsService extends CrudService<SupplyParticularsMappe
                         supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
                         supplyParticulars.setProjectDefinition("");
                         supplyParticulars.setRemarks("");
+                        supplyParticulars.setFlag("true");
                         supplyParticularsList.add(supplyParticulars);
 
                     }

+ 31 - 1
src/main/java/com/jeeplus/modules/supply/particulars/web/SupplyParticularsController.java

@@ -1,11 +1,15 @@
 package com.jeeplus.modules.supply.particulars.web;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.DateUtils;
 import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
 import com.jeeplus.core.persistence.Page;
 import com.jeeplus.core.web.BaseController;
 import com.jeeplus.modules.supply.particulars.entity.SupplyParticulars;
 import com.jeeplus.modules.supply.particulars.service.SupplyParticularsService;
-import com.jeeplus.modules.supply.stockOut.entity.SupplyStockOut;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -17,7 +21,11 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
+import org.apache.commons.lang.StringEscapeUtils;
 
 /**
  * 超欠供明细controller
@@ -63,4 +71,26 @@ public class SupplyParticularsController extends BaseController {
         Page<SupplyParticulars> page = service.findPage(new Page<SupplyParticulars>(request, response), supplyParticulars);
         return getBootstrapData(page);
     }
+
+    /**
+     * 导出excel文件
+     */
+    @ResponseBody
+    @RequestMapping(value = "export")
+    public AjaxJson exportFile(String json, HttpServletRequest request, HttpServletResponse response) {
+        AjaxJson j = new AjaxJson();
+        try {
+            json = StringEscapeUtils.unescapeHtml(json);
+            String fileName = "超欠供核对明细表"+ DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            ArrayList<SupplyParticulars> list  = JSON.parseObject(json, new TypeReference<ArrayList<SupplyParticulars>>(){});
+            new ExportExcel("超欠供核对明细表", SupplyParticulars.class).setDataList(list).write(response, fileName).dispose();
+            j.setSuccess(true);
+            j.setMsg("导出成功!");
+            return j;
+        } catch (Exception e) {
+            j.setSuccess(false);
+            j.setMsg("导出超欠供核对明细表记录失败!失败信息:"+e.getMessage());
+        }
+        return j;
+    }
 }

+ 674 - 0
src/main/webapp/static/plugin/editable/bootstrap-editable/css/bootstrap-editable.css

@@ -0,0 +1,674 @@
+/*! X-editable - v1.5.3
+* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
+* http://github.com/vitalets/x-editable
+* Copyright (c) 2019 Vitaliy Potapov; Licensed MIT */
+.editableform {
+    margin-bottom: 0; /* overwrites bootstrap margin */
+}
+
+.editableform .control-group {
+    margin-bottom: 0; /* overwrites bootstrap margin */
+    white-space: nowrap; /* prevent wrapping buttons on new line */
+    line-height: 20px; /* overwriting bootstrap line-height. See #133 */
+}
+
+/*
+    BS3 fix: stop css from breaking when the form is inside a popup and inside a form with the class .form-horizontal
+    See: https://github.com/vitalets/x-editable/issues/682
+*/
+.form-horizontal .editable-popup .editableform .form-group {
+    margin-left:0;
+    margin-right:0;
+}
+
+
+/*
+  BS3 width:1005 for inputs breaks editable form in popup
+  See: https://github.com/vitalets/x-editable/issues/393
+*/
+.editableform .form-control {
+    width: auto;
+}
+
+.editable-buttons {
+   display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+   vertical-align: top;
+   margin-left: 7px;
+   /* inline-block emulation for IE7*/
+   zoom: 1;
+   *display: inline;
+}
+
+.editable-buttons.editable-buttons-bottom {
+   display: block;
+   margin-top: 7px;
+   margin-left: 0;
+}
+
+.editable-input {
+    vertical-align: top;
+    display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+    width: auto; /* bootstrap-responsive has width: 100% that breakes layout */
+    white-space: normal; /* reset white-space decalred in parent*/
+   /* display-inline emulation for IE7*/
+   zoom: 1;
+   *display: inline;
+}
+
+.editable-buttons .editable-cancel {
+   margin-left: 7px;
+}
+
+/*for jquery-ui buttons need set height to look more pretty*/
+.editable-buttons button.ui-button-icon-only {
+   height: 24px;
+   width: 30px;
+}
+
+.editableform-loading {
+    background: url('../img/loading.gif') center center no-repeat;
+    height: 25px;
+    width: auto;
+    min-width: 25px;
+}
+
+.editable-inline .editableform-loading {
+    background-position: left 5px;
+}
+
+ .editable-error-block {
+    max-width: 300px;
+    margin: 5px 0 0 0;
+    width: auto;
+    white-space: normal;
+}
+
+/*add padding for jquery ui*/
+.editable-error-block.ui-state-error {
+    padding: 3px;
+}
+
+.editable-error {
+   color: red;
+}
+
+/* ---- For specific types ---- */
+
+.editableform .editable-date {
+    padding: 0;
+    margin: 0;
+    float: left;
+}
+
+/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */
+.editable-inline .add-on .icon-th {
+   margin-top: 3px;
+   margin-left: 1px;
+}
+
+
+/* checklist vertical alignment */
+.editable-checklist label input[type="checkbox"],
+.editable-checklist label span {
+    vertical-align: middle;
+    margin: 0;
+}
+
+.editable-checklist label {
+    white-space: nowrap;
+}
+
+/* set exact width of textarea to fit buttons toolbar */
+.editable-wysihtml5 {
+    width: 566px;
+    height: 250px;
+}
+
+/* clear button shown as link in date inputs */
+.editable-clear {
+   clear: both;
+   font-size: 0.9em;
+   text-decoration: none;
+   text-align: right;
+}
+
+/* IOS-style clear button for text inputs */
+.editable-clear-x {
+   background: url('../img/clear.png') center center no-repeat;
+   display: block;
+   width: 13px;
+   height: 13px;
+   position: absolute;
+   opacity: 0.6;
+   z-index: 100;
+
+   top: 50%;
+   right: 6px;
+   margin-top: -6px;
+
+}
+
+.editable-clear-x:hover {
+   opacity: 1;
+}
+
+.editable-pre-wrapped {
+   white-space: pre-wrap;
+}
+
+.editable-container.editable-popup {
+    max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
+}
+
+.editable-container.popover {
+    width: auto; /* without this rule popover does not stretch */
+}
+
+.editable-container.editable-inline {
+    display: inline-block;
+    vertical-align: middle;
+    width: auto;
+    /* inline-block emulation for IE7*/
+    zoom: 1;
+    *display: inline;
+}
+
+.editable-container.ui-widget {
+   font-size: inherit;  /* jqueryui widget font 1.1em too big, overwrite it */
+   z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */
+}
+.editable-click,
+a.editable-click,
+a.editable-click:hover {
+    text-decoration: none;
+    border-bottom: dashed 1px #0088cc;
+}
+
+.editable-click.editable-disabled,
+a.editable-click.editable-disabled,
+a.editable-click.editable-disabled:hover {
+   color: #585858;
+   cursor: default;
+   border-bottom: none;
+}
+
+.editable-empty, .editable-empty:hover, .editable-empty:focus{
+  font-style: italic;
+  color: #DD1144;
+  /* border-bottom: none; */
+  text-decoration: none;
+}
+
+.editable-unsaved {
+  font-weight: bold;
+}
+
+.editable-unsaved:after {
+/*    content: '*'*/
+}
+
+.editable-bg-transition {
+  -webkit-transition: background-color 1400ms ease-out;
+  -moz-transition: background-color 1400ms ease-out;
+  -o-transition: background-color 1400ms ease-out;
+  -ms-transition: background-color 1400ms ease-out;
+  transition: background-color 1400ms ease-out;
+}
+
+/*see https://github.com/vitalets/x-editable/issues/139 */
+.form-horizontal .editable
+{
+    padding-top: 5px;
+    display:inline-block;
+}
+
+
+/*!
+ * Datepicker for Bootstrap
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.datepicker {
+  padding: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  direction: ltr;
+  /*.dow {
+		border-top: 1px solid #ddd !important;
+	}*/
+
+}
+.datepicker-inline {
+  width: 220px;
+}
+.datepicker.datepicker-rtl {
+  direction: rtl;
+}
+.datepicker.datepicker-rtl table tr td span {
+  float: right;
+}
+.datepicker-dropdown {
+  top: 0;
+  left: 0;
+}
+.datepicker-dropdown:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+  top: -7px;
+  left: 6px;
+}
+.datepicker-dropdown:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  position: absolute;
+  top: -6px;
+  left: 7px;
+}
+.datepicker > div {
+  display: none;
+}
+.datepicker.days div.datepicker-days {
+  display: block;
+}
+.datepicker.months div.datepicker-months {
+  display: block;
+}
+.datepicker.years div.datepicker-years {
+  display: block;
+}
+.datepicker table {
+  margin: 0;
+}
+.datepicker td,
+.datepicker th {
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+  background-color: transparent;
+}
+.datepicker table tr td.day:hover {
+  background: #eeeeee;
+  cursor: pointer;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+  color: #999999;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+  background: none;
+  color: #999999;
+  cursor: default;
+}
+.datepicker table tr td.today,
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:hover {
+  background-color: #fde19a;
+  background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+  background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: linear-gradient(top, #fdd49a, #fdf59a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+  border-color: #fdf59a #fdf59a #fbed50;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #000;
+}
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today:hover:hover,
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today.disabled:hover:hover,
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today:hover.disabled,
+.datepicker table tr td.today.disabled.disabled,
+.datepicker table tr td.today.disabled:hover.disabled,
+.datepicker table tr td.today[disabled],
+.datepicker table tr td.today:hover[disabled],
+.datepicker table tr td.today.disabled[disabled],
+.datepicker table tr td.today.disabled:hover[disabled] {
+  background-color: #fdf59a;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active {
+  background-color: #fbf069 \9;
+}
+.datepicker table tr td.today:hover:hover {
+  color: #000;
+}
+.datepicker table tr td.today.active:hover {
+  color: #fff;
+}
+.datepicker table tr td.range,
+.datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:hover {
+  background: #eeeeee;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today,
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:hover {
+  background-color: #f3d17a;
+  background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
+  background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: -o-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: linear-gradient(top, #f3c17a, #f3e97a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
+  border-color: #f3e97a #f3e97a #edde34;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today:hover:hover,
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover:hover,
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today:hover.disabled,
+.datepicker table tr td.range.today.disabled.disabled,
+.datepicker table tr td.range.today.disabled:hover.disabled,
+.datepicker table tr td.range.today[disabled],
+.datepicker table tr td.range.today:hover[disabled],
+.datepicker table tr td.range.today.disabled[disabled],
+.datepicker table tr td.range.today.disabled:hover[disabled] {
+  background-color: #f3e97a;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active {
+  background-color: #efe24b \9;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected.disabled:hover {
+  background-color: #9e9e9e;
+  background-image: -moz-linear-gradient(top, #b3b3b3, #808080);
+  background-image: -ms-linear-gradient(top, #b3b3b3, #808080);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
+  background-image: -webkit-linear-gradient(top, #b3b3b3, #808080);
+  background-image: -o-linear-gradient(top, #b3b3b3, #808080);
+  background-image: linear-gradient(top, #b3b3b3, #808080);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
+  border-color: #808080 #808080 #595959;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected:hover:hover,
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.disabled:hover:hover,
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected:hover.disabled,
+.datepicker table tr td.selected.disabled.disabled,
+.datepicker table tr td.selected.disabled:hover.disabled,
+.datepicker table tr td.selected[disabled],
+.datepicker table tr td.selected:hover[disabled],
+.datepicker table tr td.selected.disabled[disabled],
+.datepicker table tr td.selected.disabled:hover[disabled] {
+  background-color: #808080;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active {
+  background-color: #666666 \9;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(top, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active:hover:hover,
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.disabled:hover:hover,
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active:hover.disabled,
+.datepicker table tr td.active.disabled.disabled,
+.datepicker table tr td.active.disabled:hover.disabled,
+.datepicker table tr td.active[disabled],
+.datepicker table tr td.active:hover[disabled],
+.datepicker table tr td.active.disabled[disabled],
+.datepicker table tr td.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span {
+  display: block;
+  width: 23%;
+  height: 54px;
+  line-height: 54px;
+  float: left;
+  margin: 1%;
+  cursor: pointer;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.datepicker table tr td span:hover {
+  background: #eeeeee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+  background: none;
+  color: #999999;
+  cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(top, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active:hover.disabled,
+.datepicker table tr td span.active.disabled.disabled,
+.datepicker table tr td span.active.disabled:hover.disabled,
+.datepicker table tr td span.active[disabled],
+.datepicker table tr td span.active:hover[disabled],
+.datepicker table tr td span.active.disabled[disabled],
+.datepicker table tr td span.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+  color: #999999;
+}
+.datepicker th.datepicker-switch {
+  width: 145px;
+}
+.datepicker thead tr:first-child th,
+.datepicker tfoot tr th {
+  cursor: pointer;
+}
+.datepicker thead tr:first-child th:hover,
+.datepicker tfoot tr th:hover {
+  background: #eeeeee;
+}
+.datepicker .cw {
+  font-size: 10px;
+  width: 12px;
+  padding: 0 2px 0 5px;
+  vertical-align: middle;
+}
+.datepicker thead tr:first-child th.cw {
+  cursor: default;
+  background-color: transparent;
+}
+.input-append.date .add-on i,
+.input-prepend.date .add-on i {
+  display: block;
+  cursor: pointer;
+  width: 16px;
+  height: 16px;
+}
+.input-daterange input {
+  text-align: center;
+}
+.input-daterange input:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-daterange .add-on {
+  display: inline-block;
+  width: auto;
+  min-width: 16px;
+  height: 18px;
+  padding: 4px 5px;
+  font-weight: normal;
+  line-height: 18px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  vertical-align: middle;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+  margin-left: -5px;
+  margin-right: -5px;
+}

BIN
src/main/webapp/static/plugin/editable/bootstrap-editable/img/clear.png


BIN
src/main/webapp/static/plugin/editable/bootstrap-editable/img/loading.gif


File diff suppressed because it is too large
+ 7083 - 0
src/main/webapp/static/plugin/editable/bootstrap-editable/js/bootstrap-editable.js


File diff suppressed because it is too large
+ 7 - 0
src/main/webapp/static/plugin/editable/bootstrap-editable/js/bootstrap-editable.min.js


+ 180 - 0
src/main/webapp/static/plugin/editable/bootstrap-table-editable.js

@@ -0,0 +1,180 @@
+/**
+ * @author zhixin wen <wenzhixin2010@gmail.com>
+ * extensions: https://github.com/vitalets/x-editable
+ */
+
+!function ($) {
+
+    'use strict';
+
+    $.extend($.fn.bootstrapTable.defaults, {
+        editable: true,
+        onEditableInit: function () {
+            return false;
+        },
+        onEditableSave: function (field, row, oldValue, $el) {
+            return false;
+        },
+        onEditableShown: function (field, row, $el, editable) {
+            return false;
+        },
+        onEditableHidden: function (field, row, $el, reason) {
+            return false;
+        }
+    });
+
+    $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
+        'editable-init.bs.table': 'onEditableInit',
+        'editable-save.bs.table': 'onEditableSave',
+        'editable-shown.bs.table': 'onEditableShown',
+        'editable-hidden.bs.table': 'onEditableHidden'
+    });
+
+    var BootstrapTable = $.fn.bootstrapTable.Constructor,
+        _initTable = BootstrapTable.prototype.initTable,
+        _initBody = BootstrapTable.prototype.initBody;
+
+    BootstrapTable.prototype.initTable = function() {
+
+        var that = this;
+        _initTable.apply(this, Array.prototype.slice.apply(arguments));
+
+        if (!this.options.editable) {
+            return;
+        }
+
+        $.each(this.columns, function (i, column) {
+            if (!column.editable) {
+                return;
+            }
+
+            var _formatter = column.formatter;
+            column.formatter = function (value, row, index) {
+                var result = _formatter ? _formatter(value, row, index) : value;
+
+                return ['<a href="javascript:void(0)"',
+                    ' data-name="' + column.field + '"',
+                    ' data-pk="' + row[that.options.idField] + '"',
+                    ' data-value="' + result + '"',
+                    '>' + '</a>'
+                ].join('');
+            };
+        });
+
+        var that = this;
+        _initTable.apply(this, Array.prototype.slice.apply(arguments));
+        if (!this.options.editable) {
+            return;
+        }
+        $.each(this.columns, function(i, column) {
+            if (!column.editable) {
+                return;
+            }
+            var editableOptions = {},
+                editableDataMarkup = [],
+                editableDataPrefix = 'editable-';
+            var processDataOptions = function(key, value) {
+                // Replace camel case with dashes.
+                var dashKey = key.replace(/([A-Z])/g, function($1) {
+                    return "-" + $1.toLowerCase();
+                });
+                if (dashKey.slice(0, editableDataPrefix.length) == editableDataPrefix) {
+                    var dataKey = dashKey.replace(editableDataPrefix, 'data-');
+                    editableOptions[dataKey] = value;
+                }
+            };
+            $.each(that.options, processDataOptions);
+            column.formatter = column.formatter || function(value, row, index) {
+                return value;
+            };
+            column._formatter = column._formatter ? column._formatter : column.formatter;
+            column.formatter = function(value, row, index) {
+                var result = column._formatter ? column._formatter(value, row, index) : value;
+
+                $.each(column, processDataOptions);
+
+                $.each(editableOptions, function(key, value) {
+                    editableDataMarkup.push(' ' + key + '="' + value + '"');
+                });
+
+                var _dont_edit_formatter = false;
+                // ----- 因为我们删除了editable属性,所以如果不判断一下column.editable属性是否为undefined的话,加载table会提示column.editable为undefined导致table初始化失败,无法显示数据。故这里如editable为undefined的话就不需要在做editable属性的初始化,直接显示数据。
+                if (column.editable.hasOwnProperty('noeditFormatter')) {
+                    _dont_edit_formatter = column.editable.noeditFormatter(value, row, index);
+                    if (_dont_edit_formatter === false) {
+                        var href = ['<a href="javascript:void(0)"',
+                            ' data-name="' + column.field + '"',
+                            ' data-type=\"text\"',
+                            ' data-pk="' + row[that.options.idField] + '"',
+                            ' data-value="' + value + '"',
+                            editableDataMarkup.join(''),
+                            '>' + value + '</a>'
+                        ].join('');
+                        return href;
+                    } else {
+                        return value;
+                    }
+                }else if(column.editable.hasOwnProperty('noEditSelectFormatter')){
+                    _dont_edit_formatter = column.editable.noEditSelectFormatter(value, row, index);
+                    if (_dont_edit_formatter === false) {
+                        var href = ['<a href="javascript:void(0)"',
+                            ' data-name="' + column.field + '"',
+                            ' data-type=\"select\"',
+                            ' data-pk="' + row[that.options.idField] + '"',
+                            ' data-value="' + value + '"',
+                            editableDataMarkup.join(''),
+                            '>' + value + '</a>'
+                        ].join('');
+                        return href;
+                    } else {
+                        return value;
+                    }
+                }
+            };
+        });
+    };
+
+    BootstrapTable.prototype.initBody = function () {
+        var that = this;
+        _initBody.apply(this, Array.prototype.slice.apply(arguments));
+
+        if (!this.options.editable) {
+            return;
+        }
+
+        $.each(this.columns, function (i, column) {
+            if (!column.editable) {
+                return;
+            }
+
+            that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
+                .off('save').on('save', function (e, params) {
+                    var data = that.getData(),
+                        index = $(this).parents('tr[data-index]').data('index'),
+                        row = data[index],
+                        oldValue = row[column.field];
+
+                    row[column.field] = params.submitValue;
+                    that.trigger('editable-save', column.field, row, oldValue, $(this));
+                });
+            that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
+                .off('shown').on('shown', function (e, editable) {
+                    var data = that.getData(),
+                        index = $(this).parents('tr[data-index]').data('index'),
+                        row = data[index];
+
+                    that.trigger('editable-shown', column.field, row, $(this), editable);
+                });
+            that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
+                .off('hidden').on('hidden', function (e, reason) {
+                    var data = that.getData(),
+                        index = $(this).parents('tr[data-index]').data('index'),
+                        row = data[index];
+
+                    that.trigger('editable-hidden', column.field, row, $(this), reason);
+                });
+        });
+        this.trigger('editable-init');
+    };
+
+}(jQuery);

File diff suppressed because it is too large
+ 1917 - 0
src/main/webapp/static/plugin/editable/bootstrap3-editable/bootstrap-table-editable.js


+ 676 - 0
src/main/webapp/static/plugin/editable/bootstrap3-editable/css/bootstrap-editable.css

@@ -0,0 +1,676 @@
+/*! X-editable - v1.5.3
+* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
+* http://github.com/vitalets/x-editable
+* Copyright (c) 2019 Vitaliy Potapov; Licensed MIT */
+.editableform {
+    margin-bottom: 0; /* overwrites bootstrap margin */
+}
+
+.editableform .control-group {
+    margin-bottom: 0; /* overwrites bootstrap margin */
+    white-space: nowrap; /* prevent wrapping buttons on new line */
+    line-height: 20px; /* overwriting bootstrap line-height. See #133 */
+}
+
+/*
+    BS3 fix: stop css from breaking when the form is inside a popup and inside a form with the class .form-horizontal
+    See: https://github.com/vitalets/x-editable/issues/682
+*/
+.form-horizontal .editable-popup .editableform .form-group {
+    margin-left:0;
+    margin-right:0;
+}
+
+
+/*
+  BS3 width:1005 for inputs breaks editable form in popup
+  See: https://github.com/vitalets/x-editable/issues/393
+*/
+.editableform .form-control {
+    width: auto;
+}
+
+.editable-buttons {
+   display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+   vertical-align: top;
+   margin-left: 7px;
+   /* inline-block emulation for IE7*/
+   zoom: 1;
+   *display: inline;
+}
+
+.editable-buttons.editable-buttons-bottom {
+   display: block;
+   margin-top: 7px;
+   margin-left: 0;
+}
+
+.editable-input {
+    vertical-align: top;
+    display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+    width: auto; /* bootstrap-responsive has width: 100% that breakes layout */
+    white-space: normal; /* reset white-space decalred in parent*/
+   /* display-inline emulation for IE7*/
+   zoom: 1;
+   *display: inline;
+}
+
+.editable-buttons .editable-cancel {
+   margin-left: 7px;
+}
+
+/*for jquery-ui buttons need set height to look more pretty*/
+.editable-buttons button.ui-button-icon-only {
+   height: 24px;
+   width: 30px;
+}
+
+.editableform-loading {
+    background: url('../img/loading.gif') center center no-repeat;
+    height: 25px;
+    width: auto;
+    min-width: 25px;
+}
+
+.editable-inline .editableform-loading {
+    background-position: left 5px;
+}
+
+ .editable-error-block {
+    max-width: 300px;
+    margin: 5px 0 0 0;
+    width: auto;
+    white-space: normal;
+     color: red;
+}
+
+/*add padding for jquery ui*/
+.editable-error-block.ui-state-error {
+    padding: 3px;
+    color: red;
+}
+
+.editable-error {
+   color: red;
+}
+
+/* ---- For specific types ---- */
+
+.editableform .editable-date {
+    padding: 0;
+    margin: 0;
+    float: left;
+}
+
+/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */
+.editable-inline .add-on .icon-th {
+   margin-top: 3px;
+   margin-left: 1px;
+}
+
+
+/* checklist vertical alignment */
+.editable-checklist label input[type="checkbox"],
+.editable-checklist label span {
+    vertical-align: middle;
+    margin: 0;
+}
+
+.editable-checklist label {
+    white-space: nowrap;
+}
+
+/* set exact width of textarea to fit buttons toolbar */
+.editable-wysihtml5 {
+    width: 566px;
+    height: 250px;
+}
+
+/* clear button shown as link in date inputs */
+.editable-clear {
+   clear: both;
+   font-size: 0.9em;
+   text-decoration: none;
+   text-align: right;
+}
+
+/* IOS-style clear button for text inputs */
+.editable-clear-x {
+   background: url('../img/clear.png') center center no-repeat;
+   display: block;
+   width: 13px;
+   height: 13px;
+   position: absolute;
+   opacity: 0.6;
+   z-index: 100;
+
+   top: 50%;
+   right: 6px;
+   margin-top: -6px;
+
+}
+
+.editable-clear-x:hover {
+   opacity: 1;
+}
+
+.editable-pre-wrapped {
+   white-space: pre-wrap;
+}
+
+.editable-container.editable-popup {
+    max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
+}
+
+.editable-container.popover {
+    width: auto; /* without this rule popover does not stretch */
+}
+
+.editable-container.editable-inline {
+    display: inline-block;
+    vertical-align: middle;
+    width: auto;
+    /* inline-block emulation for IE7*/
+    zoom: 1;
+    *display: inline;
+}
+
+.editable-container.ui-widget {
+   font-size: inherit;  /* jqueryui widget font 1.1em too big, overwrite it */
+   z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */
+}
+.editable-click,
+a.editable-click,
+a.editable-click:hover {
+    text-decoration: none;
+    border-bottom: dashed 1px #0088cc;
+}
+
+.editable-click.editable-disabled,
+a.editable-click.editable-disabled,
+a.editable-click.editable-disabled:hover {
+   color: #585858;
+   cursor: default;
+   border-bottom: none;
+}
+
+.editable-empty, .editable-empty:hover, .editable-empty:focus{
+  font-style: italic;
+  color: #DD1144;
+  /* border-bottom: none; */
+  text-decoration: none;
+}
+
+.editable-unsaved {
+  font-weight: bold;
+}
+
+.editable-unsaved:after {
+/*    content: '*'*/
+}
+
+.editable-bg-transition {
+  -webkit-transition: background-color 1400ms ease-out;
+  -moz-transition: background-color 1400ms ease-out;
+  -o-transition: background-color 1400ms ease-out;
+  -ms-transition: background-color 1400ms ease-out;
+  transition: background-color 1400ms ease-out;
+}
+
+/*see https://github.com/vitalets/x-editable/issues/139 */
+.form-horizontal .editable
+{
+    padding-top: 5px;
+    display:inline-block;
+}
+
+
+/*!
+ * Datepicker for Bootstrap
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.datepicker {
+  padding: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  direction: ltr;
+  /*.dow {
+		border-top: 1px solid #ddd !important;
+	}*/
+
+}
+.datepicker-inline {
+  width: 220px;
+}
+.datepicker.datepicker-rtl {
+  direction: rtl;
+}
+.datepicker.datepicker-rtl table tr td span {
+  float: right;
+}
+.datepicker-dropdown {
+  top: 0;
+  left: 0;
+}
+.datepicker-dropdown:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+  top: -7px;
+  left: 6px;
+}
+.datepicker-dropdown:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  position: absolute;
+  top: -6px;
+  left: 7px;
+}
+.datepicker > div {
+  display: none;
+}
+.datepicker.days div.datepicker-days {
+  display: block;
+}
+.datepicker.months div.datepicker-months {
+  display: block;
+}
+.datepicker.years div.datepicker-years {
+  display: block;
+}
+.datepicker table {
+  margin: 0;
+}
+.datepicker td,
+.datepicker th {
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+  background-color: transparent;
+}
+.datepicker table tr td.day:hover {
+  background: #eeeeee;
+  cursor: pointer;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+  color: #999999;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+  background: none;
+  color: #999999;
+  cursor: default;
+}
+.datepicker table tr td.today,
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:hover {
+  background-color: #fde19a;
+  background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+  background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
+  background-image: linear-gradient(top, #fdd49a, #fdf59a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+  border-color: #fdf59a #fdf59a #fbed50;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #000;
+}
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today:hover:hover,
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today.disabled:hover:hover,
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today:hover.disabled,
+.datepicker table tr td.today.disabled.disabled,
+.datepicker table tr td.today.disabled:hover.disabled,
+.datepicker table tr td.today[disabled],
+.datepicker table tr td.today:hover[disabled],
+.datepicker table tr td.today.disabled[disabled],
+.datepicker table tr td.today.disabled:hover[disabled] {
+  background-color: #fdf59a;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active {
+  background-color: #fbf069 \9;
+}
+.datepicker table tr td.today:hover:hover {
+  color: #000;
+}
+.datepicker table tr td.today.active:hover {
+  color: #fff;
+}
+.datepicker table tr td.range,
+.datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:hover {
+  background: #eeeeee;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today,
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:hover {
+  background-color: #f3d17a;
+  background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
+  background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: -o-linear-gradient(top, #f3c17a, #f3e97a);
+  background-image: linear-gradient(top, #f3c17a, #f3e97a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
+  border-color: #f3e97a #f3e97a #edde34;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today:hover:hover,
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover:hover,
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today:hover.disabled,
+.datepicker table tr td.range.today.disabled.disabled,
+.datepicker table tr td.range.today.disabled:hover.disabled,
+.datepicker table tr td.range.today[disabled],
+.datepicker table tr td.range.today:hover[disabled],
+.datepicker table tr td.range.today.disabled[disabled],
+.datepicker table tr td.range.today.disabled:hover[disabled] {
+  background-color: #f3e97a;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active {
+  background-color: #efe24b \9;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected.disabled:hover {
+  background-color: #9e9e9e;
+  background-image: -moz-linear-gradient(top, #b3b3b3, #808080);
+  background-image: -ms-linear-gradient(top, #b3b3b3, #808080);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
+  background-image: -webkit-linear-gradient(top, #b3b3b3, #808080);
+  background-image: -o-linear-gradient(top, #b3b3b3, #808080);
+  background-image: linear-gradient(top, #b3b3b3, #808080);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
+  border-color: #808080 #808080 #595959;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected:hover:hover,
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.disabled:hover:hover,
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected:hover.disabled,
+.datepicker table tr td.selected.disabled.disabled,
+.datepicker table tr td.selected.disabled:hover.disabled,
+.datepicker table tr td.selected[disabled],
+.datepicker table tr td.selected:hover[disabled],
+.datepicker table tr td.selected.disabled[disabled],
+.datepicker table tr td.selected.disabled:hover[disabled] {
+  background-color: #808080;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active {
+  background-color: #666666 \9;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(top, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active:hover:hover,
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.disabled:hover:hover,
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active:hover.disabled,
+.datepicker table tr td.active.disabled.disabled,
+.datepicker table tr td.active.disabled:hover.disabled,
+.datepicker table tr td.active[disabled],
+.datepicker table tr td.active:hover[disabled],
+.datepicker table tr td.active.disabled[disabled],
+.datepicker table tr td.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span {
+  display: block;
+  width: 23%;
+  height: 54px;
+  line-height: 54px;
+  float: left;
+  margin: 1%;
+  cursor: pointer;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.datepicker table tr td span:hover {
+  background: #eeeeee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+  background: none;
+  color: #999999;
+  cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(top, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active:hover.disabled,
+.datepicker table tr td span.active.disabled.disabled,
+.datepicker table tr td span.active.disabled:hover.disabled,
+.datepicker table tr td span.active[disabled],
+.datepicker table tr td span.active:hover[disabled],
+.datepicker table tr td span.active.disabled[disabled],
+.datepicker table tr td span.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+  color: #999999;
+}
+.datepicker th.datepicker-switch {
+  width: 145px;
+}
+.datepicker thead tr:first-child th,
+.datepicker tfoot tr th {
+  cursor: pointer;
+}
+.datepicker thead tr:first-child th:hover,
+.datepicker tfoot tr th:hover {
+  background: #eeeeee;
+}
+.datepicker .cw {
+  font-size: 10px;
+  width: 12px;
+  padding: 0 2px 0 5px;
+  vertical-align: middle;
+}
+.datepicker thead tr:first-child th.cw {
+  cursor: default;
+  background-color: transparent;
+}
+.input-append.date .add-on i,
+.input-prepend.date .add-on i {
+  display: block;
+  cursor: pointer;
+  width: 16px;
+  height: 16px;
+}
+.input-daterange input {
+  text-align: center;
+}
+.input-daterange input:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-daterange .add-on {
+  display: inline-block;
+  width: auto;
+  min-width: 16px;
+  height: 18px;
+  padding: 4px 5px;
+  font-weight: normal;
+  line-height: 18px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  vertical-align: middle;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+  margin-left: -5px;
+  margin-right: -5px;
+}

BIN
src/main/webapp/static/plugin/editable/bootstrap3-editable/img/clear.png


BIN
src/main/webapp/static/plugin/editable/bootstrap3-editable/img/loading.gif


File diff suppressed because it is too large
+ 6883 - 0
src/main/webapp/static/plugin/editable/bootstrap3-editable/js/bootstrap-editable.js


File diff suppressed because it is too large
+ 7 - 0
src/main/webapp/static/plugin/editable/bootstrap3-editable/js/bootstrap-editable.min.js


+ 151 - 53
src/main/webapp/webpage/modules/supply/particulars/supplyParticularsList.js

@@ -14,7 +14,7 @@
             //显示切换手机试图按钮
             showToggle: true,
             //显示 内容列下拉框
-            showColumns: true,
+            showColumns: false,
             //显示到处按钮
             showExport: true,
             //显示切换分页按钮
@@ -128,29 +128,25 @@
                     title: '单价',
                     width:120,
                     sortName: 'unitPrice',
-                    /*formatter:function(value, row , index) {
-                        value = jp.unescapeHTML(value);
-                        console.log(value)
-                        if(true){
-                            return "<input id='" + row.id + "' type='text' name='changeAmount' class='form-control required deal' onchange='onchangeFun(this)' value='"+value+"'>"
-                            //return "<a href=\"javascript:void(0)\" data-name=\"unitPrice\"  data-pk=\""+row.id+"\" data-value=\""+ value +"\" class=\"editable editable-click\">" + value +"</a>";
-                        }
-                    }*/
                     editable: {
                         type: 'text',
                         title: '单价',
-                        noEditFormatter (value, row, index) {
-                            if (row.id === 1) {
-                                console.log(1)
-                                return value
+                        noeditFormatter (value, row, index) {
+                            var actualQuantityIssued = parseFloat(row.actualQuantityIssued);
+                            var examineCount = parseFloat(row.examineCount);
+                            if (actualQuantityIssued === 0 && examineCount !== 0) {
+                                return false
                             }
-                            return false
+                            return value;
                         },
-                        validate: function (v) {
-                            if (isNaN(v))
+                        validate: function (value) {
+                            if (isNaN(value))
                                 return '单价必须为数字';
-                            var age = parseFloat(v);
+                            var age = parseFloat(value);
                             if (age < 0) return '单价必须大于等于0';
+                            if (!$.trim(value)) {
+                                return '不能为空';
+                            }
                         }
                     }
 
@@ -165,7 +161,35 @@
                     field: 'commodityHandleTenet',
                     title: '商定处理原则',
                     width:150,
-                    sortName: 'commodityHandleTenet'
+                    sortName: 'commodityHandleTenet',
+                    editable: {
+                        type: 'select2',
+                        title: '商定处理原则',
+                        noEditSelectFormatter (value, row, index) {
+                            if (row.supplyCount !== "-" && row.flag === "true") {
+                                return false
+                            }
+                            return value
+                        },select2: {
+                            multiple: true,//多选
+                            placeholder: '请选择',
+                            width: '100px',
+                        },
+                        source: //下拉框数据源--后台获取list数据
+                            function () {
+                                var result1 = [];
+                                result1.push({value: "置换", text: "置换"});
+                                result1.push({value: "核减施工费", text: "核减施工费"});
+                                result1.push({value: "欠供不在发生", text: "欠供不在发生"});
+                                result1.push({value: "退料", text: "退料"});
+                                result1.push({value: "欠供转乙供", text: "欠供转乙供"});
+                                result1.push({value: "欠供补领", text: "欠供补领"});
+                                return result1;
+                            },
+                        validate: function (value) {
+
+                        }
+                    }
                 }
                 ,{
                     field: 'planMoney',
@@ -193,25 +217,99 @@
                 }
 
 
-            ],onClickRow: function (row, $element) {
-                    $("#tb_user a").editable({
-                        type: "text",                //编辑框的类型。支持text|textarea|select|date|checklist等
-                        // title: "用户名",              //编辑框的标题
-                        disabled: false,             //是否禁用编辑
-                        pk:row.id,
-                        // emptytext: "空文本",          //空值的默认文本
-                        mode: "popup",              //编辑框的模式:支持popup和inline两种模式,默认是popup
-                        validate: function (value) { //字段验证
-                            if (!$.trim(value)) {
-                                return '不能为空';
-                            }
-                        }
-                    });
-            },
+            ],
+            onEditableSave: function (field, row, oldvalue, $el) {
+                var data= $('#dataTable').bootstrapTable('getData',{useCurrentPage:false,includeHiddenRows:false});
+                var index =  row.index
+                if("unitPrice" === field){
+                    row.planMoney = (row.unitPrice * row.examineCount).toFixed(2)
+                    row.practicalMoney = (row.unitPrice * row.actualQuantityIssued).toFixed(2)
+                    $("table tbody").find("tr").eq(index-1).find("td").eq(9).html(row.planMoney);
+                    $("table tbody").find("tr").eq(index-1).find("td").eq(10).html(row.practicalMoney);
+
+                }else if("commodityHandleTenet" === field){
+                    if(row.commodityHandleTenet === '置换' || row.commodityHandleTenet === '核减施工费' ||
+                        row.commodityHandleTenet === '欠供不在发生' || row.commodityHandleTenet === '欠供转乙供'){
+                        //实际列入工程投资的材料金额  =  出库数*单价
+                        row.practicalMoney = (row.unitPrice * row.actualQuantityIssued).toFixed(2)
+                        $("table tbody").find("tr").eq(index-1).find("td").eq(10).html(row.practicalMoney);
+                    } else if(row.commodityHandleTenet === '退料' || row.commodityHandleTenet === '欠供补领'){
+                        //实际列入工程投资的材料金额  =  审定数*单价
+                        row.practicalMoney = (row.unitPrice * row.examineCount).toFixed(2)
+                        $("table tbody").find("tr").eq(index-1).find("td").eq(10).html(row.practicalMoney);
+                    }
+                }
+
+                //获取所在行材料类型
+                var materialsType = row.materialsType
+                var planMoneyAll = 0;
+                var practicalMoneyAll = 0;
+                var collectRow;
+                var collectAllRow;
+                for(var i=0,l=data.length;i<l;i++){
+                    var planMoney = data[i].planMoney.replace(/,/g, "");
+                    var practicalMoney = data[i].practicalMoney.replace(/,/g, "");
+                    if(data[i].materialsType === materialsType){
+                        planMoneyAll = parseFloat(planMoneyAll) + parseFloat(planMoney);
+                        practicalMoneyAll = parseFloat(practicalMoneyAll) + parseFloat(practicalMoney);
+                    }
+                }
+                for(var i=0,l=data.length;i<l;i++){
+                    if(data[i].showType === materialsType){
+                        collectRow = data[i].index;
+
+                        data[i].planMoney = numberDispose(planMoneyAll.toFixed(2)) ;
+                        data[i].practicalMoney = numberDispose(practicalMoneyAll.toFixed(2)) ;
+                    }
+                }
+                //对合计行进行处理
+                $("table tbody").find("tr").eq(collectRow-1).find("td").eq(9).html(numberDispose(planMoneyAll.toFixed(2)));
+                $("table tbody").find("tr").eq(collectRow-1).find("td").eq(10).html(numberDispose(practicalMoneyAll.toFixed(2)));
+
+
+                var planMoneyCollect = 0;
+                var practicalMoneyCollect = 0;
+                for(var i=0,l=data.length;i<l;i++){
+                    var planMoney = data[i].planMoney.replace(/,/g, "");
+                    var practicalMoney = data[i].practicalMoney.replace(/,/g, "");
+                    switch (data[i].showType) {
+                        case "设备":
+                            planMoneyCollect = parseFloat(planMoneyCollect) + parseFloat(planMoney);
+                            practicalMoneyCollect = parseFloat(practicalMoneyCollect) + parseFloat(practicalMoney);
+                            break;
+                        case "材料":
+                            planMoneyCollect = parseFloat(planMoneyCollect) + parseFloat(planMoney);
+                            practicalMoneyCollect = parseFloat(practicalMoneyCollect) + parseFloat(practicalMoney);
+                            break;
+                        case "-":
+                            planMoneyCollect = parseFloat(planMoneyCollect) + parseFloat(planMoney);
+                            practicalMoneyCollect = parseFloat(practicalMoneyCollect) + parseFloat(practicalMoney);
+                            break;
+                    }
+                }
+
+                for(var i=0,l=data.length;i<l;i++){
+                    if(data[i].showType === "汇总"){
+                        collectAllRow = data[i].index;
+                        data[i].planMoney = numberDispose(planMoneyCollect.toFixed(2)) ;
+                        data[i].practicalMoney = numberDispose(practicalMoneyCollect.toFixed(2)) ;
+                    }
+                }
+
+                //对汇总行进行处理
+                $("table tbody").find("tr").eq(collectAllRow-1).find("td").eq(9).html(numberDispose(planMoneyCollect.toFixed(2)));
+                $("table tbody").find("tr").eq(collectAllRow-1).find("td").eq(10).html(numberDispose(practicalMoneyCollect.toFixed(2)));
+            }
 
 
         });
 
+        function numberDispose(number) {
+            var numberArray = number.split(".");
+            return parseFloat(numberArray[0]).toLocaleString() + "." + numberArray[1];
+        }
+
+
         if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端
 
 
@@ -254,16 +352,28 @@
         });
 
 
+        function post(URL, PARAMS) {
+            var temp = document.createElement("form");
+            temp.action = URL;
+            temp.method = "post";
+            temp.style.display = "none";
+            for (var x in PARAMS) {
+                var opt = document.createElement("textarea");
+                opt.name = x;
+                opt.value = PARAMS[x];
+                temp.appendChild(opt);
+            }
+            document.body.appendChild(temp);
+            temp.submit();
+            return temp;
+        }
 
         $("#export").click(function(){//导出Excel文件物料
-            var reserveProjectName = $("#reserveProjectName").val();//储备项目暂定名称:
-            var projectName = $("#projectName").val();//项目名称
-            var reserveCode = $("#reserveCode").val();//储备编码
-            var projectCode = $("#projectCode").val();//项目编码
-            var projectAttribute = $("#projectAttribute").val();//项目属性
-            var projectDefine = $("#projectDefine").val();//项目定义
-            var bat = $("#bat").val();//项目批次
-            jp.downloadFile('${ctx}/supply/particulars/export?reserveProjectName='+reserveProjectName+'&projectName='+projectName+'&reserveCode='+reserveCode+'&projectCode='+projectCode+'&projectAttribute='+projectAttribute+'&projectBatch='+bat+'&projectDefine='+projectDefine);
+            var data= $('#dataTable').bootstrapTable('getData',{useCurrentPage:false,includeHiddenRows:false});
+
+            //var info = $("#dataTable").bootstrapTable('getData');
+            var jsonStr = JSON.stringify(data);       //转为JSON字符串
+            post('${ctx}/supply/particulars/export',{json:jsonStr})
         });
         $("#exportpro").click(function(){//导出Excel文件
             jp.downloadFile('${ctx}/supply/particulars/exportpro');
@@ -283,19 +393,7 @@
 
     });
 
-/*function onchangeFun(obj){
-    var index =  $(obj).attr("id");
-    $("table tbody").find("tr").eq(index-1).find("td").eq(3).html("1321");
-    updateCellData(index,'remarks',"1321");
 
-}
-function updateCellData(index,key,value){
-    $('#table').bootstrapTable('updateCell', {
-        index: index,
-        field: key,
-        value: value
-    })
-}*/
 
 function getIdSelections() {
     return $.map($("#dataTable").bootstrapTable('getSelections'), function (row) {

+ 5 - 0
src/main/webapp/webpage/modules/supply/particulars/supplyParticularsList.jsp

@@ -58,6 +58,11 @@
 						<i class="fa fa-folder-open-o"></i> 导入
 					</button>
 				</shiro:hasPermission>--%>
+				<shiro:hasPermission name="supply:particulars:export">
+					<button id="export" class="btn btn-warning">
+						<i class="fa fa-file-excel-o"></i> 导出
+					</button>
+				</shiro:hasPermission>
 			</div>
 
 	<!-- 表格 -->