Commit 35a45502901c2b12e1354f870370a5906405fb36

Authored by 潘钊
2 parents 676e47d5 fa962ba4

Merge branch 'master' of 192.168.168.201:panzhaov5/bsth_control

Showing 72 changed files with 5509 additions and 899 deletions
@@ -71,7 +71,11 @@ @@ -71,7 +71,11 @@
71 <groupId>commons-dbcp</groupId> 71 <groupId>commons-dbcp</groupId>
72 <artifactId>commons-dbcp</artifactId> 72 <artifactId>commons-dbcp</artifactId>
73 </dependency> 73 </dependency>
74 - 74 + <dependency>
  75 + <groupId>commons-lang</groupId>
  76 + <artifactId>commons-lang</artifactId>
  77 + <version>2.6</version>
  78 + </dependency>
75 <dependency> 79 <dependency>
76 <groupId>org.apache.commons</groupId> 80 <groupId>org.apache.commons</groupId>
77 <artifactId>commons-lang3</artifactId> 81 <artifactId>commons-lang3</artifactId>
@@ -122,6 +126,33 @@ @@ -122,6 +126,33 @@
122 <version>0.9.1.2</version> 126 <version>0.9.1.2</version>
123 </dependency> 127 </dependency>
124 128
  129 + <!-- pentaho kettle 依赖 -->
  130 + <dependency>
  131 + <groupId>com.pentaho.kettle</groupId>
  132 + <artifactId>kettle-core</artifactId>
  133 + <version>6.0.1.0-386</version>
  134 + </dependency>
  135 + <dependency>
  136 + <groupId>com.pentaho.kettle</groupId>
  137 + <artifactId>kettle-engine</artifactId>
  138 + <version>6.0.1.0-386</version>
  139 + </dependency>
  140 + <dependency>
  141 + <groupId>com.pentaho.kettle</groupId>
  142 + <artifactId>metastore</artifactId>
  143 + <version>6.0.1.0-386</version>
  144 + </dependency>
  145 + <dependency>
  146 + <groupId>com.pentaho.kettle</groupId>
  147 + <artifactId>vfs2</artifactId>
  148 + <version>2.1-20150824</version>
  149 + </dependency>
  150 + <dependency>
  151 + <groupId>net.sourceforge.jexcelapi</groupId>
  152 + <artifactId>jxl</artifactId>
  153 + <version>2.6.12</version>
  154 + </dependency>
  155 +
125 </dependencies> 156 </dependencies>
126 157
127 <dependencyManagement> 158 <dependencyManagement>
src/main/java/com/bsth/controller/CarsController.java
1 package com.bsth.controller; 1 package com.bsth.controller;
2 2
  3 +import com.bsth.common.ResponseCode;
3 import com.bsth.entity.Cars; 4 import com.bsth.entity.Cars;
4 -import org.springframework.web.bind.annotation.RequestBody;  
5 -import org.springframework.web.bind.annotation.RequestMapping;  
6 -import org.springframework.web.bind.annotation.RequestMethod;  
7 -import org.springframework.web.bind.annotation.RestController; 5 +import com.bsth.service.schedule.utils.DataImportExportService;
  6 +import com.bsth.service.schedule.utils.DataToolsProperties;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  9 +import org.springframework.web.bind.annotation.*;
  10 +import org.springframework.web.multipart.MultipartFile;
8 11
  12 +import java.io.File;
  13 +import java.util.HashMap;
9 import java.util.Map; 14 import java.util.Map;
10 15
11 /** 16 /**
@@ -13,8 +18,13 @@ import java.util.Map; @@ -13,8 +18,13 @@ import java.util.Map;
13 */ 18 */
14 @RestController 19 @RestController
15 @RequestMapping("cars") 20 @RequestMapping("cars")
  21 +@EnableConfigurationProperties(DataToolsProperties.class)
16 public class CarsController extends BaseController<Cars, Integer> { 22 public class CarsController extends BaseController<Cars, Integer> {
17 23
  24 + @Autowired
  25 + private DataImportExportService dataImportExportService;
  26 + @Autowired
  27 + private DataToolsProperties dataToolsProperties;
18 28
19 /** 29 /**
20 * 覆写方法,因为form提交的方式参数不全,改用 json形式提交 @RequestBody 30 * 覆写方法,因为form提交的方式参数不全,改用 json形式提交 @RequestBody
@@ -29,4 +39,40 @@ public class CarsController extends BaseController&lt;Cars, Integer&gt; { @@ -29,4 +39,40 @@ public class CarsController extends BaseController&lt;Cars, Integer&gt; {
29 public Map<String, Object> save(@RequestBody Cars t){ 39 public Map<String, Object> save(@RequestBody Cars t){
30 return baseService.save(t); 40 return baseService.save(t);
31 } 41 }
  42 +
  43 + /**
  44 + * 验证。
  45 + * @param map
  46 + * @return
  47 + */
  48 + @RequestMapping(value = "/validate/equale", method = RequestMethod.GET)
  49 + public Map<String, Object> validateData(@RequestParam Map<String, Object> map) {
  50 + // 一般比较自编号是否重复
  51 + return baseService.validateEquale(map);
  52 + }
  53 +
  54 + // 上传图片
  55 + @RequestMapping(value = "/dataImport", method = RequestMethod.POST)
  56 + public Map<String, Object> uploadPic(MultipartFile file) throws Exception {
  57 + Map<String, Object> resultMap = new HashMap<>();
  58 +
  59 + try {
  60 + // 获取ktr转换文件绝对路径
  61 + File ktrfile = new File(this.getClass().getResource(
  62 + dataToolsProperties.getCarsDatainputktr()).toURI());
  63 + System.out.println(ktrfile.getAbsolutePath());
  64 + // 导入数据
  65 + dataImportExportService.fileDataImport(file, ktrfile);
  66 +
  67 + resultMap.put("status", ResponseCode.SUCCESS);
  68 + resultMap.put("msg", "导入成功");
  69 + } catch (Exception exp) {
  70 + exp.printStackTrace();
  71 + resultMap.put("status", ResponseCode.ERROR);
  72 + resultMap.put("msg", exp.getLocalizedMessage());
  73 + }
  74 +
  75 + return resultMap;
  76 + }
  77 +
32 } 78 }
src/main/java/com/bsth/controller/PersonnelController.java
1 package com.bsth.controller; 1 package com.bsth.controller;
2 2
3 import com.bsth.entity.Personnel; 3 import com.bsth.entity.Personnel;
4 -import org.springframework.web.bind.annotation.RequestBody;  
5 -import org.springframework.web.bind.annotation.RequestMapping;  
6 -import org.springframework.web.bind.annotation.RequestMethod;  
7 -import org.springframework.web.bind.annotation.RestController; 4 +import org.springframework.web.bind.annotation.*;
8 5
9 import java.util.Map; 6 import java.util.Map;
10 7
@@ -27,4 +24,15 @@ public class PersonnelController extends BaseController&lt;Personnel, Integer&gt; { @@ -27,4 +24,15 @@ public class PersonnelController extends BaseController&lt;Personnel, Integer&gt; {
27 public Map<String, Object> save(@RequestBody Personnel t){ 24 public Map<String, Object> save(@RequestBody Personnel t){
28 return baseService.save(t); 25 return baseService.save(t);
29 } 26 }
  27 +
  28 + /**
  29 + * 验证。
  30 + * @param map
  31 + * @return
  32 + */
  33 + @RequestMapping(value = "/validate/equale", method = RequestMethod.GET)
  34 + public Map<String, Object> validateData(@RequestParam Map<String, Object> map) {
  35 + // 一般比较相同公司下工号是否相同
  36 + return baseService.validateEquale(map);
  37 + }
30 } 38 }
src/main/java/com/bsth/entity/Line.java
@@ -29,12 +29,12 @@ public class Line implements Serializable { @@ -29,12 +29,12 @@ public class Line implements Serializable {
29 @Id 29 @Id
30 @GeneratedValue(strategy = GenerationType.IDENTITY) 30 @GeneratedValue(strategy = GenerationType.IDENTITY)
31 private Integer id; 31 private Integer id;
32 -  
33 - // 线路代码  
34 - private String lineCode;  
35 - 32 +
36 // 线路名称 33 // 线路名称
37 private String name; 34 private String name;
  35 +
  36 + // 线路代码
  37 + private String lineCode;
38 38
39 // 英文名 39 // 英文名
40 private String es; 40 private String es;
@@ -42,16 +42,16 @@ public class Line implements Serializable { @@ -42,16 +42,16 @@ public class Line implements Serializable {
42 // 简称 42 // 简称
43 private String shortName; 43 private String shortName;
44 44
45 - // 配置车辆总数 45 + /** 配置车辆总数 老版本系统字段, 新版本系统业务需求暂时没用到该字段 ,这里暂时留着 */
46 private Integer carSumNumber; 46 private Integer carSumNumber;
47 47
48 - // 空调车辆数量 48 + /** 空调车辆数量 老版本系统字段, 新版本系统业务需求暂时没用到该字段 ,这里暂时留着 */
49 private Integer hvacCarNumber; 49 private Integer hvacCarNumber;
50 50
51 - // 普通车辆数量 51 + /** 普通车辆数量 老版本系统字段, 新版本系统业务需求暂时没用到该字段 ,这里暂时留着 */
52 private Integer ordCarNumber; 52 private Integer ordCarNumber;
53 53
54 - // 停车场编码 54 + /** 停车场编码 老版本系统字段, 新版本系统业务需求暂时没用到该字段 ,这里暂时留着 */
55 private String carParkCode; 55 private String carParkCode;
56 56
57 // 起始站名称 57 // 起始站名称
@@ -61,7 +61,7 @@ public class Line implements Serializable { @@ -61,7 +61,7 @@ public class Line implements Serializable {
61 private String startStationFirstTime; 61 private String startStationFirstTime;
62 62
63 // 起始站末班车时间 00:00 63 // 起始站末班车时间 00:00
64 - private String StartStationEndTime; 64 + private String startStationEndTime;
65 65
66 // 终点站名称 66 // 终点站名称
67 private String endStationName; 67 private String endStationName;
@@ -94,10 +94,10 @@ public class Line implements Serializable { @@ -94,10 +94,10 @@ public class Line implements Serializable {
94 private String telephone; 94 private String telephone;
95 95
96 // 是否撤销 96 // 是否撤销
97 - private boolean destroy; 97 + private Integer destroy;
98 98
99 // 是否夜宵线 99 // 是否夜宵线
100 - private boolean supperLine; 100 + private Integer supperLine;
101 101
102 // 起始调度电话 102 // 起始调度电话
103 private String startPhone; 103 private String startPhone;
@@ -224,11 +224,11 @@ public class Line implements Serializable { @@ -224,11 +224,11 @@ public class Line implements Serializable {
224 } 224 }
225 225
226 public String getStartStationEndTime() { 226 public String getStartStationEndTime() {
227 - return StartStationEndTime; 227 + return startStationEndTime;
228 } 228 }
229 229
230 public void setStartStationEndTime(String startStationEndTime) { 230 public void setStartStationEndTime(String startStationEndTime) {
231 - StartStationEndTime = startStationEndTime; 231 + this.startStationEndTime = startStationEndTime;
232 } 232 }
233 233
234 public String getEndStationName() { 234 public String getEndStationName() {
@@ -311,19 +311,19 @@ public class Line implements Serializable { @@ -311,19 +311,19 @@ public class Line implements Serializable {
311 this.telephone = telephone; 311 this.telephone = telephone;
312 } 312 }
313 313
314 - public boolean isDestroy() { 314 + public Integer getDestroy() {
315 return destroy; 315 return destroy;
316 } 316 }
317 317
318 - public void setDestroy(boolean destroy) { 318 + public void setDestroy(Integer destroy) {
319 this.destroy = destroy; 319 this.destroy = destroy;
320 } 320 }
321 321
322 - public boolean isSupperLine() { 322 + public Integer getSupperLine() {
323 return supperLine; 323 return supperLine;
324 } 324 }
325 325
326 - public void setSupperLine(boolean supperLine) { 326 + public void setSupperLine(Integer supperLine) {
327 this.supperLine = supperLine; 327 this.supperLine = supperLine;
328 } 328 }
329 329
src/main/java/com/bsth/entity/LineInformation.java
@@ -131,7 +131,7 @@ public class LineInformation { @@ -131,7 +131,7 @@ public class LineInformation {
131 private Integer lagStation; 131 private Integer lagStation;
132 132
133 // 越站 133 // 越站
134 - private Integer Skip; 134 + private Integer skip;
135 135
136 // 超速 136 // 超速
137 private Integer speeding; 137 private Integer speeding;
@@ -435,11 +435,11 @@ public class LineInformation { @@ -435,11 +435,11 @@ public class LineInformation {
435 } 435 }
436 436
437 public Integer getSkip() { 437 public Integer getSkip() {
438 - return Skip; 438 + return skip;
439 } 439 }
440 440
441 public void setSkip(Integer skip) { 441 public void setSkip(Integer skip) {
442 - Skip = skip; 442 + this.skip = skip;
443 } 443 }
444 444
445 public Integer getSpeeding() { 445 public Integer getSpeeding() {
src/main/java/com/bsth/entity/Personnel.java
@@ -39,7 +39,7 @@ public class Personnel { @@ -39,7 +39,7 @@ public class Personnel {
39 /** 分公司编码 */ 39 /** 分公司编码 */
40 private String brancheCompanyCode; 40 private String brancheCompanyCode;
41 /** 工号 */ 41 /** 工号 */
42 - @Column(nullable = false, unique = true) 42 + @Column(nullable = false)
43 private String jobCode; 43 private String jobCode;
44 /** 姓名 */ 44 /** 姓名 */
45 @Column(nullable = false) 45 @Column(nullable = false)
@@ -49,9 +49,9 @@ public class Personnel { @@ -49,9 +49,9 @@ public class Personnel {
49 private String papersCode; 49 private String papersCode;
50 /** 一卡通工作卡号 */ 50 /** 一卡通工作卡号 */
51 private String icCardCode; 51 private String icCardCode;
52 - /** 性别(TODO:暂时使用男/女,不使用字典) */ 52 + /** 性别(字典类型sexType) */
53 private String personnelType; 53 private String personnelType;
54 - /** 所属岗位/工种(TODO:暂时不使用字典) */ 54 + /** 所属岗位/工种(字典类型gzType) */
55 private String posts; 55 private String posts;
56 56
57 57
src/main/java/com/bsth/service/BaseService.java
1 package com.bsth.service; 1 package com.bsth.service;
2 2
3 -import java.io.Serializable;  
4 -import java.util.Map;  
5 -  
6 import org.springframework.data.domain.Page; 3 import org.springframework.data.domain.Page;
7 import org.springframework.data.domain.Pageable; 4 import org.springframework.data.domain.Pageable;
8 5
  6 +import java.io.Serializable;
  7 +import java.util.Map;
  8 +
9 /** 9 /**
10 * 10 *
11 * @ClassName: BaseService 11 * @ClassName: BaseService
@@ -63,4 +63,11 @@ public interface BaseService&lt;T, ID extends Serializable&gt; { @@ -63,4 +63,11 @@ public interface BaseService&lt;T, ID extends Serializable&gt; {
63 * @throws 63 * @throws
64 */ 64 */
65 Map<String, Object> delete(ID id); 65 Map<String, Object> delete(ID id);
  66 +
  67 + /**
  68 + * 后端验证查询数据是否重复。
  69 + * @param params 查询条件
  70 + * @return {status:状态编码,msg:错误描述},状态编码 @see com.bsth.common.ResponseCode
  71 + */
  72 + Map<String, Object> validateEquale(Map<String, Object> params);
66 } 73 }
src/main/java/com/bsth/service/impl/BaseServiceImpl.java
1 package com.bsth.service.impl; 1 package com.bsth.service.impl;
2 2
3 -import java.io.Serializable;  
4 -import java.util.HashMap;  
5 -import java.util.Map;  
6 - 3 +import com.bsth.common.ResponseCode;
  4 +import com.bsth.entity.search.CustomerSpecs;
  5 +import com.bsth.repository.BaseRepository;
  6 +import com.bsth.service.BaseService;
7 import org.slf4j.Logger; 7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
@@ -11,10 +11,9 @@ import org.springframework.dao.DataIntegrityViolationException; @@ -11,10 +11,9 @@ import org.springframework.dao.DataIntegrityViolationException;
11 import org.springframework.data.domain.Page; 11 import org.springframework.data.domain.Page;
12 import org.springframework.data.domain.Pageable; 12 import org.springframework.data.domain.Pageable;
13 13
14 -import com.bsth.common.ResponseCode;  
15 -import com.bsth.entity.search.CustomerSpecs;  
16 -import com.bsth.repository.BaseRepository;  
17 -import com.bsth.service.BaseService; 14 +import java.io.Serializable;
  15 +import java.util.HashMap;
  16 +import java.util.Map;
18 17
19 public class BaseServiceImpl<T, ID extends Serializable> implements BaseService<T, ID>{ 18 public class BaseServiceImpl<T, ID extends Serializable> implements BaseService<T, ID>{
20 19
@@ -70,4 +69,31 @@ public class BaseServiceImpl&lt;T, ID extends Serializable&gt; implements BaseService&lt; @@ -70,4 +69,31 @@ public class BaseServiceImpl&lt;T, ID extends Serializable&gt; implements BaseService&lt;
70 } 69 }
71 return map; 70 return map;
72 } 71 }
  72 +
  73 + @Override
  74 + public Map<String, Object> validateEquale(Map<String, Object> params) {
  75 + Map<String, Object> returnMap = new HashMap<>();
  76 +
  77 + try {
  78 + if (params == null || params.size() == 0) {
  79 + returnMap.put("status", ResponseCode.SUCCESS);
  80 + returnMap.put("msg", "此时没有重复");
  81 + } else {
  82 + Iterable<T> iterable = list(params);
  83 + if (iterable.iterator().hasNext()) {
  84 + returnMap.put("status", ResponseCode.ERROR);
  85 + returnMap.put("msg", "数据重复");
  86 + } else {
  87 + returnMap.put("status", ResponseCode.SUCCESS);
  88 + returnMap.put("msg", "没有重复");
  89 + }
  90 + }
  91 + } catch (Exception exp) {
  92 + logger.error("validateEquale error", exp);
  93 + returnMap.put("status", ResponseCode.ERROR);
  94 + returnMap.put("msg", exp.getLocalizedMessage());
  95 + }
  96 +
  97 + return returnMap;
  98 + }
73 } 99 }
src/main/java/com/bsth/service/schedule/utils/DataImportExportService.java 0 → 100644
  1 +package com.bsth.service.schedule.utils;
  2 +
  3 +import org.springframework.web.multipart.MultipartFile;
  4 +
  5 +import java.io.File;
  6 +
  7 +/**
  8 + * 数据导入导出服务。
  9 + */
  10 +public interface DataImportExportService {
  11 + /**
  12 + * 上传文件。
  13 + * @param file mutipartFile
  14 + * @return 上传后的文件路径
  15 + * @throws Exception
  16 + */
  17 + File uploadFile(MultipartFile file) throws Exception;
  18 +
  19 + /**
  20 + * 上传文件,并导入文件数据。
  21 + * @param datafile 上传的文件
  22 + * @param ktrFile 导入的逻辑ktr文件
  23 + * @throws Exception
  24 + */
  25 + void fileDataImport(MultipartFile datafile, File ktrFile) throws Exception;
  26 +}
src/main/java/com/bsth/service/schedule/utils/DataImportExportServiceImpl.java 0 → 100644
  1 +package com.bsth.service.schedule.utils;
  2 +
  3 +import com.google.common.io.Files;
  4 +import org.pentaho.di.core.KettleEnvironment;
  5 +import org.pentaho.di.core.util.EnvUtil;
  6 +import org.pentaho.di.trans.Trans;
  7 +import org.pentaho.di.trans.TransMeta;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  10 +import org.springframework.stereotype.Service;
  11 +import org.springframework.web.multipart.MultipartFile;
  12 +
  13 +import java.io.File;
  14 +
  15 +/**
  16 + * Created by xu on 16/6/23.
  17 + */
  18 +@Service
  19 +@EnableConfigurationProperties(DataToolsProperties.class)
  20 +public class DataImportExportServiceImpl implements DataImportExportService {
  21 +
  22 + @Autowired
  23 + private DataToolsProperties dataToolsProperties;
  24 +
  25 + @Override
  26 + public File uploadFile(MultipartFile file) throws Exception {
  27 + // TODO:以后的文件名要加时间戳
  28 + File newFile = new File(
  29 + dataToolsProperties.getFileuploadDir() + File.separator +
  30 + file.getOriginalFilename());
  31 + Files.write(file.getBytes(), newFile);
  32 + return newFile;
  33 + }
  34 +
  35 + @Override
  36 + public void fileDataImport(MultipartFile datafile, File ktrFile) throws Exception {
  37 + // 1、上传数据文件
  38 + File uploadFile = uploadFile(datafile);
  39 +
  40 + // 2、使用kettle运行封装数据导入逻辑的ktr转换文件
  41 + // 2.1、初始化kettle
  42 + EnvUtil.environmentInit();
  43 + KettleEnvironment.init();
  44 + // 2.2、创建转换元数据,转换
  45 + TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
  46 + Trans trans = new Trans(transMeta);
  47 + // 2.3、设定命名参数,用于指定数据文件,注意每个ktr必须都有以下指定的命名参数
  48 + trans.setParameterValue("filepath", uploadFile.getAbsolutePath()); // 指定导入数据文件的位置
  49 + trans.setParameterValue("erroroutputdir", dataToolsProperties.getTransErrordir()); // ktr转换错误输出目录
  50 + // TODO:可以考虑设定日志输出
  51 + // 2.4、执行转换
  52 + trans.execute(null);
  53 + // 2.5、等待转换结束
  54 + trans.waitUntilFinished();
  55 +
  56 + // 3、判定ktr错误数,注意这种错误代表部分数据错误,不会终止转换执行,一般设计ktr的时候,会有错误输出文件,TODO:以后考虑使用日志实时输出
  57 + if (trans.getErrors() > 0) {
  58 + throw new Exception("转换数据部分错误,请查看相关错误输出文件!");
  59 + }
  60 + }
  61 +}
src/main/java/com/bsth/service/schedule/utils/DataToolsProperties.java 0 → 100644
  1 +package com.bsth.service.schedule.utils;
  2 +
  3 +import org.springframework.boot.context.properties.ConfigurationProperties;
  4 +
  5 +import javax.validation.constraints.NotNull;
  6 +
  7 +/**
  8 + * 配置数据导入导出用到的配置信息
  9 + */
  10 +@ConfigurationProperties(
  11 + locations = "classpath:datatools/config.properties",
  12 + ignoreInvalidFields = true,
  13 + prefix = "datatools"
  14 +)
  15 +public class DataToolsProperties {
  16 +
  17 + /** 上传文件目录配置(根据不同的环境需要修正) */
  18 + @NotNull
  19 + private String fileuploadDir;
  20 +
  21 + /** ktr转换文件,中配置的错误输出目录(根据不同的环境需要修正) */
  22 + @NotNull
  23 + private String transErrordir;
  24 +
  25 + /** 测试temp的ktr转换文件 */
  26 + @NotNull
  27 + private String tempDatainputktr;
  28 + /** 车辆信息导入ktr转换 */
  29 + @NotNull
  30 + private String carsDatainputktr;
  31 +
  32 + public String getFileuploadDir() {
  33 + return fileuploadDir;
  34 + }
  35 +
  36 + public void setFileuploadDir(String fileuploadDir) {
  37 + this.fileuploadDir = fileuploadDir;
  38 + }
  39 +
  40 + public String getTransErrordir() {
  41 + return transErrordir;
  42 + }
  43 +
  44 + public void setTransErrordir(String transErrordir) {
  45 + this.transErrordir = transErrordir;
  46 + }
  47 +
  48 + public String getTempDatainputktr() {
  49 + return tempDatainputktr;
  50 + }
  51 +
  52 + public void setTempDatainputktr(String tempDatainputktr) {
  53 + this.tempDatainputktr = tempDatainputktr;
  54 + }
  55 +
  56 + public String getCarsDatainputktr() {
  57 + return carsDatainputktr;
  58 + }
  59 +
  60 + public void setCarsDatainputktr(String carsDatainputktr) {
  61 + this.carsDatainputktr = carsDatainputktr;
  62 + }
  63 +}
src/main/resources/application.properties
@@ -25,6 +25,12 @@ server.session-timeout=-1 @@ -25,6 +25,12 @@ server.session-timeout=-1
25 25
26 security.basic.enabled=false 26 security.basic.enabled=false
27 27
  28 +# 上传文件大小限制配置
  29 +# File size limit
  30 +multipart.maxFileSize = -1
  31 +# Total request size for a multipart/form-data
  32 +multipart.maxRequestSize = -1
  33 +
28 ## 34 ##
29 #222.66.0.204:5555 35 #222.66.0.204:5555
30 ##\u5B9E\u65F6gps 36 ##\u5B9E\u65F6gps
src/main/resources/datatools/config.properties 0 → 100644
  1 +# 配置数据导入导出用到的配置信息
  2 +
  3 +# 上传文件目录配置(根据不同的环境需要修正)
  4 +datatools.fileupload_dir=/Users/xu/resource/project/bsth_control_u_d_files
  5 +# ktr转换文件,中配置的错误输出目录(根据不同的环境需要修正)
  6 +datatools.trans_errordir=/Users/xu/resource/project/bsth_control_u_d_files/erroroutput
  7 +
  8 +# 以下是封装数据导入导出逻辑的ktr转换文件,类路径,以后考虑放到数据库中
  9 +# 测试temp的ktr转换文件
  10 +datatools.temp_datainputktr=/datatools/ktrs/test.ktr
  11 +# 车辆信息导入ktr转换
  12 +datatools.cars_datainputktr=/datatools/ktrs/carsDataInput.ktr
  13 +# 人员信息导入
  14 +
  15 +# 时刻表基础信息导入
  16 +
  17 +# 时刻明细信息导入
  18 +
  19 +# 车辆配置信息导入
  20 +
  21 +# 人员配置信息导入
  22 +
  23 +# 排班规则信息导入**
0 \ No newline at end of file 24 \ No newline at end of file
src/main/resources/datatools/ktrs/carsDataInput.ktr 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<transformation>
  3 + <info>
  4 + <name>carsDataInput</name>
  5 + <description>&#x8f66;&#x8f86;&#x4fe1;&#x606f;&#x5bfc;&#x5165;</description>
  6 + <extended_description>&#x8f66;&#x8f86;&#x57fa;&#x7840;&#x4fe1;&#x606f;</extended_description>
  7 + <trans_version/>
  8 + <trans_type>Normal</trans_type>
  9 + <trans_status>0</trans_status>
  10 + <directory>&#x2f;</directory>
  11 + <parameters>
  12 + <parameter>
  13 + <name>erroroutputdir</name>
  14 + <default_value/>
  15 + <description>ktr&#x914d;&#x7f6e;&#x7684;&#x9519;&#x8bef;&#x8f93;&#x51fa;&#x76ee;&#x5f55;</description>
  16 + </parameter>
  17 + <parameter>
  18 + <name>filepath</name>
  19 + <default_value/>
  20 + <description>&#x5f85;&#x5904;&#x7406;&#x5bfc;&#x5165;&#x7684;excel&#x6587;&#x4ef6;</description>
  21 + </parameter>
  22 + </parameters>
  23 + <log>
  24 +<trans-log-table><connection/>
  25 +<schema/>
  26 +<table/>
  27 +<size_limit_lines/>
  28 +<interval/>
  29 +<timeout_days/>
  30 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STATUS</id><enabled>Y</enabled><name>STATUS</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name><subject/></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name><subject/></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name><subject/></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name><subject/></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name><subject/></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name><subject/></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>STARTDATE</id><enabled>Y</enabled><name>STARTDATE</name></field><field><id>ENDDATE</id><enabled>Y</enabled><name>ENDDATE</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>DEPDATE</id><enabled>Y</enabled><name>DEPDATE</name></field><field><id>REPLAYDATE</id><enabled>Y</enabled><name>REPLAYDATE</name></field><field><id>LOG_FIELD</id><enabled>Y</enabled><name>LOG_FIELD</name></field><field><id>EXECUTING_SERVER</id><enabled>N</enabled><name>EXECUTING_SERVER</name></field><field><id>EXECUTING_USER</id><enabled>N</enabled><name>EXECUTING_USER</name></field><field><id>CLIENT</id><enabled>N</enabled><name>CLIENT</name></field></trans-log-table>
  31 +<perf-log-table><connection/>
  32 +<schema/>
  33 +<table/>
  34 +<interval/>
  35 +<timeout_days/>
  36 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>SEQ_NR</id><enabled>Y</enabled><name>SEQ_NR</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>INPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>INPUT_BUFFER_ROWS</name></field><field><id>OUTPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>OUTPUT_BUFFER_ROWS</name></field></perf-log-table>
  37 +<channel-log-table><connection/>
  38 +<schema/>
  39 +<table/>
  40 +<timeout_days/>
  41 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>LOGGING_OBJECT_TYPE</id><enabled>Y</enabled><name>LOGGING_OBJECT_TYPE</name></field><field><id>OBJECT_NAME</id><enabled>Y</enabled><name>OBJECT_NAME</name></field><field><id>OBJECT_COPY</id><enabled>Y</enabled><name>OBJECT_COPY</name></field><field><id>REPOSITORY_DIRECTORY</id><enabled>Y</enabled><name>REPOSITORY_DIRECTORY</name></field><field><id>FILENAME</id><enabled>Y</enabled><name>FILENAME</name></field><field><id>OBJECT_ID</id><enabled>Y</enabled><name>OBJECT_ID</name></field><field><id>OBJECT_REVISION</id><enabled>Y</enabled><name>OBJECT_REVISION</name></field><field><id>PARENT_CHANNEL_ID</id><enabled>Y</enabled><name>PARENT_CHANNEL_ID</name></field><field><id>ROOT_CHANNEL_ID</id><enabled>Y</enabled><name>ROOT_CHANNEL_ID</name></field></channel-log-table>
  42 +<step-log-table><connection/>
  43 +<schema/>
  44 +<table/>
  45 +<timeout_days/>
  46 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>LOG_FIELD</id><enabled>N</enabled><name>LOG_FIELD</name></field></step-log-table>
  47 +<metrics-log-table><connection/>
  48 +<schema/>
  49 +<table/>
  50 +<timeout_days/>
  51 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>METRICS_DATE</id><enabled>Y</enabled><name>METRICS_DATE</name></field><field><id>METRICS_CODE</id><enabled>Y</enabled><name>METRICS_CODE</name></field><field><id>METRICS_DESCRIPTION</id><enabled>Y</enabled><name>METRICS_DESCRIPTION</name></field><field><id>METRICS_SUBJECT</id><enabled>Y</enabled><name>METRICS_SUBJECT</name></field><field><id>METRICS_TYPE</id><enabled>Y</enabled><name>METRICS_TYPE</name></field><field><id>METRICS_VALUE</id><enabled>Y</enabled><name>METRICS_VALUE</name></field></metrics-log-table>
  52 + </log>
  53 + <maxdate>
  54 + <connection/>
  55 + <table/>
  56 + <field/>
  57 + <offset>0.0</offset>
  58 + <maxdiff>0.0</maxdiff>
  59 + </maxdate>
  60 + <size_rowset>10000</size_rowset>
  61 + <sleep_time_empty>50</sleep_time_empty>
  62 + <sleep_time_full>50</sleep_time_full>
  63 + <unique_connections>N</unique_connections>
  64 + <feedback_shown>Y</feedback_shown>
  65 + <feedback_size>50000</feedback_size>
  66 + <using_thread_priorities>Y</using_thread_priorities>
  67 + <shared_objects_file/>
  68 + <capture_step_performance>N</capture_step_performance>
  69 + <step_performance_capturing_delay>1000</step_performance_capturing_delay>
  70 + <step_performance_capturing_size_limit>100</step_performance_capturing_size_limit>
  71 + <dependencies>
  72 + </dependencies>
  73 + <partitionschemas>
  74 + </partitionschemas>
  75 + <slaveservers>
  76 + </slaveservers>
  77 + <clusterschemas>
  78 + </clusterschemas>
  79 + <created_user>-</created_user>
  80 + <created_date>2016&#x2f;06&#x2f;23 17&#x3a;44&#x3a;46.781</created_date>
  81 + <modified_user>-</modified_user>
  82 + <modified_date>2016&#x2f;06&#x2f;23 17&#x3a;44&#x3a;46.781</modified_date>
  83 + <key_for_session_key/>
  84 + <is_key_private>N</is_key_private>
  85 + </info>
  86 + <notepads>
  87 + <notepad>
  88 + <note>&#x539f;&#x7cfb;&#x7edf;&#x7684;&#x5bfc;&#x51fa;&#x8868;&#xff0c;&#x6709;&#x4e9b;&#x6570;&#x636e;&#x662f;&#x6ca1;&#x6709;&#x7684;&#xff0c;&#x6709;&#x4e9b;&#x6570;&#x636e;&#x4e5f;&#x6709;&#x95ee;&#x9898;&#xff0c;&#x5982;&#x4e0b;&#xa;&#x62a5;&#x5e9f;&#x65e5;&#x671f;&#x53bb;&#x6389;&#xa;&#x8f66;&#x8f86;&#x7f16;&#x7801;&#xff0c;&#x6682;&#x65f6;&#x7528;1&#x4ee3;&#x66ff;&#xa;&#x662f;&#x5426;&#x7535;&#x8f66; &#x6ca1;&#x6709;&#xa;&#x8f66;&#x8f86;&#x5e8f;&#x53f7; &#x6ca1;&#x6709;&#xa;&#x662f;&#x5426;&#x5207;&#x6362; &#x6ca1;&#x6709;&#xa;&#x7ebf;&#x8def;&#x540d;&#x79f0;&#xff08;&#x8fd9;&#x91cc;&#x4e0d;&#x505a;&#x5173;&#x8054;&#xff0c;&#x53ea;&#x662f;&#x767b;&#x8bb0;&#x7684;&#x65f6;&#x5019;&#x4f7f;&#x7528;&#xff09; &#x54a9;&#x6709;</note>
  89 + <xloc>365</xloc>
  90 + <yloc>136</yloc>
  91 + <width>346</width>
  92 + <heigth>122</heigth>
  93 + <fontname>YaHei Consolas Hybrid</fontname>
  94 + <fontsize>12</fontsize>
  95 + <fontbold>N</fontbold>
  96 + <fontitalic>N</fontitalic>
  97 + <fontcolorred>0</fontcolorred>
  98 + <fontcolorgreen>0</fontcolorgreen>
  99 + <fontcolorblue>0</fontcolorblue>
  100 + <backgroundcolorred>255</backgroundcolorred>
  101 + <backgroundcolorgreen>205</backgroundcolorgreen>
  102 + <backgroundcolorblue>112</backgroundcolorblue>
  103 + <bordercolorred>100</bordercolorred>
  104 + <bordercolorgreen>100</bordercolorgreen>
  105 + <bordercolorblue>100</bordercolorblue>
  106 + <drawshadow>Y</drawshadow>
  107 + </notepad>
  108 + </notepads>
  109 + <connection>
  110 + <name>bus_control_&#x516c;&#x53f8;_201</name>
  111 + <server>192.168.168.201</server>
  112 + <type>MYSQL</type>
  113 + <access>Native</access>
  114 + <database>control</database>
  115 + <port>3306</port>
  116 + <username>root</username>
  117 + <password>Encrypted 2be98afc86aa7f2e4cb79ff228dc6fa8c</password>
  118 + <servername/>
  119 + <data_tablespace/>
  120 + <index_tablespace/>
  121 + <attributes>
  122 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  123 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  124 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  125 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  126 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  127 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  128 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  129 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  130 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  131 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  132 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  133 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  134 + </attributes>
  135 + </connection>
  136 + <connection>
  137 + <name>xlab_mysql_youle</name>
  138 + <server>101.231.124.8</server>
  139 + <type>MYSQL</type>
  140 + <access>Native</access>
  141 + <database>xlab_youle</database>
  142 + <port>45687</port>
  143 + <username>xlab-youle</username>
  144 + <password>Encrypted 2be98afc86aa78a88aa1be369d187a3df</password>
  145 + <servername/>
  146 + <data_tablespace/>
  147 + <index_tablespace/>
  148 + <attributes>
  149 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  150 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  151 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  152 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  153 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  154 + <attribute><code>PORT_NUMBER</code><attribute>45687</attribute></attribute>
  155 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  156 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  157 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  158 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  159 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  160 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  161 + </attributes>
  162 + </connection>
  163 + <connection>
  164 + <name>xlab_mysql_youle&#xff08;&#x672c;&#x673a;&#xff09;</name>
  165 + <server>localhost</server>
  166 + <type>MYSQL</type>
  167 + <access>Native</access>
  168 + <database>xlab_youle</database>
  169 + <port>3306</port>
  170 + <username>root</username>
  171 + <password>Encrypted </password>
  172 + <servername/>
  173 + <data_tablespace/>
  174 + <index_tablespace/>
  175 + <attributes>
  176 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  177 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  178 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  179 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  180 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  181 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  182 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  183 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  184 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  185 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  186 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  187 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  188 + </attributes>
  189 + </connection>
  190 + <connection>
  191 + <name>xlab_youle</name>
  192 + <server/>
  193 + <type>MYSQL</type>
  194 + <access>JNDI</access>
  195 + <database>xlab_youle</database>
  196 + <port>1521</port>
  197 + <username/>
  198 + <password>Encrypted </password>
  199 + <servername/>
  200 + <data_tablespace/>
  201 + <index_tablespace/>
  202 + <attributes>
  203 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  204 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  205 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  206 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  207 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  208 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  209 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  210 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  211 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  212 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  213 + </attributes>
  214 + </connection>
  215 + <order>
  216 + <hop> <from>&#x539f;&#x59cb;&#x7cfb;&#x7edf;&#x5bfc;&#x51fa;&#x7684;Excel&#x8f93;&#x5165;</from><to>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</to><enabled>Y</enabled> </hop>
  217 + <hop> <from>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</from><to>&#x662f;&#x5426;&#x7a7a;&#x8c03;&#x8f66;</to><enabled>Y</enabled> </hop>
  218 + <hop> <from>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_cars</from><to>&#x9519;&#x8bef;&#x8f93;&#x51fa;</to><enabled>Y</enabled> </hop>
  219 + <hop> <from>&#x662f;&#x5426;&#x6709;LED&#x670d;&#x52a1;&#x5c4f;</from><to>&#x662f;&#x5426;&#x6709;TV&#x89c6;&#x9891;</to><enabled>Y</enabled> </hop>
  220 + <hop> <from>&#x662f;&#x5426;&#x6709;TV&#x89c6;&#x9891;</from><to>&#x662f;&#x5426;&#x7684;&#x53d8;&#x6210;&#x6570;&#x5b57;&#x578b;</to><enabled>Y</enabled> </hop>
  221 + <hop> <from>&#x662f;&#x5426;&#x7684;&#x53d8;&#x6210;&#x6570;&#x5b57;&#x578b;</from><to>&#x516c;&#x4ea4;&#x4f01;&#x4e1a;&#x4ee3;&#x7801;</to><enabled>Y</enabled> </hop>
  222 + <hop> <from>&#x662f;&#x5426;&#x7a7a;&#x8c03;&#x8f66;</from><to>&#x6709;&#x65e0;&#x4eba;&#x552e;&#x7968;</to><enabled>Y</enabled> </hop>
  223 + <hop> <from>&#x6709;&#x65e0;&#x4eba;&#x552e;&#x7968;</from><to>&#x662f;&#x5426;&#x6709;LED&#x670d;&#x52a1;&#x5c4f;</to><enabled>Y</enabled> </hop>
  224 + <hop> <from>&#x516c;&#x4ea4;&#x4f01;&#x4e1a;&#x4ee3;&#x7801;</from><to>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_cars</to><enabled>Y</enabled> </hop>
  225 + <hop> <from>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</from><to>&#x539f;&#x59cb;&#x7cfb;&#x7edf;&#x5bfc;&#x51fa;&#x7684;Excel&#x8f93;&#x5165;</to><enabled>Y</enabled> </hop>
  226 + </order>
  227 + <step>
  228 + <name>&#x516c;&#x4ea4;&#x4f01;&#x4e1a;&#x4ee3;&#x7801;</name>
  229 + <type>ValueMapper</type>
  230 + <description/>
  231 + <distribute>Y</distribute>
  232 + <custom_distribution/>
  233 + <copies>1</copies>
  234 + <partitioning>
  235 + <method>none</method>
  236 + <schema_name/>
  237 + </partitioning>
  238 + <field_to_use>company</field_to_use>
  239 + <target_field>businessCode</target_field>
  240 + <non_match_default/>
  241 + <fields>
  242 + <field>
  243 + <source_value>&#x4e0a;&#x5357;&#x516c;&#x53f8;</source_value>
  244 + <target_value>55</target_value>
  245 + </field>
  246 + <field>
  247 + <source_value>&#x91d1;&#x9ad8;&#x516c;&#x53f8;</source_value>
  248 + <target_value>22</target_value>
  249 + </field>
  250 + <field>
  251 + <source_value>&#x6768;&#x9ad8;&#x516c;&#x53f8;</source_value>
  252 + <target_value>05</target_value>
  253 + </field>
  254 + <field>
  255 + <source_value>&#x5357;&#x6c47;&#x516c;&#x53f8;</source_value>
  256 + <target_value>26</target_value>
  257 + </field>
  258 + <field>
  259 + <source_value>&#x516c;&#x4ea4;&#x516c;&#x53f8;</source_value>
  260 + <target_value>88</target_value>
  261 + </field>
  262 + <field>
  263 + <source_value>&#x95f5;&#x884c;&#x516c;&#x4ea4;</source_value>
  264 + <target_value>77</target_value>
  265 + </field>
  266 + </fields>
  267 + <cluster_schema/>
  268 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  269 + <xloc>841</xloc>
  270 + <yloc>166</yloc>
  271 + <draw>Y</draw>
  272 + </GUI>
  273 + </step>
  274 +
  275 + <step>
  276 + <name>&#x539f;&#x59cb;&#x7cfb;&#x7edf;&#x5bfc;&#x51fa;&#x7684;Excel&#x8f93;&#x5165;</name>
  277 + <type>ExcelInput</type>
  278 + <description/>
  279 + <distribute>Y</distribute>
  280 + <custom_distribution/>
  281 + <copies>1</copies>
  282 + <partitioning>
  283 + <method>none</method>
  284 + <schema_name/>
  285 + </partitioning>
  286 + <header>Y</header>
  287 + <noempty>Y</noempty>
  288 + <stoponempty>N</stoponempty>
  289 + <filefield/>
  290 + <sheetfield/>
  291 + <sheetrownumfield/>
  292 + <rownumfield/>
  293 + <sheetfield/>
  294 + <filefield/>
  295 + <limit>0</limit>
  296 + <encoding/>
  297 + <add_to_result_filenames>Y</add_to_result_filenames>
  298 + <accept_filenames>Y</accept_filenames>
  299 + <accept_field>filepath_</accept_field>
  300 + <accept_stepname>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</accept_stepname>
  301 + <file>
  302 + <name/>
  303 + <filemask/>
  304 + <exclude_filemask/>
  305 + <file_required>N</file_required>
  306 + <include_subfolders>N</include_subfolders>
  307 + </file>
  308 + <fields>
  309 + <field>
  310 + <name>&#x8f66;&#x724c;&#x53f7;</name>
  311 + <type>String</type>
  312 + <length>-1</length>
  313 + <precision>-1</precision>
  314 + <trim_type>none</trim_type>
  315 + <repeat>N</repeat>
  316 + <format/>
  317 + <currency/>
  318 + <decimal/>
  319 + <group/>
  320 + </field>
  321 + <field>
  322 + <name>&#x5185;&#x90e8;&#x7f16;&#x7801;</name>
  323 + <type>String</type>
  324 + <length>-1</length>
  325 + <precision>-1</precision>
  326 + <trim_type>none</trim_type>
  327 + <repeat>N</repeat>
  328 + <format/>
  329 + <currency/>
  330 + <decimal/>
  331 + <group/>
  332 + </field>
  333 + <field>
  334 + <name>&#x8f66;&#x8f86;&#x7f16;&#x7801;</name>
  335 + <type>String</type>
  336 + <length>-1</length>
  337 + <precision>-1</precision>
  338 + <trim_type>none</trim_type>
  339 + <repeat>N</repeat>
  340 + <format/>
  341 + <currency/>
  342 + <decimal/>
  343 + <group/>
  344 + </field>
  345 + <field>
  346 + <name>&#x8f66;&#x578b;&#x7c7b;&#x522b;</name>
  347 + <type>String</type>
  348 + <length>-1</length>
  349 + <precision>-1</precision>
  350 + <trim_type>none</trim_type>
  351 + <repeat>N</repeat>
  352 + <format/>
  353 + <currency/>
  354 + <decimal/>
  355 + <group/>
  356 + </field>
  357 + <field>
  358 + <name>&#x5ea7;&#x4f4d;&#x6570;</name>
  359 + <type>String</type>
  360 + <length>-1</length>
  361 + <precision>-1</precision>
  362 + <trim_type>none</trim_type>
  363 + <repeat>N</repeat>
  364 + <format/>
  365 + <currency/>
  366 + <decimal/>
  367 + <group/>
  368 + </field>
  369 + <field>
  370 + <name>&#x8f7d;&#x5ba2;&#x6807;&#x51c6;</name>
  371 + <type>String</type>
  372 + <length>-1</length>
  373 + <precision>-1</precision>
  374 + <trim_type>none</trim_type>
  375 + <repeat>N</repeat>
  376 + <format/>
  377 + <currency/>
  378 + <decimal/>
  379 + <group/>
  380 + </field>
  381 + <field>
  382 + <name>&#x6280;&#x672f;&#x901f;&#x5ea6;</name>
  383 + <type>String</type>
  384 + <length>-1</length>
  385 + <precision>-1</precision>
  386 + <trim_type>none</trim_type>
  387 + <repeat>N</repeat>
  388 + <format/>
  389 + <currency/>
  390 + <decimal/>
  391 + <group/>
  392 + </field>
  393 + <field>
  394 + <name>&#x662f;&#x5426;&#x7a7a;&#x8c03;</name>
  395 + <type>String</type>
  396 + <length>-1</length>
  397 + <precision>-1</precision>
  398 + <trim_type>none</trim_type>
  399 + <repeat>N</repeat>
  400 + <format/>
  401 + <currency/>
  402 + <decimal/>
  403 + <group/>
  404 + </field>
  405 + <field>
  406 + <name>&#x6807;&#x51c6;&#x6cb9;&#x8017;&#x28;&#x5f00;&#x7a7a;&#x8c03;&#x29;</name>
  407 + <type>String</type>
  408 + <length>-1</length>
  409 + <precision>-1</precision>
  410 + <trim_type>none</trim_type>
  411 + <repeat>N</repeat>
  412 + <format/>
  413 + <currency/>
  414 + <decimal/>
  415 + <group/>
  416 + </field>
  417 + <field>
  418 + <name>&#x6807;&#x51c6;&#x6cb9;&#x8017;&#x28;&#x5173;&#x7a7a;&#x8c03;&#x29;</name>
  419 + <type>String</type>
  420 + <length>-1</length>
  421 + <precision>-1</precision>
  422 + <trim_type>none</trim_type>
  423 + <repeat>N</repeat>
  424 + <format/>
  425 + <currency/>
  426 + <decimal/>
  427 + <group/>
  428 + </field>
  429 + <field>
  430 + <name>&#x6709;&#x65e0;&#x4eba;&#x552e;&#x7968;</name>
  431 + <type>String</type>
  432 + <length>-1</length>
  433 + <precision>-1</precision>
  434 + <trim_type>none</trim_type>
  435 + <repeat>N</repeat>
  436 + <format/>
  437 + <currency/>
  438 + <decimal/>
  439 + <group/>
  440 + </field>
  441 + <field>
  442 + <name>&#x662f;&#x5426;&#x6709;TV&#x89c6;&#x9891;</name>
  443 + <type>String</type>
  444 + <length>-1</length>
  445 + <precision>-1</precision>
  446 + <trim_type>none</trim_type>
  447 + <repeat>N</repeat>
  448 + <format/>
  449 + <currency/>
  450 + <decimal/>
  451 + <group/>
  452 + </field>
  453 + <field>
  454 + <name>&#x662f;&#x5426;&#x6709;LED&#x670d;&#x52a1;&#x5c4f;</name>
  455 + <type>String</type>
  456 + <length>-1</length>
  457 + <precision>-1</precision>
  458 + <trim_type>none</trim_type>
  459 + <repeat>N</repeat>
  460 + <format/>
  461 + <currency/>
  462 + <decimal/>
  463 + <group/>
  464 + </field>
  465 + <field>
  466 + <name>&#x8fd0;&#x8425;&#x72b6;&#x6001;</name>
  467 + <type>String</type>
  468 + <length>-1</length>
  469 + <precision>-1</precision>
  470 + <trim_type>none</trim_type>
  471 + <repeat>N</repeat>
  472 + <format/>
  473 + <currency/>
  474 + <decimal/>
  475 + <group/>
  476 + </field>
  477 + <field>
  478 + <name>&#x542f;&#x7528;&#x65e5;&#x671f;</name>
  479 + <type>String</type>
  480 + <length>-1</length>
  481 + <precision>-1</precision>
  482 + <trim_type>none</trim_type>
  483 + <repeat>N</repeat>
  484 + <format/>
  485 + <currency/>
  486 + <decimal/>
  487 + <group/>
  488 + </field>
  489 + <field>
  490 + <name>&#x53d6;&#x6d88;&#x65e5;&#x671f;</name>
  491 + <type>String</type>
  492 + <length>-1</length>
  493 + <precision>-1</precision>
  494 + <trim_type>none</trim_type>
  495 + <repeat>N</repeat>
  496 + <format/>
  497 + <currency/>
  498 + <decimal/>
  499 + <group/>
  500 + </field>
  501 + <field>
  502 + <name>&#x62a5;&#x5e9f;&#x53f7;</name>
  503 + <type>String</type>
  504 + <length>-1</length>
  505 + <precision>-1</precision>
  506 + <trim_type>none</trim_type>
  507 + <repeat>N</repeat>
  508 + <format/>
  509 + <currency/>
  510 + <decimal/>
  511 + <group/>
  512 + </field>
  513 + <field>
  514 + <name>&#x62a5;&#x5e9f;&#x65e5;&#x671f;</name>
  515 + <type>String</type>
  516 + <length>-1</length>
  517 + <precision>-1</precision>
  518 + <trim_type>none</trim_type>
  519 + <repeat>N</repeat>
  520 + <format/>
  521 + <currency/>
  522 + <decimal/>
  523 + <group/>
  524 + </field>
  525 + <field>
  526 + <name>&#x5907;&#x6ce8;</name>
  527 + <type>String</type>
  528 + <length>-1</length>
  529 + <precision>-1</precision>
  530 + <trim_type>none</trim_type>
  531 + <repeat>N</repeat>
  532 + <format/>
  533 + <currency/>
  534 + <decimal/>
  535 + <group/>
  536 + </field>
  537 + <field>
  538 + <name>&#x8bbe;&#x5907;&#x7f16;&#x53f7;</name>
  539 + <type>String</type>
  540 + <length>-1</length>
  541 + <precision>-1</precision>
  542 + <trim_type>none</trim_type>
  543 + <repeat>N</repeat>
  544 + <format/>
  545 + <currency/>
  546 + <decimal/>
  547 + <group/>
  548 + </field>
  549 + <field>
  550 + <name>&#x5382;&#x724c;&#x578b;&#x53f7;</name>
  551 + <type>String</type>
  552 + <length>-1</length>
  553 + <precision>-1</precision>
  554 + <trim_type>none</trim_type>
  555 + <repeat>N</repeat>
  556 + <format/>
  557 + <currency/>
  558 + <decimal/>
  559 + <group/>
  560 + </field>
  561 + <field>
  562 + <name>&#x5382;&#x724c;&#x578b;&#x53f7;2</name>
  563 + <type>String</type>
  564 + <length>-1</length>
  565 + <precision>-1</precision>
  566 + <trim_type>none</trim_type>
  567 + <repeat>N</repeat>
  568 + <format/>
  569 + <currency/>
  570 + <decimal/>
  571 + <group/>
  572 + </field>
  573 + <field>
  574 + <name>&#x8f66;&#x8f86;&#x7b49;&#x7ea7;&#x6807;&#x51c6;</name>
  575 + <type>String</type>
  576 + <length>-1</length>
  577 + <precision>-1</precision>
  578 + <trim_type>none</trim_type>
  579 + <repeat>N</repeat>
  580 + <format/>
  581 + <currency/>
  582 + <decimal/>
  583 + <group/>
  584 + </field>
  585 + <field>
  586 + <name>&#x51fa;&#x5382;&#x6392;&#x653e;&#x6807;&#x51c6;</name>
  587 + <type>String</type>
  588 + <length>-1</length>
  589 + <precision>-1</precision>
  590 + <trim_type>none</trim_type>
  591 + <repeat>N</repeat>
  592 + <format/>
  593 + <currency/>
  594 + <decimal/>
  595 + <group/>
  596 + </field>
  597 + <field>
  598 + <name>&#x53d1;&#x52a8;&#x673a;&#x53f7;&#x7801;1</name>
  599 + <type>String</type>
  600 + <length>-1</length>
  601 + <precision>-1</precision>
  602 + <trim_type>none</trim_type>
  603 + <repeat>N</repeat>
  604 + <format/>
  605 + <currency/>
  606 + <decimal/>
  607 + <group/>
  608 + </field>
  609 + <field>
  610 + <name>&#x53d1;&#x52a8;&#x673a;&#x53f7;&#x7801;2</name>
  611 + <type>String</type>
  612 + <length>-1</length>
  613 + <precision>-1</precision>
  614 + <trim_type>none</trim_type>
  615 + <repeat>N</repeat>
  616 + <format/>
  617 + <currency/>
  618 + <decimal/>
  619 + <group/>
  620 + </field>
  621 + <field>
  622 + <name>&#x8f66;&#x67b6;&#x53f7;&#x7801;1</name>
  623 + <type>String</type>
  624 + <length>-1</length>
  625 + <precision>-1</precision>
  626 + <trim_type>none</trim_type>
  627 + <repeat>N</repeat>
  628 + <format/>
  629 + <currency/>
  630 + <decimal/>
  631 + <group/>
  632 + </field>
  633 + <field>
  634 + <name>&#x8f66;&#x67b6;&#x53f7;&#x7801;2</name>
  635 + <type>String</type>
  636 + <length>-1</length>
  637 + <precision>-1</precision>
  638 + <trim_type>none</trim_type>
  639 + <repeat>N</repeat>
  640 + <format/>
  641 + <currency/>
  642 + <decimal/>
  643 + <group/>
  644 + </field>
  645 + <field>
  646 + <name>&#x8f66;&#x8f86;&#x7c7b;&#x578b;</name>
  647 + <type>String</type>
  648 + <length>-1</length>
  649 + <precision>-1</precision>
  650 + <trim_type>none</trim_type>
  651 + <repeat>N</repeat>
  652 + <format/>
  653 + <currency/>
  654 + <decimal/>
  655 + <group/>
  656 + </field>
  657 + <field>
  658 + <name>&#x6240;&#x5c5e;&#x516c;&#x53f8;</name>
  659 + <type>String</type>
  660 + <length>-1</length>
  661 + <precision>-1</precision>
  662 + <trim_type>none</trim_type>
  663 + <repeat>N</repeat>
  664 + <format/>
  665 + <currency/>
  666 + <decimal/>
  667 + <group/>
  668 + </field>
  669 + <field>
  670 + <name>&#x4fee;&#x6539;&#x65e5;&#x671f;</name>
  671 + <type>String</type>
  672 + <length>-1</length>
  673 + <precision>-1</precision>
  674 + <trim_type>none</trim_type>
  675 + <repeat>N</repeat>
  676 + <format/>
  677 + <currency/>
  678 + <decimal/>
  679 + <group/>
  680 + </field>
  681 + <field>
  682 + <name>&#x662f;&#x5426;&#x673a;&#x52a8;&#x8f66;</name>
  683 + <type>String</type>
  684 + <length>-1</length>
  685 + <precision>-1</precision>
  686 + <trim_type>none</trim_type>
  687 + <repeat>N</repeat>
  688 + <format/>
  689 + <currency/>
  690 + <decimal/>
  691 + <group/>
  692 + </field>
  693 + <field>
  694 + <name>&#x89c6;&#x9891;&#x7f16;&#x53f7;</name>
  695 + <type>String</type>
  696 + <length>-1</length>
  697 + <precision>-1</precision>
  698 + <trim_type>none</trim_type>
  699 + <repeat>N</repeat>
  700 + <format/>
  701 + <currency/>
  702 + <decimal/>
  703 + <group/>
  704 + </field>
  705 + <field>
  706 + <name>&#x8bbe;&#x5907;&#x4f9b;&#x5e94;&#x5382;&#x5546;</name>
  707 + <type>String</type>
  708 + <length>-1</length>
  709 + <precision>-1</precision>
  710 + <trim_type>none</trim_type>
  711 + <repeat>N</repeat>
  712 + <format/>
  713 + <currency/>
  714 + <decimal/>
  715 + <group/>
  716 + </field>
  717 + <field>
  718 + <name>&#x5206;&#x516c;&#x53f8;</name>
  719 + <type>String</type>
  720 + <length>-1</length>
  721 + <precision>-1</precision>
  722 + <trim_type>none</trim_type>
  723 + <repeat>N</repeat>
  724 + <format/>
  725 + <currency/>
  726 + <decimal/>
  727 + <group/>
  728 + </field>
  729 + </fields>
  730 + <sheets>
  731 + <sheet>
  732 + <name>&#x5de5;&#x4f5c;&#x8868;1</name>
  733 + <startrow>0</startrow>
  734 + <startcol>0</startcol>
  735 + </sheet>
  736 + </sheets>
  737 + <strict_types>N</strict_types>
  738 + <error_ignored>N</error_ignored>
  739 + <error_line_skipped>N</error_line_skipped>
  740 + <bad_line_files_destination_directory/>
  741 + <bad_line_files_extension>warning</bad_line_files_extension>
  742 + <error_line_files_destination_directory/>
  743 + <error_line_files_extension>error</error_line_files_extension>
  744 + <line_number_files_destination_directory/>
  745 + <line_number_files_extension>line</line_number_files_extension>
  746 + <shortFileFieldName/>
  747 + <pathFieldName/>
  748 + <hiddenFieldName/>
  749 + <lastModificationTimeFieldName/>
  750 + <uriNameFieldName/>
  751 + <rootUriNameFieldName/>
  752 + <extensionFieldName/>
  753 + <sizeFieldName/>
  754 + <spreadsheet_type>JXL</spreadsheet_type>
  755 + <cluster_schema/>
  756 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  757 + <xloc>131</xloc>
  758 + <yloc>58</yloc>
  759 + <draw>Y</draw>
  760 + </GUI>
  761 + </step>
  762 +
  763 + <step>
  764 + <name>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</name>
  765 + <type>SelectValues</type>
  766 + <description/>
  767 + <distribute>Y</distribute>
  768 + <custom_distribution/>
  769 + <copies>1</copies>
  770 + <partitioning>
  771 + <method>none</method>
  772 + <schema_name/>
  773 + </partitioning>
  774 + <fields> <field> <name>&#x5185;&#x90e8;&#x7f16;&#x7801;</name>
  775 + <rename>insideCode</rename>
  776 + <length>-2</length>
  777 + <precision>-2</precision>
  778 + </field> <field> <name>&#x8f66;&#x8f86;&#x7f16;&#x7801;</name>
  779 + <rename>carCode</rename>
  780 + <length>-2</length>
  781 + <precision>-2</precision>
  782 + </field> <field> <name>&#x6240;&#x5c5e;&#x516c;&#x53f8;</name>
  783 + <rename>company</rename>
  784 + <length>-2</length>
  785 + <precision>-2</precision>
  786 + </field> <field> <name>&#x5206;&#x516c;&#x53f8;</name>
  787 + <rename>brancheCompany</rename>
  788 + <length>-2</length>
  789 + <precision>-2</precision>
  790 + </field> <field> <name>&#x8f66;&#x724c;&#x53f7;</name>
  791 + <rename>carPlate</rename>
  792 + <length>-2</length>
  793 + <precision>-2</precision>
  794 + </field> <field> <name>&#x8bbe;&#x5907;&#x4f9b;&#x5e94;&#x5382;&#x5546;</name>
  795 + <rename>supplierName</rename>
  796 + <length>-2</length>
  797 + <precision>-2</precision>
  798 + </field> <field> <name>&#x8bbe;&#x5907;&#x7f16;&#x53f7;</name>
  799 + <rename>equipmentCode</rename>
  800 + <length>-2</length>
  801 + <precision>-2</precision>
  802 + </field> <field> <name>&#x8f66;&#x578b;&#x7c7b;&#x522b;</name>
  803 + <rename>carClass</rename>
  804 + <length>-2</length>
  805 + <precision>-2</precision>
  806 + </field> <field> <name>&#x6280;&#x672f;&#x901f;&#x5ea6;</name>
  807 + <rename>speed</rename>
  808 + <length>-2</length>
  809 + <precision>-2</precision>
  810 + </field> <field> <name>&#x5ea7;&#x4f4d;&#x6570;</name>
  811 + <rename>carSeatnNumber</rename>
  812 + <length>-2</length>
  813 + <precision>-2</precision>
  814 + </field> <field> <name>&#x8f7d;&#x5ba2;&#x6807;&#x51c6;</name>
  815 + <rename>carStandard</rename>
  816 + <length>-2</length>
  817 + <precision>-2</precision>
  818 + </field> <field> <name>&#x6807;&#x51c6;&#x6cb9;&#x8017;&#x28;&#x5f00;&#x7a7a;&#x8c03;&#x29;</name>
  819 + <rename>kburnStandard</rename>
  820 + <length>-2</length>
  821 + <precision>-2</precision>
  822 + </field> <field> <name>&#x6807;&#x51c6;&#x6cb9;&#x8017;&#x28;&#x5173;&#x7a7a;&#x8c03;&#x29;</name>
  823 + <rename>gburnStandard</rename>
  824 + <length>-2</length>
  825 + <precision>-2</precision>
  826 + </field> <field> <name>&#x62a5;&#x5e9f;&#x53f7;</name>
  827 + <rename>scrapCode</rename>
  828 + <length>-2</length>
  829 + <precision>-2</precision>
  830 + </field> <field> <name>&#x5382;&#x724c;&#x578b;&#x53f7;</name>
  831 + <rename>makeCodeOne</rename>
  832 + <length>-2</length>
  833 + <precision>-2</precision>
  834 + </field> <field> <name>&#x5382;&#x724c;&#x578b;&#x53f7;2</name>
  835 + <rename>makeCodeTwo</rename>
  836 + <length>-2</length>
  837 + <precision>-2</precision>
  838 + </field> <field> <name>&#x8f66;&#x8f86;&#x7b49;&#x7ea7;&#x6807;&#x51c6;</name>
  839 + <rename>carGride</rename>
  840 + <length>-2</length>
  841 + <precision>-2</precision>
  842 + </field> <field> <name>&#x51fa;&#x5382;&#x6392;&#x653e;&#x6807;&#x51c6;</name>
  843 + <rename>emissionsStandard</rename>
  844 + <length>-2</length>
  845 + <precision>-2</precision>
  846 + </field> <field> <name>&#x53d1;&#x52a8;&#x673a;&#x53f7;&#x7801;1</name>
  847 + <rename>engineCodeOne</rename>
  848 + <length>-2</length>
  849 + <precision>-2</precision>
  850 + </field> <field> <name>&#x53d1;&#x52a8;&#x673a;&#x53f7;&#x7801;2</name>
  851 + <rename>engineCodeTwo</rename>
  852 + <length>-2</length>
  853 + <precision>-2</precision>
  854 + </field> <field> <name>&#x8f66;&#x67b6;&#x53f7;&#x7801;1</name>
  855 + <rename>carNumberOne</rename>
  856 + <length>-2</length>
  857 + <precision>-2</precision>
  858 + </field> <field> <name>&#x8f66;&#x67b6;&#x53f7;&#x7801;2</name>
  859 + <rename>carNumberTwo</rename>
  860 + <length>-2</length>
  861 + <precision>-2</precision>
  862 + </field> <field> <name>&#x542f;&#x7528;&#x65e5;&#x671f;</name>
  863 + <rename>openDate</rename>
  864 + <length>-2</length>
  865 + <precision>-2</precision>
  866 + </field> <field> <name>&#x53d6;&#x6d88;&#x65e5;&#x671f;</name>
  867 + <rename>closeDate</rename>
  868 + <length>-2</length>
  869 + <precision>-2</precision>
  870 + </field> <field> <name>&#x662f;&#x5426;&#x7a7a;&#x8c03;</name>
  871 + <rename>hvacCar</rename>
  872 + <length>-2</length>
  873 + <precision>-2</precision>
  874 + </field> <field> <name>&#x6709;&#x65e0;&#x4eba;&#x552e;&#x7968;</name>
  875 + <rename>ticketType</rename>
  876 + <length>-2</length>
  877 + <precision>-2</precision>
  878 + </field> <field> <name>&#x662f;&#x5426;&#x6709;LED&#x670d;&#x52a1;&#x5c4f;</name>
  879 + <rename>ledScreen</rename>
  880 + <length>-2</length>
  881 + <precision>-2</precision>
  882 + </field> <field> <name>&#x662f;&#x5426;&#x6709;TV&#x89c6;&#x9891;</name>
  883 + <rename>tvVideoType</rename>
  884 + <length>-2</length>
  885 + <precision>-2</precision>
  886 + </field> <field> <name>&#x8f66;&#x8f86;&#x7c7b;&#x578b;</name>
  887 + <rename>carType</rename>
  888 + <length>-2</length>
  889 + <precision>-2</precision>
  890 + </field> <field> <name>&#x662f;&#x5426;&#x673a;&#x52a8;&#x8f66;</name>
  891 + <rename>vehicleStats</rename>
  892 + <length>-2</length>
  893 + <precision>-2</precision>
  894 + </field> <field> <name>&#x8fd0;&#x8425;&#x72b6;&#x6001;</name>
  895 + <rename>operatorsState</rename>
  896 + <length>-2</length>
  897 + <precision>-2</precision>
  898 + </field> <field> <name>&#x5907;&#x6ce8;</name>
  899 + <rename>descriptions</rename>
  900 + <length>-2</length>
  901 + <precision>-2</precision>
  902 + </field> <field> <name>&#x89c6;&#x9891;&#x7f16;&#x53f7;</name>
  903 + <rename>videoCode</rename>
  904 + <length>-2</length>
  905 + <precision>-2</precision>
  906 + </field> <select_unspecified>Y</select_unspecified>
  907 + </fields> <cluster_schema/>
  908 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  909 + <xloc>279</xloc>
  910 + <yloc>59</yloc>
  911 + <draw>Y</draw>
  912 + </GUI>
  913 + </step>
  914 +
  915 + <step>
  916 + <name>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_cars</name>
  917 + <type>InsertUpdate</type>
  918 + <description/>
  919 + <distribute>Y</distribute>
  920 + <custom_distribution/>
  921 + <copies>1</copies>
  922 + <partitioning>
  923 + <method>none</method>
  924 + <schema_name/>
  925 + </partitioning>
  926 + <connection>bus_control_&#x516c;&#x53f8;_201</connection>
  927 + <commit>1000</commit>
  928 + <update_bypassed>N</update_bypassed>
  929 + <lookup>
  930 + <schema/>
  931 + <table>bsth_c_cars</table>
  932 + <key>
  933 + <name>insideCode</name>
  934 + <field>inside_code</field>
  935 + <condition>&#x3d;</condition>
  936 + <name2/>
  937 + </key>
  938 + <value>
  939 + <name>inside_code</name>
  940 + <rename>insideCode</rename>
  941 + <update>Y</update>
  942 + </value>
  943 + <value>
  944 + <name>company</name>
  945 + <rename>company</rename>
  946 + <update>Y</update>
  947 + </value>
  948 + <value>
  949 + <name>branche_company</name>
  950 + <rename>brancheCompany</rename>
  951 + <update>Y</update>
  952 + </value>
  953 + <value>
  954 + <name>car_plate</name>
  955 + <rename>carPlate</rename>
  956 + <update>Y</update>
  957 + </value>
  958 + <value>
  959 + <name>supplier_name</name>
  960 + <rename>supplierName</rename>
  961 + <update>Y</update>
  962 + </value>
  963 + <value>
  964 + <name>equipment_code</name>
  965 + <rename>equipmentCode</rename>
  966 + <update>Y</update>
  967 + </value>
  968 + <value>
  969 + <name>car_class</name>
  970 + <rename>carClass</rename>
  971 + <update>Y</update>
  972 + </value>
  973 + <value>
  974 + <name>speed</name>
  975 + <rename>speed</rename>
  976 + <update>Y</update>
  977 + </value>
  978 + <value>
  979 + <name>car_seatn_number</name>
  980 + <rename>carSeatnNumber</rename>
  981 + <update>Y</update>
  982 + </value>
  983 + <value>
  984 + <name>car_standard</name>
  985 + <rename>carStandard</rename>
  986 + <update>Y</update>
  987 + </value>
  988 + <value>
  989 + <name>car_code</name>
  990 + <rename>carCode</rename>
  991 + <update>Y</update>
  992 + </value>
  993 + <value>
  994 + <name>kburn_standard</name>
  995 + <rename>kburnStandard</rename>
  996 + <update>Y</update>
  997 + </value>
  998 + <value>
  999 + <name>gburn_standard</name>
  1000 + <rename>gburnStandard</rename>
  1001 + <update>Y</update>
  1002 + </value>
  1003 + <value>
  1004 + <name>scrap_code</name>
  1005 + <rename>scrapCode</rename>
  1006 + <update>Y</update>
  1007 + </value>
  1008 + <value>
  1009 + <name>make_code_one</name>
  1010 + <rename>makeCodeOne</rename>
  1011 + <update>Y</update>
  1012 + </value>
  1013 + <value>
  1014 + <name>make_code_two</name>
  1015 + <rename>makeCodeTwo</rename>
  1016 + <update>Y</update>
  1017 + </value>
  1018 + <value>
  1019 + <name>car_gride</name>
  1020 + <rename>carGride</rename>
  1021 + <update>Y</update>
  1022 + </value>
  1023 + <value>
  1024 + <name>emissions_standard</name>
  1025 + <rename>emissionsStandard</rename>
  1026 + <update>Y</update>
  1027 + </value>
  1028 + <value>
  1029 + <name>engine_code_one</name>
  1030 + <rename>engineCodeOne</rename>
  1031 + <update>Y</update>
  1032 + </value>
  1033 + <value>
  1034 + <name>engine_code_two</name>
  1035 + <rename>engineCodeTwo</rename>
  1036 + <update>Y</update>
  1037 + </value>
  1038 + <value>
  1039 + <name>car_number_one</name>
  1040 + <rename>carNumberOne</rename>
  1041 + <update>Y</update>
  1042 + </value>
  1043 + <value>
  1044 + <name>car_number_two</name>
  1045 + <rename>carNumberTwo</rename>
  1046 + <update>Y</update>
  1047 + </value>
  1048 + <value>
  1049 + <name>open_date</name>
  1050 + <rename>openDate</rename>
  1051 + <update>Y</update>
  1052 + </value>
  1053 + <value>
  1054 + <name>close_date</name>
  1055 + <rename>closeDate</rename>
  1056 + <update>Y</update>
  1057 + </value>
  1058 + <value>
  1059 + <name>hvac_car</name>
  1060 + <rename>hvacCar</rename>
  1061 + <update>Y</update>
  1062 + </value>
  1063 + <value>
  1064 + <name>ticket_type</name>
  1065 + <rename>ticketType</rename>
  1066 + <update>Y</update>
  1067 + </value>
  1068 + <value>
  1069 + <name>led_screen</name>
  1070 + <rename>ledScreen</rename>
  1071 + <update>Y</update>
  1072 + </value>
  1073 + <value>
  1074 + <name>tv_video_type</name>
  1075 + <rename>tvVideoType</rename>
  1076 + <update>Y</update>
  1077 + </value>
  1078 + <value>
  1079 + <name>car_type</name>
  1080 + <rename>carType</rename>
  1081 + <update>Y</update>
  1082 + </value>
  1083 + <value>
  1084 + <name>vehicle_stats</name>
  1085 + <rename>vehicleStats</rename>
  1086 + <update>Y</update>
  1087 + </value>
  1088 + <value>
  1089 + <name>operators_state</name>
  1090 + <rename>operatorsState</rename>
  1091 + <update>Y</update>
  1092 + </value>
  1093 + <value>
  1094 + <name>descriptions</name>
  1095 + <rename>descriptions</rename>
  1096 + <update>Y</update>
  1097 + </value>
  1098 + <value>
  1099 + <name>video_code</name>
  1100 + <rename>videoCode</rename>
  1101 + <update>Y</update>
  1102 + </value>
  1103 + <value>
  1104 + <name>business_code</name>
  1105 + <rename>businessCode</rename>
  1106 + <update>Y</update>
  1107 + </value>
  1108 + </lookup>
  1109 + <cluster_schema/>
  1110 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1111 + <xloc>842</xloc>
  1112 + <yloc>319</yloc>
  1113 + <draw>Y</draw>
  1114 + </GUI>
  1115 + </step>
  1116 +
  1117 + <step>
  1118 + <name>&#x662f;&#x5426;&#x6709;LED&#x670d;&#x52a1;&#x5c4f;</name>
  1119 + <type>ValueMapper</type>
  1120 + <description/>
  1121 + <distribute>Y</distribute>
  1122 + <custom_distribution/>
  1123 + <copies>1</copies>
  1124 + <partitioning>
  1125 + <method>none</method>
  1126 + <schema_name/>
  1127 + </partitioning>
  1128 + <field_to_use>ledScreen</field_to_use>
  1129 + <target_field/>
  1130 + <non_match_default/>
  1131 + <fields>
  1132 + <field>
  1133 + <source_value>&#x662f;</source_value>
  1134 + <target_value>1</target_value>
  1135 + </field>
  1136 + <field>
  1137 + <source_value>&#x5426;</source_value>
  1138 + <target_value>0</target_value>
  1139 + </field>
  1140 + </fields>
  1141 + <cluster_schema/>
  1142 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1143 + <xloc>590</xloc>
  1144 + <yloc>61</yloc>
  1145 + <draw>Y</draw>
  1146 + </GUI>
  1147 + </step>
  1148 +
  1149 + <step>
  1150 + <name>&#x662f;&#x5426;&#x6709;TV&#x89c6;&#x9891;</name>
  1151 + <type>ValueMapper</type>
  1152 + <description/>
  1153 + <distribute>Y</distribute>
  1154 + <custom_distribution/>
  1155 + <copies>1</copies>
  1156 + <partitioning>
  1157 + <method>none</method>
  1158 + <schema_name/>
  1159 + </partitioning>
  1160 + <field_to_use>tvVideoType</field_to_use>
  1161 + <target_field/>
  1162 + <non_match_default/>
  1163 + <fields>
  1164 + <field>
  1165 + <source_value>&#x662f;</source_value>
  1166 + <target_value>1</target_value>
  1167 + </field>
  1168 + <field>
  1169 + <source_value>&#x5426;</source_value>
  1170 + <target_value>0</target_value>
  1171 + </field>
  1172 + </fields>
  1173 + <cluster_schema/>
  1174 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1175 + <xloc>706</xloc>
  1176 + <yloc>61</yloc>
  1177 + <draw>Y</draw>
  1178 + </GUI>
  1179 + </step>
  1180 +
  1181 + <step>
  1182 + <name>&#x662f;&#x5426;&#x7684;&#x53d8;&#x6210;&#x6570;&#x5b57;&#x578b;</name>
  1183 + <type>SelectValues</type>
  1184 + <description/>
  1185 + <distribute>Y</distribute>
  1186 + <custom_distribution/>
  1187 + <copies>1</copies>
  1188 + <partitioning>
  1189 + <method>none</method>
  1190 + <schema_name/>
  1191 + </partitioning>
  1192 + <fields> <select_unspecified>N</select_unspecified>
  1193 + <meta> <name>hvacCar</name>
  1194 + <rename>hvacCar</rename>
  1195 + <type>Integer</type>
  1196 + <length>1</length>
  1197 + <precision>-2</precision>
  1198 + <conversion_mask/>
  1199 + <date_format_lenient>false</date_format_lenient>
  1200 + <date_format_locale/>
  1201 + <date_format_timezone/>
  1202 + <lenient_string_to_number>false</lenient_string_to_number>
  1203 + <encoding/>
  1204 + <decimal_symbol/>
  1205 + <grouping_symbol/>
  1206 + <currency_symbol/>
  1207 + <storage_type/>
  1208 + </meta> <meta> <name>ticketType</name>
  1209 + <rename>ticketType</rename>
  1210 + <type>Integer</type>
  1211 + <length>1</length>
  1212 + <precision>-2</precision>
  1213 + <conversion_mask/>
  1214 + <date_format_lenient>false</date_format_lenient>
  1215 + <date_format_locale/>
  1216 + <date_format_timezone/>
  1217 + <lenient_string_to_number>false</lenient_string_to_number>
  1218 + <encoding/>
  1219 + <decimal_symbol/>
  1220 + <grouping_symbol/>
  1221 + <currency_symbol/>
  1222 + <storage_type/>
  1223 + </meta> <meta> <name>ledScreen</name>
  1224 + <rename>ledScreen</rename>
  1225 + <type>Integer</type>
  1226 + <length>1</length>
  1227 + <precision>-2</precision>
  1228 + <conversion_mask/>
  1229 + <date_format_lenient>false</date_format_lenient>
  1230 + <date_format_locale/>
  1231 + <date_format_timezone/>
  1232 + <lenient_string_to_number>false</lenient_string_to_number>
  1233 + <encoding/>
  1234 + <decimal_symbol/>
  1235 + <grouping_symbol/>
  1236 + <currency_symbol/>
  1237 + <storage_type/>
  1238 + </meta> <meta> <name>tvVideoType</name>
  1239 + <rename>tvVideoType</rename>
  1240 + <type>Integer</type>
  1241 + <length>1</length>
  1242 + <precision>-2</precision>
  1243 + <conversion_mask/>
  1244 + <date_format_lenient>false</date_format_lenient>
  1245 + <date_format_locale/>
  1246 + <date_format_timezone/>
  1247 + <lenient_string_to_number>false</lenient_string_to_number>
  1248 + <encoding/>
  1249 + <decimal_symbol/>
  1250 + <grouping_symbol/>
  1251 + <currency_symbol/>
  1252 + <storage_type/>
  1253 + </meta> </fields> <cluster_schema/>
  1254 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1255 + <xloc>839</xloc>
  1256 + <yloc>61</yloc>
  1257 + <draw>Y</draw>
  1258 + </GUI>
  1259 + </step>
  1260 +
  1261 + <step>
  1262 + <name>&#x662f;&#x5426;&#x7a7a;&#x8c03;&#x8f66;</name>
  1263 + <type>ValueMapper</type>
  1264 + <description/>
  1265 + <distribute>Y</distribute>
  1266 + <custom_distribution/>
  1267 + <copies>1</copies>
  1268 + <partitioning>
  1269 + <method>none</method>
  1270 + <schema_name/>
  1271 + </partitioning>
  1272 + <field_to_use>hvacCar</field_to_use>
  1273 + <target_field/>
  1274 + <non_match_default/>
  1275 + <fields>
  1276 + <field>
  1277 + <source_value>&#x662f;</source_value>
  1278 + <target_value>1</target_value>
  1279 + </field>
  1280 + <field>
  1281 + <source_value>&#x5426;</source_value>
  1282 + <target_value>0</target_value>
  1283 + </field>
  1284 + </fields>
  1285 + <cluster_schema/>
  1286 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1287 + <xloc>388</xloc>
  1288 + <yloc>61</yloc>
  1289 + <draw>Y</draw>
  1290 + </GUI>
  1291 + </step>
  1292 +
  1293 + <step>
  1294 + <name>&#x6709;&#x65e0;&#x4eba;&#x552e;&#x7968;</name>
  1295 + <type>ValueMapper</type>
  1296 + <description/>
  1297 + <distribute>Y</distribute>
  1298 + <custom_distribution/>
  1299 + <copies>1</copies>
  1300 + <partitioning>
  1301 + <method>none</method>
  1302 + <schema_name/>
  1303 + </partitioning>
  1304 + <field_to_use>ticketType</field_to_use>
  1305 + <target_field/>
  1306 + <non_match_default/>
  1307 + <fields>
  1308 + <field>
  1309 + <source_value>&#x662f;</source_value>
  1310 + <target_value>1</target_value>
  1311 + </field>
  1312 + <field>
  1313 + <source_value>&#x5426;</source_value>
  1314 + <target_value>0</target_value>
  1315 + </field>
  1316 + </fields>
  1317 + <cluster_schema/>
  1318 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1319 + <xloc>485</xloc>
  1320 + <yloc>61</yloc>
  1321 + <draw>Y</draw>
  1322 + </GUI>
  1323 + </step>
  1324 +
  1325 + <step>
  1326 + <name>&#x9519;&#x8bef;&#x8f93;&#x51fa;</name>
  1327 + <type>ExcelOutput</type>
  1328 + <description/>
  1329 + <distribute>Y</distribute>
  1330 + <custom_distribution/>
  1331 + <copies>1</copies>
  1332 + <partitioning>
  1333 + <method>none</method>
  1334 + <schema_name/>
  1335 + </partitioning>
  1336 + <header>Y</header>
  1337 + <footer>N</footer>
  1338 + <encoding/>
  1339 + <append>N</append>
  1340 + <add_to_result_filenames>Y</add_to_result_filenames>
  1341 + <file>
  1342 + <name>&#x24;&#x7b;erroroutputdir&#x7d;&#x2f;&#x8f66;&#x8f86;&#x57fa;&#x7840;&#x4fe1;&#x606f;_&#x9519;&#x8bef;</name>
  1343 + <extention>xls</extention>
  1344 + <do_not_open_newfile_init>N</do_not_open_newfile_init>
  1345 + <create_parent_folder>N</create_parent_folder>
  1346 + <split>N</split>
  1347 + <add_date>N</add_date>
  1348 + <add_time>N</add_time>
  1349 + <SpecifyFormat>N</SpecifyFormat>
  1350 + <date_time_format/>
  1351 + <sheetname>Sheet1</sheetname>
  1352 + <autosizecolums>N</autosizecolums>
  1353 + <nullisblank>N</nullisblank>
  1354 + <protect_sheet>N</protect_sheet>
  1355 + <password>Encrypted </password>
  1356 + <splitevery>0</splitevery>
  1357 + <usetempfiles>N</usetempfiles>
  1358 + <tempdirectory/>
  1359 + </file>
  1360 + <template>
  1361 + <enabled>N</enabled>
  1362 + <append>N</append>
  1363 + <filename>template.xls</filename>
  1364 + </template>
  1365 + <fields>
  1366 + <field>
  1367 + <name>insideCode</name>
  1368 + <type>String</type>
  1369 + <format/>
  1370 + </field>
  1371 + <field>
  1372 + <name>company</name>
  1373 + <type>String</type>
  1374 + <format/>
  1375 + </field>
  1376 + <field>
  1377 + <name>brancheCompany</name>
  1378 + <type>String</type>
  1379 + <format/>
  1380 + </field>
  1381 + <field>
  1382 + <name>carPlate</name>
  1383 + <type>String</type>
  1384 + <format/>
  1385 + </field>
  1386 + <field>
  1387 + <name>supplierName</name>
  1388 + <type>String</type>
  1389 + <format/>
  1390 + </field>
  1391 + <field>
  1392 + <name>equipmentCode</name>
  1393 + <type>String</type>
  1394 + <format/>
  1395 + </field>
  1396 + <field>
  1397 + <name>carClass</name>
  1398 + <type>String</type>
  1399 + <format/>
  1400 + </field>
  1401 + <field>
  1402 + <name>speed</name>
  1403 + <type>String</type>
  1404 + <format/>
  1405 + </field>
  1406 + <field>
  1407 + <name>carSeatnNumber</name>
  1408 + <type>String</type>
  1409 + <format/>
  1410 + </field>
  1411 + <field>
  1412 + <name>carStandard</name>
  1413 + <type>String</type>
  1414 + <format/>
  1415 + </field>
  1416 + <field>
  1417 + <name>kburnStandard</name>
  1418 + <type>String</type>
  1419 + <format/>
  1420 + </field>
  1421 + <field>
  1422 + <name>gburnStandard</name>
  1423 + <type>String</type>
  1424 + <format/>
  1425 + </field>
  1426 + <field>
  1427 + <name>scrapCode</name>
  1428 + <type>String</type>
  1429 + <format/>
  1430 + </field>
  1431 + <field>
  1432 + <name>makeCodeOne</name>
  1433 + <type>String</type>
  1434 + <format/>
  1435 + </field>
  1436 + <field>
  1437 + <name>makeCodeTwo</name>
  1438 + <type>String</type>
  1439 + <format/>
  1440 + </field>
  1441 + <field>
  1442 + <name>carGride</name>
  1443 + <type>String</type>
  1444 + <format/>
  1445 + </field>
  1446 + <field>
  1447 + <name>emissionsStandard</name>
  1448 + <type>String</type>
  1449 + <format/>
  1450 + </field>
  1451 + <field>
  1452 + <name>engineCodeOne</name>
  1453 + <type>String</type>
  1454 + <format/>
  1455 + </field>
  1456 + <field>
  1457 + <name>engineCodeTwo</name>
  1458 + <type>String</type>
  1459 + <format/>
  1460 + </field>
  1461 + <field>
  1462 + <name>carNumberOne</name>
  1463 + <type>String</type>
  1464 + <format/>
  1465 + </field>
  1466 + <field>
  1467 + <name>carNumberTwo</name>
  1468 + <type>String</type>
  1469 + <format/>
  1470 + </field>
  1471 + <field>
  1472 + <name>openDate</name>
  1473 + <type>String</type>
  1474 + <format/>
  1475 + </field>
  1476 + <field>
  1477 + <name>closeDate</name>
  1478 + <type>String</type>
  1479 + <format/>
  1480 + </field>
  1481 + <field>
  1482 + <name>hvacCar</name>
  1483 + <type>Integer</type>
  1484 + <format/>
  1485 + </field>
  1486 + <field>
  1487 + <name>ticketType</name>
  1488 + <type>Integer</type>
  1489 + <format/>
  1490 + </field>
  1491 + <field>
  1492 + <name>ledScreen</name>
  1493 + <type>Integer</type>
  1494 + <format/>
  1495 + </field>
  1496 + <field>
  1497 + <name>tvVideoType</name>
  1498 + <type>Integer</type>
  1499 + <format/>
  1500 + </field>
  1501 + <field>
  1502 + <name>carType</name>
  1503 + <type>String</type>
  1504 + <format/>
  1505 + </field>
  1506 + <field>
  1507 + <name>vehicleStats</name>
  1508 + <type>String</type>
  1509 + <format/>
  1510 + </field>
  1511 + <field>
  1512 + <name>operatorsState</name>
  1513 + <type>String</type>
  1514 + <format/>
  1515 + </field>
  1516 + <field>
  1517 + <name>descriptions</name>
  1518 + <type>String</type>
  1519 + <format/>
  1520 + </field>
  1521 + <field>
  1522 + <name>videoCode</name>
  1523 + <type>String</type>
  1524 + <format/>
  1525 + </field>
  1526 + <field>
  1527 + <name>businessCode</name>
  1528 + <type>String</type>
  1529 + <format/>
  1530 + </field>
  1531 + <field>
  1532 + <name>carCode</name>
  1533 + <type>String</type>
  1534 + <format/>
  1535 + </field>
  1536 + <field>
  1537 + <name>error_count</name>
  1538 + <type>Integer</type>
  1539 + <format/>
  1540 + </field>
  1541 + <field>
  1542 + <name>error_desc</name>
  1543 + <type>String</type>
  1544 + <format/>
  1545 + </field>
  1546 + <field>
  1547 + <name>error_column1</name>
  1548 + <type>String</type>
  1549 + <format/>
  1550 + </field>
  1551 + <field>
  1552 + <name>error_column2</name>
  1553 + <type>String</type>
  1554 + <format/>
  1555 + </field>
  1556 + </fields>
  1557 + <custom>
  1558 + <header_font_name>arial</header_font_name>
  1559 + <header_font_size>10</header_font_size>
  1560 + <header_font_bold>N</header_font_bold>
  1561 + <header_font_italic>N</header_font_italic>
  1562 + <header_font_underline>no</header_font_underline>
  1563 + <header_font_orientation>horizontal</header_font_orientation>
  1564 + <header_font_color>black</header_font_color>
  1565 + <header_background_color>none</header_background_color>
  1566 + <header_row_height>255</header_row_height>
  1567 + <header_alignment>left</header_alignment>
  1568 + <header_image/>
  1569 + <row_font_name>arial</row_font_name>
  1570 + <row_font_size>10</row_font_size>
  1571 + <row_font_color>black</row_font_color>
  1572 + <row_background_color>none</row_background_color>
  1573 + </custom>
  1574 + <cluster_schema/>
  1575 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1576 + <xloc>637</xloc>
  1577 + <yloc>320</yloc>
  1578 + <draw>Y</draw>
  1579 + </GUI>
  1580 + </step>
  1581 +
  1582 + <step>
  1583 + <name>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</name>
  1584 + <type>GetVariable</type>
  1585 + <description/>
  1586 + <distribute>Y</distribute>
  1587 + <custom_distribution/>
  1588 + <copies>1</copies>
  1589 + <partitioning>
  1590 + <method>none</method>
  1591 + <schema_name/>
  1592 + </partitioning>
  1593 + <fields>
  1594 + <field>
  1595 + <name>filepath_</name>
  1596 + <variable>&#x24;&#x7b;filepath&#x7d;</variable>
  1597 + <type>String</type>
  1598 + <format/>
  1599 + <currency/>
  1600 + <decimal/>
  1601 + <group/>
  1602 + <length>-1</length>
  1603 + <precision>-1</precision>
  1604 + <trim_type>none</trim_type>
  1605 + </field>
  1606 + <field>
  1607 + <name>erroroutputdir_</name>
  1608 + <variable>&#x24;&#x7b;erroroutputdir&#x7d;</variable>
  1609 + <type>String</type>
  1610 + <format/>
  1611 + <currency/>
  1612 + <decimal/>
  1613 + <group/>
  1614 + <length>-1</length>
  1615 + <precision>-1</precision>
  1616 + <trim_type>none</trim_type>
  1617 + </field>
  1618 + </fields>
  1619 + <cluster_schema/>
  1620 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1621 + <xloc>134</xloc>
  1622 + <yloc>183</yloc>
  1623 + <draw>Y</draw>
  1624 + </GUI>
  1625 + </step>
  1626 +
  1627 + <step_error_handling>
  1628 + <error>
  1629 + <source_step>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_cars</source_step>
  1630 + <target_step>&#x9519;&#x8bef;&#x8f93;&#x51fa;</target_step>
  1631 + <is_enabled>Y</is_enabled>
  1632 + <nr_valuename>error_count</nr_valuename>
  1633 + <descriptions_valuename>error_desc</descriptions_valuename>
  1634 + <fields_valuename>error_column1</fields_valuename>
  1635 + <codes_valuename>error_column2</codes_valuename>
  1636 + <max_errors/>
  1637 + <max_pct_errors/>
  1638 + <min_pct_rows/>
  1639 + </error>
  1640 + </step_error_handling>
  1641 + <slave-step-copy-partition-distribution>
  1642 +</slave-step-copy-partition-distribution>
  1643 + <slave_transformation>N</slave_transformation>
  1644 +
  1645 +</transformation>
src/main/resources/datatools/ktrs/test.ktr 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<transformation>
  3 + <info>
  4 + <name>test</name>
  5 + <description/>
  6 + <extended_description/>
  7 + <trans_version/>
  8 + <trans_type>Normal</trans_type>
  9 + <trans_status>0</trans_status>
  10 + <directory>&#x2f;</directory>
  11 + <parameters>
  12 + <parameter>
  13 + <name>filepath</name>
  14 + <default_value/>
  15 + <description>&#x5bfc;&#x5165;&#x7684;excel&#x8def;&#x5f84;</description>
  16 + </parameter>
  17 + </parameters>
  18 + <log>
  19 +<trans-log-table><connection/>
  20 +<schema/>
  21 +<table/>
  22 +<size_limit_lines/>
  23 +<interval/>
  24 +<timeout_days/>
  25 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STATUS</id><enabled>Y</enabled><name>STATUS</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name><subject/></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name><subject/></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name><subject/></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name><subject/></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name><subject/></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name><subject/></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>STARTDATE</id><enabled>Y</enabled><name>STARTDATE</name></field><field><id>ENDDATE</id><enabled>Y</enabled><name>ENDDATE</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>DEPDATE</id><enabled>Y</enabled><name>DEPDATE</name></field><field><id>REPLAYDATE</id><enabled>Y</enabled><name>REPLAYDATE</name></field><field><id>LOG_FIELD</id><enabled>Y</enabled><name>LOG_FIELD</name></field><field><id>EXECUTING_SERVER</id><enabled>N</enabled><name>EXECUTING_SERVER</name></field><field><id>EXECUTING_USER</id><enabled>N</enabled><name>EXECUTING_USER</name></field><field><id>CLIENT</id><enabled>N</enabled><name>CLIENT</name></field></trans-log-table>
  26 +<perf-log-table><connection/>
  27 +<schema/>
  28 +<table/>
  29 +<interval/>
  30 +<timeout_days/>
  31 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>SEQ_NR</id><enabled>Y</enabled><name>SEQ_NR</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>INPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>INPUT_BUFFER_ROWS</name></field><field><id>OUTPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>OUTPUT_BUFFER_ROWS</name></field></perf-log-table>
  32 +<channel-log-table><connection/>
  33 +<schema/>
  34 +<table/>
  35 +<timeout_days/>
  36 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>LOGGING_OBJECT_TYPE</id><enabled>Y</enabled><name>LOGGING_OBJECT_TYPE</name></field><field><id>OBJECT_NAME</id><enabled>Y</enabled><name>OBJECT_NAME</name></field><field><id>OBJECT_COPY</id><enabled>Y</enabled><name>OBJECT_COPY</name></field><field><id>REPOSITORY_DIRECTORY</id><enabled>Y</enabled><name>REPOSITORY_DIRECTORY</name></field><field><id>FILENAME</id><enabled>Y</enabled><name>FILENAME</name></field><field><id>OBJECT_ID</id><enabled>Y</enabled><name>OBJECT_ID</name></field><field><id>OBJECT_REVISION</id><enabled>Y</enabled><name>OBJECT_REVISION</name></field><field><id>PARENT_CHANNEL_ID</id><enabled>Y</enabled><name>PARENT_CHANNEL_ID</name></field><field><id>ROOT_CHANNEL_ID</id><enabled>Y</enabled><name>ROOT_CHANNEL_ID</name></field></channel-log-table>
  37 +<step-log-table><connection/>
  38 +<schema/>
  39 +<table/>
  40 +<timeout_days/>
  41 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>LOG_FIELD</id><enabled>N</enabled><name>LOG_FIELD</name></field></step-log-table>
  42 +<metrics-log-table><connection/>
  43 +<schema/>
  44 +<table/>
  45 +<timeout_days/>
  46 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>METRICS_DATE</id><enabled>Y</enabled><name>METRICS_DATE</name></field><field><id>METRICS_CODE</id><enabled>Y</enabled><name>METRICS_CODE</name></field><field><id>METRICS_DESCRIPTION</id><enabled>Y</enabled><name>METRICS_DESCRIPTION</name></field><field><id>METRICS_SUBJECT</id><enabled>Y</enabled><name>METRICS_SUBJECT</name></field><field><id>METRICS_TYPE</id><enabled>Y</enabled><name>METRICS_TYPE</name></field><field><id>METRICS_VALUE</id><enabled>Y</enabled><name>METRICS_VALUE</name></field></metrics-log-table>
  47 + </log>
  48 + <maxdate>
  49 + <connection/>
  50 + <table/>
  51 + <field/>
  52 + <offset>0.0</offset>
  53 + <maxdiff>0.0</maxdiff>
  54 + </maxdate>
  55 + <size_rowset>10000</size_rowset>
  56 + <sleep_time_empty>50</sleep_time_empty>
  57 + <sleep_time_full>50</sleep_time_full>
  58 + <unique_connections>N</unique_connections>
  59 + <feedback_shown>Y</feedback_shown>
  60 + <feedback_size>50000</feedback_size>
  61 + <using_thread_priorities>Y</using_thread_priorities>
  62 + <shared_objects_file/>
  63 + <capture_step_performance>N</capture_step_performance>
  64 + <step_performance_capturing_delay>1000</step_performance_capturing_delay>
  65 + <step_performance_capturing_size_limit>100</step_performance_capturing_size_limit>
  66 + <dependencies>
  67 + </dependencies>
  68 + <partitionschemas>
  69 + </partitionschemas>
  70 + <slaveservers>
  71 + </slaveservers>
  72 + <clusterschemas>
  73 + </clusterschemas>
  74 + <created_user>-</created_user>
  75 + <created_date>2016&#x2f;06&#x2f;23 10&#x3a;31&#x3a;17.508</created_date>
  76 + <modified_user>-</modified_user>
  77 + <modified_date>2016&#x2f;06&#x2f;23 10&#x3a;31&#x3a;17.508</modified_date>
  78 + <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA&#x3d;</key_for_session_key>
  79 + <is_key_private>N</is_key_private>
  80 + </info>
  81 + <notepads>
  82 + </notepads>
  83 + <connection>
  84 + <name>bus_control_&#x516c;&#x53f8;_201</name>
  85 + <server>192.168.168.201</server>
  86 + <type>MYSQL</type>
  87 + <access>Native</access>
  88 + <database>control</database>
  89 + <port>3306</port>
  90 + <username>root</username>
  91 + <password>Encrypted 2be98afc86aa7f2e4cb79ff228dc6fa8c</password>
  92 + <servername/>
  93 + <data_tablespace/>
  94 + <index_tablespace/>
  95 + <attributes>
  96 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  97 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  98 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  99 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  100 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  101 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  102 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  103 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  104 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  105 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  106 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  107 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  108 + </attributes>
  109 + </connection>
  110 + <connection>
  111 + <name>xlab_mysql_youle</name>
  112 + <server>101.231.124.8</server>
  113 + <type>MYSQL</type>
  114 + <access>Native</access>
  115 + <database>xlab_youle</database>
  116 + <port>45687</port>
  117 + <username>xlab-youle</username>
  118 + <password>Encrypted 2be98afc86aa78a88aa1be369d187a3df</password>
  119 + <servername/>
  120 + <data_tablespace/>
  121 + <index_tablespace/>
  122 + <attributes>
  123 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  124 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  125 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  126 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  127 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  128 + <attribute><code>PORT_NUMBER</code><attribute>45687</attribute></attribute>
  129 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  130 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  131 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  132 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  133 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  134 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  135 + </attributes>
  136 + </connection>
  137 + <connection>
  138 + <name>xlab_mysql_youle&#xff08;&#x672c;&#x673a;&#xff09;</name>
  139 + <server>localhost</server>
  140 + <type>MYSQL</type>
  141 + <access>Native</access>
  142 + <database>xlab_youle</database>
  143 + <port>3306</port>
  144 + <username>root</username>
  145 + <password>Encrypted </password>
  146 + <servername/>
  147 + <data_tablespace/>
  148 + <index_tablespace/>
  149 + <attributes>
  150 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  151 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  152 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  153 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  154 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  155 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  156 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  157 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  158 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  159 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  160 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  161 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  162 + </attributes>
  163 + </connection>
  164 + <connection>
  165 + <name>xlab_youle</name>
  166 + <server/>
  167 + <type>MYSQL</type>
  168 + <access>JNDI</access>
  169 + <database>xlab_youle</database>
  170 + <port>1521</port>
  171 + <username/>
  172 + <password>Encrypted </password>
  173 + <servername/>
  174 + <data_tablespace/>
  175 + <index_tablespace/>
  176 + <attributes>
  177 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  178 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  179 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  180 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  181 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  182 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  183 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  184 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  185 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  186 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  187 + </attributes>
  188 + </connection>
  189 + <order>
  190 + <hop> <from>Excel&#x8f93;&#x5165;</from><to>&#x7a7a;&#x64cd;&#x4f5c; &#x28;&#x4ec0;&#x4e48;&#x4e5f;&#x4e0d;&#x505a;&#x29;</to><enabled>Y</enabled> </hop>
  191 + <hop> <from>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</from><to>Excel&#x8f93;&#x5165;</to><enabled>Y</enabled> </hop>
  192 + </order>
  193 + <step>
  194 + <name>&#x7a7a;&#x64cd;&#x4f5c; &#x28;&#x4ec0;&#x4e48;&#x4e5f;&#x4e0d;&#x505a;&#x29;</name>
  195 + <type>Dummy</type>
  196 + <description/>
  197 + <distribute>Y</distribute>
  198 + <custom_distribution/>
  199 + <copies>1</copies>
  200 + <partitioning>
  201 + <method>none</method>
  202 + <schema_name/>
  203 + </partitioning>
  204 + <cluster_schema/>
  205 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  206 + <xloc>400</xloc>
  207 + <yloc>100</yloc>
  208 + <draw>Y</draw>
  209 + </GUI>
  210 + </step>
  211 +
  212 + <step>
  213 + <name>Excel&#x8f93;&#x5165;</name>
  214 + <type>ExcelInput</type>
  215 + <description/>
  216 + <distribute>Y</distribute>
  217 + <custom_distribution/>
  218 + <copies>1</copies>
  219 + <partitioning>
  220 + <method>none</method>
  221 + <schema_name/>
  222 + </partitioning>
  223 + <header>Y</header>
  224 + <noempty>Y</noempty>
  225 + <stoponempty>N</stoponempty>
  226 + <filefield/>
  227 + <sheetfield/>
  228 + <sheetrownumfield/>
  229 + <rownumfield/>
  230 + <sheetfield/>
  231 + <filefield/>
  232 + <limit>0</limit>
  233 + <encoding/>
  234 + <add_to_result_filenames>Y</add_to_result_filenames>
  235 + <accept_filenames>Y</accept_filenames>
  236 + <accept_field>filepath_</accept_field>
  237 + <accept_stepname>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</accept_stepname>
  238 + <file>
  239 + <name/>
  240 + <filemask/>
  241 + <exclude_filemask/>
  242 + <file_required>N</file_required>
  243 + <include_subfolders>N</include_subfolders>
  244 + </file>
  245 + <fields>
  246 + <field>
  247 + <name>&#x7ebf;&#x8def;</name>
  248 + <type>String</type>
  249 + <length>-1</length>
  250 + <precision>-1</precision>
  251 + <trim_type>none</trim_type>
  252 + <repeat>N</repeat>
  253 + <format/>
  254 + <currency/>
  255 + <decimal/>
  256 + <group/>
  257 + </field>
  258 + <field>
  259 + <name>&#x8def;&#x724c;&#x7f16;&#x53f7;</name>
  260 + <type>String</type>
  261 + <length>-1</length>
  262 + <precision>-1</precision>
  263 + <trim_type>none</trim_type>
  264 + <repeat>N</repeat>
  265 + <format/>
  266 + <currency/>
  267 + <decimal/>
  268 + <group/>
  269 + </field>
  270 + <field>
  271 + <name>&#x8def;&#x724c;&#x540d;&#x79f0;</name>
  272 + <type>String</type>
  273 + <length>-1</length>
  274 + <precision>-1</precision>
  275 + <trim_type>none</trim_type>
  276 + <repeat>N</repeat>
  277 + <format/>
  278 + <currency/>
  279 + <decimal/>
  280 + <group/>
  281 + </field>
  282 + <field>
  283 + <name>&#x8def;&#x724c;&#x7c7b;&#x578b;</name>
  284 + <type>String</type>
  285 + <length>-1</length>
  286 + <precision>-1</precision>
  287 + <trim_type>none</trim_type>
  288 + <repeat>N</repeat>
  289 + <format/>
  290 + <currency/>
  291 + <decimal/>
  292 + <group/>
  293 + </field>
  294 + </fields>
  295 + <sheets>
  296 + </sheets>
  297 + <strict_types>N</strict_types>
  298 + <error_ignored>N</error_ignored>
  299 + <error_line_skipped>N</error_line_skipped>
  300 + <bad_line_files_destination_directory/>
  301 + <bad_line_files_extension>warning</bad_line_files_extension>
  302 + <error_line_files_destination_directory/>
  303 + <error_line_files_extension>error</error_line_files_extension>
  304 + <line_number_files_destination_directory/>
  305 + <line_number_files_extension>line</line_number_files_extension>
  306 + <shortFileFieldName/>
  307 + <pathFieldName/>
  308 + <hiddenFieldName/>
  309 + <lastModificationTimeFieldName/>
  310 + <uriNameFieldName/>
  311 + <rootUriNameFieldName/>
  312 + <extensionFieldName/>
  313 + <sizeFieldName/>
  314 + <spreadsheet_type>JXL</spreadsheet_type>
  315 + <cluster_schema/>
  316 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  317 + <xloc>205</xloc>
  318 + <yloc>103</yloc>
  319 + <draw>Y</draw>
  320 + </GUI>
  321 + </step>
  322 +
  323 + <step>
  324 + <name>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</name>
  325 + <type>GetVariable</type>
  326 + <description/>
  327 + <distribute>Y</distribute>
  328 + <custom_distribution/>
  329 + <copies>1</copies>
  330 + <partitioning>
  331 + <method>none</method>
  332 + <schema_name/>
  333 + </partitioning>
  334 + <fields>
  335 + <field>
  336 + <name>filepath_</name>
  337 + <variable>&#x24;&#x7b;filepath&#x7d;</variable>
  338 + <type>String</type>
  339 + <format/>
  340 + <currency/>
  341 + <decimal/>
  342 + <group/>
  343 + <length>-1</length>
  344 + <precision>-1</precision>
  345 + <trim_type>none</trim_type>
  346 + </field>
  347 + </fields>
  348 + <cluster_schema/>
  349 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  350 + <xloc>266</xloc>
  351 + <yloc>283</yloc>
  352 + <draw>Y</draw>
  353 + </GUI>
  354 + </step>
  355 +
  356 + <step_error_handling>
  357 + </step_error_handling>
  358 + <slave-step-copy-partition-distribution>
  359 +</slave-step-copy-partition-distribution>
  360 + <slave_transformation>N</slave_transformation>
  361 +
  362 +</transformation>
src/main/resources/static/assets/bower_components/angular-file-upload/.bower.json 0 → 100644
  1 +{
  2 + "name": "angular-file-upload",
  3 + "main": "dist/angular-file-upload.min.js",
  4 + "homepage": "https://github.com/nervgh/angular-file-upload",
  5 + "ignore": [
  6 + "examples"
  7 + ],
  8 + "dependencies": {
  9 + "angular": "^1.1.5"
  10 + },
  11 + "devDependencies": {
  12 + "es5-shim": ">=3.4.0"
  13 + },
  14 + "keywords": [
  15 + "angular",
  16 + "file",
  17 + "upload",
  18 + "module"
  19 + ],
  20 + "version": "2.1.4",
  21 + "_release": "2.1.4",
  22 + "_resolution": {
  23 + "type": "version",
  24 + "tag": "v2.1.4",
  25 + "commit": "888127c60b2946196784a3af474931ae48a8afca"
  26 + },
  27 + "_source": "https://github.com/nervgh/angular-file-upload.git",
  28 + "_target": "2.1.4",
  29 + "_originalSource": "angular-file-upload"
  30 +}
0 \ No newline at end of file 31 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/.gitignore 0 → 100644
  1 +.temp
  2 +.idea
  3 +*.iml
  4 +node_modules
  5 +bower_components
src/main/resources/static/assets/bower_components/angular-file-upload/.jshintrc 0 → 100644
  1 +{
  2 + "camelcase" : true,
  3 + "indent": 4,
  4 + "strict": true,
  5 + "undef": true,
  6 + "unused": true,
  7 + "quotmark": "single",
  8 + "maxlen": 120,
  9 + "trailing": true,
  10 + "curly": true,
  11 +
  12 + "devel": true,
  13 +
  14 + "browser":true,
  15 + "jquery":true,
  16 + "predef": [
  17 + "angular",
  18 + "define",
  19 + "require",
  20 + "app"
  21 + ]
  22 +}
0 \ No newline at end of file 23 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/README.md 0 → 100644
  1 +# Angular File Upload
  2 +
  3 +---
  4 +
  5 +## About
  6 +
  7 +**Angular File Upload** is a module for the [AngularJS](http://angularjs.org/) framework. Supports drag-n-drop upload, upload progress, validation filters and a file upload queue. It supports native HTML5 uploads, but degrades to a legacy iframe upload method for older browsers. Works with any server side platform which supports standard HTML form uploads.
  8 +
  9 +When files are selected or dropped into the component, one or more filters are applied. Files which pass all filters are added to the queue. When file is added to the queue, for him is created instance of `{FileItem}` and uploader options are copied into this object. After, items in the queue (FileItems) are ready for uploading.
  10 +
  11 +## Package managers
  12 +### Bower
  13 +```
  14 +bower install angular-file-upload
  15 +```
  16 +You could find this module in bower like [_angular file upload_](http://bower.io/search/?q=angular%20file%20upload).
  17 +
  18 +### NPM
  19 +```
  20 +npm install angular-file-upload
  21 +```
  22 +You could find this module in npm like [_angular file upload_](https://www.npmjs.com/search?q=angular%20file%20upload).
  23 +
  24 +## Demos
  25 +1. [Simple example](http://nervgh.github.io/pages/angular-file-upload/examples/simple)
  26 +2. [Uploads only images (with canvas preview)](http://nervgh.github.io/pages/angular-file-upload/examples/image-preview)
  27 +3. [Without bootstrap example](http://nervgh.github.io/pages/angular-file-upload/examples/without-bootstrap)
  28 +
  29 +## More Info
  30 +
  31 +1. [Introduction](https://github.com/nervgh/angular-file-upload/wiki/Introduction)
  32 +2. [Module API](https://github.com/nervgh/angular-file-upload/wiki/Module-API)
  33 +3. [FAQ](https://github.com/nervgh/angular-file-upload/wiki/FAQ)
  34 +4. [Migrate from 0.x.x to 1.x.x](https://github.com/nervgh/angular-file-upload/wiki/Migrate-from-0.x.x-to-1.x.x)
  35 +5. [RubyGem](https://github.com/marthyn/angularjs-file-upload-rails)
src/main/resources/static/assets/bower_components/angular-file-upload/bower.json 0 → 100644
  1 +{
  2 + "name": "angular-file-upload",
  3 + "main": "dist/angular-file-upload.min.js",
  4 + "homepage": "https://github.com/nervgh/angular-file-upload",
  5 + "ignore": ["examples"],
  6 + "dependencies": {
  7 + "angular": "^1.1.5"
  8 + },
  9 + "devDependencies": {
  10 + "es5-shim": ">=3.4.0"
  11 + },
  12 + "keywords": [
  13 + "angular",
  14 + "file",
  15 + "upload",
  16 + "module"
  17 + ]
  18 +}
src/main/resources/static/assets/bower_components/angular-file-upload/dist/angular-file-upload.min.js 0 → 100644
  1 +/*
  2 + angular-file-upload v2.1.4
  3 + https://github.com/nervgh/angular-file-upload
  4 +*/
  5 +
  6 +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):"object"==typeof exports?exports["angular-file-upload"]=t():e["angular-file-upload"]=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=r(n(2)),o=r(n(3)),s=r(n(4)),a=r(n(5)),u=r(n(6)),l=r(n(7)),c=r(n(1)),f=r(n(8)),p=r(n(9)),d=r(n(10)),v=r(n(11)),h=r(n(12));angular.module(i.name,[]).value("fileUploaderOptions",o).factory("FileUploader",s).factory("FileLikeObject",a).factory("FileItem",u).factory("FileDirective",l).factory("FileSelect",c).factory("FileDrop",f).factory("FileOver",p).directive("nvFileSelect",d).directive("nvFileDrop",v).directive("nvFileOver",h).run(["FileUploader","FileLikeObject","FileItem","FileDirective","FileSelect","FileDrop","FileOver",function(e,t,n,r,i,o,s){e.FileLikeObject=t,e.FileItem=n,e.FileDirective=r,e.FileSelect=i,e.FileDrop=o,e.FileOver=s}])},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function l(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(void 0===r){var i=Object.getPrototypeOf(e);return null===i?void 0:l(i,t,n)}if("value"in r&&r.writable)return r.value;var o=r.get;return void 0===o?void 0:o.call(n)},s=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)},a=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},u=(r(n(2)),angular.extend);e.exports=function(e){var t=function(e){function t(e){a(this,t);var n=u(e,{events:{$destroy:"destroy",change:"onChange"},prop:"select"});o(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,n),this.uploader.isHTML5||this.element.removeAttr("multiple"),this.element.prop("value",null)}return s(t,e),i(t,{getOptions:{value:function(){}},getFilters:{value:function(){}},isEmptyAfterSelection:{value:function(){return!!this.element.attr("multiple")}},onChange:{value:function(){var e=this.uploader.isHTML5?this.element[0].files:this.element[0],t=this.getOptions(),n=this.getFilters();this.uploader.isHTML5||this.destroy(),this.uploader.addToQueue(e,t,n),this.isEmptyAfterSelection()&&(this.element.prop("value",null),this.element.replaceWith(this.element=this.element.clone(!0)))}}}),t}(e);return t},e.exports.$inject=["FileDirective"]},function(e,t){e.exports={name:"angularFileUpload"}},function(e,t){"use strict";e.exports={url:"/",alias:"file",headers:{},queue:[],progress:0,autoUpload:!1,removeAfterUpload:!1,method:"POST",filters:[],formData:[],queueLimit:Number.MAX_VALUE,withCredentials:!1}},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.copy),a=angular.extend,u=angular.forEach,l=angular.isObject,c=angular.isNumber,f=angular.isDefined,p=angular.isArray,d=angular.element;e.exports=function(e,t,n,r,v,h){var m=r.File,g=r.FormData,_=function(){function r(t){o(this,r);var n=s(e);a(this,n,t,{isUploading:!1,_nextIndex:0,_failFilterIndex:-1,_directives:{select:[],drop:[],over:[]}}),this.filters.unshift({name:"queueLimit",fn:this._queueLimitFilter}),this.filters.unshift({name:"folder",fn:this._folderFilter})}return i(r,{addToQueue:{value:function(e,t,n){var r=this,i=this.isArrayLikeObject(e)?e:[e],o=this._getFilters(n),s=this.queue.length,a=[];u(i,function(e){var n=new v(e);if(r._isValidFile(n,o,t)){var i=new h(r,e,t);a.push(i),r.queue.push(i),r._onAfterAddingFile(i)}else{var s=o[r._failFilterIndex];r._onWhenAddingFileFailed(n,s,t)}}),this.queue.length!==s&&(this._onAfterAddingAll(a),this.progress=this._getTotalProgress()),this._render(),this.autoUpload&&this.uploadAll()}},removeFromQueue:{value:function(e){var t=this.getIndexOfItem(e),n=this.queue[t];n.isUploading&&n.cancel(),this.queue.splice(t,1),n._destroy(),this.progress=this._getTotalProgress()}},clearQueue:{value:function(){for(;this.queue.length;)this.queue[0].remove();this.progress=0}},uploadItem:{value:function(e){var t=this.getIndexOfItem(e),n=this.queue[t],r=this.isHTML5?"_xhrTransport":"_iframeTransport";n._prepareToUploading(),this.isUploading||(this.isUploading=!0,this[r](n))}},cancelItem:{value:function(e){var t=this.getIndexOfItem(e),n=this.queue[t],r=this.isHTML5?"_xhr":"_form";n&&n.isUploading&&n[r].abort()}},uploadAll:{value:function(){var e=this.getNotUploadedItems().filter(function(e){return!e.isUploading});e.length&&(u(e,function(e){return e._prepareToUploading()}),e[0].upload())}},cancelAll:{value:function(){var e=this.getNotUploadedItems();u(e,function(e){return e.cancel()})}},isFile:{value:function(e){return this.constructor.isFile(e)}},isFileLikeObject:{value:function(e){return this.constructor.isFileLikeObject(e)}},isArrayLikeObject:{value:function(e){return this.constructor.isArrayLikeObject(e)}},getIndexOfItem:{value:function(e){return c(e)?e:this.queue.indexOf(e)}},getNotUploadedItems:{value:function(){return this.queue.filter(function(e){return!e.isUploaded})}},getReadyItems:{value:function(){return this.queue.filter(function(e){return e.isReady&&!e.isUploading}).sort(function(e,t){return e.index-t.index})}},destroy:{value:function(){var e=this;u(this._directives,function(t){u(e._directives[t],function(e){e.destroy()})})}},onAfterAddingAll:{value:function(e){}},onAfterAddingFile:{value:function(e){}},onWhenAddingFileFailed:{value:function(e,t,n){}},onBeforeUploadItem:{value:function(e){}},onProgressItem:{value:function(e,t){}},onProgressAll:{value:function(e){}},onSuccessItem:{value:function(e,t,n,r){}},onErrorItem:{value:function(e,t,n,r){}},onCancelItem:{value:function(e,t,n,r){}},onCompleteItem:{value:function(e,t,n,r){}},onCompleteAll:{value:function(){}},_getTotalProgress:{value:function(e){if(this.removeAfterUpload)return e||0;var t=this.getNotUploadedItems().length,n=t?this.queue.length-t:this.queue.length,r=100/this.queue.length,i=(e||0)*r/100;return Math.round(n*r+i)}},_getFilters:{value:function(e){if(!e)return this.filters;if(p(e))return e;var t=e.match(/[^\s,]+/g);return this.filters.filter(function(e){return-1!==t.indexOf(e.name)})}},_render:{value:function(){t.$$phase||t.$apply()}},_folderFilter:{value:function(e){return!(!e.size&&!e.type)}},_queueLimitFilter:{value:function(){return this.queue.length<this.queueLimit}},_isValidFile:{value:function(e,t,n){var r=this;return this._failFilterIndex=-1,t.length?t.every(function(t){return r._failFilterIndex++,t.fn.call(r,e,n)}):!0}},_isSuccessCode:{value:function(e){return e>=200&&300>e||304===e}},_transformResponse:{value:function(e,t){var r=this._headersGetter(t);return u(n.defaults.transformResponse,function(t){e=t(e,r)}),e}},_parseHeaders:{value:function(e){var t,n,r,i={};return e?(u(e.split("\n"),function(e){r=e.indexOf(":"),t=e.slice(0,r).trim().toLowerCase(),n=e.slice(r+1).trim(),t&&(i[t]=i[t]?i[t]+", "+n:n)}),i):i}},_headersGetter:{value:function(e){return function(t){return t?e[t.toLowerCase()]||null:e}}},_xhrTransport:{value:function(e){var t=this,n=e._xhr=new XMLHttpRequest,r=new g;if(this._onBeforeUploadItem(e),u(e.formData,function(e){u(e,function(e,t){r.append(t,e)})}),"number"!=typeof e._file.size)throw new TypeError("The file specified is no longer valid");r.append(e.alias,e._file,e.file.name),n.upload.onprogress=function(n){var r=Math.round(n.lengthComputable?100*n.loaded/n.total:0);t._onProgressItem(e,r)},n.onload=function(){var r=t._parseHeaders(n.getAllResponseHeaders()),i=t._transformResponse(n.response,r),o=t._isSuccessCode(n.status)?"Success":"Error",s="_on"+o+"Item";t[s](e,i,n.status,r),t._onCompleteItem(e,i,n.status,r)},n.onerror=function(){var r=t._parseHeaders(n.getAllResponseHeaders()),i=t._transformResponse(n.response,r);t._onErrorItem(e,i,n.status,r),t._onCompleteItem(e,i,n.status,r)},n.onabort=function(){var r=t._parseHeaders(n.getAllResponseHeaders()),i=t._transformResponse(n.response,r);t._onCancelItem(e,i,n.status,r),t._onCompleteItem(e,i,n.status,r)},n.open(e.method,e.url,!0),n.withCredentials=e.withCredentials,u(e.headers,function(e,t){n.setRequestHeader(t,e)}),n.send(r),this._render()}},_iframeTransport:{value:function(e){var t=this,n=d('<form style="display: none;" />'),r=d('<iframe name="iframeTransport'+Date.now()+'">'),i=e._input;e._form&&e._form.replaceWith(i),e._form=n,this._onBeforeUploadItem(e),i.prop("name",e.alias),u(e.formData,function(e){u(e,function(e,t){var r=d('<input type="hidden" name="'+t+'" />');r.val(e),n.append(r)})}),n.prop({action:e.url,method:"POST",target:r.prop("name"),enctype:"multipart/form-data",encoding:"multipart/form-data"}),r.bind("load",function(){var n="",i=200;try{n=r[0].contentDocument.body.innerHTML}catch(o){i=500}var s={response:n,status:i,dummy:!0},a={},u=t._transformResponse(s.response,a);t._onSuccessItem(e,u,s.status,a),t._onCompleteItem(e,u,s.status,a)}),n.abort=function(){var o,s={status:0,dummy:!0},a={};r.unbind("load").prop("src","javascript:false;"),n.replaceWith(i),t._onCancelItem(e,o,s.status,a),t._onCompleteItem(e,o,s.status,a)},i.after(n),n.append(i).append(r),n[0].submit(),this._render()}},_onWhenAddingFileFailed:{value:function(e,t,n){this.onWhenAddingFileFailed(e,t,n)}},_onAfterAddingFile:{value:function(e){this.onAfterAddingFile(e)}},_onAfterAddingAll:{value:function(e){this.onAfterAddingAll(e)}},_onBeforeUploadItem:{value:function(e){e._onBeforeUpload(),this.onBeforeUploadItem(e)}},_onProgressItem:{value:function(e,t){var n=this._getTotalProgress(t);this.progress=n,e._onProgress(t),this.onProgressItem(e,t),this.onProgressAll(n),this._render()}},_onSuccessItem:{value:function(e,t,n,r){e._onSuccess(t,n,r),this.onSuccessItem(e,t,n,r)}},_onErrorItem:{value:function(e,t,n,r){e._onError(t,n,r),this.onErrorItem(e,t,n,r)}},_onCancelItem:{value:function(e,t,n,r){e._onCancel(t,n,r),this.onCancelItem(e,t,n,r)}},_onCompleteItem:{value:function(e,t,n,r){e._onComplete(t,n,r),this.onCompleteItem(e,t,n,r);var i=this.getReadyItems()[0];return this.isUploading=!1,f(i)?void i.upload():(this.onCompleteAll(),this.progress=this._getTotalProgress(),void this._render())}}},{isFile:{value:function(e){return m&&e instanceof m}},isFileLikeObject:{value:function(e){return e instanceof v}},isArrayLikeObject:{value:function(e){return l(e)&&"length"in e}},inherit:{value:function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.super_=t}}}),r}();return _.prototype.isHTML5=!(!m||!g),_.isHTML5=_.prototype.isHTML5,_},e.exports.$inject=["fileUploaderOptions","$rootScope","$http","$window","FileLikeObject","FileItem"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.copy),a=angular.isElement,u=angular.isString;e.exports=function(){var e=function(){function e(t){o(this,e);var n=a(t),r=n?t.value:t,i=u(r)?"FakePath":"Object",s="_createFrom"+i;this[s](r)}return i(e,{_createFromFakePath:{value:function(e){this.lastModifiedDate=null,this.size=null,this.type="like/"+e.slice(e.lastIndexOf(".")+1).toLowerCase(),this.name=e.slice(e.lastIndexOf("/")+e.lastIndexOf("\\")+2)}},_createFromObject:{value:function(e){this.lastModifiedDate=s(e.lastModifiedDate),this.size=e.size,this.type=e.type,this.name=e.name}}}),e}();return e},e.exports.$inject=[]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.copy),a=angular.extend,u=angular.element,l=angular.isElement;e.exports=function(e,t){var n=function(){function n(e,r,i){o(this,n);var c=l(r),f=c?u(r):null,p=c?null:r;a(this,{url:e.url,alias:e.alias,headers:s(e.headers),formData:s(e.formData),removeAfterUpload:e.removeAfterUpload,withCredentials:e.withCredentials,method:e.method},i,{uploader:e,file:new t(r),isReady:!1,isUploading:!1,isUploaded:!1,isSuccess:!1,isCancel:!1,isError:!1,progress:0,index:null,_file:p,_input:f}),f&&this._replaceNode(f)}return i(n,{upload:{value:function(){try{this.uploader.uploadItem(this)}catch(e){this.uploader._onCompleteItem(this,"",0,[]),this.uploader._onErrorItem(this,"",0,[])}}},cancel:{value:function(){this.uploader.cancelItem(this)}},remove:{value:function(){this.uploader.removeFromQueue(this)}},onBeforeUpload:{value:function(){}},onProgress:{value:function(e){}},onSuccess:{value:function(e,t,n){}},onError:{value:function(e,t,n){}},onCancel:{value:function(e,t,n){}},onComplete:{value:function(e,t,n){}},_onBeforeUpload:{value:function(){this.isReady=!0,this.isUploading=!0,this.isUploaded=!1,this.isSuccess=!1,this.isCancel=!1,this.isError=!1,this.progress=0,this.onBeforeUpload()}},_onProgress:{value:function(e){this.progress=e,this.onProgress(e)}},_onSuccess:{value:function(e,t,n){this.isReady=!1,this.isUploading=!1,this.isUploaded=!0,this.isSuccess=!0,this.isCancel=!1,this.isError=!1,this.progress=100,this.index=null,this.onSuccess(e,t,n)}},_onError:{value:function(e,t,n){this.isReady=!1,this.isUploading=!1,this.isUploaded=!0,this.isSuccess=!1,this.isCancel=!1,this.isError=!0,this.progress=0,this.index=null,this.onError(e,t,n)}},_onCancel:{value:function(e,t,n){this.isReady=!1,this.isUploading=!1,this.isUploaded=!1,this.isSuccess=!1,this.isCancel=!0,this.isError=!1,this.progress=0,this.index=null,this.onCancel(e,t,n)}},_onComplete:{value:function(e,t,n){this.onComplete(e,t,n),this.removeAfterUpload&&this.remove()}},_destroy:{value:function(){this._input&&this._input.remove(),this._form&&this._form.remove(),delete this._form,delete this._input}},_prepareToUploading:{value:function(){this.index=this.index||++this.uploader._nextIndex,this.isReady=!0}},_replaceNode:{value:function(t){var n=e(t.clone())(t.scope());n.prop("value",null),t.css("display","none"),t.after(n)}}}),n}();return n},e.exports.$inject=["$compile","FileLikeObject"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.extend);e.exports=function(){var e=function(){function e(t){o(this,e),s(this,t),this.uploader._directives[this.prop].push(this),this._saveLinks(),this.bind()}return i(e,{bind:{value:function(){for(var e in this.events){var t=this.events[e];this.element.bind(e,this[t])}}},unbind:{value:function(){for(var e in this.events)this.element.unbind(e,this.events[e])}},destroy:{value:function(){var e=this.uploader._directives[this.prop].indexOf(this);this.uploader._directives[this.prop].splice(e,1),this.unbind()}},_saveLinks:{value:function(){for(var e in this.events){var t=this.events[e];this[t]=this[t].bind(this)}}}}),e}();return e.prototype.events={},e},e.exports.$inject=[]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function c(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(void 0===r){var i=Object.getPrototypeOf(e);return null===i?void 0:c(i,t,n)}if("value"in r&&r.writable)return r.value;var o=r.get;return void 0===o?void 0:o.call(n)},s=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)},a=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},u=(r(n(2)),angular.extend),l=angular.forEach;e.exports=function(e){var t=function(e){function t(e){a(this,t);var n=u(e,{events:{$destroy:"destroy",drop:"onDrop",dragover:"onDragOver",dragleave:"onDragLeave"},prop:"drop"});o(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,n)}return s(t,e),i(t,{getOptions:{value:function(){}},getFilters:{value:function(){}},onDrop:{value:function(e){var t=this._getTransfer(e);if(t){var n=this.getOptions(),r=this.getFilters();this._preventAndStop(e),l(this.uploader._directives.over,this._removeOverClass,this),this.uploader.addToQueue(t.files,n,r)}}},onDragOver:{value:function(e){var t=this._getTransfer(e);this._haveFiles(t.types)&&(t.dropEffect="copy",this._preventAndStop(e),l(this.uploader._directives.over,this._addOverClass,this))}},onDragLeave:{value:function(e){e.currentTarget!==this.element[0]&&(this._preventAndStop(e),l(this.uploader._directives.over,this._removeOverClass,this))}},_getTransfer:{value:function(e){return e.dataTransfer?e.dataTransfer:e.originalEvent.dataTransfer}},_preventAndStop:{value:function(e){e.preventDefault(),e.stopPropagation()}},_haveFiles:{value:function(e){return e?e.indexOf?-1!==e.indexOf("Files"):e.contains?e.contains("Files"):!1:!1}},_addOverClass:{value:function(e){e.addOverClass()}},_removeOverClass:{value:function(e){e.removeOverClass()}}}),t}(e);return t},e.exports.$inject=["FileDirective"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function l(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(void 0===r){var i=Object.getPrototypeOf(e);return null===i?void 0:l(i,t,n)}if("value"in r&&r.writable)return r.value;var o=r.get;return void 0===o?void 0:o.call(n)},s=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)},a=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},u=(r(n(2)),angular.extend);e.exports=function(e){var t=function(e){function t(e){a(this,t);var n=u(e,{events:{$destroy:"destroy"},prop:"over",overClass:"nv-file-over"});o(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,n)}return s(t,e),i(t,{addOverClass:{value:function(){this.element.addClass(this.getOverClass())}},removeOverClass:{value:function(){this.element.removeClass(this.getOverClass())}},getOverClass:{value:function(){return this.overClass}}}),t}(e);return t},e.exports.$inject=["FileDirective"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e};r(n(2));e.exports=function(e,t,n){return{link:function(r,i,o){var s=r.$eval(o.uploader);if(!(s instanceof t))throw new TypeError('"Uploader" must be an instance of FileUploader');var a=new n({uploader:s,element:i});a.getOptions=e(o.options).bind(a,r),a.getFilters=function(){return o.filters}}}},e.exports.$inject=["$parse","FileUploader","FileSelect"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e};r(n(2));e.exports=function(e,t,n){return{link:function(r,i,o){var s=r.$eval(o.uploader);if(!(s instanceof t))throw new TypeError('"Uploader" must be an instance of FileUploader');if(s.isHTML5){var a=new n({uploader:s,element:i});a.getOptions=e(o.options).bind(a,r),a.getFilters=function(){return o.filters}}}}},e.exports.$inject=["$parse","FileUploader","FileDrop"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e};r(n(2));e.exports=function(e,t){return{link:function(n,r,i){var o=n.$eval(i.uploader);if(!(o instanceof e))throw new TypeError('"Uploader" must be an instance of FileUploader');var s=new t({uploader:o,element:r});s.getOverClass=function(){return i.overClass||s.overClass}}}},e.exports.$inject=["FileUploader","FileOver"]}])});
  7 +//# sourceMappingURL=angular-file-upload.min.js.map
0 \ No newline at end of file 8 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/dist/angular-file-upload.min.js.map 0 → 100644
  1 +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///angular-file-upload.min.js","webpack:///webpack/bootstrap 2be85a13effb1c2acd03","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/index.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileSelect.js","webpack:///./src/config.json","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/values/options.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileUploader.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileLikeObject.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileItem.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileDirective.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileDrop.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileOver.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/directives/FileSelect.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/directives/FileDrop.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/directives/FileOver.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequire","obj","__esModule","CONFIG","options","serviceFileUploader","serviceFileLikeObject","serviceFileItem","serviceFileDirective","serviceFileSelect","serviceFileDrop","serviceFileOver","directiveFileSelect","directiveFileDrop","directiveFileOver","angular","name","value","directive","run","FileUploader","FileLikeObject","FileItem","FileDirective","FileSelect","FileDrop","FileOver","_createClass","defineProperties","target","props","key","prop","configurable","writable","Object","Constructor","protoProps","staticProps","prototype","_get","get","object","property","receiver","desc","getOwnPropertyDescriptor","undefined","parent","getPrototypeOf","getter","_inherits","subClass","superClass","TypeError","create","constructor","enumerable","__proto__","_classCallCheck","instance","extend","_FileDirective","extendedOptions","events","$destroy","change","uploader","isHTML5","element","removeAttr","getOptions","getFilters","isEmptyAfterSelection","attr","onChange","files","filters","destroy","addToQueue","replaceWith","clone","$inject","url","alias","headers","queue","progress","autoUpload","removeAfterUpload","method","formData","queueLimit","Number","MAX_VALUE","withCredentials","copy","forEach","isObject","isNumber","isDefined","isArray","fileUploaderOptions","$rootScope","$http","$window","File","FormData","settings","isUploading","_nextIndex","_failFilterIndex","_directives","select","drop","over","unshift","fn","_queueLimitFilter","_folderFilter","_this","list","isArrayLikeObject","arrayOfFilters","_getFilters","count","length","addedFileItems","some","temp","_isValidFile","fileItem","push","_onAfterAddingFile","filter","_onWhenAddingFileFailed","_onAfterAddingAll","_getTotalProgress","_render","uploadAll","removeFromQueue","index","getIndexOfItem","item","cancel","splice","_destroy","clearQueue","remove","uploadItem","transport","_prepareToUploading","cancelItem","abort","items","getNotUploadedItems","upload","cancelAll","isFile","isFileLikeObject","indexOf","isUploaded","getReadyItems","isReady","sort","item1","item2","onAfterAddingAll","fileItems","onAfterAddingFile","onWhenAddingFileFailed","onBeforeUploadItem","onProgressItem","onProgressAll","onSuccessItem","response","status","onErrorItem","onCancelItem","onCompleteItem","onCompleteAll","notUploaded","uploaded","ratio","current","Math","round","names","match","$$phase","$apply","size","type","file","every","_isSuccessCode","_transformResponse","headersGetter","_headersGetter","defaults","transformResponse","transformFn","_parseHeaders","val","i","parsed","split","line","slice","trim","toLowerCase","parsedHeaders","_xhrTransport","xhr","_xhr","XMLHttpRequest","form","_onBeforeUploadItem","append","_file","onprogress","event","lengthComputable","total","_onProgressItem","onload","getAllResponseHeaders","gist","_onCompleteItem","onerror","_onErrorItem","onabort","_onCancelItem","open","setRequestHeader","send","_iframeTransport","iframe","Date","now","input","_input","_form","element_","action","enctype","encoding","bind","html","contentDocument","body","innerHTML","e","dummy","_onSuccessItem","unbind","after","submit","_onBeforeUpload","_onProgress","_onSuccess","_onError","_onCancel","_onComplete","nextItem","inherit","source","super_","isElement","isString","fileOrInput","isInput","fakePathOrObject","postfix","_createFromFakePath","path","lastModifiedDate","lastIndexOf","_createFromObject","$compile","isSuccess","isCancel","isError","_replaceNode","onBeforeUpload","onProgress","onSuccess","onError","onCancel","onComplete","scope","css","_saveLinks","dragover","dragleave","onDrop","transfer","_getTransfer","_preventAndStop","_removeOverClass","onDragOver","_haveFiles","types","dropEffect","_addOverClass","onDragLeave","currentTarget","dataTransfer","originalEvent","preventDefault","stopPropagation","contains","addOverClass","removeOverClass","overClass","addClass","getOverClass","removeClass","$parse","link","attributes","$eval"],"mappings":"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","file":"angular-file-upload.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"angular-file-upload\"] = factory();\n\telse\n\t\troot[\"angular-file-upload\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"angular-file-upload\"] = factory();\n\telse\n\t\troot[\"angular-file-upload\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar options = _interopRequire(__webpack_require__(3));\n\t\n\tvar serviceFileUploader = _interopRequire(__webpack_require__(4));\n\t\n\tvar serviceFileLikeObject = _interopRequire(__webpack_require__(5));\n\t\n\tvar serviceFileItem = _interopRequire(__webpack_require__(6));\n\t\n\tvar serviceFileDirective = _interopRequire(__webpack_require__(7));\n\t\n\tvar serviceFileSelect = _interopRequire(__webpack_require__(1));\n\t\n\tvar serviceFileDrop = _interopRequire(__webpack_require__(8));\n\t\n\tvar serviceFileOver = _interopRequire(__webpack_require__(9));\n\t\n\tvar directiveFileSelect = _interopRequire(__webpack_require__(10));\n\t\n\tvar directiveFileDrop = _interopRequire(__webpack_require__(11));\n\t\n\tvar directiveFileOver = _interopRequire(__webpack_require__(12));\n\t\n\tangular.module(CONFIG.name, []).value(\"fileUploaderOptions\", options).factory(\"FileUploader\", serviceFileUploader).factory(\"FileLikeObject\", serviceFileLikeObject).factory(\"FileItem\", serviceFileItem).factory(\"FileDirective\", serviceFileDirective).factory(\"FileSelect\", serviceFileSelect).factory(\"FileDrop\", serviceFileDrop).factory(\"FileOver\", serviceFileOver).directive(\"nvFileSelect\", directiveFileSelect).directive(\"nvFileDrop\", directiveFileDrop).directive(\"nvFileOver\", directiveFileOver).run([\"FileUploader\", \"FileLikeObject\", \"FileItem\", \"FileDirective\", \"FileSelect\", \"FileDrop\", \"FileOver\", function (FileUploader, FileLikeObject, FileItem, FileDirective, FileSelect, FileDrop, FileOver) {\n\t // only for compatibility\n\t FileUploader.FileLikeObject = FileLikeObject;\n\t FileUploader.FileItem = FileItem;\n\t FileUploader.FileDirective = FileDirective;\n\t FileUploader.FileSelect = FileSelect;\n\t FileUploader.FileDrop = FileDrop;\n\t FileUploader.FileOver = FileOver;\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _inherits = function (subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar extend = angular.extend;\n\t\n\tmodule.exports = function (FileDirective) {\n\t var FileSelect = (function (_FileDirective) {\n\t /**\r\n\t * Creates instance of {FileSelect} object\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileSelect(options) {\n\t _classCallCheck(this, FileSelect);\n\t\n\t var extendedOptions = extend(options, {\n\t // Map of events\n\t events: {\n\t $destroy: \"destroy\",\n\t change: \"onChange\"\n\t },\n\t // Name of property inside uploader._directive object\n\t prop: \"select\"\n\t });\n\t\n\t _get(Object.getPrototypeOf(FileSelect.prototype), \"constructor\", this).call(this, extendedOptions);\n\t\n\t if (!this.uploader.isHTML5) {\n\t this.element.removeAttr(\"multiple\");\n\t }\n\t this.element.prop(\"value\", null); // FF fix\n\t }\n\t\n\t _inherits(FileSelect, _FileDirective);\n\t\n\t _createClass(FileSelect, {\n\t getOptions: {\n\t /**\r\n\t * Returns options\r\n\t * @return {Object|undefined}\r\n\t */\n\t\n\t value: function getOptions() {}\n\t },\n\t getFilters: {\n\t /**\r\n\t * Returns filters\r\n\t * @return {Array<Function>|String|undefined}\r\n\t */\n\t\n\t value: function getFilters() {}\n\t },\n\t isEmptyAfterSelection: {\n\t /**\r\n\t * If returns \"true\" then HTMLInputElement will be cleared\r\n\t * @returns {Boolean}\r\n\t */\n\t\n\t value: function isEmptyAfterSelection() {\n\t return !!this.element.attr(\"multiple\");\n\t }\n\t },\n\t onChange: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onChange() {\n\t var files = this.uploader.isHTML5 ? this.element[0].files : this.element[0];\n\t var options = this.getOptions();\n\t var filters = this.getFilters();\n\t\n\t if (!this.uploader.isHTML5) this.destroy();\n\t this.uploader.addToQueue(files, options, filters);\n\t if (this.isEmptyAfterSelection()) {\n\t this.element.prop(\"value\", null);\n\t this.element.replaceWith(this.element = this.element.clone(true)); // IE fix\n\t }\n\t }\n\t }\n\t });\n\t\n\t return FileSelect;\n\t })(FileDirective);\n\t\n\t return FileSelect;\n\t};\n\t\n\tmodule.exports.$inject = [\"FileDirective\"];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\tmodule.exports = {\n\t\t\"name\": \"angularFileUpload\"\n\t}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tmodule.exports = {\n\t url: \"/\",\n\t alias: \"file\",\n\t headers: {},\n\t queue: [],\n\t progress: 0,\n\t autoUpload: false,\n\t removeAfterUpload: false,\n\t method: \"POST\",\n\t filters: [],\n\t formData: [],\n\t queueLimit: Number.MAX_VALUE,\n\t withCredentials: false\n\t};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar copy = angular.copy;\n\tvar extend = angular.extend;\n\tvar forEach = angular.forEach;\n\tvar isObject = angular.isObject;\n\tvar isNumber = angular.isNumber;\n\tvar isDefined = angular.isDefined;\n\tvar isArray = angular.isArray;\n\tvar element = angular.element;\n\t\n\tmodule.exports = function (fileUploaderOptions, $rootScope, $http, $window, FileLikeObject, FileItem) {\n\t var File = $window.File;\n\t var FormData = $window.FormData;\n\t\n\t var FileUploader = (function () {\n\t /**********************\r\n\t * PUBLIC\r\n\t **********************/\n\t /**\r\n\t * Creates an instance of FileUploader\r\n\t * @param {Object} [options]\r\n\t * @constructor\r\n\t */\n\t\n\t function FileUploader(options) {\n\t _classCallCheck(this, FileUploader);\n\t\n\t var settings = copy(fileUploaderOptions);\n\t\n\t extend(this, settings, options, {\n\t isUploading: false,\n\t _nextIndex: 0,\n\t _failFilterIndex: -1,\n\t _directives: { select: [], drop: [], over: [] }\n\t });\n\t\n\t // add default filters\n\t this.filters.unshift({ name: \"queueLimit\", fn: this._queueLimitFilter });\n\t this.filters.unshift({ name: \"folder\", fn: this._folderFilter });\n\t }\n\t\n\t _createClass(FileUploader, {\n\t addToQueue: {\n\t /**\r\n\t * Adds items to the queue\r\n\t * @param {File|HTMLInputElement|Object|FileList|Array<Object>} files\r\n\t * @param {Object} [options]\r\n\t * @param {Array<Function>|String} filters\r\n\t */\n\t\n\t value: function addToQueue(files, options, filters) {\n\t var _this = this;\n\t\n\t var list = this.isArrayLikeObject(files) ? files : [files];\n\t var arrayOfFilters = this._getFilters(filters);\n\t var count = this.queue.length;\n\t var addedFileItems = [];\n\t\n\t forEach(list, function (some /*{File|HTMLInputElement|Object}*/) {\n\t var temp = new FileLikeObject(some);\n\t\n\t if (_this._isValidFile(temp, arrayOfFilters, options)) {\n\t var fileItem = new FileItem(_this, some, options);\n\t addedFileItems.push(fileItem);\n\t _this.queue.push(fileItem);\n\t _this._onAfterAddingFile(fileItem);\n\t } else {\n\t var filter = arrayOfFilters[_this._failFilterIndex];\n\t _this._onWhenAddingFileFailed(temp, filter, options);\n\t }\n\t });\n\t\n\t if (this.queue.length !== count) {\n\t this._onAfterAddingAll(addedFileItems);\n\t this.progress = this._getTotalProgress();\n\t }\n\t\n\t this._render();\n\t if (this.autoUpload) this.uploadAll();\n\t }\n\t },\n\t removeFromQueue: {\n\t /**\r\n\t * Remove items from the queue. Remove last: index = -1\r\n\t * @param {FileItem|Number} value\r\n\t */\n\t\n\t value: function removeFromQueue(value) {\n\t var index = this.getIndexOfItem(value);\n\t var item = this.queue[index];\n\t if (item.isUploading) item.cancel();\n\t this.queue.splice(index, 1);\n\t item._destroy();\n\t this.progress = this._getTotalProgress();\n\t }\n\t },\n\t clearQueue: {\n\t /**\r\n\t * Clears the queue\r\n\t */\n\t\n\t value: function clearQueue() {\n\t while (this.queue.length) {\n\t this.queue[0].remove();\n\t }\n\t this.progress = 0;\n\t }\n\t },\n\t uploadItem: {\n\t /**\r\n\t * Uploads a item from the queue\r\n\t * @param {FileItem|Number} value\r\n\t */\n\t\n\t value: function uploadItem(value) {\n\t var index = this.getIndexOfItem(value);\n\t var item = this.queue[index];\n\t var transport = this.isHTML5 ? \"_xhrTransport\" : \"_iframeTransport\";\n\t\n\t item._prepareToUploading();\n\t if (this.isUploading) {\n\t return;\n\t }this.isUploading = true;\n\t this[transport](item);\n\t }\n\t },\n\t cancelItem: {\n\t /**\r\n\t * Cancels uploading of item from the queue\r\n\t * @param {FileItem|Number} value\r\n\t */\n\t\n\t value: function cancelItem(value) {\n\t var index = this.getIndexOfItem(value);\n\t var item = this.queue[index];\n\t var prop = this.isHTML5 ? \"_xhr\" : \"_form\";\n\t if (item && item.isUploading) item[prop].abort();\n\t }\n\t },\n\t uploadAll: {\n\t /**\r\n\t * Uploads all not uploaded items of queue\r\n\t */\n\t\n\t value: function uploadAll() {\n\t var items = this.getNotUploadedItems().filter(function (item) {\n\t return !item.isUploading;\n\t });\n\t if (!items.length) {\n\t return;\n\t }forEach(items, function (item) {\n\t return item._prepareToUploading();\n\t });\n\t items[0].upload();\n\t }\n\t },\n\t cancelAll: {\n\t /**\r\n\t * Cancels all uploads\r\n\t */\n\t\n\t value: function cancelAll() {\n\t var items = this.getNotUploadedItems();\n\t forEach(items, function (item) {\n\t return item.cancel();\n\t });\n\t }\n\t },\n\t isFile: {\n\t /**\r\n\t * Returns \"true\" if value an instance of File\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFile(value) {\n\t return this.constructor.isFile(value);\n\t }\n\t },\n\t isFileLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value an instance of FileLikeObject\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFileLikeObject(value) {\n\t return this.constructor.isFileLikeObject(value);\n\t }\n\t },\n\t isArrayLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value is array like object\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t */\n\t\n\t value: function isArrayLikeObject(value) {\n\t return this.constructor.isArrayLikeObject(value);\n\t }\n\t },\n\t getIndexOfItem: {\n\t /**\r\n\t * Returns a index of item from the queue\r\n\t * @param {Item|Number} value\r\n\t * @returns {Number}\r\n\t */\n\t\n\t value: function getIndexOfItem(value) {\n\t return isNumber(value) ? value : this.queue.indexOf(value);\n\t }\n\t },\n\t getNotUploadedItems: {\n\t /**\r\n\t * Returns not uploaded items\r\n\t * @returns {Array}\r\n\t */\n\t\n\t value: function getNotUploadedItems() {\n\t return this.queue.filter(function (item) {\n\t return !item.isUploaded;\n\t });\n\t }\n\t },\n\t getReadyItems: {\n\t /**\r\n\t * Returns items ready for upload\r\n\t * @returns {Array}\r\n\t */\n\t\n\t value: function getReadyItems() {\n\t return this.queue.filter(function (item) {\n\t return item.isReady && !item.isUploading;\n\t }).sort(function (item1, item2) {\n\t return item1.index - item2.index;\n\t });\n\t }\n\t },\n\t destroy: {\n\t /**\r\n\t * Destroys instance of FileUploader\r\n\t */\n\t\n\t value: function destroy() {\n\t var _this = this;\n\t\n\t forEach(this._directives, function (key) {\n\t forEach(_this._directives[key], function (object) {\n\t object.destroy();\n\t });\n\t });\n\t }\n\t },\n\t onAfterAddingAll: {\n\t /**\r\n\t * Callback\r\n\t * @param {Array} fileItems\r\n\t */\n\t\n\t value: function onAfterAddingAll(fileItems) {}\n\t },\n\t onAfterAddingFile: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} fileItem\r\n\t */\n\t\n\t value: function onAfterAddingFile(fileItem) {}\n\t },\n\t onWhenAddingFileFailed: {\n\t /**\r\n\t * Callback\r\n\t * @param {File|Object} item\r\n\t * @param {Object} filter\r\n\t * @param {Object} options\r\n\t */\n\t\n\t value: function onWhenAddingFileFailed(item, filter, options) {}\n\t },\n\t onBeforeUploadItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} fileItem\r\n\t */\n\t\n\t value: function onBeforeUploadItem(fileItem) {}\n\t },\n\t onProgressItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} fileItem\r\n\t * @param {Number} progress\r\n\t */\n\t\n\t value: function onProgressItem(fileItem, progress) {}\n\t },\n\t onProgressAll: {\n\t /**\r\n\t * Callback\r\n\t * @param {Number} progress\r\n\t */\n\t\n\t value: function onProgressAll(progress) {}\n\t },\n\t onSuccessItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onSuccessItem(item, response, status, headers) {}\n\t },\n\t onErrorItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onErrorItem(item, response, status, headers) {}\n\t },\n\t onCancelItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onCancelItem(item, response, status, headers) {}\n\t },\n\t onCompleteItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onCompleteItem(item, response, status, headers) {}\n\t },\n\t onCompleteAll: {\n\t /**\r\n\t * Callback\r\n\t */\n\t\n\t value: function onCompleteAll() {}\n\t },\n\t _getTotalProgress: {\n\t /**********************\r\n\t * PRIVATE\r\n\t **********************/\n\t /**\r\n\t * Returns the total progress\r\n\t * @param {Number} [value]\r\n\t * @returns {Number}\r\n\t * @private\r\n\t */\n\t\n\t value: function _getTotalProgress(value) {\n\t if (this.removeAfterUpload) {\n\t return value || 0;\n\t }var notUploaded = this.getNotUploadedItems().length;\n\t var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length;\n\t var ratio = 100 / this.queue.length;\n\t var current = (value || 0) * ratio / 100;\n\t\n\t return Math.round(uploaded * ratio + current);\n\t }\n\t },\n\t _getFilters: {\n\t /**\r\n\t * Returns array of filters\r\n\t * @param {Array<Function>|String} filters\r\n\t * @returns {Array<Function>}\r\n\t * @private\r\n\t */\n\t\n\t value: function _getFilters(filters) {\n\t if (!filters) {\n\t return this.filters;\n\t }if (isArray(filters)) {\n\t return filters;\n\t }var names = filters.match(/[^\\s,]+/g);\n\t return this.filters.filter(function (filter) {\n\t return names.indexOf(filter.name) !== -1;\n\t });\n\t }\n\t },\n\t _render: {\n\t /**\r\n\t * Updates html\r\n\t * @private\r\n\t */\n\t\n\t value: function _render() {\n\t if (!$rootScope.$$phase) $rootScope.$apply();\n\t }\n\t },\n\t _folderFilter: {\n\t /**\r\n\t * Returns \"true\" if item is a file (not folder)\r\n\t * @param {File|FileLikeObject} item\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _folderFilter(item) {\n\t return !!(item.size || item.type);\n\t }\n\t },\n\t _queueLimitFilter: {\n\t /**\r\n\t * Returns \"true\" if the limit has not been reached\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _queueLimitFilter() {\n\t return this.queue.length < this.queueLimit;\n\t }\n\t },\n\t _isValidFile: {\n\t /**\r\n\t * Returns \"true\" if file pass all filters\r\n\t * @param {File|Object} file\r\n\t * @param {Array<Function>} filters\r\n\t * @param {Object} options\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _isValidFile(file, filters, options) {\n\t var _this = this;\n\t\n\t this._failFilterIndex = -1;\n\t return !filters.length ? true : filters.every(function (filter) {\n\t _this._failFilterIndex++;\n\t return filter.fn.call(_this, file, options);\n\t });\n\t }\n\t },\n\t _isSuccessCode: {\n\t /**\r\n\t * Checks whether upload successful\r\n\t * @param {Number} status\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _isSuccessCode(status) {\n\t return status >= 200 && status < 300 || status === 304;\n\t }\n\t },\n\t _transformResponse: {\n\t /**\r\n\t * Transforms the server response\r\n\t * @param {*} response\r\n\t * @param {Object} headers\r\n\t * @returns {*}\r\n\t * @private\r\n\t */\n\t\n\t value: function _transformResponse(response, headers) {\n\t var headersGetter = this._headersGetter(headers);\n\t forEach($http.defaults.transformResponse, function (transformFn) {\n\t response = transformFn(response, headersGetter);\n\t });\n\t return response;\n\t }\n\t },\n\t _parseHeaders: {\n\t /**\r\n\t * Parsed response headers\r\n\t * @param headers\r\n\t * @returns {Object}\r\n\t * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js\r\n\t * @private\r\n\t */\n\t\n\t value: function _parseHeaders(headers) {\n\t var parsed = {},\n\t key,\n\t val,\n\t i;\n\t\n\t if (!headers) {\n\t return parsed;\n\t }forEach(headers.split(\"\\n\"), function (line) {\n\t i = line.indexOf(\":\");\n\t key = line.slice(0, i).trim().toLowerCase();\n\t val = line.slice(i + 1).trim();\n\t\n\t if (key) {\n\t parsed[key] = parsed[key] ? parsed[key] + \", \" + val : val;\n\t }\n\t });\n\t\n\t return parsed;\n\t }\n\t },\n\t _headersGetter: {\n\t /**\r\n\t * Returns function that returns headers\r\n\t * @param {Object} parsedHeaders\r\n\t * @returns {Function}\r\n\t * @private\r\n\t */\n\t\n\t value: function _headersGetter(parsedHeaders) {\n\t return function (name) {\n\t if (name) {\n\t return parsedHeaders[name.toLowerCase()] || null;\n\t }\n\t return parsedHeaders;\n\t };\n\t }\n\t },\n\t _xhrTransport: {\n\t /**\r\n\t * The XMLHttpRequest transport\r\n\t * @param {FileItem} item\r\n\t * @private\r\n\t */\n\t\n\t value: function _xhrTransport(item) {\n\t var _this = this;\n\t\n\t var xhr = item._xhr = new XMLHttpRequest();\n\t var form = new FormData();\n\t\n\t this._onBeforeUploadItem(item);\n\t\n\t forEach(item.formData, function (obj) {\n\t forEach(obj, function (value, key) {\n\t form.append(key, value);\n\t });\n\t });\n\t\n\t if (typeof item._file.size != \"number\") {\n\t throw new TypeError(\"The file specified is no longer valid\");\n\t }\n\t\n\t form.append(item.alias, item._file, item.file.name);\n\t\n\t xhr.upload.onprogress = function (event) {\n\t var progress = Math.round(event.lengthComputable ? event.loaded * 100 / event.total : 0);\n\t _this._onProgressItem(item, progress);\n\t };\n\t\n\t xhr.onload = function () {\n\t var headers = _this._parseHeaders(xhr.getAllResponseHeaders());\n\t var response = _this._transformResponse(xhr.response, headers);\n\t var gist = _this._isSuccessCode(xhr.status) ? \"Success\" : \"Error\";\n\t var method = \"_on\" + gist + \"Item\";\n\t _this[method](item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t xhr.onerror = function () {\n\t var headers = _this._parseHeaders(xhr.getAllResponseHeaders());\n\t var response = _this._transformResponse(xhr.response, headers);\n\t _this._onErrorItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t xhr.onabort = function () {\n\t var headers = _this._parseHeaders(xhr.getAllResponseHeaders());\n\t var response = _this._transformResponse(xhr.response, headers);\n\t _this._onCancelItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t xhr.open(item.method, item.url, true);\n\t\n\t xhr.withCredentials = item.withCredentials;\n\t\n\t forEach(item.headers, function (value, name) {\n\t xhr.setRequestHeader(name, value);\n\t });\n\t\n\t xhr.send(form);\n\t this._render();\n\t }\n\t },\n\t _iframeTransport: {\n\t /**\r\n\t * The IFrame transport\r\n\t * @param {FileItem} item\r\n\t * @private\r\n\t */\n\t\n\t value: function _iframeTransport(item) {\n\t var _this = this;\n\t\n\t var form = element(\"<form style=\\\"display: none;\\\" />\");\n\t var iframe = element(\"<iframe name=\\\"iframeTransport\" + Date.now() + \"\\\">\");\n\t var input = item._input;\n\t\n\t if (item._form) item._form.replaceWith(input); // remove old form\n\t item._form = form; // save link to new form\n\t\n\t this._onBeforeUploadItem(item);\n\t\n\t input.prop(\"name\", item.alias);\n\t\n\t forEach(item.formData, function (obj) {\n\t forEach(obj, function (value, key) {\n\t var element_ = element(\"<input type=\\\"hidden\\\" name=\\\"\" + key + \"\\\" />\");\n\t element_.val(value);\n\t form.append(element_);\n\t });\n\t });\n\t\n\t form.prop({\n\t action: item.url,\n\t method: \"POST\",\n\t target: iframe.prop(\"name\"),\n\t enctype: \"multipart/form-data\",\n\t encoding: \"multipart/form-data\" // old IE\n\t });\n\t\n\t iframe.bind(\"load\", function () {\n\t var html = \"\";\n\t var status = 200;\n\t\n\t try {\n\t // Fix for legacy IE browsers that loads internal error page\n\t // when failed WS response received. In consequence iframe\n\t // content access denied error is thrown becouse trying to\n\t // access cross domain page. When such thing occurs notifying\n\t // with empty response object. See more info at:\n\t // http://stackoverflow.com/questions/151362/access-is-denied-error-on-accessing-iframe-document-object\n\t // Note that if non standard 4xx or 5xx error code returned\n\t // from WS then response content can be accessed without error\n\t // but 'XHR' status becomes 200. In order to avoid confusion\n\t // returning response via same 'success' event handler.\n\t\n\t // fixed angular.contents() for iframes\n\t html = iframe[0].contentDocument.body.innerHTML;\n\t } catch (e) {\n\t // in case we run into the access-is-denied error or we have another error on the server side\n\t // (intentional 500,40... errors), we at least say 'something went wrong' -> 500\n\t status = 500;\n\t }\n\t\n\t var xhr = { response: html, status: status, dummy: true };\n\t var headers = {};\n\t var response = _this._transformResponse(xhr.response, headers);\n\t\n\t _this._onSuccessItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t });\n\t\n\t form.abort = function () {\n\t var xhr = { status: 0, dummy: true };\n\t var headers = {};\n\t var response;\n\t\n\t iframe.unbind(\"load\").prop(\"src\", \"javascript:false;\");\n\t form.replaceWith(input);\n\t\n\t _this._onCancelItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t input.after(form);\n\t form.append(input).append(iframe);\n\t\n\t form[0].submit();\n\t this._render();\n\t }\n\t },\n\t _onWhenAddingFileFailed: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {File|Object} item\r\n\t * @param {Object} filter\r\n\t * @param {Object} options\r\n\t * @private\r\n\t */\n\t\n\t value: function _onWhenAddingFileFailed(item, filter, options) {\n\t this.onWhenAddingFileFailed(item, filter, options);\n\t }\n\t },\n\t _onAfterAddingFile: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t */\n\t\n\t value: function _onAfterAddingFile(item) {\n\t this.onAfterAddingFile(item);\n\t }\n\t },\n\t _onAfterAddingAll: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {Array<FileItem>} items\r\n\t */\n\t\n\t value: function _onAfterAddingAll(items) {\n\t this.onAfterAddingAll(items);\n\t }\n\t },\n\t _onBeforeUploadItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @private\r\n\t */\n\t\n\t value: function _onBeforeUploadItem(item) {\n\t item._onBeforeUpload();\n\t this.onBeforeUploadItem(item);\n\t }\n\t },\n\t _onProgressItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {Number} progress\r\n\t * @private\r\n\t */\n\t\n\t value: function _onProgressItem(item, progress) {\n\t var total = this._getTotalProgress(progress);\n\t this.progress = total;\n\t item._onProgress(progress);\n\t this.onProgressItem(item, progress);\n\t this.onProgressAll(total);\n\t this._render();\n\t }\n\t },\n\t _onSuccessItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onSuccessItem(item, response, status, headers) {\n\t item._onSuccess(response, status, headers);\n\t this.onSuccessItem(item, response, status, headers);\n\t }\n\t },\n\t _onErrorItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onErrorItem(item, response, status, headers) {\n\t item._onError(response, status, headers);\n\t this.onErrorItem(item, response, status, headers);\n\t }\n\t },\n\t _onCancelItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onCancelItem(item, response, status, headers) {\n\t item._onCancel(response, status, headers);\n\t this.onCancelItem(item, response, status, headers);\n\t }\n\t },\n\t _onCompleteItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onCompleteItem(item, response, status, headers) {\n\t item._onComplete(response, status, headers);\n\t this.onCompleteItem(item, response, status, headers);\n\t\n\t var nextItem = this.getReadyItems()[0];\n\t this.isUploading = false;\n\t\n\t if (isDefined(nextItem)) {\n\t nextItem.upload();\n\t return;\n\t }\n\t\n\t this.onCompleteAll();\n\t this.progress = this._getTotalProgress();\n\t this._render();\n\t }\n\t }\n\t }, {\n\t isFile: {\n\t /**********************\r\n\t * STATIC\r\n\t **********************/\n\t /**\r\n\t * Returns \"true\" if value an instance of File\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFile(value) {\n\t return File && value instanceof File;\n\t }\n\t },\n\t isFileLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value an instance of FileLikeObject\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFileLikeObject(value) {\n\t return value instanceof FileLikeObject;\n\t }\n\t },\n\t isArrayLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value is array like object\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t */\n\t\n\t value: function isArrayLikeObject(value) {\n\t return isObject(value) && \"length\" in value;\n\t }\n\t },\n\t inherit: {\n\t /**\r\n\t * Inherits a target (Class_1) by a source (Class_2)\r\n\t * @param {Function} target\r\n\t * @param {Function} source\r\n\t */\n\t\n\t value: function inherit(target, source) {\n\t target.prototype = Object.create(source.prototype);\n\t target.prototype.constructor = target;\n\t target.super_ = source;\n\t }\n\t }\n\t });\n\t\n\t return FileUploader;\n\t })();\n\t\n\t /**********************\r\n\t * PUBLIC\r\n\t **********************/\n\t /**\r\n\t * Checks a support the html5 uploader\r\n\t * @returns {Boolean}\r\n\t * @readonly\r\n\t */\n\t FileUploader.prototype.isHTML5 = !!(File && FormData);\n\t /**********************\r\n\t * STATIC\r\n\t **********************/\n\t /**\r\n\t * @borrows FileUploader.prototype.isHTML5\r\n\t */\n\t FileUploader.isHTML5 = FileUploader.prototype.isHTML5;\n\t\n\t return FileUploader;\n\t};\n\t\n\tmodule.exports.$inject = [\"fileUploaderOptions\", \"$rootScope\", \"$http\", \"$window\", \"FileLikeObject\", \"FileItem\"];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar copy = angular.copy;\n\tvar isElement = angular.isElement;\n\tvar isString = angular.isString;\n\t\n\tmodule.exports = function () {\n\t var FileLikeObject = (function () {\n\t /**\r\n\t * Creates an instance of FileLikeObject\r\n\t * @param {File|HTMLInputElement|Object} fileOrInput\r\n\t * @constructor\r\n\t */\n\t\n\t function FileLikeObject(fileOrInput) {\n\t _classCallCheck(this, FileLikeObject);\n\t\n\t var isInput = isElement(fileOrInput);\n\t var fakePathOrObject = isInput ? fileOrInput.value : fileOrInput;\n\t var postfix = isString(fakePathOrObject) ? \"FakePath\" : \"Object\";\n\t var method = \"_createFrom\" + postfix;\n\t this[method](fakePathOrObject);\n\t }\n\t\n\t _createClass(FileLikeObject, {\n\t _createFromFakePath: {\n\t /**\r\n\t * Creates file like object from fake path string\r\n\t * @param {String} path\r\n\t * @private\r\n\t */\n\t\n\t value: function _createFromFakePath(path) {\n\t this.lastModifiedDate = null;\n\t this.size = null;\n\t this.type = \"like/\" + path.slice(path.lastIndexOf(\".\") + 1).toLowerCase();\n\t this.name = path.slice(path.lastIndexOf(\"/\") + path.lastIndexOf(\"\\\\\") + 2);\n\t }\n\t },\n\t _createFromObject: {\n\t /**\r\n\t * Creates file like object from object\r\n\t * @param {File|FileLikeObject} object\r\n\t * @private\r\n\t */\n\t\n\t value: function _createFromObject(object) {\n\t this.lastModifiedDate = copy(object.lastModifiedDate);\n\t this.size = object.size;\n\t this.type = object.type;\n\t this.name = object.name;\n\t }\n\t }\n\t });\n\t\n\t return FileLikeObject;\n\t })();\n\t\n\t return FileLikeObject;\n\t};\n\t\n\tmodule.exports.$inject = [];\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar copy = angular.copy;\n\tvar extend = angular.extend;\n\tvar element = angular.element;\n\tvar isElement = angular.isElement;\n\t\n\tmodule.exports = function ($compile, FileLikeObject) {\n\t var FileItem = (function () {\n\t /**\r\n\t * Creates an instance of FileItem\r\n\t * @param {FileUploader} uploader\r\n\t * @param {File|HTMLInputElement|Object} some\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileItem(uploader, some, options) {\n\t _classCallCheck(this, FileItem);\n\t\n\t var isInput = isElement(some);\n\t var input = isInput ? element(some) : null;\n\t var file = !isInput ? some : null;\n\t\n\t extend(this, {\n\t url: uploader.url,\n\t alias: uploader.alias,\n\t headers: copy(uploader.headers),\n\t formData: copy(uploader.formData),\n\t removeAfterUpload: uploader.removeAfterUpload,\n\t withCredentials: uploader.withCredentials,\n\t method: uploader.method\n\t }, options, {\n\t uploader: uploader,\n\t file: new FileLikeObject(some),\n\t isReady: false,\n\t isUploading: false,\n\t isUploaded: false,\n\t isSuccess: false,\n\t isCancel: false,\n\t isError: false,\n\t progress: 0,\n\t index: null,\n\t _file: file,\n\t _input: input\n\t });\n\t\n\t if (input) this._replaceNode(input);\n\t }\n\t\n\t _createClass(FileItem, {\n\t upload: {\n\t /**********************\r\n\t * PUBLIC\r\n\t **********************/\n\t /**\r\n\t * Uploads a FileItem\r\n\t */\n\t\n\t value: function upload() {\n\t try {\n\t this.uploader.uploadItem(this);\n\t } catch (e) {\n\t this.uploader._onCompleteItem(this, \"\", 0, []);\n\t this.uploader._onErrorItem(this, \"\", 0, []);\n\t }\n\t }\n\t },\n\t cancel: {\n\t /**\r\n\t * Cancels uploading of FileItem\r\n\t */\n\t\n\t value: function cancel() {\n\t this.uploader.cancelItem(this);\n\t }\n\t },\n\t remove: {\n\t /**\r\n\t * Removes a FileItem\r\n\t */\n\t\n\t value: function remove() {\n\t this.uploader.removeFromQueue(this);\n\t }\n\t },\n\t onBeforeUpload: {\n\t /**\r\n\t * Callback\r\n\t * @private\r\n\t */\n\t\n\t value: function onBeforeUpload() {}\n\t },\n\t onProgress: {\n\t /**\r\n\t * Callback\r\n\t * @param {Number} progress\r\n\t * @private\r\n\t */\n\t\n\t value: function onProgress(progress) {}\n\t },\n\t onSuccess: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onSuccess(response, status, headers) {}\n\t },\n\t onError: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onError(response, status, headers) {}\n\t },\n\t onCancel: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onCancel(response, status, headers) {}\n\t },\n\t onComplete: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onComplete(response, status, headers) {}\n\t },\n\t _onBeforeUpload: {\n\t /**********************\r\n\t * PRIVATE\r\n\t **********************/\n\t /**\r\n\t * Inner callback\r\n\t */\n\t\n\t value: function _onBeforeUpload() {\n\t this.isReady = true;\n\t this.isUploading = true;\n\t this.isUploaded = false;\n\t this.isSuccess = false;\n\t this.isCancel = false;\n\t this.isError = false;\n\t this.progress = 0;\n\t this.onBeforeUpload();\n\t }\n\t },\n\t _onProgress: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {Number} progress\r\n\t * @private\r\n\t */\n\t\n\t value: function _onProgress(progress) {\n\t this.progress = progress;\n\t this.onProgress(progress);\n\t }\n\t },\n\t _onSuccess: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onSuccess(response, status, headers) {\n\t this.isReady = false;\n\t this.isUploading = false;\n\t this.isUploaded = true;\n\t this.isSuccess = true;\n\t this.isCancel = false;\n\t this.isError = false;\n\t this.progress = 100;\n\t this.index = null;\n\t this.onSuccess(response, status, headers);\n\t }\n\t },\n\t _onError: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onError(response, status, headers) {\n\t this.isReady = false;\n\t this.isUploading = false;\n\t this.isUploaded = true;\n\t this.isSuccess = false;\n\t this.isCancel = false;\n\t this.isError = true;\n\t this.progress = 0;\n\t this.index = null;\n\t this.onError(response, status, headers);\n\t }\n\t },\n\t _onCancel: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onCancel(response, status, headers) {\n\t this.isReady = false;\n\t this.isUploading = false;\n\t this.isUploaded = false;\n\t this.isSuccess = false;\n\t this.isCancel = true;\n\t this.isError = false;\n\t this.progress = 0;\n\t this.index = null;\n\t this.onCancel(response, status, headers);\n\t }\n\t },\n\t _onComplete: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onComplete(response, status, headers) {\n\t this.onComplete(response, status, headers);\n\t if (this.removeAfterUpload) this.remove();\n\t }\n\t },\n\t _destroy: {\n\t /**\r\n\t * Destroys a FileItem\r\n\t */\n\t\n\t value: function _destroy() {\n\t if (this._input) this._input.remove();\n\t if (this._form) this._form.remove();\n\t delete this._form;\n\t delete this._input;\n\t }\n\t },\n\t _prepareToUploading: {\n\t /**\r\n\t * Prepares to uploading\r\n\t * @private\r\n\t */\n\t\n\t value: function _prepareToUploading() {\n\t this.index = this.index || ++this.uploader._nextIndex;\n\t this.isReady = true;\n\t }\n\t },\n\t _replaceNode: {\n\t /**\r\n\t * Replaces input element on his clone\r\n\t * @param {JQLite|jQuery} input\r\n\t * @private\r\n\t */\n\t\n\t value: function _replaceNode(input) {\n\t var clone = $compile(input.clone())(input.scope());\n\t clone.prop(\"value\", null); // FF fix\n\t input.css(\"display\", \"none\");\n\t input.after(clone); // remove jquery dependency\n\t }\n\t }\n\t });\n\t\n\t return FileItem;\n\t })();\n\t\n\t return FileItem;\n\t};\n\t\n\tmodule.exports.$inject = [\"$compile\", \"FileLikeObject\"];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar extend = angular.extend;\n\t\n\tmodule.exports = function () {\n\t var FileDirective = (function () {\n\t /**\r\n\t * Creates instance of {FileDirective} object\r\n\t * @param {Object} options\r\n\t * @param {Object} options.uploader\r\n\t * @param {HTMLElement} options.element\r\n\t * @param {Object} options.events\r\n\t * @param {String} options.prop\r\n\t * @constructor\r\n\t */\n\t\n\t function FileDirective(options) {\n\t _classCallCheck(this, FileDirective);\n\t\n\t extend(this, options);\n\t this.uploader._directives[this.prop].push(this);\n\t this._saveLinks();\n\t this.bind();\n\t }\n\t\n\t _createClass(FileDirective, {\n\t bind: {\n\t /**\r\n\t * Binds events handles\r\n\t */\n\t\n\t value: function bind() {\n\t for (var key in this.events) {\n\t var prop = this.events[key];\n\t this.element.bind(key, this[prop]);\n\t }\n\t }\n\t },\n\t unbind: {\n\t /**\r\n\t * Unbinds events handles\r\n\t */\n\t\n\t value: function unbind() {\n\t for (var key in this.events) {\n\t this.element.unbind(key, this.events[key]);\n\t }\n\t }\n\t },\n\t destroy: {\n\t /**\r\n\t * Destroys directive\r\n\t */\n\t\n\t value: function destroy() {\n\t var index = this.uploader._directives[this.prop].indexOf(this);\n\t this.uploader._directives[this.prop].splice(index, 1);\n\t this.unbind();\n\t // this.element = null;\n\t }\n\t },\n\t _saveLinks: {\n\t /**\r\n\t * Saves links to functions\r\n\t * @private\r\n\t */\n\t\n\t value: function _saveLinks() {\n\t for (var key in this.events) {\n\t var prop = this.events[key];\n\t this[prop] = this[prop].bind(this);\n\t }\n\t }\n\t }\n\t });\n\t\n\t return FileDirective;\n\t })();\n\t\n\t /**\r\n\t * Map of events\r\n\t * @type {Object}\r\n\t */\n\t FileDirective.prototype.events = {};\n\t\n\t return FileDirective;\n\t};\n\t\n\tmodule.exports.$inject = [];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _inherits = function (subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar extend = angular.extend;\n\tvar forEach = angular.forEach;\n\t\n\tmodule.exports = function (FileDirective) {\n\t var FileDrop = (function (_FileDirective) {\n\t /**\r\n\t * Creates instance of {FileDrop} object\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileDrop(options) {\n\t _classCallCheck(this, FileDrop);\n\t\n\t var extendedOptions = extend(options, {\n\t // Map of events\n\t events: {\n\t $destroy: \"destroy\",\n\t drop: \"onDrop\",\n\t dragover: \"onDragOver\",\n\t dragleave: \"onDragLeave\"\n\t },\n\t // Name of property inside uploader._directive object\n\t prop: \"drop\"\n\t });\n\t\n\t _get(Object.getPrototypeOf(FileDrop.prototype), \"constructor\", this).call(this, extendedOptions);\n\t }\n\t\n\t _inherits(FileDrop, _FileDirective);\n\t\n\t _createClass(FileDrop, {\n\t getOptions: {\n\t /**\r\n\t * Returns options\r\n\t * @return {Object|undefined}\r\n\t */\n\t\n\t value: function getOptions() {}\n\t },\n\t getFilters: {\n\t /**\r\n\t * Returns filters\r\n\t * @return {Array<Function>|String|undefined}\r\n\t */\n\t\n\t value: function getFilters() {}\n\t },\n\t onDrop: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onDrop(event) {\n\t var transfer = this._getTransfer(event);\n\t if (!transfer) {\n\t return;\n\t }var options = this.getOptions();\n\t var filters = this.getFilters();\n\t this._preventAndStop(event);\n\t forEach(this.uploader._directives.over, this._removeOverClass, this);\n\t this.uploader.addToQueue(transfer.files, options, filters);\n\t }\n\t },\n\t onDragOver: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onDragOver(event) {\n\t var transfer = this._getTransfer(event);\n\t if (!this._haveFiles(transfer.types)) {\n\t return;\n\t }transfer.dropEffect = \"copy\";\n\t this._preventAndStop(event);\n\t forEach(this.uploader._directives.over, this._addOverClass, this);\n\t }\n\t },\n\t onDragLeave: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onDragLeave(event) {\n\t if (event.currentTarget === this.element[0]) {\n\t return;\n\t }this._preventAndStop(event);\n\t forEach(this.uploader._directives.over, this._removeOverClass, this);\n\t }\n\t },\n\t _getTransfer: {\n\t /**\r\n\t * Helper\r\n\t */\n\t\n\t value: function _getTransfer(event) {\n\t return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;\n\t }\n\t },\n\t _preventAndStop: {\n\t /**\r\n\t * Helper\r\n\t */\n\t\n\t value: function _preventAndStop(event) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t },\n\t _haveFiles: {\n\t /**\r\n\t * Returns \"true\" if types contains files\r\n\t * @param {Object} types\r\n\t */\n\t\n\t value: function _haveFiles(types) {\n\t if (!types) {\n\t return false;\n\t }if (types.indexOf) {\n\t return types.indexOf(\"Files\") !== -1;\n\t } else if (types.contains) {\n\t return types.contains(\"Files\");\n\t } else {\n\t return false;\n\t }\n\t }\n\t },\n\t _addOverClass: {\n\t /**\r\n\t * Callback\r\n\t */\n\t\n\t value: function _addOverClass(item) {\n\t item.addOverClass();\n\t }\n\t },\n\t _removeOverClass: {\n\t /**\r\n\t * Callback\r\n\t */\n\t\n\t value: function _removeOverClass(item) {\n\t item.removeOverClass();\n\t }\n\t }\n\t });\n\t\n\t return FileDrop;\n\t })(FileDirective);\n\t\n\t return FileDrop;\n\t};\n\t\n\tmodule.exports.$inject = [\"FileDirective\"];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _inherits = function (subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar extend = angular.extend;\n\t\n\tmodule.exports = function (FileDirective) {\n\t var FileOver = (function (_FileDirective) {\n\t /**\r\n\t * Creates instance of {FileDrop} object\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileOver(options) {\n\t _classCallCheck(this, FileOver);\n\t\n\t var extendedOptions = extend(options, {\n\t // Map of events\n\t events: {\n\t $destroy: \"destroy\"\n\t },\n\t // Name of property inside uploader._directive object\n\t prop: \"over\",\n\t // Over class\n\t overClass: \"nv-file-over\"\n\t });\n\t\n\t _get(Object.getPrototypeOf(FileOver.prototype), \"constructor\", this).call(this, extendedOptions);\n\t }\n\t\n\t _inherits(FileOver, _FileDirective);\n\t\n\t _createClass(FileOver, {\n\t addOverClass: {\n\t /**\r\n\t * Adds over class\r\n\t */\n\t\n\t value: function addOverClass() {\n\t this.element.addClass(this.getOverClass());\n\t }\n\t },\n\t removeOverClass: {\n\t /**\r\n\t * Removes over class\r\n\t */\n\t\n\t value: function removeOverClass() {\n\t this.element.removeClass(this.getOverClass());\n\t }\n\t },\n\t getOverClass: {\n\t /**\r\n\t * Returns over class\r\n\t * @returns {String}\r\n\t */\n\t\n\t value: function getOverClass() {\n\t return this.overClass;\n\t }\n\t }\n\t });\n\t\n\t return FileOver;\n\t })(FileDirective);\n\t\n\t return FileOver;\n\t};\n\t\n\tmodule.exports.$inject = [\"FileDirective\"];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function ($parse, FileUploader, FileSelect) {\n\t\n\t return {\n\t link: function (scope, element, attributes) {\n\t var uploader = scope.$eval(attributes.uploader);\n\t\n\t if (!(uploader instanceof FileUploader)) {\n\t throw new TypeError(\"\\\"Uploader\\\" must be an instance of FileUploader\");\n\t }\n\t\n\t var object = new FileSelect({\n\t uploader: uploader,\n\t element: element\n\t });\n\t\n\t object.getOptions = $parse(attributes.options).bind(object, scope);\n\t object.getFilters = function () {\n\t return attributes.filters;\n\t };\n\t }\n\t };\n\t};\n\t\n\tmodule.exports.$inject = [\"$parse\", \"FileUploader\", \"FileSelect\"];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function ($parse, FileUploader, FileDrop) {\n\t\n\t return {\n\t link: function (scope, element, attributes) {\n\t var uploader = scope.$eval(attributes.uploader);\n\t\n\t if (!(uploader instanceof FileUploader)) {\n\t throw new TypeError(\"\\\"Uploader\\\" must be an instance of FileUploader\");\n\t }\n\t\n\t if (!uploader.isHTML5) return;\n\t\n\t var object = new FileDrop({\n\t uploader: uploader,\n\t element: element\n\t });\n\t\n\t object.getOptions = $parse(attributes.options).bind(object, scope);\n\t object.getFilters = function () {\n\t return attributes.filters;\n\t };\n\t }\n\t };\n\t};\n\t\n\tmodule.exports.$inject = [\"$parse\", \"FileUploader\", \"FileDrop\"];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function (FileUploader, FileOver) {\n\t\n\t return {\n\t link: function (scope, element, attributes) {\n\t var uploader = scope.$eval(attributes.uploader);\n\t\n\t if (!(uploader instanceof FileUploader)) {\n\t throw new TypeError(\"\\\"Uploader\\\" must be an instance of FileUploader\");\n\t }\n\t\n\t var object = new FileOver({\n\t uploader: uploader,\n\t element: element\n\t });\n\t\n\t object.getOverClass = function () {\n\t return attributes.overClass || object.overClass;\n\t };\n\t }\n\t };\n\t};\n\t\n\tmodule.exports.$inject = [\"FileUploader\", \"FileOver\"];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** angular-file-upload.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 2be85a13effb1c2acd03\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './config.json';\r\n\r\n\r\nimport options from './values/options'\r\n\r\n\r\nimport serviceFileUploader from './services/FileUploader';\r\nimport serviceFileLikeObject from './services/FileLikeObject';\r\nimport serviceFileItem from './services/FileItem';\r\nimport serviceFileDirective from './services/FileDirective';\r\nimport serviceFileSelect from './services/FileSelect';\r\nimport serviceFileDrop from './services/FileDrop';\r\nimport serviceFileOver from './services/FileOver';\r\n\r\n\r\nimport directiveFileSelect from './directives/FileSelect';\r\nimport directiveFileDrop from './directives/FileDrop';\r\nimport directiveFileOver from './directives/FileOver';\r\n\r\n\r\nangular\r\n .module(CONFIG.name, [])\r\n .value('fileUploaderOptions', options)\r\n .factory('FileUploader', serviceFileUploader)\r\n .factory('FileLikeObject', serviceFileLikeObject)\r\n .factory('FileItem', serviceFileItem)\r\n .factory('FileDirective', serviceFileDirective)\r\n .factory('FileSelect', serviceFileSelect)\r\n .factory('FileDrop', serviceFileDrop)\r\n .factory('FileOver', serviceFileOver)\r\n .directive('nvFileSelect', directiveFileSelect)\r\n .directive('nvFileDrop', directiveFileDrop)\r\n .directive('nvFileOver', directiveFileOver)\r\n .run([\r\n 'FileUploader',\r\n 'FileLikeObject',\r\n 'FileItem',\r\n 'FileDirective',\r\n 'FileSelect',\r\n 'FileDrop',\r\n 'FileOver',\r\n function(FileUploader, FileLikeObject, FileItem, FileDirective, FileSelect, FileDrop, FileOver) {\r\n // only for compatibility\r\n FileUploader.FileLikeObject = FileLikeObject;\r\n FileUploader.FileItem = FileItem;\r\n FileUploader.FileDirective = FileDirective;\r\n FileUploader.FileSelect = FileSelect;\r\n FileUploader.FileDrop = FileDrop;\r\n FileUploader.FileOver = FileOver;\r\n }\r\n ]);\r\n\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/index.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n extend\r\n } = angular;\r\n\r\n\r\nexport default (FileDirective) => {\r\n \r\n \r\n class FileSelect extends FileDirective {\r\n /**\r\n * Creates instance of {FileSelect} object\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(options) {\r\n let extendedOptions = extend(options, {\r\n // Map of events\r\n events: {\r\n $destroy: 'destroy',\r\n change: 'onChange'\r\n },\r\n // Name of property inside uploader._directive object\r\n prop: 'select'\r\n });\r\n \r\n super(extendedOptions);\r\n \r\n if(!this.uploader.isHTML5) {\r\n this.element.removeAttr('multiple');\r\n }\r\n this.element.prop('value', null); // FF fix\r\n }\r\n /**\r\n * Returns options\r\n * @return {Object|undefined}\r\n */\r\n getOptions() {\r\n }\r\n /**\r\n * Returns filters\r\n * @return {Array<Function>|String|undefined}\r\n */\r\n getFilters() {\r\n }\r\n /**\r\n * If returns \"true\" then HTMLInputElement will be cleared\r\n * @returns {Boolean}\r\n */\r\n isEmptyAfterSelection() {\r\n return !!this.element.attr('multiple');\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onChange() {\r\n var files = this.uploader.isHTML5 ? this.element[0].files : this.element[0];\r\n var options = this.getOptions();\r\n var filters = this.getFilters();\r\n\r\n if(!this.uploader.isHTML5) this.destroy();\r\n this.uploader.addToQueue(files, options, filters);\r\n if(this.isEmptyAfterSelection()) {\r\n this.element.prop('value', null);\r\n this.element.replaceWith(this.element = this.element.clone(true)); // IE fix\r\n }\r\n }\r\n }\r\n \r\n \r\n return FileSelect;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileDirective'\r\n];\r\n\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileSelect.js\n **/","module.exports = {\n\t\"name\": \"angularFileUpload\"\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/config.json\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\r\n\r\n\r\nexport default {\r\n url: '/',\r\n alias: 'file',\r\n headers: {},\r\n queue: [],\r\n progress: 0,\r\n autoUpload: false,\r\n removeAfterUpload: false,\r\n method: 'POST',\r\n filters: [],\r\n formData: [],\r\n queueLimit: Number.MAX_VALUE,\r\n withCredentials: false\r\n};\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/values/options.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n copy,\r\n extend,\r\n forEach,\r\n isObject,\r\n isNumber,\r\n isDefined,\r\n isArray,\r\n element\r\n } = angular;\r\n\r\n\r\nexport default (fileUploaderOptions, $rootScope, $http, $window, FileLikeObject, FileItem) => {\r\n \r\n \r\n let {\r\n File,\r\n FormData\r\n } = $window;\r\n \r\n \r\n class FileUploader {\r\n /**********************\r\n * PUBLIC\r\n **********************/\r\n /**\r\n * Creates an instance of FileUploader\r\n * @param {Object} [options]\r\n * @constructor\r\n */\r\n constructor(options) {\r\n var settings = copy(fileUploaderOptions);\r\n \r\n extend(this, settings, options, {\r\n isUploading: false,\r\n _nextIndex: 0,\r\n _failFilterIndex: -1,\r\n _directives: {select: [], drop: [], over: []}\r\n });\r\n\r\n // add default filters\r\n this.filters.unshift({name: 'queueLimit', fn: this._queueLimitFilter});\r\n this.filters.unshift({name: 'folder', fn: this._folderFilter});\r\n }\r\n /**\r\n * Adds items to the queue\r\n * @param {File|HTMLInputElement|Object|FileList|Array<Object>} files\r\n * @param {Object} [options]\r\n * @param {Array<Function>|String} filters\r\n */\r\n addToQueue(files, options, filters) {\r\n var list = this.isArrayLikeObject(files) ? files: [files];\r\n var arrayOfFilters = this._getFilters(filters);\r\n var count = this.queue.length;\r\n var addedFileItems = [];\r\n\r\n forEach(list, (some /*{File|HTMLInputElement|Object}*/) => {\r\n var temp = new FileLikeObject(some);\r\n\r\n if (this._isValidFile(temp, arrayOfFilters, options)) {\r\n var fileItem = new FileItem(this, some, options);\r\n addedFileItems.push(fileItem);\r\n this.queue.push(fileItem);\r\n this._onAfterAddingFile(fileItem);\r\n } else {\r\n var filter = arrayOfFilters[this._failFilterIndex];\r\n this._onWhenAddingFileFailed(temp, filter, options);\r\n }\r\n });\r\n\r\n if(this.queue.length !== count) {\r\n this._onAfterAddingAll(addedFileItems);\r\n this.progress = this._getTotalProgress();\r\n }\r\n\r\n this._render();\r\n if (this.autoUpload) this.uploadAll();\r\n }\r\n /**\r\n * Remove items from the queue. Remove last: index = -1\r\n * @param {FileItem|Number} value\r\n */\r\n removeFromQueue(value) {\r\n var index = this.getIndexOfItem(value);\r\n var item = this.queue[index];\r\n if(item.isUploading) item.cancel();\r\n this.queue.splice(index, 1);\r\n item._destroy();\r\n this.progress = this._getTotalProgress();\r\n }\r\n /**\r\n * Clears the queue\r\n */\r\n clearQueue() {\r\n while(this.queue.length) {\r\n this.queue[0].remove();\r\n }\r\n this.progress = 0;\r\n }\r\n /**\r\n * Uploads a item from the queue\r\n * @param {FileItem|Number} value\r\n */\r\n uploadItem(value) {\r\n var index = this.getIndexOfItem(value);\r\n var item = this.queue[index];\r\n var transport = this.isHTML5 ? '_xhrTransport' : '_iframeTransport';\r\n\r\n item._prepareToUploading();\r\n if(this.isUploading) return;\r\n\r\n this.isUploading = true;\r\n this[transport](item);\r\n }\r\n /**\r\n * Cancels uploading of item from the queue\r\n * @param {FileItem|Number} value\r\n */\r\n cancelItem(value) {\r\n var index = this.getIndexOfItem(value);\r\n var item = this.queue[index];\r\n var prop = this.isHTML5 ? '_xhr' : '_form';\r\n if(item && item.isUploading) item[prop].abort();\r\n }\r\n /**\r\n * Uploads all not uploaded items of queue\r\n */\r\n uploadAll() {\r\n var items = this.getNotUploadedItems().filter(item => !item.isUploading);\r\n if(!items.length) return;\r\n\r\n forEach(items, item => item._prepareToUploading());\r\n items[0].upload();\r\n }\r\n /**\r\n * Cancels all uploads\r\n */\r\n cancelAll() {\r\n var items = this.getNotUploadedItems();\r\n forEach(items, item => item.cancel());\r\n }\r\n /**\r\n * Returns \"true\" if value an instance of File\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n isFile(value) {\r\n return this.constructor.isFile(value);\r\n }\r\n /**\r\n * Returns \"true\" if value an instance of FileLikeObject\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n isFileLikeObject(value) {\r\n return this.constructor.isFileLikeObject(value);\r\n }\r\n /**\r\n * Returns \"true\" if value is array like object\r\n * @param {*} value\r\n * @returns {Boolean}\r\n */\r\n isArrayLikeObject(value) {\r\n return this.constructor.isArrayLikeObject(value);\r\n }\r\n /**\r\n * Returns a index of item from the queue\r\n * @param {Item|Number} value\r\n * @returns {Number}\r\n */\r\n getIndexOfItem(value) {\r\n return isNumber(value) ? value : this.queue.indexOf(value);\r\n }\r\n /**\r\n * Returns not uploaded items\r\n * @returns {Array}\r\n */\r\n getNotUploadedItems() {\r\n return this.queue.filter(item => !item.isUploaded);\r\n }\r\n /**\r\n * Returns items ready for upload\r\n * @returns {Array}\r\n */\r\n getReadyItems() {\r\n return this.queue\r\n .filter(item => (item.isReady && !item.isUploading))\r\n .sort((item1, item2) => item1.index - item2.index);\r\n }\r\n /**\r\n * Destroys instance of FileUploader\r\n */\r\n destroy() {\r\n forEach(this._directives, (key) => {\r\n forEach(this._directives[key], (object) => {\r\n object.destroy();\r\n });\r\n });\r\n }\r\n /**\r\n * Callback\r\n * @param {Array} fileItems\r\n */\r\n onAfterAddingAll(fileItems) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} fileItem\r\n */\r\n onAfterAddingFile(fileItem) {\r\n }\r\n /**\r\n * Callback\r\n * @param {File|Object} item\r\n * @param {Object} filter\r\n * @param {Object} options\r\n */\r\n onWhenAddingFileFailed(item, filter, options) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} fileItem\r\n */\r\n onBeforeUploadItem(fileItem) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} fileItem\r\n * @param {Number} progress\r\n */\r\n onProgressItem(fileItem, progress) {\r\n }\r\n /**\r\n * Callback\r\n * @param {Number} progress\r\n */\r\n onProgressAll(progress) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onSuccessItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onErrorItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onCancelItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onCompleteItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n */\r\n onCompleteAll() {\r\n }\r\n /**********************\r\n * PRIVATE\r\n **********************/\r\n /**\r\n * Returns the total progress\r\n * @param {Number} [value]\r\n * @returns {Number}\r\n * @private\r\n */\r\n _getTotalProgress(value) {\r\n if(this.removeAfterUpload) return value || 0;\r\n\r\n var notUploaded = this.getNotUploadedItems().length;\r\n var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length;\r\n var ratio = 100 / this.queue.length;\r\n var current = (value || 0) * ratio / 100;\r\n\r\n return Math.round(uploaded * ratio + current);\r\n }\r\n /**\r\n * Returns array of filters\r\n * @param {Array<Function>|String} filters\r\n * @returns {Array<Function>}\r\n * @private\r\n */\r\n _getFilters(filters) {\r\n if(!filters) return this.filters;\r\n if(isArray(filters)) return filters;\r\n var names = filters.match(/[^\\s,]+/g);\r\n return this.filters\r\n .filter(filter => names.indexOf(filter.name) !== -1);\r\n }\r\n /**\r\n * Updates html\r\n * @private\r\n */\r\n _render() {\r\n if(!$rootScope.$$phase) $rootScope.$apply();\r\n }\r\n /**\r\n * Returns \"true\" if item is a file (not folder)\r\n * @param {File|FileLikeObject} item\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _folderFilter(item) {\r\n return !!(item.size || item.type);\r\n }\r\n /**\r\n * Returns \"true\" if the limit has not been reached\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _queueLimitFilter() {\r\n return this.queue.length < this.queueLimit;\r\n }\r\n /**\r\n * Returns \"true\" if file pass all filters\r\n * @param {File|Object} file\r\n * @param {Array<Function>} filters\r\n * @param {Object} options\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _isValidFile(file, filters, options) {\r\n this._failFilterIndex = -1;\r\n return !filters.length ? true : filters.every((filter) => {\r\n this._failFilterIndex++;\r\n return filter.fn.call(this, file, options);\r\n });\r\n }\r\n /**\r\n * Checks whether upload successful\r\n * @param {Number} status\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _isSuccessCode(status) {\r\n return (status >= 200 && status < 300) || status === 304;\r\n }\r\n /**\r\n * Transforms the server response\r\n * @param {*} response\r\n * @param {Object} headers\r\n * @returns {*}\r\n * @private\r\n */\r\n _transformResponse(response, headers) {\r\n var headersGetter = this._headersGetter(headers);\r\n forEach($http.defaults.transformResponse, (transformFn) => {\r\n response = transformFn(response, headersGetter);\r\n });\r\n return response;\r\n }\r\n /**\r\n * Parsed response headers\r\n * @param headers\r\n * @returns {Object}\r\n * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js\r\n * @private\r\n */\r\n _parseHeaders(headers) {\r\n var parsed = {}, key, val, i;\r\n\r\n if(!headers) return parsed;\r\n\r\n forEach(headers.split('\\n'), (line) => {\r\n i = line.indexOf(':');\r\n key = line.slice(0, i).trim().toLowerCase();\r\n val = line.slice(i + 1).trim();\r\n\r\n if(key) {\r\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\r\n }\r\n });\r\n\r\n return parsed;\r\n }\r\n /**\r\n * Returns function that returns headers\r\n * @param {Object} parsedHeaders\r\n * @returns {Function}\r\n * @private\r\n */\r\n _headersGetter(parsedHeaders) {\r\n return (name) => {\r\n if(name) {\r\n return parsedHeaders[name.toLowerCase()] || null;\r\n }\r\n return parsedHeaders;\r\n };\r\n }\r\n /**\r\n * The XMLHttpRequest transport\r\n * @param {FileItem} item\r\n * @private\r\n */\r\n _xhrTransport(item) {\r\n var xhr = item._xhr = new XMLHttpRequest();\r\n var form = new FormData();\r\n\r\n this._onBeforeUploadItem(item);\r\n\r\n forEach(item.formData, (obj) => {\r\n forEach(obj, (value, key) => {\r\n form.append(key, value);\r\n });\r\n });\r\n\r\n if(typeof(item._file.size) != 'number') {\r\n throw new TypeError('The file specified is no longer valid');\r\n }\r\n\r\n form.append(item.alias, item._file, item.file.name);\r\n\r\n xhr.upload.onprogress = (event) => {\r\n var progress = Math.round(event.lengthComputable ? event.loaded * 100 / event.total : 0);\r\n this._onProgressItem(item, progress);\r\n };\r\n\r\n xhr.onload = () => {\r\n var headers = this._parseHeaders(xhr.getAllResponseHeaders());\r\n var response = this._transformResponse(xhr.response, headers);\r\n var gist = this._isSuccessCode(xhr.status) ? 'Success' : 'Error';\r\n var method = '_on' + gist + 'Item';\r\n this[method](item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n xhr.onerror = () => {\r\n var headers = this._parseHeaders(xhr.getAllResponseHeaders());\r\n var response = this._transformResponse(xhr.response, headers);\r\n this._onErrorItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n xhr.onabort = () => {\r\n var headers = this._parseHeaders(xhr.getAllResponseHeaders());\r\n var response = this._transformResponse(xhr.response, headers);\r\n this._onCancelItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n xhr.open(item.method, item.url, true);\r\n\r\n xhr.withCredentials = item.withCredentials;\r\n\r\n forEach(item.headers, (value, name) => {\r\n xhr.setRequestHeader(name, value);\r\n });\r\n\r\n xhr.send(form);\r\n this._render();\r\n }\r\n /**\r\n * The IFrame transport\r\n * @param {FileItem} item\r\n * @private\r\n */\r\n _iframeTransport(item) {\r\n var form = element('<form style=\"display: none;\" />');\r\n var iframe = element('<iframe name=\"iframeTransport' + Date.now() + '\">');\r\n var input = item._input;\r\n\r\n if(item._form) item._form.replaceWith(input); // remove old form\r\n item._form = form; // save link to new form\r\n\r\n this._onBeforeUploadItem(item);\r\n\r\n input.prop('name', item.alias);\r\n\r\n forEach(item.formData, (obj) => {\r\n forEach(obj, (value, key) => {\r\n var element_ = element('<input type=\"hidden\" name=\"' + key + '\" />');\r\n element_.val(value);\r\n form.append(element_);\r\n });\r\n });\r\n\r\n form.prop({\r\n action: item.url,\r\n method: 'POST',\r\n target: iframe.prop('name'),\r\n enctype: 'multipart/form-data',\r\n encoding: 'multipart/form-data' // old IE\r\n });\r\n\r\n iframe.bind('load', () => {\r\n var html = '';\r\n var status = 200;\r\n\r\n try {\r\n // Fix for legacy IE browsers that loads internal error page\r\n // when failed WS response received. In consequence iframe\r\n // content access denied error is thrown becouse trying to\r\n // access cross domain page. When such thing occurs notifying\r\n // with empty response object. See more info at:\r\n // http://stackoverflow.com/questions/151362/access-is-denied-error-on-accessing-iframe-document-object\r\n // Note that if non standard 4xx or 5xx error code returned\r\n // from WS then response content can be accessed without error\r\n // but 'XHR' status becomes 200. In order to avoid confusion\r\n // returning response via same 'success' event handler.\r\n\r\n // fixed angular.contents() for iframes\r\n html = iframe[0].contentDocument.body.innerHTML;\r\n } catch(e) {\r\n // in case we run into the access-is-denied error or we have another error on the server side\r\n // (intentional 500,40... errors), we at least say 'something went wrong' -> 500\r\n status = 500;\r\n }\r\n\r\n var xhr = {response: html, status: status, dummy: true};\r\n var headers = {};\r\n var response = this._transformResponse(xhr.response, headers);\r\n\r\n this._onSuccessItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n });\r\n\r\n form.abort = () => {\r\n var xhr = {status: 0, dummy: true};\r\n var headers = {};\r\n var response;\r\n\r\n iframe.unbind('load').prop('src', 'javascript:false;');\r\n form.replaceWith(input);\r\n\r\n this._onCancelItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n input.after(form);\r\n form.append(input).append(iframe);\r\n\r\n form[0].submit();\r\n this._render();\r\n }\r\n /**\r\n * Inner callback\r\n * @param {File|Object} item\r\n * @param {Object} filter\r\n * @param {Object} options\r\n * @private\r\n */\r\n _onWhenAddingFileFailed(item, filter, options) {\r\n this.onWhenAddingFileFailed(item, filter, options);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n */\r\n _onAfterAddingFile(item) {\r\n this.onAfterAddingFile(item);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {Array<FileItem>} items\r\n */\r\n _onAfterAddingAll(items) {\r\n this.onAfterAddingAll(items);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @private\r\n */\r\n _onBeforeUploadItem(item) {\r\n item._onBeforeUpload();\r\n this.onBeforeUploadItem(item);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {Number} progress\r\n * @private\r\n */\r\n _onProgressItem(item, progress) {\r\n var total = this._getTotalProgress(progress);\r\n this.progress = total;\r\n item._onProgress(progress);\r\n this.onProgressItem(item, progress);\r\n this.onProgressAll(total);\r\n this._render();\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onSuccessItem(item, response, status, headers) {\r\n item._onSuccess(response, status, headers);\r\n this.onSuccessItem(item, response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onErrorItem(item, response, status, headers) {\r\n item._onError(response, status, headers);\r\n this.onErrorItem(item, response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onCancelItem(item, response, status, headers) {\r\n item._onCancel(response, status, headers);\r\n this.onCancelItem(item, response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onCompleteItem(item, response, status, headers) {\r\n item._onComplete(response, status, headers);\r\n this.onCompleteItem(item, response, status, headers);\r\n\r\n var nextItem = this.getReadyItems()[0];\r\n this.isUploading = false;\r\n\r\n if(isDefined(nextItem)) {\r\n nextItem.upload();\r\n return;\r\n }\r\n\r\n this.onCompleteAll();\r\n this.progress = this._getTotalProgress();\r\n this._render();\r\n }\r\n /**********************\r\n * STATIC\r\n **********************/\r\n /**\r\n * Returns \"true\" if value an instance of File\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n static isFile(value) {\r\n return (File && value instanceof File);\r\n }\r\n /**\r\n * Returns \"true\" if value an instance of FileLikeObject\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n static isFileLikeObject(value) {\r\n return value instanceof FileLikeObject;\r\n }\r\n /**\r\n * Returns \"true\" if value is array like object\r\n * @param {*} value\r\n * @returns {Boolean}\r\n */\r\n static isArrayLikeObject(value) {\r\n return (isObject(value) && 'length' in value);\r\n }\r\n /**\r\n * Inherits a target (Class_1) by a source (Class_2)\r\n * @param {Function} target\r\n * @param {Function} source\r\n */\r\n static inherit(target, source) {\r\n target.prototype = Object.create(source.prototype);\r\n target.prototype.constructor = target;\r\n target.super_ = source;\r\n }\r\n }\r\n\r\n\r\n /**********************\r\n * PUBLIC\r\n **********************/\r\n /**\r\n * Checks a support the html5 uploader\r\n * @returns {Boolean}\r\n * @readonly\r\n */\r\n FileUploader.prototype.isHTML5 = !!(File && FormData);\r\n /**********************\r\n * STATIC\r\n **********************/\r\n /**\r\n * @borrows FileUploader.prototype.isHTML5\r\n */\r\n FileUploader.isHTML5 = FileUploader.prototype.isHTML5;\r\n\r\n \r\n return FileUploader;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'fileUploaderOptions', \r\n '$rootScope', \r\n '$http', \r\n '$window',\r\n 'FileLikeObject',\r\n 'FileItem'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileUploader.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n copy,\r\n isElement,\r\n isString\r\n } = angular;\r\n\r\n\r\nexport default () => {\r\n \r\n \r\n class FileLikeObject {\r\n /**\r\n * Creates an instance of FileLikeObject\r\n * @param {File|HTMLInputElement|Object} fileOrInput\r\n * @constructor\r\n */\r\n constructor(fileOrInput) {\r\n var isInput = isElement(fileOrInput);\r\n var fakePathOrObject = isInput ? fileOrInput.value : fileOrInput;\r\n var postfix = isString(fakePathOrObject) ? 'FakePath' : 'Object';\r\n var method = '_createFrom' + postfix;\r\n this[method](fakePathOrObject);\r\n }\r\n /**\r\n * Creates file like object from fake path string\r\n * @param {String} path\r\n * @private\r\n */\r\n _createFromFakePath(path) {\r\n this.lastModifiedDate = null;\r\n this.size = null;\r\n this.type = 'like/' + path.slice(path.lastIndexOf('.') + 1).toLowerCase();\r\n this.name = path.slice(path.lastIndexOf('/') + path.lastIndexOf('\\\\') + 2);\r\n }\r\n /**\r\n * Creates file like object from object\r\n * @param {File|FileLikeObject} object\r\n * @private\r\n */\r\n _createFromObject(object) {\r\n this.lastModifiedDate = copy(object.lastModifiedDate);\r\n this.size = object.size;\r\n this.type = object.type;\r\n this.name = object.name;\r\n }\r\n }\r\n \r\n \r\n return FileLikeObject;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileLikeObject.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n copy,\r\n extend,\r\n element,\r\n isElement\r\n } = angular;\r\n\r\n\r\nexport default ($compile, FileLikeObject) => {\r\n \r\n \r\n class FileItem {\r\n /**\r\n * Creates an instance of FileItem\r\n * @param {FileUploader} uploader\r\n * @param {File|HTMLInputElement|Object} some\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(uploader, some, options) {\r\n var isInput = isElement(some);\r\n var input = isInput ? element(some) : null;\r\n var file = !isInput ? some : null;\r\n\r\n extend(this, {\r\n url: uploader.url,\r\n alias: uploader.alias,\r\n headers: copy(uploader.headers),\r\n formData: copy(uploader.formData),\r\n removeAfterUpload: uploader.removeAfterUpload,\r\n withCredentials: uploader.withCredentials,\r\n method: uploader.method\r\n }, options, {\r\n uploader: uploader,\r\n file: new FileLikeObject(some),\r\n isReady: false,\r\n isUploading: false,\r\n isUploaded: false,\r\n isSuccess: false,\r\n isCancel: false,\r\n isError: false,\r\n progress: 0,\r\n index: null,\r\n _file: file,\r\n _input: input\r\n });\r\n\r\n if (input) this._replaceNode(input);\r\n }\r\n /**********************\r\n * PUBLIC\r\n **********************/\r\n /**\r\n * Uploads a FileItem\r\n */\r\n upload() {\r\n try {\r\n this.uploader.uploadItem(this);\r\n } catch(e) {\r\n this.uploader._onCompleteItem(this, '', 0, []);\r\n this.uploader._onErrorItem(this, '', 0, []);\r\n }\r\n }\r\n /**\r\n * Cancels uploading of FileItem\r\n */\r\n cancel() {\r\n this.uploader.cancelItem(this);\r\n }\r\n /**\r\n * Removes a FileItem\r\n */\r\n remove() {\r\n this.uploader.removeFromQueue(this);\r\n }\r\n /**\r\n * Callback\r\n * @private\r\n */\r\n onBeforeUpload() {\r\n }\r\n /**\r\n * Callback\r\n * @param {Number} progress\r\n * @private\r\n */\r\n onProgress(progress) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onSuccess(response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onError(response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onCancel(response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onComplete(response, status, headers) {\r\n }\r\n /**********************\r\n * PRIVATE\r\n **********************/\r\n /**\r\n * Inner callback\r\n */\r\n _onBeforeUpload() {\r\n this.isReady = true;\r\n this.isUploading = true;\r\n this.isUploaded = false;\r\n this.isSuccess = false;\r\n this.isCancel = false;\r\n this.isError = false;\r\n this.progress = 0;\r\n this.onBeforeUpload();\r\n }\r\n /**\r\n * Inner callback\r\n * @param {Number} progress\r\n * @private\r\n */\r\n _onProgress(progress) {\r\n this.progress = progress;\r\n this.onProgress(progress);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onSuccess(response, status, headers) {\r\n this.isReady = false;\r\n this.isUploading = false;\r\n this.isUploaded = true;\r\n this.isSuccess = true;\r\n this.isCancel = false;\r\n this.isError = false;\r\n this.progress = 100;\r\n this.index = null;\r\n this.onSuccess(response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onError(response, status, headers) {\r\n this.isReady = false;\r\n this.isUploading = false;\r\n this.isUploaded = true;\r\n this.isSuccess = false;\r\n this.isCancel = false;\r\n this.isError = true;\r\n this.progress = 0;\r\n this.index = null;\r\n this.onError(response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onCancel(response, status, headers) {\r\n this.isReady = false;\r\n this.isUploading = false;\r\n this.isUploaded = false;\r\n this.isSuccess = false;\r\n this.isCancel = true;\r\n this.isError = false;\r\n this.progress = 0;\r\n this.index = null;\r\n this.onCancel(response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onComplete(response, status, headers) {\r\n this.onComplete(response, status, headers);\r\n if(this.removeAfterUpload) this.remove();\r\n }\r\n /**\r\n * Destroys a FileItem\r\n */\r\n _destroy() {\r\n if(this._input) this._input.remove();\r\n if(this._form) this._form.remove();\r\n delete this._form;\r\n delete this._input;\r\n }\r\n /**\r\n * Prepares to uploading\r\n * @private\r\n */\r\n _prepareToUploading() {\r\n this.index = this.index || ++this.uploader._nextIndex;\r\n this.isReady = true;\r\n }\r\n /**\r\n * Replaces input element on his clone\r\n * @param {JQLite|jQuery} input\r\n * @private\r\n */\r\n _replaceNode(input) {\r\n var clone = $compile(input.clone())(input.scope());\r\n clone.prop('value', null); // FF fix\r\n input.css('display', 'none');\r\n input.after(clone); // remove jquery dependency\r\n }\r\n\r\n }\r\n \r\n \r\n return FileItem;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n '$compile',\r\n 'FileLikeObject'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileItem.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n extend\r\n } = angular;\r\n\r\n\r\nexport default () => {\r\n\r\n\r\n class FileDirective {\r\n /**\r\n * Creates instance of {FileDirective} object\r\n * @param {Object} options\r\n * @param {Object} options.uploader\r\n * @param {HTMLElement} options.element\r\n * @param {Object} options.events\r\n * @param {String} options.prop\r\n * @constructor\r\n */\r\n constructor(options) {\r\n extend(this, options);\r\n this.uploader._directives[this.prop].push(this);\r\n this._saveLinks();\r\n this.bind();\r\n }\r\n /**\r\n * Binds events handles\r\n */\r\n bind() {\r\n for(var key in this.events) {\r\n var prop = this.events[key];\r\n this.element.bind(key, this[prop]);\r\n }\r\n }\r\n /**\r\n * Unbinds events handles\r\n */\r\n unbind() {\r\n for(var key in this.events) {\r\n this.element.unbind(key, this.events[key]);\r\n }\r\n }\r\n /**\r\n * Destroys directive\r\n */\r\n destroy() {\r\n var index = this.uploader._directives[this.prop].indexOf(this);\r\n this.uploader._directives[this.prop].splice(index, 1);\r\n this.unbind();\r\n // this.element = null;\r\n }\r\n /**\r\n * Saves links to functions\r\n * @private\r\n */\r\n _saveLinks() {\r\n for(var key in this.events) {\r\n var prop = this.events[key];\r\n this[prop] = this[prop].bind(this);\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Map of events\r\n * @type {Object}\r\n */\r\n FileDirective.prototype.events = {};\r\n\r\n\r\n return FileDirective;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileDirective.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n extend,\r\n forEach\r\n } = angular;\r\n\r\n\r\nexport default (FileDirective) => {\r\n \r\n \r\n class FileDrop extends FileDirective {\r\n /**\r\n * Creates instance of {FileDrop} object\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(options) {\r\n let extendedOptions = extend(options, {\r\n // Map of events\r\n events: {\r\n $destroy: 'destroy',\r\n drop: 'onDrop',\r\n dragover: 'onDragOver',\r\n dragleave: 'onDragLeave'\r\n },\r\n // Name of property inside uploader._directive object\r\n prop: 'drop'\r\n });\r\n \r\n super(extendedOptions);\r\n }\r\n /**\r\n * Returns options\r\n * @return {Object|undefined}\r\n */\r\n getOptions() {\r\n }\r\n /**\r\n * Returns filters\r\n * @return {Array<Function>|String|undefined}\r\n */\r\n getFilters() {\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onDrop(event) {\r\n var transfer = this._getTransfer(event);\r\n if(!transfer) return;\r\n var options = this.getOptions();\r\n var filters = this.getFilters();\r\n this._preventAndStop(event);\r\n forEach(this.uploader._directives.over, this._removeOverClass, this);\r\n this.uploader.addToQueue(transfer.files, options, filters);\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onDragOver(event) {\r\n var transfer = this._getTransfer(event);\r\n if(!this._haveFiles(transfer.types)) return;\r\n transfer.dropEffect = 'copy';\r\n this._preventAndStop(event);\r\n forEach(this.uploader._directives.over, this._addOverClass, this);\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onDragLeave(event) {\r\n if(event.currentTarget === this.element[0]) return;\r\n this._preventAndStop(event);\r\n forEach(this.uploader._directives.over, this._removeOverClass, this);\r\n }\r\n /**\r\n * Helper\r\n */\r\n _getTransfer(event) {\r\n return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;\r\n }\r\n /**\r\n * Helper\r\n */\r\n _preventAndStop(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n /**\r\n * Returns \"true\" if types contains files\r\n * @param {Object} types\r\n */\r\n _haveFiles(types) {\r\n if(!types) return false;\r\n if(types.indexOf) {\r\n return types.indexOf('Files') !== -1;\r\n } else if(types.contains) {\r\n return types.contains('Files');\r\n } else {\r\n return false;\r\n }\r\n }\r\n /**\r\n * Callback\r\n */\r\n _addOverClass(item) {\r\n item.addOverClass();\r\n }\r\n /**\r\n * Callback\r\n */\r\n _removeOverClass(item) {\r\n item.removeOverClass();\r\n }\r\n }\r\n \r\n \r\n return FileDrop;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileDirective'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileDrop.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n extend\r\n } = angular;\r\n\r\n\r\nexport default (FileDirective) => {\r\n \r\n \r\n class FileOver extends FileDirective {\r\n /**\r\n * Creates instance of {FileDrop} object\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(options) {\r\n let extendedOptions = extend(options, {\r\n // Map of events\r\n events: {\r\n $destroy: 'destroy'\r\n },\r\n // Name of property inside uploader._directive object\r\n prop: 'over',\r\n // Over class\r\n overClass: 'nv-file-over'\r\n });\r\n \r\n super(extendedOptions);\r\n }\r\n /**\r\n * Adds over class\r\n */\r\n addOverClass() {\r\n this.element.addClass(this.getOverClass());\r\n }\r\n /**\r\n * Removes over class\r\n */\r\n removeOverClass() {\r\n this.element.removeClass(this.getOverClass());\r\n }\r\n /**\r\n * Returns over class\r\n * @returns {String}\r\n */\r\n getOverClass() {\r\n return this.overClass;\r\n }\r\n }\r\n \r\n \r\n return FileOver;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileDirective'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileOver.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default ($parse, FileUploader, FileSelect) => {\r\n\r\n\r\n return {\r\n link: (scope, element, attributes) => {\r\n var uploader = scope.$eval(attributes.uploader);\r\n\r\n if (!(uploader instanceof FileUploader)) {\r\n throw new TypeError('\"Uploader\" must be an instance of FileUploader');\r\n }\r\n\r\n var object = new FileSelect({\r\n uploader: uploader,\r\n element: element\r\n });\r\n\r\n object.getOptions = $parse(attributes.options).bind(object, scope);\r\n object.getFilters = () => attributes.filters;\r\n }\r\n };\r\n\r\n\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n '$parse',\r\n 'FileUploader',\r\n 'FileSelect'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/directives/FileSelect.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default ($parse, FileUploader, FileDrop) => {\r\n\r\n\r\n return {\r\n link: (scope, element, attributes) => {\r\n var uploader = scope.$eval(attributes.uploader);\r\n\r\n if (!(uploader instanceof FileUploader)) {\r\n throw new TypeError('\"Uploader\" must be an instance of FileUploader');\r\n }\r\n\r\n if (!uploader.isHTML5) return;\r\n\r\n var object = new FileDrop({\r\n uploader: uploader,\r\n element: element\r\n });\r\n\r\n object.getOptions = $parse(attributes.options).bind(object, scope);\r\n object.getFilters = () => attributes.filters;\r\n }\r\n };\r\n\r\n\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n '$parse',\r\n 'FileUploader',\r\n 'FileDrop'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/directives/FileDrop.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default (FileUploader, FileOver) => {\r\n\r\n\r\n return {\r\n link: (scope, element, attributes) => {\r\n var uploader = scope.$eval(attributes.uploader);\r\n\r\n if (!(uploader instanceof FileUploader)) {\r\n throw new TypeError('\"Uploader\" must be an instance of FileUploader');\r\n }\r\n\r\n var object = new FileOver({\r\n uploader: uploader,\r\n element: element\r\n });\r\n\r\n object.getOverClass = () => attributes.overClass || object.overClass;\r\n }\r\n };\r\n\r\n\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileUploader',\r\n 'FileOver'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/directives/FileOver.js\n **/"],"sourceRoot":""}
0 \ No newline at end of file 2 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/gulpfile.js 0 → 100644
  1 +
  2 +
  3 +var pkg = require('./package.json');
  4 +// https://github.com/gulpjs/gulp/blob/master/docs/README.md
  5 +var gulp = require('gulp');
  6 +// http://webpack.github.io/docs/
  7 +var webpack = require('webpack');
  8 +// https://github.com/shama/webpack-stream
  9 +var webpackStream = require('webpack-stream');
  10 +
  11 +
  12 +gulp.task(
  13 + pkg.name + '/build',
  14 + function() {
  15 + return gulp
  16 + .src('./src/index.js')
  17 + .pipe(webpackStream({
  18 + module: {
  19 + loaders: [
  20 + // https://github.com/babel/babel-loader
  21 + {test: /\.js$/, loader: 'babel'},
  22 + // https://github.com/webpack/json-loader
  23 + {test: /\.json$/, loader: 'json'},
  24 + // https://github.com/webpack/html-loader
  25 + {test: /\.html$/, loader: 'html'}
  26 + ]
  27 + },
  28 + plugins: [
  29 + // http://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin
  30 + new webpack.optimize.UglifyJsPlugin({
  31 + compress: {
  32 + warnings: false
  33 + }
  34 + }),
  35 + // http://webpack.github.io/docs/list-of-plugins.html#bannerplugin
  36 + new webpack.BannerPlugin(
  37 + '/*\n' +
  38 + ' ' + pkg.name + ' v' + pkg.version + '\n' +
  39 + ' ' + pkg.homepage + '\n' +
  40 + '*/\n'
  41 + , {
  42 + entryOnly: true,
  43 + raw: true
  44 + })
  45 + ],
  46 + devtool: 'source-map',
  47 + debug: true,
  48 + output: {
  49 + library: pkg.name,
  50 + libraryTarget: 'umd',
  51 + filename: pkg.name + '.min.js'
  52 + }
  53 + }))
  54 + .pipe(gulp.dest('./dist'));
  55 + }
  56 +);
  57 +
  58 +
  59 +gulp.task(
  60 + pkg.name + '/watch', function() {
  61 + return gulp
  62 + .watch(
  63 + [
  64 + './src/**/*.js',
  65 + './src/**/*.json',
  66 + './src/**/*.html'
  67 + ],
  68 + [
  69 + pkg.name + '/build'
  70 + ]
  71 + );
  72 + }
  73 +);
src/main/resources/static/assets/bower_components/angular-file-upload/license.txt 0 → 100644
  1 +The MIT License
  2 +
  3 +Copyright (c) 2013 nerv. https://github.com/nervgh
  4 +
  5 +Permission is hereby granted, free of charge, to any person obtaining a copy
  6 +of this software and associated documentation files (the "Software"), to deal
  7 +in the Software without restriction, including without limitation the rights
  8 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9 +copies of the Software, and to permit persons to whom the Software is
  10 +furnished to do so, subject to the following conditions:
  11 +
  12 +The above copyright notice and this permission notice shall be included in
  13 +all copies or substantial portions of the Software.
  14 +
  15 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21 +THE SOFTWARE.
src/main/resources/static/assets/bower_components/angular-file-upload/package.json 0 → 100644
  1 +{
  2 + "name": "angular-file-upload",
  3 + "version": "2.1.4",
  4 + "homepage": "https://github.com/nervgh/angular-file-upload",
  5 + "description": "Angular File Upload is a module for the AngularJS framework",
  6 + "author": {
  7 + "name": "nerv",
  8 + "url": "https://github.com/nervgh"
  9 + },
  10 + "main": "dist/angular-file-upload.min.js",
  11 + "devDependencies": {
  12 + "babel": "^4.7.16",
  13 + "babel-loader": "^4.0.0",
  14 + "json-loader": "^0.5.1",
  15 + "html-loader": "^0.2.3",
  16 + "gulp": "^3.9.0",
  17 + "webpack": "^1.10.1",
  18 + "webpack-stream": "^2.0.0"
  19 + }
  20 +}
src/main/resources/static/assets/bower_components/angular-file-upload/src/config.json 0 → 100644
  1 +{
  2 + "name": "angularFileUpload"
  3 +}
0 \ No newline at end of file 4 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/directives/FileDrop.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +export default ($parse, FileUploader, FileDrop) => {
  8 +
  9 +
  10 + return {
  11 + link: (scope, element, attributes) => {
  12 + var uploader = scope.$eval(attributes.uploader);
  13 +
  14 + if (!(uploader instanceof FileUploader)) {
  15 + throw new TypeError('"Uploader" must be an instance of FileUploader');
  16 + }
  17 +
  18 + if (!uploader.isHTML5) return;
  19 +
  20 + var object = new FileDrop({
  21 + uploader: uploader,
  22 + element: element
  23 + });
  24 +
  25 + object.getOptions = $parse(attributes.options).bind(object, scope);
  26 + object.getFilters = () => attributes.filters;
  27 + }
  28 + };
  29 +
  30 +
  31 +}
  32 +
  33 +
  34 +module.exports.$inject = [
  35 + '$parse',
  36 + 'FileUploader',
  37 + 'FileDrop'
  38 +];
0 \ No newline at end of file 39 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/directives/FileOver.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +export default (FileUploader, FileOver) => {
  8 +
  9 +
  10 + return {
  11 + link: (scope, element, attributes) => {
  12 + var uploader = scope.$eval(attributes.uploader);
  13 +
  14 + if (!(uploader instanceof FileUploader)) {
  15 + throw new TypeError('"Uploader" must be an instance of FileUploader');
  16 + }
  17 +
  18 + var object = new FileOver({
  19 + uploader: uploader,
  20 + element: element
  21 + });
  22 +
  23 + object.getOverClass = () => attributes.overClass || object.overClass;
  24 + }
  25 + };
  26 +
  27 +
  28 +}
  29 +
  30 +
  31 +module.exports.$inject = [
  32 + 'FileUploader',
  33 + 'FileOver'
  34 +];
0 \ No newline at end of file 35 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/directives/FileSelect.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +export default ($parse, FileUploader, FileSelect) => {
  8 +
  9 +
  10 + return {
  11 + link: (scope, element, attributes) => {
  12 + var uploader = scope.$eval(attributes.uploader);
  13 +
  14 + if (!(uploader instanceof FileUploader)) {
  15 + throw new TypeError('"Uploader" must be an instance of FileUploader');
  16 + }
  17 +
  18 + var object = new FileSelect({
  19 + uploader: uploader,
  20 + element: element
  21 + });
  22 +
  23 + object.getOptions = $parse(attributes.options).bind(object, scope);
  24 + object.getFilters = () => attributes.filters;
  25 + }
  26 + };
  27 +
  28 +
  29 +}
  30 +
  31 +
  32 +module.exports.$inject = [
  33 + '$parse',
  34 + 'FileUploader',
  35 + 'FileSelect'
  36 +];
0 \ No newline at end of file 37 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/index.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './config.json';
  5 +
  6 +
  7 +import options from './values/options'
  8 +
  9 +
  10 +import serviceFileUploader from './services/FileUploader';
  11 +import serviceFileLikeObject from './services/FileLikeObject';
  12 +import serviceFileItem from './services/FileItem';
  13 +import serviceFileDirective from './services/FileDirective';
  14 +import serviceFileSelect from './services/FileSelect';
  15 +import serviceFileDrop from './services/FileDrop';
  16 +import serviceFileOver from './services/FileOver';
  17 +
  18 +
  19 +import directiveFileSelect from './directives/FileSelect';
  20 +import directiveFileDrop from './directives/FileDrop';
  21 +import directiveFileOver from './directives/FileOver';
  22 +
  23 +
  24 +angular
  25 + .module(CONFIG.name, [])
  26 + .value('fileUploaderOptions', options)
  27 + .factory('FileUploader', serviceFileUploader)
  28 + .factory('FileLikeObject', serviceFileLikeObject)
  29 + .factory('FileItem', serviceFileItem)
  30 + .factory('FileDirective', serviceFileDirective)
  31 + .factory('FileSelect', serviceFileSelect)
  32 + .factory('FileDrop', serviceFileDrop)
  33 + .factory('FileOver', serviceFileOver)
  34 + .directive('nvFileSelect', directiveFileSelect)
  35 + .directive('nvFileDrop', directiveFileDrop)
  36 + .directive('nvFileOver', directiveFileOver)
  37 + .run([
  38 + 'FileUploader',
  39 + 'FileLikeObject',
  40 + 'FileItem',
  41 + 'FileDirective',
  42 + 'FileSelect',
  43 + 'FileDrop',
  44 + 'FileOver',
  45 + function(FileUploader, FileLikeObject, FileItem, FileDirective, FileSelect, FileDrop, FileOver) {
  46 + // only for compatibility
  47 + FileUploader.FileLikeObject = FileLikeObject;
  48 + FileUploader.FileItem = FileItem;
  49 + FileUploader.FileDirective = FileDirective;
  50 + FileUploader.FileSelect = FileSelect;
  51 + FileUploader.FileDrop = FileDrop;
  52 + FileUploader.FileOver = FileOver;
  53 + }
  54 + ]);
src/main/resources/static/assets/bower_components/angular-file-upload/src/services/FileDirective.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +let {
  8 + extend
  9 + } = angular;
  10 +
  11 +
  12 +export default () => {
  13 +
  14 +
  15 + class FileDirective {
  16 + /**
  17 + * Creates instance of {FileDirective} object
  18 + * @param {Object} options
  19 + * @param {Object} options.uploader
  20 + * @param {HTMLElement} options.element
  21 + * @param {Object} options.events
  22 + * @param {String} options.prop
  23 + * @constructor
  24 + */
  25 + constructor(options) {
  26 + extend(this, options);
  27 + this.uploader._directives[this.prop].push(this);
  28 + this._saveLinks();
  29 + this.bind();
  30 + }
  31 + /**
  32 + * Binds events handles
  33 + */
  34 + bind() {
  35 + for(var key in this.events) {
  36 + var prop = this.events[key];
  37 + this.element.bind(key, this[prop]);
  38 + }
  39 + }
  40 + /**
  41 + * Unbinds events handles
  42 + */
  43 + unbind() {
  44 + for(var key in this.events) {
  45 + this.element.unbind(key, this.events[key]);
  46 + }
  47 + }
  48 + /**
  49 + * Destroys directive
  50 + */
  51 + destroy() {
  52 + var index = this.uploader._directives[this.prop].indexOf(this);
  53 + this.uploader._directives[this.prop].splice(index, 1);
  54 + this.unbind();
  55 + // this.element = null;
  56 + }
  57 + /**
  58 + * Saves links to functions
  59 + * @private
  60 + */
  61 + _saveLinks() {
  62 + for(var key in this.events) {
  63 + var prop = this.events[key];
  64 + this[prop] = this[prop].bind(this);
  65 + }
  66 + }
  67 + }
  68 +
  69 +
  70 + /**
  71 + * Map of events
  72 + * @type {Object}
  73 + */
  74 + FileDirective.prototype.events = {};
  75 +
  76 +
  77 + return FileDirective;
  78 +}
  79 +
  80 +
  81 +module.exports.$inject = [
  82 +];
0 \ No newline at end of file 83 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/services/FileDrop.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +let {
  8 + extend,
  9 + forEach
  10 + } = angular;
  11 +
  12 +
  13 +export default (FileDirective) => {
  14 +
  15 +
  16 + class FileDrop extends FileDirective {
  17 + /**
  18 + * Creates instance of {FileDrop} object
  19 + * @param {Object} options
  20 + * @constructor
  21 + */
  22 + constructor(options) {
  23 + let extendedOptions = extend(options, {
  24 + // Map of events
  25 + events: {
  26 + $destroy: 'destroy',
  27 + drop: 'onDrop',
  28 + dragover: 'onDragOver',
  29 + dragleave: 'onDragLeave'
  30 + },
  31 + // Name of property inside uploader._directive object
  32 + prop: 'drop'
  33 + });
  34 +
  35 + super(extendedOptions);
  36 + }
  37 + /**
  38 + * Returns options
  39 + * @return {Object|undefined}
  40 + */
  41 + getOptions() {
  42 + }
  43 + /**
  44 + * Returns filters
  45 + * @return {Array<Function>|String|undefined}
  46 + */
  47 + getFilters() {
  48 + }
  49 + /**
  50 + * Event handler
  51 + */
  52 + onDrop(event) {
  53 + var transfer = this._getTransfer(event);
  54 + if(!transfer) return;
  55 + var options = this.getOptions();
  56 + var filters = this.getFilters();
  57 + this._preventAndStop(event);
  58 + forEach(this.uploader._directives.over, this._removeOverClass, this);
  59 + this.uploader.addToQueue(transfer.files, options, filters);
  60 + }
  61 + /**
  62 + * Event handler
  63 + */
  64 + onDragOver(event) {
  65 + var transfer = this._getTransfer(event);
  66 + if(!this._haveFiles(transfer.types)) return;
  67 + transfer.dropEffect = 'copy';
  68 + this._preventAndStop(event);
  69 + forEach(this.uploader._directives.over, this._addOverClass, this);
  70 + }
  71 + /**
  72 + * Event handler
  73 + */
  74 + onDragLeave(event) {
  75 + if(event.currentTarget === this.element[0]) return;
  76 + this._preventAndStop(event);
  77 + forEach(this.uploader._directives.over, this._removeOverClass, this);
  78 + }
  79 + /**
  80 + * Helper
  81 + */
  82 + _getTransfer(event) {
  83 + return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;
  84 + }
  85 + /**
  86 + * Helper
  87 + */
  88 + _preventAndStop(event) {
  89 + event.preventDefault();
  90 + event.stopPropagation();
  91 + }
  92 + /**
  93 + * Returns "true" if types contains files
  94 + * @param {Object} types
  95 + */
  96 + _haveFiles(types) {
  97 + if(!types) return false;
  98 + if(types.indexOf) {
  99 + return types.indexOf('Files') !== -1;
  100 + } else if(types.contains) {
  101 + return types.contains('Files');
  102 + } else {
  103 + return false;
  104 + }
  105 + }
  106 + /**
  107 + * Callback
  108 + */
  109 + _addOverClass(item) {
  110 + item.addOverClass();
  111 + }
  112 + /**
  113 + * Callback
  114 + */
  115 + _removeOverClass(item) {
  116 + item.removeOverClass();
  117 + }
  118 + }
  119 +
  120 +
  121 + return FileDrop;
  122 +}
  123 +
  124 +
  125 +module.exports.$inject = [
  126 + 'FileDirective'
  127 +];
0 \ No newline at end of file 128 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/services/FileItem.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +let {
  8 + copy,
  9 + extend,
  10 + element,
  11 + isElement
  12 + } = angular;
  13 +
  14 +
  15 +export default ($compile, FileLikeObject) => {
  16 +
  17 +
  18 + class FileItem {
  19 + /**
  20 + * Creates an instance of FileItem
  21 + * @param {FileUploader} uploader
  22 + * @param {File|HTMLInputElement|Object} some
  23 + * @param {Object} options
  24 + * @constructor
  25 + */
  26 + constructor(uploader, some, options) {
  27 + var isInput = isElement(some);
  28 + var input = isInput ? element(some) : null;
  29 + var file = !isInput ? some : null;
  30 +
  31 + extend(this, {
  32 + url: uploader.url,
  33 + alias: uploader.alias,
  34 + headers: copy(uploader.headers),
  35 + formData: copy(uploader.formData),
  36 + removeAfterUpload: uploader.removeAfterUpload,
  37 + withCredentials: uploader.withCredentials,
  38 + method: uploader.method
  39 + }, options, {
  40 + uploader: uploader,
  41 + file: new FileLikeObject(some),
  42 + isReady: false,
  43 + isUploading: false,
  44 + isUploaded: false,
  45 + isSuccess: false,
  46 + isCancel: false,
  47 + isError: false,
  48 + progress: 0,
  49 + index: null,
  50 + _file: file,
  51 + _input: input
  52 + });
  53 +
  54 + if (input) this._replaceNode(input);
  55 + }
  56 + /**********************
  57 + * PUBLIC
  58 + **********************/
  59 + /**
  60 + * Uploads a FileItem
  61 + */
  62 + upload() {
  63 + try {
  64 + this.uploader.uploadItem(this);
  65 + } catch(e) {
  66 + this.uploader._onCompleteItem(this, '', 0, []);
  67 + this.uploader._onErrorItem(this, '', 0, []);
  68 + }
  69 + }
  70 + /**
  71 + * Cancels uploading of FileItem
  72 + */
  73 + cancel() {
  74 + this.uploader.cancelItem(this);
  75 + }
  76 + /**
  77 + * Removes a FileItem
  78 + */
  79 + remove() {
  80 + this.uploader.removeFromQueue(this);
  81 + }
  82 + /**
  83 + * Callback
  84 + * @private
  85 + */
  86 + onBeforeUpload() {
  87 + }
  88 + /**
  89 + * Callback
  90 + * @param {Number} progress
  91 + * @private
  92 + */
  93 + onProgress(progress) {
  94 + }
  95 + /**
  96 + * Callback
  97 + * @param {*} response
  98 + * @param {Number} status
  99 + * @param {Object} headers
  100 + */
  101 + onSuccess(response, status, headers) {
  102 + }
  103 + /**
  104 + * Callback
  105 + * @param {*} response
  106 + * @param {Number} status
  107 + * @param {Object} headers
  108 + */
  109 + onError(response, status, headers) {
  110 + }
  111 + /**
  112 + * Callback
  113 + * @param {*} response
  114 + * @param {Number} status
  115 + * @param {Object} headers
  116 + */
  117 + onCancel(response, status, headers) {
  118 + }
  119 + /**
  120 + * Callback
  121 + * @param {*} response
  122 + * @param {Number} status
  123 + * @param {Object} headers
  124 + */
  125 + onComplete(response, status, headers) {
  126 + }
  127 + /**********************
  128 + * PRIVATE
  129 + **********************/
  130 + /**
  131 + * Inner callback
  132 + */
  133 + _onBeforeUpload() {
  134 + this.isReady = true;
  135 + this.isUploading = true;
  136 + this.isUploaded = false;
  137 + this.isSuccess = false;
  138 + this.isCancel = false;
  139 + this.isError = false;
  140 + this.progress = 0;
  141 + this.onBeforeUpload();
  142 + }
  143 + /**
  144 + * Inner callback
  145 + * @param {Number} progress
  146 + * @private
  147 + */
  148 + _onProgress(progress) {
  149 + this.progress = progress;
  150 + this.onProgress(progress);
  151 + }
  152 + /**
  153 + * Inner callback
  154 + * @param {*} response
  155 + * @param {Number} status
  156 + * @param {Object} headers
  157 + * @private
  158 + */
  159 + _onSuccess(response, status, headers) {
  160 + this.isReady = false;
  161 + this.isUploading = false;
  162 + this.isUploaded = true;
  163 + this.isSuccess = true;
  164 + this.isCancel = false;
  165 + this.isError = false;
  166 + this.progress = 100;
  167 + this.index = null;
  168 + this.onSuccess(response, status, headers);
  169 + }
  170 + /**
  171 + * Inner callback
  172 + * @param {*} response
  173 + * @param {Number} status
  174 + * @param {Object} headers
  175 + * @private
  176 + */
  177 + _onError(response, status, headers) {
  178 + this.isReady = false;
  179 + this.isUploading = false;
  180 + this.isUploaded = true;
  181 + this.isSuccess = false;
  182 + this.isCancel = false;
  183 + this.isError = true;
  184 + this.progress = 0;
  185 + this.index = null;
  186 + this.onError(response, status, headers);
  187 + }
  188 + /**
  189 + * Inner callback
  190 + * @param {*} response
  191 + * @param {Number} status
  192 + * @param {Object} headers
  193 + * @private
  194 + */
  195 + _onCancel(response, status, headers) {
  196 + this.isReady = false;
  197 + this.isUploading = false;
  198 + this.isUploaded = false;
  199 + this.isSuccess = false;
  200 + this.isCancel = true;
  201 + this.isError = false;
  202 + this.progress = 0;
  203 + this.index = null;
  204 + this.onCancel(response, status, headers);
  205 + }
  206 + /**
  207 + * Inner callback
  208 + * @param {*} response
  209 + * @param {Number} status
  210 + * @param {Object} headers
  211 + * @private
  212 + */
  213 + _onComplete(response, status, headers) {
  214 + this.onComplete(response, status, headers);
  215 + if(this.removeAfterUpload) this.remove();
  216 + }
  217 + /**
  218 + * Destroys a FileItem
  219 + */
  220 + _destroy() {
  221 + if(this._input) this._input.remove();
  222 + if(this._form) this._form.remove();
  223 + delete this._form;
  224 + delete this._input;
  225 + }
  226 + /**
  227 + * Prepares to uploading
  228 + * @private
  229 + */
  230 + _prepareToUploading() {
  231 + this.index = this.index || ++this.uploader._nextIndex;
  232 + this.isReady = true;
  233 + }
  234 + /**
  235 + * Replaces input element on his clone
  236 + * @param {JQLite|jQuery} input
  237 + * @private
  238 + */
  239 + _replaceNode(input) {
  240 + var clone = $compile(input.clone())(input.scope());
  241 + clone.prop('value', null); // FF fix
  242 + input.css('display', 'none');
  243 + input.after(clone); // remove jquery dependency
  244 + }
  245 +
  246 + }
  247 +
  248 +
  249 + return FileItem;
  250 +}
  251 +
  252 +
  253 +module.exports.$inject = [
  254 + '$compile',
  255 + 'FileLikeObject'
  256 +];
0 \ No newline at end of file 257 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/services/FileLikeObject.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +let {
  8 + copy,
  9 + isElement,
  10 + isString
  11 + } = angular;
  12 +
  13 +
  14 +export default () => {
  15 +
  16 +
  17 + class FileLikeObject {
  18 + /**
  19 + * Creates an instance of FileLikeObject
  20 + * @param {File|HTMLInputElement|Object} fileOrInput
  21 + * @constructor
  22 + */
  23 + constructor(fileOrInput) {
  24 + var isInput = isElement(fileOrInput);
  25 + var fakePathOrObject = isInput ? fileOrInput.value : fileOrInput;
  26 + var postfix = isString(fakePathOrObject) ? 'FakePath' : 'Object';
  27 + var method = '_createFrom' + postfix;
  28 + this[method](fakePathOrObject);
  29 + }
  30 + /**
  31 + * Creates file like object from fake path string
  32 + * @param {String} path
  33 + * @private
  34 + */
  35 + _createFromFakePath(path) {
  36 + this.lastModifiedDate = null;
  37 + this.size = null;
  38 + this.type = 'like/' + path.slice(path.lastIndexOf('.') + 1).toLowerCase();
  39 + this.name = path.slice(path.lastIndexOf('/') + path.lastIndexOf('\\') + 2);
  40 + }
  41 + /**
  42 + * Creates file like object from object
  43 + * @param {File|FileLikeObject} object
  44 + * @private
  45 + */
  46 + _createFromObject(object) {
  47 + this.lastModifiedDate = copy(object.lastModifiedDate);
  48 + this.size = object.size;
  49 + this.type = object.type;
  50 + this.name = object.name;
  51 + }
  52 + }
  53 +
  54 +
  55 + return FileLikeObject;
  56 +}
  57 +
  58 +
  59 +module.exports.$inject = [
  60 +];
0 \ No newline at end of file 61 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/services/FileOver.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +let {
  8 + extend
  9 + } = angular;
  10 +
  11 +
  12 +export default (FileDirective) => {
  13 +
  14 +
  15 + class FileOver extends FileDirective {
  16 + /**
  17 + * Creates instance of {FileDrop} object
  18 + * @param {Object} options
  19 + * @constructor
  20 + */
  21 + constructor(options) {
  22 + let extendedOptions = extend(options, {
  23 + // Map of events
  24 + events: {
  25 + $destroy: 'destroy'
  26 + },
  27 + // Name of property inside uploader._directive object
  28 + prop: 'over',
  29 + // Over class
  30 + overClass: 'nv-file-over'
  31 + });
  32 +
  33 + super(extendedOptions);
  34 + }
  35 + /**
  36 + * Adds over class
  37 + */
  38 + addOverClass() {
  39 + this.element.addClass(this.getOverClass());
  40 + }
  41 + /**
  42 + * Removes over class
  43 + */
  44 + removeOverClass() {
  45 + this.element.removeClass(this.getOverClass());
  46 + }
  47 + /**
  48 + * Returns over class
  49 + * @returns {String}
  50 + */
  51 + getOverClass() {
  52 + return this.overClass;
  53 + }
  54 + }
  55 +
  56 +
  57 + return FileOver;
  58 +}
  59 +
  60 +
  61 +module.exports.$inject = [
  62 + 'FileDirective'
  63 +];
0 \ No newline at end of file 64 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/services/FileSelect.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +let {
  8 + extend
  9 + } = angular;
  10 +
  11 +
  12 +export default (FileDirective) => {
  13 +
  14 +
  15 + class FileSelect extends FileDirective {
  16 + /**
  17 + * Creates instance of {FileSelect} object
  18 + * @param {Object} options
  19 + * @constructor
  20 + */
  21 + constructor(options) {
  22 + let extendedOptions = extend(options, {
  23 + // Map of events
  24 + events: {
  25 + $destroy: 'destroy',
  26 + change: 'onChange'
  27 + },
  28 + // Name of property inside uploader._directive object
  29 + prop: 'select'
  30 + });
  31 +
  32 + super(extendedOptions);
  33 +
  34 + if(!this.uploader.isHTML5) {
  35 + this.element.removeAttr('multiple');
  36 + }
  37 + this.element.prop('value', null); // FF fix
  38 + }
  39 + /**
  40 + * Returns options
  41 + * @return {Object|undefined}
  42 + */
  43 + getOptions() {
  44 + }
  45 + /**
  46 + * Returns filters
  47 + * @return {Array<Function>|String|undefined}
  48 + */
  49 + getFilters() {
  50 + }
  51 + /**
  52 + * If returns "true" then HTMLInputElement will be cleared
  53 + * @returns {Boolean}
  54 + */
  55 + isEmptyAfterSelection() {
  56 + return !!this.element.attr('multiple');
  57 + }
  58 + /**
  59 + * Event handler
  60 + */
  61 + onChange() {
  62 + var files = this.uploader.isHTML5 ? this.element[0].files : this.element[0];
  63 + var options = this.getOptions();
  64 + var filters = this.getFilters();
  65 +
  66 + if(!this.uploader.isHTML5) this.destroy();
  67 + this.uploader.addToQueue(files, options, filters);
  68 + if(this.isEmptyAfterSelection()) {
  69 + this.element.prop('value', null);
  70 + this.element.replaceWith(this.element = this.element.clone(true)); // IE fix
  71 + }
  72 + }
  73 + }
  74 +
  75 +
  76 + return FileSelect;
  77 +}
  78 +
  79 +
  80 +module.exports.$inject = [
  81 + 'FileDirective'
  82 +];
src/main/resources/static/assets/bower_components/angular-file-upload/src/services/FileUploader.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +import CONFIG from './../config.json';
  5 +
  6 +
  7 +let {
  8 + copy,
  9 + extend,
  10 + forEach,
  11 + isObject,
  12 + isNumber,
  13 + isDefined,
  14 + isArray,
  15 + element
  16 + } = angular;
  17 +
  18 +
  19 +export default (fileUploaderOptions, $rootScope, $http, $window, FileLikeObject, FileItem) => {
  20 +
  21 +
  22 + let {
  23 + File,
  24 + FormData
  25 + } = $window;
  26 +
  27 +
  28 + class FileUploader {
  29 + /**********************
  30 + * PUBLIC
  31 + **********************/
  32 + /**
  33 + * Creates an instance of FileUploader
  34 + * @param {Object} [options]
  35 + * @constructor
  36 + */
  37 + constructor(options) {
  38 + var settings = copy(fileUploaderOptions);
  39 +
  40 + extend(this, settings, options, {
  41 + isUploading: false,
  42 + _nextIndex: 0,
  43 + _failFilterIndex: -1,
  44 + _directives: {select: [], drop: [], over: []}
  45 + });
  46 +
  47 + // add default filters
  48 + this.filters.unshift({name: 'queueLimit', fn: this._queueLimitFilter});
  49 + this.filters.unshift({name: 'folder', fn: this._folderFilter});
  50 + }
  51 + /**
  52 + * Adds items to the queue
  53 + * @param {File|HTMLInputElement|Object|FileList|Array<Object>} files
  54 + * @param {Object} [options]
  55 + * @param {Array<Function>|String} filters
  56 + */
  57 + addToQueue(files, options, filters) {
  58 + var list = this.isArrayLikeObject(files) ? files: [files];
  59 + var arrayOfFilters = this._getFilters(filters);
  60 + var count = this.queue.length;
  61 + var addedFileItems = [];
  62 +
  63 + forEach(list, (some /*{File|HTMLInputElement|Object}*/) => {
  64 + var temp = new FileLikeObject(some);
  65 +
  66 + if (this._isValidFile(temp, arrayOfFilters, options)) {
  67 + var fileItem = new FileItem(this, some, options);
  68 + addedFileItems.push(fileItem);
  69 + this.queue.push(fileItem);
  70 + this._onAfterAddingFile(fileItem);
  71 + } else {
  72 + var filter = arrayOfFilters[this._failFilterIndex];
  73 + this._onWhenAddingFileFailed(temp, filter, options);
  74 + }
  75 + });
  76 +
  77 + if(this.queue.length !== count) {
  78 + this._onAfterAddingAll(addedFileItems);
  79 + this.progress = this._getTotalProgress();
  80 + }
  81 +
  82 + this._render();
  83 + if (this.autoUpload) this.uploadAll();
  84 + }
  85 + /**
  86 + * Remove items from the queue. Remove last: index = -1
  87 + * @param {FileItem|Number} value
  88 + */
  89 + removeFromQueue(value) {
  90 + var index = this.getIndexOfItem(value);
  91 + var item = this.queue[index];
  92 + if(item.isUploading) item.cancel();
  93 + this.queue.splice(index, 1);
  94 + item._destroy();
  95 + this.progress = this._getTotalProgress();
  96 + }
  97 + /**
  98 + * Clears the queue
  99 + */
  100 + clearQueue() {
  101 + while(this.queue.length) {
  102 + this.queue[0].remove();
  103 + }
  104 + this.progress = 0;
  105 + }
  106 + /**
  107 + * Uploads a item from the queue
  108 + * @param {FileItem|Number} value
  109 + */
  110 + uploadItem(value) {
  111 + var index = this.getIndexOfItem(value);
  112 + var item = this.queue[index];
  113 + var transport = this.isHTML5 ? '_xhrTransport' : '_iframeTransport';
  114 +
  115 + item._prepareToUploading();
  116 + if(this.isUploading) return;
  117 +
  118 + this.isUploading = true;
  119 + this[transport](item);
  120 + }
  121 + /**
  122 + * Cancels uploading of item from the queue
  123 + * @param {FileItem|Number} value
  124 + */
  125 + cancelItem(value) {
  126 + var index = this.getIndexOfItem(value);
  127 + var item = this.queue[index];
  128 + var prop = this.isHTML5 ? '_xhr' : '_form';
  129 + if(item && item.isUploading) item[prop].abort();
  130 + }
  131 + /**
  132 + * Uploads all not uploaded items of queue
  133 + */
  134 + uploadAll() {
  135 + var items = this.getNotUploadedItems().filter(item => !item.isUploading);
  136 + if(!items.length) return;
  137 +
  138 + forEach(items, item => item._prepareToUploading());
  139 + items[0].upload();
  140 + }
  141 + /**
  142 + * Cancels all uploads
  143 + */
  144 + cancelAll() {
  145 + var items = this.getNotUploadedItems();
  146 + forEach(items, item => item.cancel());
  147 + }
  148 + /**
  149 + * Returns "true" if value an instance of File
  150 + * @param {*} value
  151 + * @returns {Boolean}
  152 + * @private
  153 + */
  154 + isFile(value) {
  155 + return this.constructor.isFile(value);
  156 + }
  157 + /**
  158 + * Returns "true" if value an instance of FileLikeObject
  159 + * @param {*} value
  160 + * @returns {Boolean}
  161 + * @private
  162 + */
  163 + isFileLikeObject(value) {
  164 + return this.constructor.isFileLikeObject(value);
  165 + }
  166 + /**
  167 + * Returns "true" if value is array like object
  168 + * @param {*} value
  169 + * @returns {Boolean}
  170 + */
  171 + isArrayLikeObject(value) {
  172 + return this.constructor.isArrayLikeObject(value);
  173 + }
  174 + /**
  175 + * Returns a index of item from the queue
  176 + * @param {Item|Number} value
  177 + * @returns {Number}
  178 + */
  179 + getIndexOfItem(value) {
  180 + return isNumber(value) ? value : this.queue.indexOf(value);
  181 + }
  182 + /**
  183 + * Returns not uploaded items
  184 + * @returns {Array}
  185 + */
  186 + getNotUploadedItems() {
  187 + return this.queue.filter(item => !item.isUploaded);
  188 + }
  189 + /**
  190 + * Returns items ready for upload
  191 + * @returns {Array}
  192 + */
  193 + getReadyItems() {
  194 + return this.queue
  195 + .filter(item => (item.isReady && !item.isUploading))
  196 + .sort((item1, item2) => item1.index - item2.index);
  197 + }
  198 + /**
  199 + * Destroys instance of FileUploader
  200 + */
  201 + destroy() {
  202 + forEach(this._directives, (key) => {
  203 + forEach(this._directives[key], (object) => {
  204 + object.destroy();
  205 + });
  206 + });
  207 + }
  208 + /**
  209 + * Callback
  210 + * @param {Array} fileItems
  211 + */
  212 + onAfterAddingAll(fileItems) {
  213 + }
  214 + /**
  215 + * Callback
  216 + * @param {FileItem} fileItem
  217 + */
  218 + onAfterAddingFile(fileItem) {
  219 + }
  220 + /**
  221 + * Callback
  222 + * @param {File|Object} item
  223 + * @param {Object} filter
  224 + * @param {Object} options
  225 + */
  226 + onWhenAddingFileFailed(item, filter, options) {
  227 + }
  228 + /**
  229 + * Callback
  230 + * @param {FileItem} fileItem
  231 + */
  232 + onBeforeUploadItem(fileItem) {
  233 + }
  234 + /**
  235 + * Callback
  236 + * @param {FileItem} fileItem
  237 + * @param {Number} progress
  238 + */
  239 + onProgressItem(fileItem, progress) {
  240 + }
  241 + /**
  242 + * Callback
  243 + * @param {Number} progress
  244 + */
  245 + onProgressAll(progress) {
  246 + }
  247 + /**
  248 + * Callback
  249 + * @param {FileItem} item
  250 + * @param {*} response
  251 + * @param {Number} status
  252 + * @param {Object} headers
  253 + */
  254 + onSuccessItem(item, response, status, headers) {
  255 + }
  256 + /**
  257 + * Callback
  258 + * @param {FileItem} item
  259 + * @param {*} response
  260 + * @param {Number} status
  261 + * @param {Object} headers
  262 + */
  263 + onErrorItem(item, response, status, headers) {
  264 + }
  265 + /**
  266 + * Callback
  267 + * @param {FileItem} item
  268 + * @param {*} response
  269 + * @param {Number} status
  270 + * @param {Object} headers
  271 + */
  272 + onCancelItem(item, response, status, headers) {
  273 + }
  274 + /**
  275 + * Callback
  276 + * @param {FileItem} item
  277 + * @param {*} response
  278 + * @param {Number} status
  279 + * @param {Object} headers
  280 + */
  281 + onCompleteItem(item, response, status, headers) {
  282 + }
  283 + /**
  284 + * Callback
  285 + */
  286 + onCompleteAll() {
  287 + }
  288 + /**********************
  289 + * PRIVATE
  290 + **********************/
  291 + /**
  292 + * Returns the total progress
  293 + * @param {Number} [value]
  294 + * @returns {Number}
  295 + * @private
  296 + */
  297 + _getTotalProgress(value) {
  298 + if(this.removeAfterUpload) return value || 0;
  299 +
  300 + var notUploaded = this.getNotUploadedItems().length;
  301 + var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length;
  302 + var ratio = 100 / this.queue.length;
  303 + var current = (value || 0) * ratio / 100;
  304 +
  305 + return Math.round(uploaded * ratio + current);
  306 + }
  307 + /**
  308 + * Returns array of filters
  309 + * @param {Array<Function>|String} filters
  310 + * @returns {Array<Function>}
  311 + * @private
  312 + */
  313 + _getFilters(filters) {
  314 + if(!filters) return this.filters;
  315 + if(isArray(filters)) return filters;
  316 + var names = filters.match(/[^\s,]+/g);
  317 + return this.filters
  318 + .filter(filter => names.indexOf(filter.name) !== -1);
  319 + }
  320 + /**
  321 + * Updates html
  322 + * @private
  323 + */
  324 + _render() {
  325 + if(!$rootScope.$$phase) $rootScope.$apply();
  326 + }
  327 + /**
  328 + * Returns "true" if item is a file (not folder)
  329 + * @param {File|FileLikeObject} item
  330 + * @returns {Boolean}
  331 + * @private
  332 + */
  333 + _folderFilter(item) {
  334 + return !!(item.size || item.type);
  335 + }
  336 + /**
  337 + * Returns "true" if the limit has not been reached
  338 + * @returns {Boolean}
  339 + * @private
  340 + */
  341 + _queueLimitFilter() {
  342 + return this.queue.length < this.queueLimit;
  343 + }
  344 + /**
  345 + * Returns "true" if file pass all filters
  346 + * @param {File|Object} file
  347 + * @param {Array<Function>} filters
  348 + * @param {Object} options
  349 + * @returns {Boolean}
  350 + * @private
  351 + */
  352 + _isValidFile(file, filters, options) {
  353 + this._failFilterIndex = -1;
  354 + return !filters.length ? true : filters.every((filter) => {
  355 + this._failFilterIndex++;
  356 + return filter.fn.call(this, file, options);
  357 + });
  358 + }
  359 + /**
  360 + * Checks whether upload successful
  361 + * @param {Number} status
  362 + * @returns {Boolean}
  363 + * @private
  364 + */
  365 + _isSuccessCode(status) {
  366 + return (status >= 200 && status < 300) || status === 304;
  367 + }
  368 + /**
  369 + * Transforms the server response
  370 + * @param {*} response
  371 + * @param {Object} headers
  372 + * @returns {*}
  373 + * @private
  374 + */
  375 + _transformResponse(response, headers) {
  376 + var headersGetter = this._headersGetter(headers);
  377 + forEach($http.defaults.transformResponse, (transformFn) => {
  378 + response = transformFn(response, headersGetter);
  379 + });
  380 + return response;
  381 + }
  382 + /**
  383 + * Parsed response headers
  384 + * @param headers
  385 + * @returns {Object}
  386 + * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js
  387 + * @private
  388 + */
  389 + _parseHeaders(headers) {
  390 + var parsed = {}, key, val, i;
  391 +
  392 + if(!headers) return parsed;
  393 +
  394 + forEach(headers.split('\n'), (line) => {
  395 + i = line.indexOf(':');
  396 + key = line.slice(0, i).trim().toLowerCase();
  397 + val = line.slice(i + 1).trim();
  398 +
  399 + if(key) {
  400 + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
  401 + }
  402 + });
  403 +
  404 + return parsed;
  405 + }
  406 + /**
  407 + * Returns function that returns headers
  408 + * @param {Object} parsedHeaders
  409 + * @returns {Function}
  410 + * @private
  411 + */
  412 + _headersGetter(parsedHeaders) {
  413 + return (name) => {
  414 + if(name) {
  415 + return parsedHeaders[name.toLowerCase()] || null;
  416 + }
  417 + return parsedHeaders;
  418 + };
  419 + }
  420 + /**
  421 + * The XMLHttpRequest transport
  422 + * @param {FileItem} item
  423 + * @private
  424 + */
  425 + _xhrTransport(item) {
  426 + var xhr = item._xhr = new XMLHttpRequest();
  427 + var form = new FormData();
  428 +
  429 + this._onBeforeUploadItem(item);
  430 +
  431 + forEach(item.formData, (obj) => {
  432 + forEach(obj, (value, key) => {
  433 + form.append(key, value);
  434 + });
  435 + });
  436 +
  437 + if(typeof(item._file.size) != 'number') {
  438 + throw new TypeError('The file specified is no longer valid');
  439 + }
  440 +
  441 + form.append(item.alias, item._file, item.file.name);
  442 +
  443 + xhr.upload.onprogress = (event) => {
  444 + var progress = Math.round(event.lengthComputable ? event.loaded * 100 / event.total : 0);
  445 + this._onProgressItem(item, progress);
  446 + };
  447 +
  448 + xhr.onload = () => {
  449 + var headers = this._parseHeaders(xhr.getAllResponseHeaders());
  450 + var response = this._transformResponse(xhr.response, headers);
  451 + var gist = this._isSuccessCode(xhr.status) ? 'Success' : 'Error';
  452 + var method = '_on' + gist + 'Item';
  453 + this[method](item, response, xhr.status, headers);
  454 + this._onCompleteItem(item, response, xhr.status, headers);
  455 + };
  456 +
  457 + xhr.onerror = () => {
  458 + var headers = this._parseHeaders(xhr.getAllResponseHeaders());
  459 + var response = this._transformResponse(xhr.response, headers);
  460 + this._onErrorItem(item, response, xhr.status, headers);
  461 + this._onCompleteItem(item, response, xhr.status, headers);
  462 + };
  463 +
  464 + xhr.onabort = () => {
  465 + var headers = this._parseHeaders(xhr.getAllResponseHeaders());
  466 + var response = this._transformResponse(xhr.response, headers);
  467 + this._onCancelItem(item, response, xhr.status, headers);
  468 + this._onCompleteItem(item, response, xhr.status, headers);
  469 + };
  470 +
  471 + xhr.open(item.method, item.url, true);
  472 +
  473 + xhr.withCredentials = item.withCredentials;
  474 +
  475 + forEach(item.headers, (value, name) => {
  476 + xhr.setRequestHeader(name, value);
  477 + });
  478 +
  479 + xhr.send(form);
  480 + this._render();
  481 + }
  482 + /**
  483 + * The IFrame transport
  484 + * @param {FileItem} item
  485 + * @private
  486 + */
  487 + _iframeTransport(item) {
  488 + var form = element('<form style="display: none;" />');
  489 + var iframe = element('<iframe name="iframeTransport' + Date.now() + '">');
  490 + var input = item._input;
  491 +
  492 + if(item._form) item._form.replaceWith(input); // remove old form
  493 + item._form = form; // save link to new form
  494 +
  495 + this._onBeforeUploadItem(item);
  496 +
  497 + input.prop('name', item.alias);
  498 +
  499 + forEach(item.formData, (obj) => {
  500 + forEach(obj, (value, key) => {
  501 + var element_ = element('<input type="hidden" name="' + key + '" />');
  502 + element_.val(value);
  503 + form.append(element_);
  504 + });
  505 + });
  506 +
  507 + form.prop({
  508 + action: item.url,
  509 + method: 'POST',
  510 + target: iframe.prop('name'),
  511 + enctype: 'multipart/form-data',
  512 + encoding: 'multipart/form-data' // old IE
  513 + });
  514 +
  515 + iframe.bind('load', () => {
  516 + var html = '';
  517 + var status = 200;
  518 +
  519 + try {
  520 + // Fix for legacy IE browsers that loads internal error page
  521 + // when failed WS response received. In consequence iframe
  522 + // content access denied error is thrown becouse trying to
  523 + // access cross domain page. When such thing occurs notifying
  524 + // with empty response object. See more info at:
  525 + // http://stackoverflow.com/questions/151362/access-is-denied-error-on-accessing-iframe-document-object
  526 + // Note that if non standard 4xx or 5xx error code returned
  527 + // from WS then response content can be accessed without error
  528 + // but 'XHR' status becomes 200. In order to avoid confusion
  529 + // returning response via same 'success' event handler.
  530 +
  531 + // fixed angular.contents() for iframes
  532 + html = iframe[0].contentDocument.body.innerHTML;
  533 + } catch(e) {
  534 + // in case we run into the access-is-denied error or we have another error on the server side
  535 + // (intentional 500,40... errors), we at least say 'something went wrong' -> 500
  536 + status = 500;
  537 + }
  538 +
  539 + var xhr = {response: html, status: status, dummy: true};
  540 + var headers = {};
  541 + var response = this._transformResponse(xhr.response, headers);
  542 +
  543 + this._onSuccessItem(item, response, xhr.status, headers);
  544 + this._onCompleteItem(item, response, xhr.status, headers);
  545 + });
  546 +
  547 + form.abort = () => {
  548 + var xhr = {status: 0, dummy: true};
  549 + var headers = {};
  550 + var response;
  551 +
  552 + iframe.unbind('load').prop('src', 'javascript:false;');
  553 + form.replaceWith(input);
  554 +
  555 + this._onCancelItem(item, response, xhr.status, headers);
  556 + this._onCompleteItem(item, response, xhr.status, headers);
  557 + };
  558 +
  559 + input.after(form);
  560 + form.append(input).append(iframe);
  561 +
  562 + form[0].submit();
  563 + this._render();
  564 + }
  565 + /**
  566 + * Inner callback
  567 + * @param {File|Object} item
  568 + * @param {Object} filter
  569 + * @param {Object} options
  570 + * @private
  571 + */
  572 + _onWhenAddingFileFailed(item, filter, options) {
  573 + this.onWhenAddingFileFailed(item, filter, options);
  574 + }
  575 + /**
  576 + * Inner callback
  577 + * @param {FileItem} item
  578 + */
  579 + _onAfterAddingFile(item) {
  580 + this.onAfterAddingFile(item);
  581 + }
  582 + /**
  583 + * Inner callback
  584 + * @param {Array<FileItem>} items
  585 + */
  586 + _onAfterAddingAll(items) {
  587 + this.onAfterAddingAll(items);
  588 + }
  589 + /**
  590 + * Inner callback
  591 + * @param {FileItem} item
  592 + * @private
  593 + */
  594 + _onBeforeUploadItem(item) {
  595 + item._onBeforeUpload();
  596 + this.onBeforeUploadItem(item);
  597 + }
  598 + /**
  599 + * Inner callback
  600 + * @param {FileItem} item
  601 + * @param {Number} progress
  602 + * @private
  603 + */
  604 + _onProgressItem(item, progress) {
  605 + var total = this._getTotalProgress(progress);
  606 + this.progress = total;
  607 + item._onProgress(progress);
  608 + this.onProgressItem(item, progress);
  609 + this.onProgressAll(total);
  610 + this._render();
  611 + }
  612 + /**
  613 + * Inner callback
  614 + * @param {FileItem} item
  615 + * @param {*} response
  616 + * @param {Number} status
  617 + * @param {Object} headers
  618 + * @private
  619 + */
  620 + _onSuccessItem(item, response, status, headers) {
  621 + item._onSuccess(response, status, headers);
  622 + this.onSuccessItem(item, response, status, headers);
  623 + }
  624 + /**
  625 + * Inner callback
  626 + * @param {FileItem} item
  627 + * @param {*} response
  628 + * @param {Number} status
  629 + * @param {Object} headers
  630 + * @private
  631 + */
  632 + _onErrorItem(item, response, status, headers) {
  633 + item._onError(response, status, headers);
  634 + this.onErrorItem(item, response, status, headers);
  635 + }
  636 + /**
  637 + * Inner callback
  638 + * @param {FileItem} item
  639 + * @param {*} response
  640 + * @param {Number} status
  641 + * @param {Object} headers
  642 + * @private
  643 + */
  644 + _onCancelItem(item, response, status, headers) {
  645 + item._onCancel(response, status, headers);
  646 + this.onCancelItem(item, response, status, headers);
  647 + }
  648 + /**
  649 + * Inner callback
  650 + * @param {FileItem} item
  651 + * @param {*} response
  652 + * @param {Number} status
  653 + * @param {Object} headers
  654 + * @private
  655 + */
  656 + _onCompleteItem(item, response, status, headers) {
  657 + item._onComplete(response, status, headers);
  658 + this.onCompleteItem(item, response, status, headers);
  659 +
  660 + var nextItem = this.getReadyItems()[0];
  661 + this.isUploading = false;
  662 +
  663 + if(isDefined(nextItem)) {
  664 + nextItem.upload();
  665 + return;
  666 + }
  667 +
  668 + this.onCompleteAll();
  669 + this.progress = this._getTotalProgress();
  670 + this._render();
  671 + }
  672 + /**********************
  673 + * STATIC
  674 + **********************/
  675 + /**
  676 + * Returns "true" if value an instance of File
  677 + * @param {*} value
  678 + * @returns {Boolean}
  679 + * @private
  680 + */
  681 + static isFile(value) {
  682 + return (File && value instanceof File);
  683 + }
  684 + /**
  685 + * Returns "true" if value an instance of FileLikeObject
  686 + * @param {*} value
  687 + * @returns {Boolean}
  688 + * @private
  689 + */
  690 + static isFileLikeObject(value) {
  691 + return value instanceof FileLikeObject;
  692 + }
  693 + /**
  694 + * Returns "true" if value is array like object
  695 + * @param {*} value
  696 + * @returns {Boolean}
  697 + */
  698 + static isArrayLikeObject(value) {
  699 + return (isObject(value) && 'length' in value);
  700 + }
  701 + /**
  702 + * Inherits a target (Class_1) by a source (Class_2)
  703 + * @param {Function} target
  704 + * @param {Function} source
  705 + */
  706 + static inherit(target, source) {
  707 + target.prototype = Object.create(source.prototype);
  708 + target.prototype.constructor = target;
  709 + target.super_ = source;
  710 + }
  711 + }
  712 +
  713 +
  714 + /**********************
  715 + * PUBLIC
  716 + **********************/
  717 + /**
  718 + * Checks a support the html5 uploader
  719 + * @returns {Boolean}
  720 + * @readonly
  721 + */
  722 + FileUploader.prototype.isHTML5 = !!(File && FormData);
  723 + /**********************
  724 + * STATIC
  725 + **********************/
  726 + /**
  727 + * @borrows FileUploader.prototype.isHTML5
  728 + */
  729 + FileUploader.isHTML5 = FileUploader.prototype.isHTML5;
  730 +
  731 +
  732 + return FileUploader;
  733 +}
  734 +
  735 +
  736 +module.exports.$inject = [
  737 + 'fileUploaderOptions',
  738 + '$rootScope',
  739 + '$http',
  740 + '$window',
  741 + 'FileLikeObject',
  742 + 'FileItem'
  743 +];
0 \ No newline at end of file 744 \ No newline at end of file
src/main/resources/static/assets/bower_components/angular-file-upload/src/values/options.js 0 → 100644
  1 +'use strict';
  2 +
  3 +
  4 +export default {
  5 + url: '/',
  6 + alias: 'file',
  7 + headers: {},
  8 + queue: [],
  9 + progress: 0,
  10 + autoUpload: false,
  11 + removeAfterUpload: false,
  12 + method: 'POST',
  13 + filters: [],
  14 + formData: [],
  15 + queueLimit: Number.MAX_VALUE,
  16 + withCredentials: false
  17 +};
0 \ No newline at end of file 18 \ No newline at end of file
src/main/resources/static/pages/base/line/add.html
@@ -220,6 +220,79 @@ @@ -220,6 +220,79 @@
220 <input type="text" class="form-control" name="endPhone" id="startPhoneInput" placeholder="终点站调度电话"> 220 <input type="text" class="form-control" name="endPhone" id="startPhoneInput" placeholder="终点站调度电话">
221 </div> 221 </div>
222 </div> 222 </div>
  223 + <!--
  224 + 起始站名称
  225 + <div class="form-group">
  226 + <label class="control-label col-md-3"> 起始站名称: </label>
  227 + <div class="col-md-4">
  228 + <input type="text" class="form-control" name="startStationName" id="startStationNameInput" placeholder="起始站名称">
  229 + </div>
  230 + </div>
  231 +
  232 + 起始站首班车时间
  233 + <div class="form-group">
  234 + <label class="control-label col-md-3"> 起始站首班车时间: </label>
  235 + <div class="col-md-4">
  236 + <input type="text" class="form-control" name="startStationFirstTime" id="startStationFirstTimeInput" placeholder="起始站首班车时间">
  237 + </div>
  238 + </div>
  239 +
  240 + 起始站末班车时间
  241 + <div class="form-group">
  242 + <label class="control-label col-md-3"> 起始站末班车时间: </label>
  243 + <div class="col-md-4">
  244 + <input type="text" class="form-control" name="StartStationEndTime" id="StartStationEndTimeInput" placeholder="起始站末班车时间 ">
  245 + </div>
  246 + </div>
  247 +
  248 +
  249 + 终点站名称
  250 + <div class="form-group">
  251 + <label class="control-label col-md-3"> 终点站名称: </label>
  252 + <div class="col-md-4">
  253 + <input type="text" class="form-control" name="endStationName" id="endStationNameInput" placeholder="终点站名称">
  254 + </div>
  255 + </div>
  256 +
  257 + 终点站首班时间
  258 + <div class="form-group">
  259 + <label class="control-label col-md-3"> 终点站首班车时间: </label>
  260 + <div class="col-md-4">
  261 + <input type="text" class="form-control" name="endStationFirstTime" id="endStationFirstTimeInput" placeholder="终点站首班车时间">
  262 + </div>
  263 + </div>
  264 +
  265 + 终点站末班时间
  266 + <div class="form-group">
  267 + <label class="control-label col-md-3"> 终点站末班车时间: </label>
  268 + <div class="col-md-4">
  269 + <input type="text" class="form-control" name="endStationEndTime" id="endStationEndTimeInput" placeholder="终点站末班车时间 ">
  270 + </div>
  271 + </div> -->
  272 +
  273 + <!-- 车辆总数 -->
  274 + <div class="form-group">
  275 + <label class="control-label col-md-3"> 车辆总数: </label>
  276 + <div class="col-md-4">
  277 + <input type="text" class="form-control" name="carSumNumber" id="carSumNumberInput" placeholder="车辆总数">
  278 + </div>
  279 + </div>
  280 +
  281 + <!-- 空调车辆数 -->
  282 + <div class="form-group">
  283 + <label class="control-label col-md-3"> 空调车辆数: </label>
  284 + <div class="col-md-4">
  285 + <input type="text" class="form-control" name="hvacCarNumber" id="hvacCarNumberInput" placeholder="空调车辆数">
  286 + </div>
  287 + </div>
  288 +
  289 + <!-- 普通车辆数 -->
  290 + <div class="form-group">
  291 + <label class="control-label col-md-3"> 普通车辆数: </label>
  292 + <div class="col-md-4">
  293 + <input type="text" class="form-control" name="ordCarNumber" id="ordCarNumberInput" placeholder="普通车辆数">
  294 + </div>
  295 + </div>
223 296
224 <!-- 描述/说明 --> 297 <!-- 描述/说明 -->
225 <div class="form-group"> 298 <div class="form-group">
src/main/resources/static/pages/base/line/details.html
@@ -11,97 +11,296 @@ @@ -11,97 +11,296 @@
11 <li><span class="active">线路详情</span></li> 11 <li><span class="active">线路详情</span></li>
12 </ul> 12 </ul>
13 13
14 -<div class="row">  
15 - <div class="col-md-12">  
16 - <div class="portlet light porttlet-fit bordered">  
17 - <div class="portlet-title">  
18 - <div class="caption">  
19 - <i class="fa fa-info-circle font-dark"></i>  
20 - <span class="caption-subject font-dark sbold uppercase">线路详情</span>  
21 - </div>  
22 - <div class="actions">  
23 - <div class="btn-group btn-group-devided" data-toggle="buttons">  
24 - <a class="btn btn-circle blue" href="list.html" data-pjax><i class="fa fa-reply"></i> 返回</a> 14 +<div class="portlet light bordered">
  15 + <div class="portlet-title">
  16 + <div class="caption">
  17 + <i class="icon-equalizer font-red-sunglo"></i>
  18 + <span class="caption-subject font-red-sunglo bold uppercase">线路详情信息</span>
  19 + </div>
  20 + </div>
  21 + <div class="portlet-body form" id="lineDetailsForm">
  22 +
  23 + <!-- START FORM -->
  24 + <form action="/" class="form-horizontal" id="line_details_form" >
  25 +
  26 + <!-- 表单内容 -->
  27 + <div class="form-body">
  28 +
  29 + <!-- 线路名称 -->
  30 + <div class="form-group">
  31 + <label class="control-label col-md-3">
  32 + <span class="required"> * </span>线路名称:
  33 + </label>
  34 + <div class="col-md-4">
  35 + <input type="text" class="form-control" name="name" id="nameInput" placeholder="线路名称" />
  36 + <span class="help-block"> 例如 :浦东88路 </span>
  37 + </div>
  38 + </div>
  39 +
  40 + <!-- 英文名称 -->
  41 + <div class="form-group">
  42 + <label class="control-label col-md-3"> 英文名称: </label>
  43 + <div class="col-md-4">
  44 + <input type="text" class="form-control" name="es" id="esInput" placeholder="英文名称">
  45 + </div>
  46 + </div>
  47 +
  48 + <!-- 线路简称 -->
  49 + <div class="form-group">
  50 + <label class="control-label col-md-3"> 线路简称:</label>
  51 + <div class="col-md-4">
  52 + <input type="text" class="form-control" name="shortName" id="shortNameInput" placeholder="线路简称">
  53 + </div>
  54 + </div>
  55 +
  56 + <!-- 线路编码 -->
  57 + <div class="form-group">
  58 + <label class="control-label col-md-3">
  59 + <span class="required"> * </span>线路编码:
  60 + </label>
  61 + <div class="col-md-4">
  62 + <input type="text" class="form-control" name="lineCode" id="lineCodeInput" placeholder="线路编码">
  63 + </div>
  64 + </div>
  65 +
  66 + <!-- 所属公司 -->
  67 + <div class="form-group">
  68 + <label class="control-label col-md-3"> 所属公司:</label>
  69 + <div class="col-md-4">
  70 + <select name="company" class="form-control" id="companySelect"></select>
  71 + </div>
  72 + </div>
  73 +
  74 + <!-- 所属分公司 -->
  75 + <div class="form-group">
  76 + <label class="control-label col-md-3"> 所属分公司:</label>
  77 + <div class="col-md-4">
  78 + <select name="brancheCompany" class="form-control" id="brancheCompanySelect"></select>
  79 + </div>
  80 + </div>
  81 +
  82 + <!-- 线路性质 -->
  83 + <div class="form-group">
  84 + <label class="control-label col-md-3"> 线路性质:</label>
  85 + <div class="col-md-4">
  86 + <select name="nature" class="form-control" id="natureSelect">
  87 + <option value="">-- 请选择线路性质 --</option>
  88 + <option value="lj">路救</option>
  89 + <option value="bc">备车</option>
  90 + <option value="dbc">定班车</option>
  91 + <option value="yxl">夜宵路</option>
  92 + <option value="cgxl">常规线路</option>
  93 + <option value="gjxl">过江线路</option>
  94 + <option value="csbs">穿梭巴士</option>
  95 + <option value="tyxl">特约线路</option>
  96 + <option value="cctxl">村村通线路</option>
  97 + <option value="qt">其他</option>
  98 + </select>
  99 + </div>
  100 + </div>
  101 +
  102 + <!-- 线路等级 -->
  103 + <div class="form-group">
  104 + <label class="control-label col-md-3"> 线路等级:</label>
  105 + <div class="col-md-4">
  106 + <select name="level" class="form-control" id="levelSelect">
  107 + <option value="">-- 请选择线路等级 --</option>
  108 + <option value="1">一级线路</option>
  109 + <option value="2">二级线路</option>
  110 + <option value="0">未知等级</option>
  111 + </select>
25 </div> 112 </div>
26 - </div> 113 + </div>
  114 +
  115 + <!-- 是否撤销 -->
  116 + <div class="form-group">
  117 + <label class="control-label col-md-3">是否撤销:</label>
  118 + <div class="col-md-4">
  119 + <div class="md-radio-inline">
  120 + <div class="md-radio">
  121 + <input type="radio" id="radio14" name="destroy" data-title="是" class="md-radiobtn" value="1" >
  122 + <label for="radio14">
  123 + <span></span>
  124 + <span class="check"></span>
  125 + <span class="box"></span> 是
  126 + </label>
  127 + </div>
  128 + <div class="md-radio has-error">
  129 + <input type="radio" id="radio15" name="destroy" class="md-radiobtn" data-title="否" value="0">
  130 + <label for="radio15" style="color:#FFC0CB">
  131 + <span></span>
  132 + <span class="check"></span>
  133 + <span class="box"></span> 否
  134 + </label>
  135 + </div>
  136 + </div>
  137 + </div>
  138 + </div>
  139 +
  140 + <!-- 是否宵夜 -->
  141 + <div class="form-group">
  142 + <label class="control-label col-md-3">是否宵夜:</label>
  143 + <div class="col-md-4">
  144 + <div class="md-radio-inline">
  145 + <div class="md-radio">
  146 + <input type="radio" id="radio16" name="supperLine" class="md-radiobtn" data-title="是" value="1">
  147 + <label for="radio16">
  148 + <span></span>
  149 + <span class="check"></span>
  150 + <span class="box"></span> 是
  151 + </label>
  152 + </div>
  153 + <div class="md-radio has-error">
  154 + <input type="radio" id="radio17" name="supperLine" class="md-radiobtn" data-title="否" value="0">
  155 + <label for="radio17" style="color:#FFC0CB">
  156 + <span></span>
  157 + <span class="check"></span>
  158 + <span class="box"></span> 否
  159 + </label>
  160 + </div>
  161 + </div>
  162 + </div>
  163 + </div>
  164 +
  165 + <!-- 开辟日期 -->
  166 + <div class="form-group">
  167 + <label class="control-label col-md-3"> 开辟日期: </label>
  168 + <div class="col-md-4">
  169 + <input type="text" class="form-control" name="openDate" id="openDateInput" placeholder="开辟日期">
  170 + </div>
  171 + </div>
  172 +
  173 + <!-- 线路沿革 -->
  174 + <div class="form-group">
  175 + <label class="control-label col-md-3"> 线路沿革: </label>
  176 + <div class="col-md-4">
  177 + <textarea class="form-control" rows="3" name="history" id="historyTextarea" placeholder="线路沿革"></textarea>
  178 + <span class="help-block">日期及内容:如2014-1-1,开辟;2014-5-1,延线;</span>
  179 + </div>
  180 + </div>
  181 +
  182 + <!-- 设备线路编码 -->
  183 + <div class="form-group">
  184 + <label class="control-label col-md-3"> 设备线路编码: </label>
  185 + <div class="col-md-4">
  186 + <input type="text" class="form-control" name="eqLinecode" id="eqLinecodeInput" placeholder="设备线路编码">
  187 + </div>
  188 + </div>
  189 +
  190 + <!-- 上海市线路编码 -->
  191 + <div class="form-group">
  192 + <label class="control-label col-md-3"> 上海市线路编码: </label>
  193 + <div class="col-md-4">
  194 + <input type="text" class="form-control" name="shanghaiLinecode" id="shanghaiLinecodeInput" placeholder="上海市线路编码">
  195 + </div>
  196 + </div>
  197 +
  198 + <!-- 起始站调度电话 -->
  199 + <div class="form-group">
  200 + <label class="control-label col-md-3"> 起始站调度电话: </label>
  201 + <div class="col-md-4">
  202 + <input type="text" class="form-control" name="startPhone" id="startPhoneInput" placeholder="起始站调度电话">
  203 + </div>
  204 + </div>
  205 +
  206 + <!-- 终点站调度电话 -->
  207 + <div class="form-group">
  208 + <label class="control-label col-md-3"> 终点站调度电话: </label>
  209 + <div class="col-md-4">
  210 + <input type="text" class="form-control" name="endPhone" id="startPhoneInput" placeholder="终点站调度电话">
  211 + </div>
  212 + </div>
  213 + <!-- 起始站名称 -->
  214 + <div class="form-group">
  215 + <label class="control-label col-md-3"> 起始站名称: </label>
  216 + <div class="col-md-4">
  217 + <input type="text" class="form-control" name="startStationName" id="startStationNameInput" placeholder="起始站名称">
  218 + </div>
  219 + </div>
  220 +
  221 + <!-- 起始站首班车时间 -->
  222 + <div class="form-group">
  223 + <label class="control-label col-md-3"> 起始站首班车时间: </label>
  224 + <div class="col-md-4">
  225 + <input type="text" class="form-control" name="startStationFirstTime" id="startStationFirstTimeInput" placeholder="起始站首班车时间">
  226 + </div>
  227 + </div>
  228 +
  229 + <!-- 起始站末班车时间 -->
  230 + <div class="form-group">
  231 + <label class="control-label col-md-3"> 起始站末班车时间: </label>
  232 + <div class="col-md-4">
  233 + <input type="text" class="form-control" name="startStationEndTime" id="StartStationEndTimeInput" placeholder="起始站末班车时间 ">
  234 + </div>
  235 + </div>
  236 +
  237 +
  238 + <!-- 终点站名称 -->
  239 + <div class="form-group">
  240 + <label class="control-label col-md-3"> 终点站名称: </label>
  241 + <div class="col-md-4">
  242 + <input type="text" class="form-control" name="endStationName" id="endStationNameInput" placeholder="终点站名称">
  243 + </div>
  244 + </div>
  245 +
  246 + <!-- 终点站首班时间 -->
  247 + <div class="form-group">
  248 + <label class="control-label col-md-3"> 终点站首班车时间: </label>
  249 + <div class="col-md-4">
  250 + <input type="text" class="form-control" name="endStationFirstTime" id="endStationFirstTimeInput" placeholder="终点站首班车时间">
  251 + </div>
  252 + </div>
  253 +
  254 + <!-- 终点站末班时间 -->
  255 + <div class="form-group">
  256 + <label class="control-label col-md-3"> 终点站末班车时间: </label>
  257 + <div class="col-md-4">
  258 + <input type="text" class="form-control" name="endStationEndTime" id="endStationEndTimeInput" placeholder="终点站末班车时间 ">
  259 + </div>
  260 + </div>
  261 +
  262 + <!-- 车辆总数 -->
  263 + <div class="form-group">
  264 + <label class="control-label col-md-3"> 车辆总数: </label>
  265 + <div class="col-md-4">
  266 + <input type="text" class="form-control" name="carSumNumber" id="carSumNumberInput" placeholder="车辆总数">
  267 + </div>
  268 + </div>
  269 +
  270 + <!-- 空调车辆数 -->
  271 + <div class="form-group">
  272 + <label class="control-label col-md-3"> 空调车辆数: </label>
  273 + <div class="col-md-4">
  274 + <input type="text" class="form-control" name="hvacCarNumber" id="hvacCarNumberInput" placeholder="空调车辆数">
  275 + </div>
  276 + </div>
  277 +
  278 + <!-- 普通车辆数 -->
  279 + <div class="form-group">
  280 + <label class="control-label col-md-3"> 普通车辆数: </label>
  281 + <div class="col-md-4">
  282 + <input type="text" class="form-control" name="ordCarNumber" id="ordCarNumberInput" placeholder="普通车辆数">
  283 + </div>
  284 + </div>
  285 +
  286 + <!-- 描述/说明 -->
  287 + <div class="form-group">
  288 + <label class="control-label col-md-3"> 描述/说明: </label>
  289 + <div class="col-md-4">
  290 + <textarea class="form-control" rows="3" name="descriptions" id="descriptionsTextarea" placeholder="描述/说明"></textarea>
  291 + </div>
  292 + </div>
27 </div> 293 </div>
28 - <div class="portlet-body">  
29 - <div class="table-container" style="margin-top: 10px">  
30 - <table class="table table-striped table-bordered table-hover table-checkable" id="line_details">  
31 - <thead>  
32 - <tr role="row" class="heading">  
33 - <th width="8%">线路编码</th>  
34 - <th width="8%">线路名称</th>  
35 - <th width="10%">英文名称</th>  
36 - <th width="10%">线路简称</th>  
37 - <th width="10%">所属公司</th>  
38 - <th width="10%">所属分公司</th>  
39 - <th width="10%">线路性质</th>  
40 - <th width="10%">线路等级</th>  
41 - <th width="10%">是否撤消</th>  
42 - <th width="10%">是否夜宵线</th>  
43 - <th width="10%">起始站调度电话</th>  
44 - <th width="10%">终点站调度电话</th>  
45 - <th width="10%">开辟日期</th>  
46 - <th width="10%">线路沿革</th>  
47 - </tr>  
48 - </thead>  
49 - <tbody></tbody>  
50 - </table>  
51 - <div style="text-align: right;">  
52 - <ul id="pagination" class="pagination"></ul> 294 + <div class="form-actions">
  295 + <div class="row">
  296 + <div class="col-md-offset-3 col-md-4">
  297 + <a type="button" class="btn default" href="list.html" style="margin-left: 35%;" data-pjax><i class="fa fa-reply"></i> 返回</a>
53 </div> 298 </div>
54 </div> 299 </div>
55 </div> 300 </div>
56 - </div> 301 + </form>
  302 + <!-- END FORM-->
  303 +
57 </div> 304 </div>
58 </div> 305 </div>
59 -<script type="text/html" id="line_details_temp">  
60 -{{each list as obj i }}  
61 -<tr>  
62 - <td>  
63 - {{obj.lineCode}}  
64 - </td>  
65 - <td>  
66 - {{obj.name}}  
67 - </td>  
68 - <td>  
69 - {{obj.es}}  
70 - </td>  
71 - <td>  
72 - {{obj.shortName}}  
73 - </td>  
74 - <td>  
75 - {{obj.company}}  
76 - </td>  
77 - <td>  
78 - {{obj.brancheCompany}}  
79 - </td>  
80 - <td>  
81 - {{obj.nature}}  
82 - </td>  
83 - <td>  
84 - {{obj.level}}  
85 - </td>  
86 - <td>  
87 - {{obj.destroy}}  
88 - </td>  
89 - <td>  
90 - {{obj.supperLine}}  
91 - </td>  
92 - <td>  
93 - {{obj.startPhone}}  
94 - </td>  
95 - <td>  
96 - {{obj.endPhone}}  
97 - </td>  
98 - <td>  
99 - {{obj.openDate}}  
100 - </td>  
101 - <td>  
102 - {{obj.history}}  
103 - </td>  
104 -</tr>  
105 -{{/each}}  
106 -</script>  
107 <script type="text/javascript" src="/pages/base/line/js/line-details-info.js"></script> 306 <script type="text/javascript" src="/pages/base/line/js/line-details-info.js"></script>
108 \ No newline at end of file 307 \ No newline at end of file
src/main/resources/static/pages/base/line/edit.html
@@ -219,7 +219,31 @@ @@ -219,7 +219,31 @@
219 </div> 219 </div>
220 </div> 220 </div>
221 221
222 - <!-- --> 222 + <!-- 车辆总数 -->
  223 + <div class="form-group">
  224 + <label class="control-label col-md-3"> 车辆总数: </label>
  225 + <div class="col-md-4">
  226 + <input type="text" class="form-control" name="carSumNumber" id="carSumNumberInput" placeholder="车辆总数">
  227 + </div>
  228 + </div>
  229 +
  230 + <!-- 空调车辆数 -->
  231 + <div class="form-group">
  232 + <label class="control-label col-md-3"> 空调车辆数: </label>
  233 + <div class="col-md-4">
  234 + <input type="text" class="form-control" name="hvacCarNumber" id="hvacCarNumberInput" placeholder="空调车辆数">
  235 + </div>
  236 + </div>
  237 +
  238 + <!-- 普通车辆数 -->
  239 + <div class="form-group">
  240 + <label class="control-label col-md-3"> 普通车辆数: </label>
  241 + <div class="col-md-4">
  242 + <input type="text" class="form-control" name="ordCarNumber" id="ordCarNumberInput" placeholder="普通车辆数">
  243 + </div>
  244 + </div>
  245 +
  246 + <!-- 描述/说明 -->
223 <div class="form-group"> 247 <div class="form-group">
224 <label class="control-label col-md-3"> 描述/说明: </label> 248 <label class="control-label col-md-3"> 描述/说明: </label>
225 <div class="col-md-4"> 249 <div class="col-md-4">
src/main/resources/static/pages/base/line/js/line-add-form.js
1 $(function(){ 1 $(function(){
2 2
3 -  
4 // 获取线路编码 3 // 获取线路编码
5 function getLineCode(cb) { 4 function getLineCode(cb) {
6 5
7 // 获取线路编码 6 // 获取线路编码
8 $.get('/line/getLineCode',function(lineCode){ 7 $.get('/line/getLineCode',function(lineCode){
9 8
10 - cb && cb(lineCode); 9 + return cb && cb(lineCode);
11 10
12 }); 11 });
13 } 12 }
14 13
  14 + // 获取线路编码元素并设值
15 getLineCode(function(result){ 15 getLineCode(function(result){
16 16
17 // 设置线路编码值 17 // 设置线路编码值
@@ -38,8 +38,10 @@ $(function(){ @@ -38,8 +38,10 @@ $(function(){
38 // 日期控件 38 // 日期控件
39 $('#openDateInput').datetimepicker({ 39 $('#openDateInput').datetimepicker({
40 40
  41 + // 日期控件时间格式
41 format : 'YYYY-MM-DD', 42 format : 'YYYY-MM-DD',
42 43
  44 + // 语言
43 locale: 'zh-cn' 45 locale: 'zh-cn'
44 46
45 }); 47 });
@@ -203,6 +205,36 @@ $(function(){ @@ -203,6 +205,36 @@ $(function(){
203 digits : true 205 digits : true
204 }, 206 },
205 207
  208 + // 车辆总数
  209 + 'carSumNumber' : {
  210 +
  211 + // 必须输入合法的数字(负数,小数)。
  212 + number : true,
  213 +
  214 + // 必须输入整数。
  215 + digits : true
  216 + },
  217 +
  218 + // 空调车辆数
  219 + 'hvacCarNumber' : {
  220 +
  221 + // 必须输入合法的数字(负数,小数)。
  222 + number : true,
  223 +
  224 + // 必须输入整数。
  225 + digits : true
  226 + },
  227 +
  228 + // 普通车辆数
  229 + 'ordCarNumber' : {
  230 +
  231 + // 必须输入合法的数字(负数,小数)。
  232 + number : true,
  233 +
  234 + // 必须输入整数。
  235 + digits : true
  236 + },
  237 +
206 // 描述/说明 238 // 描述/说明
207 'descriptions' : { 239 'descriptions' : {
208 240
src/main/resources/static/pages/base/line/js/line-details-info.js
1 $(function(){ 1 $(function(){
2 2
3 // 获取参数ID 3 // 获取参数ID
4 - var lineId = $.url().param('lineId'); 4 + var lineId = $.url().param('no');
5 5
6 if(lineId) { 6 if(lineId) {
7 7
8 - $get('/line/all',{id_eq:lineId},function(data) { 8 + // 填充公司下拉框
  9 + selectTemp(function(){
9 10
10 - if(data) { 11 + // 根据ID查询详细信息
  12 + $get('/line/' + lineId ,null, function(result){
11 13
12 - var tbodyHtml = template('line_details_temp',{list : data});  
13 -  
14 - // 把渲染好的模版html文本追加到表格中  
15 - $('#line_details tbody').html(tbodyHtml);  
16 -  
17 - }  
18 - 14 + // 如果不为空
  15 + if(result) {
  16 +
  17 + // 定义日期格式
  18 + var fs = 'YYYY-MM-DD'
  19 +
  20 + // 设置日期格式
  21 + result.openDate = moment(result.openDate).format(fs);
  22 +
  23 + // 获取线路详情表单元素并设值
  24 + putFormData(result, '#line_details_form');
  25 +
  26 + // 获取表单元素并设置Disabled属性
  27 + $('input,select,textarea','#line_details_form').attr('Disabled','Disabled');
  28 +
  29 + // 设置公司值
  30 + $('#companySelect').val(result.company);
  31 +
  32 + // 填充分公司下拉框选择值
  33 + getbrancheCompanyValues(result.company,function(){
  34 +
  35 + // 设置分公司
  36 + $('#brancheCompanySelect').val(result.brancheCompany);
  37 +
  38 + });
  39 +
  40 + }
  41 +
  42 + });
19 }); 43 });
20 44
21 } else { 45 } else {
22 46
23 // 缺少ID 47 // 缺少ID
24 - layer.confirm('【ID缺失,请点击返回,重新进行详情操作】', {  
25 - btn : [ '返回' ],icon: 3, title:'提示'  
26 - }, function(index){ 48 + layer.confirm('【ID缺失,请点击返回,重新进行详情操作】', {btn : [ '返回' ],icon: 3, title:'提示'}, function(index){
  49 +
  50 + // 关闭弹出层
27 layer.close(index); 51 layer.close(index);
  52 +
  53 + // 放回list页面
28 loadPage('list.html'); 54 loadPage('list.html');
  55 +
29 }); 56 });
30 57
31 } 58 }
32 59
  60 + // 填充公司下拉框
  61 + function selectTemp(callback) {
  62 +
  63 + // 填充公司下拉框选择值
  64 + $.get('/business/all', {upCode_eq: '88'}, function(array){
  65 +
  66 + // 公司下拉options属性值
  67 + var options = '<option value="">-- 请选择公司 --</option>';
  68 +
  69 + // 遍历array
  70 + $.each(array, function(i,d){
  71 +
  72 + options += '<option value="'+d.businessCode+'">'+d.businessName+'</option>';
  73 +
  74 + });
  75 +
  76 + // 填充公司下拉框options
  77 + $('#companySelect').html(options);
  78 +
  79 + return callback && callback();
  80 +
  81 + });
  82 + }
  83 +
  84 +
  85 + // 填充分公司下拉框选择值
  86 + function getbrancheCompanyValues(businessCode,cb){
  87 +
  88 + // 分公司下拉框options属性值
  89 + var options = '<option value="">-- 请选择分公司 --</option>';
  90 +
  91 + if(businessCode) {
  92 +
  93 + $get('/business/all', {upCode_eq: businessCode}, function(brancheCompany){
  94 +
  95 + // 遍历brancheCompany
  96 + $.each(brancheCompany, function(i,d){
  97 +
  98 + options += '<option value="'+d.businessCode+'">'+d.businessName+'</option>';
  99 +
  100 + });
  101 +
  102 + // 填充分公司下拉框options
  103 + $('#brancheCompanySelect').html(options);
  104 +
  105 + return cb && cb();
  106 +
  107 + });
  108 +
  109 + } else {
  110 +
  111 + // 填充分公司下拉框options
  112 + $('#brancheCompanySelect').html(options);
  113 +
  114 + return cb && cb();
  115 + }
  116 +
  117 + }
33 }); 118 });
34 \ No newline at end of file 119 \ No newline at end of file
src/main/resources/static/pages/base/line/js/line-edit-form.js
1 !function(){ 1 !function(){
2 2
3 // 获取参数ID 3 // 获取参数ID
4 - var lineId = $.url().param('lineId'); 4 + var lineId = $.url().param('no');
5 5
6 // 如果参数ID不为空 6 // 如果参数ID不为空
7 if(lineId) { 7 if(lineId) {
8 8
  9 + // 获取线路Id元素并设值
9 $('#lineId').val(lineId); 10 $('#lineId').val(lineId);
10 11
  12 + // 初始化公司下拉框
11 selectTemp(function(){ 13 selectTemp(function(){
12 14
13 // 根据ID查询详细信息 15 // 根据ID查询详细信息
@@ -22,11 +24,13 @@ @@ -22,11 +24,13 @@
22 // 设置日期 24 // 设置日期
23 result.openDate = moment(result.openDate).format(fs); 25 result.openDate = moment(result.openDate).format(fs);
24 26
  27 + // 填充修改线路表单元素值
25 putFormData(result, '#line_edit_form'); 28 putFormData(result, '#line_edit_form');
26 29
27 // 设置公司值 30 // 设置公司值
28 $('#companySelect').val(result.company); 31 $('#companySelect').val(result.company);
29 32
  33 + // 填充分公司下拉框选择值
30 getbrancheCompanyValues(result.company,function(){ 34 getbrancheCompanyValues(result.company,function(){
31 35
32 // 设置分公司 36 // 设置分公司
@@ -42,17 +46,35 @@ @@ -42,17 +46,35 @@
42 } else { 46 } else {
43 47
44 // 缺少ID 48 // 缺少ID
45 - layer.confirm('【ID缺失,请点击返回,重新进行修改操作】', {  
46 - btn : [ '返回' ],icon: 3, title:'提示'  
47 - }, function(index){ 49 + layer.confirm('【ID缺失,请点击返回,重新进行修改操作】', {btn : [ '返回' ],icon: 3, title:'提示'}, function(index){
  50 +
  51 + // 关闭弹出层
48 layer.close(index); 52 layer.close(index);
  53 +
  54 + // 跳转到list页面
49 loadPage('list.html'); 55 loadPage('list.html');
  56 +
50 }); 57 });
51 } 58 }
52 59
  60 + // 输入线路名称,自动生成英文名称和线路简称
  61 + $('#nameInput').on('keyup', setPinYin);
  62 +
  63 + // 根据线路名称值设置英文名称值和线路简称
  64 + function setPinYin(){
  65 +
  66 + // 获取线路名称值
  67 + var val = $('#nameInput').val();
  68 +
  69 + // 设置英文名称值
  70 + $('#esInput').val(pinyin.getFullChars(val));
  71 +
  72 + // 设置线路简称值
  73 + $('#shortNameInput').val(pinyin.getCamelChars(val));
  74 + }
53 75
54 76
55 - // 模块下拉框 77 + // 公司下拉框
56 function selectTemp(callback) { 78 function selectTemp(callback) {
57 79
58 // 填充公司下拉框选择值 80 // 填充公司下拉框选择值
@@ -71,7 +93,7 @@ @@ -71,7 +93,7 @@
71 // 填充公司下拉框options 93 // 填充公司下拉框options
72 $('#companySelect').html(options); 94 $('#companySelect').html(options);
73 95
74 - callback && callback(); 96 + return callback && callback();
75 }); 97 });
76 } 98 }
77 99
@@ -95,7 +117,7 @@ @@ -95,7 +117,7 @@
95 // 填充分公司下拉框options 117 // 填充分公司下拉框options
96 $('#brancheCompanySelect').html(options); 118 $('#brancheCompanySelect').html(options);
97 119
98 - cb && cb(); 120 + return cb && cb();
99 121
100 }); 122 });
101 123
@@ -104,7 +126,7 @@ @@ -104,7 +126,7 @@
104 // 填充分公司下拉框options 126 // 填充分公司下拉框options
105 $('#brancheCompanySelect').html(options); 127 $('#brancheCompanySelect').html(options);
106 128
107 - cb && cb(); 129 + return cb && cb();
108 } 130 }
109 131
110 } 132 }
@@ -258,6 +280,36 @@ @@ -258,6 +280,36 @@
258 digits : true 280 digits : true
259 }, 281 },
260 282
  283 + // 车辆总数
  284 + 'carSumNumber' : {
  285 +
  286 + // 必须输入合法的数字(负数,小数)。
  287 + number : true,
  288 +
  289 + // 必须输入整数。
  290 + digits : true
  291 + },
  292 +
  293 + // 空调车辆数
  294 + 'hvacCarNumber' : {
  295 +
  296 + // 必须输入合法的数字(负数,小数)。
  297 + number : true,
  298 +
  299 + // 必须输入整数。
  300 + digits : true
  301 + },
  302 +
  303 + // 普通车辆数
  304 + 'ordCarNumber' : {
  305 +
  306 + // 必须输入合法的数字(负数,小数)。
  307 + number : true,
  308 +
  309 + // 必须输入整数。
  310 + digits : true
  311 + },
  312 +
261 // 描述/说明 313 // 描述/说明
262 'descriptions' : { 314 'descriptions' : {
263 315
@@ -412,7 +464,9 @@ @@ -412,7 +464,9 @@
412 464
413 // 固定电话正则表达式 465 // 固定电话正则表达式
414 var tel = /^\d{3,4}-?\d{7,9}$/; 466 var tel = /^\d{3,4}-?\d{7,9}$/;
  467 +
415 return this.optional(element) || (tel.test(value) || mobile.test(value)); 468 return this.optional(element) || (tel.test(value) || mobile.test(value));
  469 +
416 }, "请正确填写您的联系电话"); 470 }, "请正确填写您的联系电话");
417 471
418 }(); 472 }();
419 \ No newline at end of file 473 \ No newline at end of file
src/main/resources/static/pages/base/line/js/line-list-table.js
@@ -68,19 +68,11 @@ @@ -68,19 +68,11 @@
68 } 68 }
69 } 69 }
70 70
71 - /**  
72 - * -----page : 当前页  
73 - *  
74 - * -----initPag :  
75 - *  
76 - */ 71 + /** page : 当前页;initPag : */
77 var page = 0,initPag; 72 var page = 0,initPag;
78 73
79 // 选择框 74 // 选择框
80 - var icheckOptions = {  
81 - checkboxClass: 'icheckbox_flat-blue',  
82 - increaseArea: '20%'  
83 - }; 75 + var icheckOptions = {checkboxClass: 'icheckbox_flat-blue',increaseArea: '20%'};
84 76
85 // 表格数据分页加载 77 // 表格数据分页加载
86 loadTableDate(null,true); 78 loadTableDate(null,true);
@@ -147,6 +139,12 @@ @@ -147,6 +139,12 @@
147 var i = layer.load(2); 139 var i = layer.load(2);
148 // 异步请求获取表格数据 140 // 异步请求获取表格数据
149 $.get('/line',params,function(result){ 141 $.get('/line',params,function(result){
  142 +
  143 + console.log(result);
  144 +
  145 + // 添加序号
  146 + result.content.page = page;
  147 +
150 // 把数据填充到模版中 148 // 把数据填充到模版中
151 var tbodyHtml = template('line_list_temp',{list:result.content}); 149 var tbodyHtml = template('line_list_temp',{list:result.content});
152 // 把渲染好的模版html文本追加到表格中 150 // 把渲染好的模版html文本追加到表格中
src/main/resources/static/pages/base/line/list.html
@@ -29,7 +29,7 @@ @@ -29,7 +29,7 @@
29 <table class="table table-striped table-bordered table-hover table-checkable" id="datatable_line"> 29 <table class="table table-striped table-bordered table-hover table-checkable" id="datatable_line">
30 <thead> 30 <thead>
31 <tr role="row" class="heading"> 31 <tr role="row" class="heading">
32 - <th width="3%">#</th> 32 + <th width="3%">序号</th>
33 <th width="7%">线路编码</th> 33 <th width="7%">线路编码</th>
34 <th width="8%">线路名称</th> 34 <th width="8%">线路名称</th>
35 <th width="7%">所属公司</th> 35 <th width="7%">所属公司</th>
@@ -43,7 +43,7 @@ @@ -43,7 +43,7 @@
43 <th width="14%">操作</th> 43 <th width="14%">操作</th>
44 </tr> 44 </tr>
45 <tr role="row" class="filter"> 45 <tr role="row" class="filter">
46 - <td></td> 46 + <td>#</td>
47 <td> 47 <td>
48 <input type="text" class="form-control form-filter input-sm" name="lineCode_eq"> 48 <input type="text" class="form-control form-filter input-sm" name="lineCode_eq">
49 </td> 49 </td>
@@ -85,8 +85,8 @@ @@ -85,8 +85,8 @@
85 <td> 85 <td>
86 <select class="form-control form-filter " name="destroy_eq"> 86 <select class="form-control form-filter " name="destroy_eq">
87 <option value="">请选择...</option> 87 <option value="">请选择...</option>
88 - <option value="1">运营</option>  
89 - <option value="0">撤销</option> 88 + <option value="0">运营</option>
  89 + <option value="1">撤销</option>
90 </select> 90 </select>
91 </td> 91 </td>
92 <td> 92 <td>
@@ -114,11 +114,17 @@ @@ -114,11 +114,17 @@
114 </div> 114 </div>
115 </div> 115 </div>
116 </div> 116 </div>
  117 +<!--
  118 +
  119 +<td style="vertical-align: middle;">
  120 + <input type="checkbox" class="group-checkable icheck" value="{{obj.name}}" id="{{obj.id}}" data-id="{{obj.id}}" data-lineName="{{obj.name}}">
  121 +</td>
  122 + -->
117 <script type="text/html" id="line_list_temp"> 123 <script type="text/html" id="line_list_temp">
118 {{each list as obj i }} 124 {{each list as obj i }}
119 <tr> 125 <tr>
120 <td style="vertical-align: middle;"> 126 <td style="vertical-align: middle;">
121 - <input type="checkbox" class="group-checkable icheck" data-id="{{obj.id}}"> 127 + {{(list.page*10)+(i+1)}}
122 </td> 128 </td>
123 <td> 129 <td>
124 {{obj.lineCode}} 130 {{obj.lineCode}}
@@ -142,7 +148,11 @@ @@ -142,7 +148,11 @@
142 {{obj.shanghaiLinecode}} 148 {{obj.shanghaiLinecode}}
143 </td> 149 </td>
144 <td> 150 <td>
145 - {{obj.destroy}} 151 + {{if obj.destroy == 1}}
  152 + <span style="font-weight: bold; color: red; padding: 5px; background-color: #FFE4E1; margin: 5px; font-size: 9px;border-radius: 4px;">撤销</span>
  153 + {{else if obj.destroy == 0}}
  154 + <span style="font-weight: bold; color: #07824e; padding: 5px; background-color: #FFE4E1; margin: 5px; font-size: 9px;border-radius: 4px;">运营</span>
  155 + {{/if}}
146 </td> 156 </td>
147 <td> 157 <td>
148 <a href="/pages/base/lineinformation/list.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 查看 </a> 158 <a href="/pages/base/lineinformation/list.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 查看 </a>
@@ -151,15 +161,15 @@ @@ -151,15 +161,15 @@
151 <a href="/pages/base/stationroute/list.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 查看 </a> 161 <a href="/pages/base/stationroute/list.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 查看 </a>
152 </td> 162 </td>
153 <td> 163 <td>
154 - <a href="details.html?lineId={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 详细 </a>  
155 - <a href="edit.html?lineId={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 修改 </a> 164 + <a href="details.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 详细 </a>
  165 + <a href="edit.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 修改 </a>
156 </td> 166 </td>
157 </tr> 167 </tr>
158 {{/each}} 168 {{/each}}
159 {{if list.length == 0}} 169 {{if list.length == 0}}
160 <tr> 170 <tr>
161 - <td colspan=8><h6 class="muted">没有找到相关数据</h6></td> 171 + <td colspan=12><h6 class="muted">没有找到相关数据</h6></td>
162 </tr> 172 </tr>
163 {{/if}} 173 {{/if}}
164 </script> 174 </script>
165 -<script src="/pages/base/line/js/line-list-table.js"></script> 175 +<script src="/pages/base/line/js/line-list-table.js"></script>
166 \ No newline at end of file 176 \ No newline at end of file
src/main/resources/static/pages/base/lineinformation/add.html
@@ -56,9 +56,7 @@ @@ -56,9 +56,7 @@
56 56
57 <!-- 标准总里程 --> 57 <!-- 标准总里程 -->
58 <div class="form-group"> 58 <div class="form-group">
59 - <label class="control-label col-md-3">  
60 - <span class="required"> * </span>标准总里程:  
61 - </label> 59 + <label class="control-label col-md-3">标准总里程:</label>
62 <div class="col-md-4"> 60 <div class="col-md-4">
63 <input type="text" class="form-control" name="totalMileage" id="totalMileageInput" placeholder="标准总里程"> 61 <input type="text" class="form-control" name="totalMileage" id="totalMileageInput" placeholder="标准总里程">
64 <span class="help-block"> 单位:公里 </span> 62 <span class="help-block"> 单位:公里 </span>
@@ -76,9 +74,7 @@ @@ -76,9 +74,7 @@
76 74
77 <!-- 上行里程 --> 75 <!-- 上行里程 -->
78 <div class="form-group"> 76 <div class="form-group">
79 - <label class="control-label col-md-3">  
80 - <span class="required"> * </span>上行里程:  
81 - </label> 77 + <label class="control-label col-md-3">上行里程:</label>
82 <div class="col-md-4"> 78 <div class="col-md-4">
83 <input type="text" class="form-control" name="upMileage" id="upMileageInput" placeholder="上行里程"> 79 <input type="text" class="form-control" name="upMileage" id="upMileageInput" placeholder="上行里程">
84 <span class="help-block"> 单位:公里 </span> 80 <span class="help-block"> 单位:公里 </span>
@@ -87,9 +83,7 @@ @@ -87,9 +83,7 @@
87 83
88 <!-- 下行里程 --> 84 <!-- 下行里程 -->
89 <div class="form-group"> 85 <div class="form-group">
90 - <label class="control-label col-md-3">  
91 - <span class="required"> * </span>下行里程:  
92 - </label> 86 + <label class="control-label col-md-3">下行里程: </label>
93 <div class="col-md-4"> 87 <div class="col-md-4">
94 <input type="text" class="form-control" name="downMileage" id="downMileageInput" placeholder="下行里程"> 88 <input type="text" class="form-control" name="downMileage" id="downMileageInput" placeholder="下行里程">
95 <span class="help-block"> 单位:公里 </span> 89 <span class="help-block"> 单位:公里 </span>
@@ -342,7 +336,7 @@ @@ -342,7 +336,7 @@
342 <div class="form-group"> 336 <div class="form-group">
343 <label class="control-label col-md-3"> 越站: </label> 337 <label class="control-label col-md-3"> 越站: </label>
344 <div class="col-md-4"> 338 <div class="col-md-4">
345 - <input type="text" class="form-control" name="Skip" id="SkipInput" placeholder="越站"> 339 + <input type="text" class="form-control" name="skip" id="skipInput" placeholder="越站">
346 </div> 340 </div>
347 </div> 341 </div>
348 342
src/main/resources/static/pages/base/lineinformation/details.html
@@ -20,11 +20,6 @@ @@ -20,11 +20,6 @@
20 <i class="icon-equalizer font-red-sunglo"></i> 20 <i class="icon-equalizer font-red-sunglo"></i>
21 <span class="caption-subject font-red-sunglo bold uppercase">线路标准信息详情</span> 21 <span class="caption-subject font-red-sunglo bold uppercase">线路标准信息详情</span>
22 </div> 22 </div>
23 - <div class="actions">  
24 - <div class="btn-group btn-group-devided" data-toggle="buttons">  
25 - <a class="btn btn-circle back-up blue" href="/pages/base/lineinformation/list.html" data-pjax><i class="fa fa-reply"></i> 返回</a>  
26 - </div>  
27 - </div>  
28 </div> 23 </div>
29 24
30 <!-- 表单 --> 25 <!-- 表单 -->
@@ -348,7 +343,7 @@ @@ -348,7 +343,7 @@
348 <div class="form-group"> 343 <div class="form-group">
349 <label class="control-label col-md-3"> 越站: </label> 344 <label class="control-label col-md-3"> 越站: </label>
350 <div class="col-md-4"> 345 <div class="col-md-4">
351 - <input type="text" class="form-control" name="Skip" id="SkipInput" placeholder="越站"> 346 + <input type="text" class="form-control" name="skip" id="skipInput" placeholder="越站">
352 </div> 347 </div>
353 </div> 348 </div>
354 349
@@ -384,6 +379,13 @@ @@ -384,6 +379,13 @@
384 </div> 379 </div>
385 </div> 380 </div>
386 </div> 381 </div>
  382 + <div class="form-actions">
  383 + <div class="row">
  384 + <div class="col-md-offset-3 col-md-4">
  385 + <a type="button" class="btn default back-up" href="/pages/base/lineinformation/list.html" style="margin-left: 35%;" data-pjax><i class="fa fa-reply"></i> 返回</a>
  386 + </div>
  387 + </div>
  388 + </div>
387 </form> 389 </form>
388 </div> 390 </div>
389 </div> 391 </div>
src/main/resources/static/pages/base/lineinformation/edit.html
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 <div class="portlet-title"> 18 <div class="portlet-title">
19 <div class="caption"> 19 <div class="caption">
20 <i class="icon-equalizer font-red-sunglo"></i> 20 <i class="icon-equalizer font-red-sunglo"></i>
21 - <span class="caption-subject font-red-sunglo bold uppercase">添加线路标准信息</span> 21 + <span class="caption-subject font-red-sunglo bold uppercase">修改线路标准信息</span>
22 </div> 22 </div>
23 </div> 23 </div>
24 24
@@ -40,6 +40,9 @@ @@ -40,6 +40,9 @@
40 <!-- 线路信息ID --> 40 <!-- 线路信息ID -->
41 <input type="hidden" name="id" id="lineinformationId"> 41 <input type="hidden" name="id" id="lineinformationId">
42 42
  43 + <!-- 线路信息ID -->
  44 + <input type="hidden" name="line" id="lineIdInput">
  45 +
43 <!-- 线路标准信息类型 --> 46 <!-- 线路标准信息类型 -->
44 <div class="form-group"> 47 <div class="form-group">
45 <label class="control-label col-md-3"> 48 <label class="control-label col-md-3">
@@ -343,7 +346,7 @@ @@ -343,7 +346,7 @@
343 <div class="form-group"> 346 <div class="form-group">
344 <label class="control-label col-md-3"> 越站: </label> 347 <label class="control-label col-md-3"> 越站: </label>
345 <div class="col-md-4"> 348 <div class="col-md-4">
346 - <input type="text" class="form-control" name="Skip" id="SkipInput" placeholder="越站"> 349 + <input type="text" class="form-control" name="skip" id="skipInput" placeholder="越站">
347 </div> 350 </div>
348 </div> 351 </div>
349 352
src/main/resources/static/pages/base/lineinformation/js/lineinformation-add-form.js
1 $(function(){ 1 $(function(){
2 2
3 // 获取参数ID 3 // 获取参数ID
4 - var lineId = $.url().param('lineId'); 4 + var lineId = $.url().param('no');
5 5
6 if(lineId) { 6 if(lineId) {
7 7
8 - $('.lineinformation_back').attr('href','/pages/base/lineinformation/list.html?lineId='+lineId); 8 + $('.lineinformation_back').attr('href','/pages/base/lineinformation/list.html?no='+lineId);
9 9
10 $('#lineIdInput').val(lineId); 10 $('#lineIdInput').val(lineId);
11 11
@@ -86,9 +86,6 @@ $(function(){ @@ -86,9 +86,6 @@ $(function(){
86 // 标准总里程 86 // 标准总里程
87 'totalMileage' : { 87 'totalMileage' : {
88 88
89 - //必填项  
90 - required:true,  
91 -  
92 // 必须输入合法的数字(负数,小数)。 89 // 必须输入合法的数字(负数,小数)。
93 number : true, 90 number : true,
94 91
@@ -105,9 +102,6 @@ $(function(){ @@ -105,9 +102,6 @@ $(function(){
105 // 上行里程 102 // 上行里程
106 'upMileage' : { 103 'upMileage' : {
107 104
108 - //必填项  
109 - required:true,  
110 -  
111 // 必须输入合法的数字(负数,小数)。 105 // 必须输入合法的数字(负数,小数)。
112 number : true 106 number : true
113 107
@@ -116,9 +110,6 @@ $(function(){ @@ -116,9 +110,6 @@ $(function(){
116 // 下行里程 110 // 下行里程
117 'downMileage' : { 111 'downMileage' : {
118 112
119 - //必填项  
120 - required:true,  
121 -  
122 // 必须输入合法的数字(负数,小数)。 113 // 必须输入合法的数字(负数,小数)。
123 number : true 114 number : true
124 115
@@ -428,7 +419,7 @@ $(function(){ @@ -428,7 +419,7 @@ $(function(){
428 } 419 }
429 420
430 // 返回list.html页面 421 // 返回list.html页面
431 - loadPage('lineinformation.html?lineId='+lineId); 422 + loadPage('/pages/base/lineinformation/list.html?no='+lineId);
432 }); 423 });
433 424
434 } 425 }
src/main/resources/static/pages/base/lineinformation/js/lineinformation-details-form.js
1 $(function() { 1 $(function() {
2 2
3 - var lineinformationId = $.url().param('lineinformationId'); 3 + // 获取参数值
  4 + var noStr = $.url().param('no');
4 5
5 - var lineId = $.url().param('lineId'); 6 + // 线路标准ID
  7 + var lineinformationId = '';
6 8
7 - if(lineinformationId && lineId) { 9 + // 线路ID
  10 + var lineId = '';
  11 +
  12 + // 如果参数值不为空
  13 + if(noStr) {
  14 +
  15 + // 切割参数值
  16 + var noArray = noStr.split('_');
  17 +
  18 + // 赋值线路标准ID
  19 + lineinformationId = noArray[0];
  20 +
  21 + // 赋值线路ID
  22 + lineId = noArray[1];
8 23
9 // 根据ID查询详细信息 24 // 根据ID查询详细信息
10 $get('/lineInformation/' + lineinformationId ,null, function(result){ 25 $get('/lineInformation/' + lineinformationId ,null, function(result){
11 26
12 - console.log(result);  
13 -  
14 - $('.back-up').attr('href','/pages/base/lineinformation/list.html?lineId='+lineId); 27 + // 获取返回元素并修改url地址
  28 + $('.back-up').attr('href','/pages/base/lineinformation/list.html?no='+lineId);
15 29
  30 + // 获取表单元素下的元素设置属性值Disabled
16 $('input,select,textarea','#lineinformation_details_form').attr('Disabled','Disabled'); 31 $('input,select,textarea','#lineinformation_details_form').attr('Disabled','Disabled');
17 32
18 // 如果不为空 33 // 如果不为空
19 if(result) { 34 if(result) {
20 35
  36 + // 获取表单元素下的元素并设置值
21 putFormData(result, '#lineinformation_details_form'); 37 putFormData(result, '#lineinformation_details_form');
22 38
  39 + // 获取线路标注类型设置值
23 $('#typeInput').val(result.type); 40 $('#typeInput').val(result.type);
24 41
25 } 42 }
@@ -29,11 +46,14 @@ $(function() { @@ -29,11 +46,14 @@ $(function() {
29 } else { 46 } else {
30 47
31 // 缺少ID 48 // 缺少ID
32 - layer.confirm('【ID缺失,请点击返回,重新进行查看线路标准信息详情操作】', {  
33 - btn : [ '返回' ],icon: 3, title:'提示'  
34 - }, function(index){ 49 + layer.confirm('【ID缺失,请点击返回,重新进行查看线路标准信息详情操作】', {btn : [ '返回' ],icon: 3, title:'提示'}, function(index){
  50 +
  51 + // 关闭弹出层
35 layer.close(index); 52 layer.close(index);
  53 +
  54 + // 返回list页面
36 loadPage('/pages/base/lineinformation/list.html'); 55 loadPage('/pages/base/lineinformation/list.html');
  56 +
37 }); 57 });
38 58
39 } 59 }
src/main/resources/static/pages/base/lineinformation/js/lineinformation-edit-form.js
1 $(function() { 1 $(function() {
2 2
3 - // 获取参数ID  
4 - var lineinformationId = $.url().param('lineinformationId'); 3 + // 获取参数值
  4 + var noStr = $.url().param('no');
5 5
6 - // 获取参数ID  
7 - var lineId = $.url().param('lineId'); 6 + // 定义线路标准信息ID
  7 + var lineinformationId = '';
8 8
9 - if(lineinformationId && lineId) { 9 + // 定义线路ID
  10 + var lineId = '';
  11 +
  12 + // 如果参数值不为空
  13 + if(noStr) {
  14 +
  15 + // 切割参数值
  16 + var noArray = noStr.split('_');
  17 +
  18 + // 赋值线路标准ID
  19 + lineinformationId = noArray[0];
  20 +
  21 + // 赋值线路ID
  22 + lineId = noArray[1];
10 23
11 - $('.back-up').attr('href','/pages/base/lineinformation/list.html?lineId='+lineId); 24 + // 获取返回元素并修改url
  25 + $('.back-up').attr('href','/pages/base/lineinformation/list.html?no='+lineId);
12 26
  27 + // 获取线路标准ID并设值
13 $('#lineinformationId').val(lineinformationId); 28 $('#lineinformationId').val(lineinformationId);
14 29
15 // 根据ID查询详细信息 30 // 根据ID查询详细信息
16 $get('/lineInformation/' + lineinformationId ,null, function(result){ 31 $get('/lineInformation/' + lineinformationId ,null, function(result){
17 32
18 - console.log(result);  
19 -  
20 // 如果不为空 33 // 如果不为空
21 if(result) { 34 if(result) {
22 35
  36 + // 获取线路标准类型并设值
23 $('#typeInput').val(result.type); 37 $('#typeInput').val(result.type);
24 38
  39 + // 获取表单元素下的元素并设值
25 putFormData(result, '#lineinformation_edit_form'); 40 putFormData(result, '#lineinformation_edit_form');
26 41
  42 + // 获取线路ID元素并设值
  43 + $('#lineIdInput').val(lineId);
  44 +
27 } 45 }
28 46
29 }); 47 });
30 48
31 - // 日期控件 49 + // 早高峰开始时间(日期控件)
32 $('#earlyStartTimeInput').datetimepicker({ 50 $('#earlyStartTimeInput').datetimepicker({
33 51
  52 + // 格式
34 format : 'HH:mm', 53 format : 'HH:mm',
35 54
  55 + // 语言
36 locale: 'zh-cn', 56 locale: 'zh-cn',
37 }); 57 });
38 58
39 - // 日期控件 59 + // 早高峰结束时间(日期控件)
40 $('#earlyEndTimeInput').datetimepicker({ 60 $('#earlyEndTimeInput').datetimepicker({
41 61
  62 + // 格式
42 format : 'HH:mm', 63 format : 'HH:mm',
43 64
44 - locale: 'zh-cn' 65 + // 语言
  66 + locale: 'zh-cn',
45 67
46 }); 68 });
47 69
48 - // 日期控件 70 + // 晚高峰开始时间(日期控件)
49 $('#lateStartTimeInput').datetimepicker({ 71 $('#lateStartTimeInput').datetimepicker({
50 72
  73 + // 格式
51 format : 'HH:mm', 74 format : 'HH:mm',
52 75
53 - locale: 'zh-cn' 76 + // 语言
  77 + locale: 'zh-cn',
54 78
55 }); 79 });
56 80
57 - // 日期控件 81 + // 晚高峰结束时间(日期控件)
58 $('#lateEndTimeInput').datetimepicker({ 82 $('#lateEndTimeInput').datetimepicker({
59 83
  84 + // 格式
60 format : 'HH:mm', 85 format : 'HH:mm',
61 86
62 - locale: 'zh-cn' 87 + // 语言
  88 + locale: 'zh-cn',
63 89
64 }); 90 });
65 91
66 // 定义表单 92 // 定义表单
67 - var form = $('#lineinformation_add_form'); 93 + var form = $('#lineinformation_edit_form');
68 94
69 // 定义表单异常 95 // 定义表单异常
70 var error = $('.alert-danger',form); 96 var error = $('.alert-danger',form);
@@ -424,18 +450,19 @@ $(function() { @@ -424,18 +450,19 @@ $(function() {
424 if(result.status=='SUCCESS') { 450 if(result.status=='SUCCESS') {
425 451
426 // 弹出添加成功提示消息 452 // 弹出添加成功提示消息
427 - layer.msg('添加成功...'); 453 + layer.msg('修改成功...');
428 454
429 } else if(result.status=='ERROR') { 455 } else if(result.status=='ERROR') {
430 456
431 // 弹出添加失败提示消息 457 // 弹出添加失败提示消息
432 - layer.msg('添加失败...'); 458 + layer.msg('修改失败...');
433 459
434 } 460 }
435 } 461 }
436 462
437 // 返回list.html页面 463 // 返回list.html页面
438 - loadPage('lineinformation.html?lineId='+lineId); 464 + loadPage('/pages/base/lineinformation/list.html?no='+lineId);
  465 +
439 }); 466 });
440 467
441 } 468 }
@@ -451,18 +478,22 @@ $(function() { @@ -451,18 +478,22 @@ $(function() {
451 // 手机正则表达式 478 // 手机正则表达式
452 var dateStr = /^(?:(?:0?|1)\d|2[0-3]):[0-5]\d$/; 479 var dateStr = /^(?:(?:0?|1)\d|2[0-3]):[0-5]\d$/;
453 480
454 - return this.optional(element) || dateStr.test(value); 481 + return this.optional(element) || dateStr.test(value);
  482 +
455 }, "请正确填写您的时间格式"); 483 }, "请正确填写您的时间格式");
456 484
457 485
458 } else { 486 } else {
459 487
460 // 缺少ID 488 // 缺少ID
461 - layer.confirm('【ID缺失,请点击返回,重新进行修改操作】', {  
462 - btn : [ '返回' ],icon: 3, title:'提示'  
463 - }, function(index){ 489 + layer.confirm('【ID缺失,请点击返回,重新进行修改操作】', {btn : [ '返回' ],icon: 3, title:'提示'}, function(index){
  490 +
  491 + // 关闭弹出层
464 layer.close(index); 492 layer.close(index);
  493 +
  494 + // 返回list页面
465 loadPage('/pages/base/lineinformation/list.html?lineId='+lineId); 495 loadPage('/pages/base/lineinformation/list.html?lineId='+lineId);
  496 +
466 }); 497 });
467 498
468 } 499 }
src/main/resources/static/pages/base/lineinformation/js/lineinformation-list-table.js
@@ -6,26 +6,33 @@ $(function(){ @@ -6,26 +6,33 @@ $(function(){
6 // 如果不为空 6 // 如果不为空
7 if(lineId) { 7 if(lineId) {
8 8
9 - $('#lineinformation_add').attr('href','add.html?lineId='+lineId); 9 + // 获取返回元素修改url
  10 + $('#lineinformation_add').attr('href','/pages/base/lineinformation/add.html?no='+lineId);
10 11
  12 + // 根据线路标准ID查询详情
11 $get('/lineInformation',{'line.id_eq':lineId},function(result) { 13 $get('/lineInformation',{'line.id_eq':lineId},function(result) {
12 14
  15 + // 返回值长度
13 var len = result.content.length; 16 var len = result.content.length;
14 17
15 - var tbodyHtml; 18 + // html文本
  19 + var tbodyHtml = '';
16 20
  21 + // 判断长度
17 if(len>0) { 22 if(len>0) {
18 23
19 // 先一个线路对应一个线路标准 24 // 先一个线路对应一个线路标准
20 $('#lineinformation_add').hide(); 25 $('#lineinformation_add').hide();
21 26
  27 + // 模版
22 tbodyHtml = template('lineinformation_table_temp',{list : result.content}); 28 tbodyHtml = template('lineinformation_table_temp',{list : result.content});
23 29
24 } else { 30 } else {
25 31
26 tbodyHtml = '<tr><td colspan=9><h6 class="muted">没有找到相关数据</h6></td></tr>' 32 tbodyHtml = '<tr><td colspan=9><h6 class="muted">没有找到相关数据</h6></td></tr>'
27 } 33 }
28 - 34 +
  35 + // 获取表格元素并插入htnl代码
29 $('#datatable_lineinformation tbody').html(tbodyHtml); 36 $('#datatable_lineinformation tbody').html(tbodyHtml);
30 37
31 }); 38 });
@@ -34,11 +41,14 @@ $(function(){ @@ -34,11 +41,14 @@ $(function(){
34 } else { 41 } else {
35 42
36 // 缺少ID 43 // 缺少ID
37 - layer.confirm('【ID缺失,请点击返回,重新进行查看线路标准信息操作】', {  
38 - btn : [ '返回' ],icon: 3, title:'提示'  
39 - }, function(index){ 44 + layer.confirm('【ID缺失,请点击返回,重新进行查看线路标准信息操作】', {btn : [ '返回' ],icon: 3, title:'提示'}, function(index){
  45 +
  46 + // 关闭弹出层
40 layer.close(index); 47 layer.close(index);
  48 +
  49 + // 返回list页面
41 loadPage('/pages/base/line/list.html'); 50 loadPage('/pages/base/line/list.html');
  51 +
42 }); 52 });
43 } 53 }
44 54
src/main/resources/static/pages/base/lineinformation/list.html
@@ -21,10 +21,10 @@ @@ -21,10 +21,10 @@
21 </div> 21 </div>
22 <div class="actions"> 22 <div class="actions">
23 <div class="btn-group btn-group-devided" data-toggle="buttons"> 23 <div class="btn-group btn-group-devided" data-toggle="buttons">
24 - <a class="btn btn-circle blue" href="add.html" id="lineinformation_add" data-pjax><i class="fa fa-plus"></i> 添加线路标准信息</a> 24 + <a class="btn btn-circle blue" href="/pages/base/lineinformation/add.html" id="lineinformation_add" data-pjax><i class="fa fa-plus"></i> 添加线路标准信息</a>
25 </div> 25 </div>
26 <div class="btn-group btn-group-devided" data-toggle="buttons"> 26 <div class="btn-group btn-group-devided" data-toggle="buttons">
27 - <a class="btn btn-circle blue" href="/pages/base/line/list.html" data-pjax><i class="fa fa-reply"></i> 返回</a> 27 + <a class="btn btn-circle default" href="/pages/base/line/list.html" style="float: right;padding: 4px 23px;" data-pjax><i class="fa fa-reply"></i> 返回</a>
28 </div> 28 </div>
29 </div> 29 </div>
30 </div> 30 </div>
@@ -43,46 +43,6 @@ @@ -43,46 +43,6 @@
43 <th width="10%">下行行驶时间</th> 43 <th width="10%">下行行驶时间</th>
44 <th width="15%">操作</th> 44 <th width="15%">操作</th>
45 </tr> 45 </tr>
46 - <!--  
47 - <tr role="row" class="filter">  
48 - <td></td>  
49 - <td>  
50 - <input type="text" class="form-control form-filter input-sm" name="lineCode">  
51 - </td>  
52 - <td>  
53 - <input type="text" class="form-control form-filter input-sm" name="name">  
54 - </td>  
55 - <td>  
56 - <select name="type" class="form-control" id="typeInput">  
57 - <option value="">请选择...</option>  
58 - <option value="zc">正常</option>  
59 - <option value="qj">区间</option>  
60 - <option value="fk">放空</option>  
61 - </select>  
62 - </td>  
63 - <td>  
64 - <input type="text" class="form-control form-filter input-sm" name="name">  
65 - </td>  
66 - <td>  
67 - <input type="text" class="form-control form-filter input-sm" name="name">  
68 - </td>  
69 - <td>  
70 - <input type="text" class="form-control form-filter input-sm" name="name">  
71 - </td>  
72 - <td>  
73 - <input type="text" class="form-control form-filter input-sm" name="name">  
74 - </td>  
75 - <td>  
76 - <button class="btn btn-sm green btn-outline filter-submit margin-bottom" >  
77 - <i class="fa fa-search"></i> 搜索  
78 - </button>  
79 -  
80 - <button class="btn btn-sm red btn-outline filter-cancel">  
81 - <i class="fa fa-times"></i> 重置  
82 - </button>  
83 - </td>  
84 - </tr>  
85 - -->  
86 </thead> 46 </thead>
87 <tbody></tbody> 47 <tbody></tbody>
88 </table> 48 </table>
@@ -122,8 +82,8 @@ @@ -122,8 +82,8 @@
122 {{obj.downTravelTime}} 82 {{obj.downTravelTime}}
123 </td> 83 </td>
124 <td> 84 <td>
125 - <a href="details.html?lineinformationId={{obj.id}}&lineId={{obj.line.id}}" class="btn default blue-stripe btn-sm" data-pjax> 详细 </a>  
126 - <a href="edit.html?lineinformationId={{obj.id}}&lineId={{obj.line.id}}" class="btn default blue-stripe btn-sm" data-pjax> 修改 </a> 85 + <a href="details.html?no={{obj.id}}_{{obj.line.id}}" class="btn default blue-stripe btn-sm" data-pjax> 详细 </a>
  86 + <a href="edit.html?no={{obj.id}}_{{obj.line.id}}" class="btn default blue-stripe btn-sm" data-pjax> 修改 </a>
127 </td> 87 </td>
128 </tr> 88 </tr>
129 {{/each}} 89 {{/each}}
src/main/resources/static/pages/scheduleApp/bower.json
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 "angular-route": "1.4.x", 16 "angular-route": "1.4.x",
17 "angular-ui-router": "0.2.15", 17 "angular-ui-router": "0.2.15",
18 "angular-ui-select": "0.13.2", 18 "angular-ui-select": "0.13.2",
  19 + "angular-file-upload": "2.1.4",
19 "angular-resource": "1.4.x" 20 "angular-resource": "1.4.x"
20 } 21 }
21 } 22 }
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/busInfoManage.js
1 // 车辆基础信息维护 service controller等写在一起 1 // 车辆基础信息维护 service controller等写在一起
2 2
3 angular.module('ScheduleApp').factory('BusInfoManageService', ['BusInfoManageService_g', function(service) { 3 angular.module('ScheduleApp').factory('BusInfoManageService', ['BusInfoManageService_g', function(service) {
4 - /** 车辆类型常量 */  
5 - var carTypes = [  
6 - {type: "营运车"},  
7 - {type: "包车"},  
8 - {type: "学校班车"},  
9 - {type: "公司班车"},  
10 - {type: "待报废车"},  
11 - {type: "备车"}  
12 - ];  
13 - /** 机动车类型常量 */  
14 - var vehicleStates = [  
15 - {type: "非机动车"},  
16 - {type: "机动一队"},  
17 - {type: "机动二队"},  
18 - {type: "机动三队"},  
19 - {type: "备车"},  
20 - {type: "抢修车"}  
21 - ];  
22 - /** 营运状态类型常量 */  
23 - var operatorsStates = [  
24 - {type: "营运"},  
25 - {type: "停运"},  
26 - {type: "挂失"},  
27 - {type: "迁出(过户)"},  
28 - {type: "迁出(转籍)"},  
29 - {type: "报废"},  
30 - {type: "歇业"},  
31 - {type: "注销"},  
32 - {type: "其他"}  
33 - ];  
34 - /** 设备厂商名字 */  
35 - var supplierNames = [  
36 - {name: "巴士拓华"},  
37 - {name: "博康"}  
38 - ];  
39 - /** 公司字典 */  
40 - var gses = [  
41 - {gsdm: "55", gsmc: "上南公司"},  
42 - {gsdm: "22", gsmc: "金高公司"},  
43 - {gsdm: "05", gsmc: "杨高公司"},  
44 - {gsdm: "26", gsmc: "南汇公司"}  
45 - ];  
46 4
47 /** 当前的查询条件信息 */ 5 /** 当前的查询条件信息 */
48 var currentSearchCondition = { 6 var currentSearchCondition = {
@@ -56,36 +14,6 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer @@ -56,36 +14,6 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer
56 var currentPageNo = 1; 14 var currentPageNo = 1;
57 return { 15 return {
58 /** 16 /**
59 - * 获取公司字典。  
60 - */  
61 - getGses: function() {  
62 - return gses;  
63 - },  
64 - /**  
65 - * 获取设备厂商名字。  
66 - */  
67 - getSupplierNames: function() {  
68 - return supplierNames;  
69 - },  
70 - /**  
71 - * 获取营运状态类型。  
72 - */  
73 - getOperatorsStates: function() {  
74 - return operatorsStates;  
75 - },  
76 - /**  
77 - * 获取机动车类型。  
78 - */  
79 - getVehicleStates: function() {  
80 - return vehicleStates;  
81 - },  
82 - /**  
83 - * 获取车辆类型。  
84 - */  
85 - getCarTypes: function() {  
86 - return carTypes;  
87 - },  
88 - /**  
89 * 获取查询条件信息, 17 * 获取查询条件信息,
90 * 用于给controller用来和页面数据绑定。 18 * 用于给controller用来和页面数据绑定。
91 */ 19 */
@@ -100,6 +28,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer @@ -100,6 +28,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer
100 for (key in currentSearchCondition) { 28 for (key in currentSearchCondition) {
101 currentSearchCondition[key] = ""; 29 currentSearchCondition[key] = "";
102 } 30 }
  31 + currentPageNo = 1;
103 }, 32 },
104 /** 33 /**
105 * 设置当前页码。 34 * 设置当前页码。
@@ -116,7 +45,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer @@ -116,7 +45,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer
116 getPage: function() { 45 getPage: function() {
117 var params = currentSearchCondition; // 查询条件 46 var params = currentSearchCondition; // 查询条件
118 params.page = currentPageNo - 1; // 服务端页码从0开始 47 params.page = currentPageNo - 1; // 服务端页码从0开始
119 - return service.list(params).$promise; 48 + return service.rest.list(params).$promise;
120 }, 49 },
121 /** 50 /**
122 * 获取明细信息。 51 * 获取明细信息。
@@ -125,7 +54,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer @@ -125,7 +54,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer
125 */ 54 */
126 getDetail: function(id) { 55 getDetail: function(id) {
127 var params = {id: id}; 56 var params = {id: id};
128 - return service.get(params).$promise; 57 + return service.rest.get(params).$promise;
129 }, 58 },
130 /** 59 /**
131 * 保存信息。 60 * 保存信息。
@@ -133,23 +62,84 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer @@ -133,23 +62,84 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusInfoManageService&#39;, [&#39;BusInfoManageSer
133 * @return 返回一个 promise 62 * @return 返回一个 promise
134 */ 63 */
135 saveDetail: function(obj) { 64 saveDetail: function(obj) {
136 - return service.save(obj).$promise; 65 + return service.rest.save(obj).$promise;
137 } 66 }
138 }; 67 };
139 }]); 68 }]);
140 69
141 -angular.module('ScheduleApp').controller('BusInfoManageCtrl', ['BusInfoManageService','$state', function(busInfoManageService, $state) { 70 +angular.module('ScheduleApp').controller('BusInfoManageCtrl', ['BusInfoManageService','$state', '$uibModal', function(busInfoManageService, $state, $uibModal) {
142 var self = this; 71 var self = this;
143 72
144 // 切换到form状态 73 // 切换到form状态
145 self.goForm = function() { 74 self.goForm = function() {
146 //alert("切换"); 75 //alert("切换");
147 $state.go("busInfoManage_form"); 76 $state.go("busInfoManage_form");
148 - } 77 + };
  78 +
  79 + // 导入excel
  80 + self.importData = function() {
  81 + // large方式弹出模态对话框
  82 + var modalInstance = $uibModal.open({
  83 + templateUrl: '/pages/scheduleApp/module/basicInfo/busInfoManage/dataImport.html',
  84 + size: "lg",
  85 + animation: true,
  86 + backdrop: 'static',
  87 + resolve: {
  88 + // 可以传值给controller
  89 + },
  90 + windowClass: 'center-modal',
  91 + controller: "BusInfoManageToolsCtrl",
  92 + controllerAs: "ctrl",
  93 + bindToController: true
  94 + });
  95 + modalInstance.result.then(
  96 + function() {
  97 + console.log("dataImport.html打开");
  98 + },
  99 + function() {
  100 + console.log("dataImport.html消失");
  101 + }
  102 + );
  103 + };
  104 +}]);
149 105
  106 +angular.module('ScheduleApp').controller('BusInfoManageToolsCtrl', ['$modalInstance', 'FileUploader', function($modalInstance, FileUploader) {
  107 + var self = this;
  108 + self.data = "TODO";
  109 +
  110 + // 关闭窗口
  111 + self.close = function() {
  112 + $modalInstance.dismiss("cancel");
  113 + };
  114 +
  115 + self.clearInputFile = function() {
  116 + angular.element("input[type='file']").val(null);
  117 + };
  118 +
  119 + // 上传文件组件
  120 + self.uploader = new FileUploader({
  121 + url: "/cars/dataImport",
  122 + filters: [] // 用于过滤文件,比如只允许导入excel
  123 + });
  124 + self.uploader.onAfterAddingFile = function(fileItem)
  125 + {
  126 + console.info('onAfterAddingFile', fileItem);
  127 + console.log(self.uploader.queue.length);
  128 + if (self.uploader.queue.length > 1)
  129 + self.uploader.removeFromQueue(0);
  130 + };
  131 + self.uploader.onSuccessItem = function(fileItem, response, status, headers)
  132 + {
  133 + console.info('onSuccessItem', fileItem, response, status, headers);
  134 + };
  135 + self.uploader.onErrorItem = function(fileItem, response, status, headers)
  136 + {
  137 + console.info('onErrorItem', fileItem, response, status, headers);
  138 + };
150 139
151 }]); 140 }]);
152 141
  142 +
153 angular.module('ScheduleApp').controller('BusInfoManageListCtrl', ['BusInfoManageService','$scope', function(busInfoManageService, $scope) { 143 angular.module('ScheduleApp').controller('BusInfoManageListCtrl', ['BusInfoManageService','$scope', function(busInfoManageService, $scope) {
154 var self = this; 144 var self = this;
155 self.pageInfo = { 145 self.pageInfo = {
@@ -196,7 +186,9 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageListCtrl&#39;, [&#39;BusInfoManag @@ -196,7 +186,9 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageListCtrl&#39;, [&#39;BusInfoManag
196 }; 186 };
197 // 重置查询条件 187 // 重置查询条件
198 self.resetSearchCondition = function() { 188 self.resetSearchCondition = function() {
199 - return busInfoManageService.resetSearchCondition(); 189 + busInfoManageService.resetSearchCondition();
  190 + self.pageInfo.currentPage = 1;
  191 + self.pageChanaged();
200 }; 192 };
201 }]); 193 }]);
202 194
@@ -223,63 +215,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageFormCtrl&#39;, [&#39;BusInfoManag @@ -223,63 +215,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageFormCtrl&#39;, [&#39;BusInfoManag
223 // 欲保存的busInfo信息,绑定 215 // 欲保存的busInfo信息,绑定
224 self.busInfoForSave = {}; 216 self.busInfoForSave = {};
225 217
226 - // 车辆类型 selectedItem  
227 - self.busInfoForSave.carType_selected = null;  
228 - self.carTypes = busInfoManageService.getCarTypes();  
229 - self.carType_selected_change = function($item, $model) {  
230 - self.busInfoForSave.carType = $item.type;  
231 - };  
232 - self.carType_selected_remove = function($item, $model) {  
233 - self.busInfoForSave.carType_selected = null;  
234 - self.busInfoForSave.carType = null;  
235 - };  
236 -  
237 - // 机动车类型 selectedItem  
238 - self.busInfoForSave.vehicleStats_selected = null;  
239 - self.vehicleStates = busInfoManageService.getVehicleStates();  
240 - self.vehicleStats_selected_change = function($item, $model) {  
241 - self.busInfoForSave.vehicleStats = $item.type;  
242 - };  
243 - self.vehicleStats_selected_remove = function($item, $model) {  
244 - self.busInfoForSave.vehicleStats_selected = null;  
245 - self.busInfoForSave.vehicleStats = null;  
246 - };  
247 -  
248 - // 营运状态类型 selectedItem  
249 - self.busInfoForSave.operatorsState_selected = null;  
250 - self.operatorsStates = busInfoManageService.getOperatorsStates();  
251 - self.operatorsState_selected_change = function($item, $model) {  
252 - self.busInfoForSave.operatorsState = $item.type;  
253 - };  
254 - self.operatorsState_selected_remove = function($item, $model) {  
255 - self.busInfoForSave.operatorsState_selected = null;  
256 - self.busInfoForSave.operatorsState = null;  
257 - };  
258 -  
259 - // 设备厂商 selectedItem  
260 - self.busInfoForSave.supplierName_selected = null;  
261 - self.supplierNames = busInfoManageService.getSupplierNames();  
262 - self.supplierName_selected_change = function($item, $model) {  
263 - self.busInfoForSave.supplierName = $item.name;  
264 - };  
265 - self.supplierName_selected_remove = function() {  
266 - self.busInfoForSave.supplierName_selected = null;  
267 - self.busInfoForSave.supplierName = null;  
268 - };  
269 -  
270 - // 公司 selectedItem  
271 - self.busInfoForSave.gs_selected = null;  
272 - self.gses = busInfoManageService.getGses();  
273 - self.gs_selected_change = function($item, $model) {  
274 - self.busInfoForSave.businessCode = $item.gsdm;  
275 - self.busInfoForSave.company = $item.gsmc;  
276 - };  
277 - self.gs_selected_remove = function() {  
278 - self.busInfoForSave.gs_selected = null;  
279 - self.busInfoForSave.businessCode = null;  
280 - self.busInfoForSave.company = null;  
281 - };  
282 -  
283 // 获取传过来的id,有的话就是修改,获取一遍数据 218 // 获取传过来的id,有的话就是修改,获取一遍数据
284 var id = $stateParams.id; 219 var id = $stateParams.id;
285 if (id) { 220 if (id) {
@@ -290,48 +225,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageFormCtrl&#39;, [&#39;BusInfoManag @@ -290,48 +225,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageFormCtrl&#39;, [&#39;BusInfoManag
290 for (key in result) { 225 for (key in result) {
291 self.busInfoForSave[key] = result[key]; 226 self.busInfoForSave[key] = result[key];
292 } 227 }
293 - // 填写所有的 select 控件选中框数据  
294 - // 公司字典  
295 - if (self.busInfoForSave.businessCode) {  
296 - angular.forEach(self.gses, function(data) {  
297 - if (self.busInfoForSave.businessCode == data.gsdm) {  
298 - self.busInfoForSave.gs_selected = data;  
299 - }  
300 - });  
301 - }  
302 - // 设备厂商字典  
303 - if (self.busInfoForSave.supplierName) {  
304 - angular.forEach(self.supplierNames, function(data) {  
305 - if (self.busInfoForSave.supplierName == data.name) {  
306 - self.busInfoForSave.supplierName_selected = data;  
307 - }  
308 - });  
309 - }  
310 - // 车辆类型字典  
311 - if (self.busInfoForSave.carType) {  
312 - angular.forEach(self.carTypes, function(data) {  
313 - if (self.busInfoForSave.carType == data.type) {  
314 - self.busInfoForSave.carType_selected = data;  
315 - }  
316 - });  
317 - }  
318 - // 机动车类型字典  
319 - if (self.busInfoForSave.vehicleStats) {  
320 - angular.forEach(self.vehicleStates, function(data) {  
321 - if (self.busInfoForSave.vehicleStats == data.type) {  
322 - self.busInfoForSave.vehicleStats_selected = data;  
323 - }  
324 - });  
325 - }  
326 - // 营运状态类型字典  
327 - if (self.busInfoForSave.operatorsState) {  
328 - angular.forEach(self.operatorsStates, function(data) {  
329 - if (self.busInfoForSave.operatorsState == data.type) {  
330 - self.busInfoForSave.operatorsState_selected = data;  
331 - }  
332 - });  
333 - }  
334 -  
335 }, 228 },
336 function(result) { 229 function(result) {
337 alert("出错啦!"); 230 alert("出错啦!");
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/dataExport.html 0 → 100644
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/dataImport.html 0 → 100644
  1 +<div class="modal-header">
  2 + <h3 class="modal-title">excel数据导入</h3>
  3 +</div>
  4 +<div class="modal-body">
  5 + <div class="col-md-6">
  6 + <div class="input-group">
  7 + <input type="file" class="form-control" nv-file-select="" uploader="ctrl.uploader"/>
  8 + <span class="input-group-btn">
  9 + <button type="button" ng-click="ctrl.clearInputFile()" class="btn btn-default">
  10 + <span class="glyphicon glyphicon-trash"></span>
  11 + </button>
  12 + </span>
  13 + </div>
  14 + </div>
  15 +
  16 + <div class="table-scrollable table-scrollable-borderless">
  17 + <table class="table table-hover table-light">
  18 + <thead>
  19 + <tr class="uppercase">
  20 + <th width="50%">文件名</th>
  21 + <th ng-show="ctrl.uploader.isHTML5">大小(M)</th>
  22 + <th ng-show="ctrl.uploader.isHTML5">进度</th>
  23 + <th>状态</th>
  24 + <th>操作</th>
  25 + </tr>
  26 + </thead>
  27 + <tbody>
  28 + <tr ng-repeat="item in ctrl.uploader.queue">
  29 + <td>
  30 + <strong>{{ item.file.name }}</strong>
  31 + </td>
  32 + <td ng-show="ctrl.uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>
  33 + <td ng-show="ctrl.uploader.isHTML5">
  34 + <div class="progress progress-sm" style="margin-bottom: 0;">
  35 + <div class="progress-bar progress-bar-info" role="progressbar"
  36 + ng-style="{ 'width': item.progress + '%' }"></div>
  37 + </div>
  38 + </td>
  39 + <td class="text-center">
  40 + <span ng-show="item.isSuccess" class="text-success">
  41 + <i class="glyphicon glyphicon-ok"></i>
  42 + </span>
  43 + <span ng-show="item.isCancel" class="text-info">
  44 + <i class="glyphicon glyphicon-ban-circle"></i>
  45 + </span>
  46 + <span ng-show="item.isError" class="text-danger">
  47 + <i class="glyphicon glyphicon-remove"></i>
  48 + </span>
  49 + </td>
  50 + <td nowrap>
  51 + <button type="button" class="btn btn-success btn-xs" ng-click="item.upload()"
  52 + ng-disabled="item.isReady || item.isUploading || item.isSuccess">
  53 + <span class="glyphicon glyphicon-upload"></span> 上传
  54 + </button>
  55 + <button type="button" class="btn btn-warning btn-xs" ng-click="item.cancel()"
  56 + ng-disabled="!item.isUploading">
  57 + <span class="glyphicon glyphicon-ban-circle"></span> 取消
  58 + </button>
  59 + <button type="button" class="btn btn-danger btn-xs" ng-click="item.remove()">
  60 + <span class="glyphicon glyphicon-trash"></span> 删除
  61 + </button>
  62 + </td>
  63 + </tr>
  64 + </tbody>
  65 + </table>
  66 + </div>
  67 +
  68 +</div>
  69 +
  70 +<div class="modal-footer">
  71 + <button class="btn btn-primary" ng-click="ctrl.close()">关闭</button>
  72 +</div>
0 \ No newline at end of file 73 \ No newline at end of file
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/detail.html
@@ -85,7 +85,7 @@ @@ -85,7 +85,7 @@
85 <label class="col-md-2 control-label">设备供应厂商*:</label> 85 <label class="col-md-2 control-label">设备供应厂商*:</label>
86 <div class="col-md-3"> 86 <div class="col-md-3">
87 <input type="text" class="form-control" 87 <input type="text" class="form-control"
88 - name="supplierName" ng-model="ctrl.busInfoForDetail.supplierName" readonly/> 88 + name="supplierName" ng-value="ctrl.busInfoForDetail.supplierName | dict:'snames':'未知'" readonly/>
89 </div> 89 </div>
90 </div> 90 </div>
91 91
@@ -218,28 +218,28 @@ @@ -218,28 +218,28 @@
218 <div class="form-group"> 218 <div class="form-group">
219 <label class="col-md-2 control-label">是否空调车:</label> 219 <label class="col-md-2 control-label">是否空调车:</label>
220 <div class="col-md-3"> 220 <div class="col-md-3">
221 - <truefalse-Dic model="ctrl.busInfoForDetail.hvacCar" disabled="true" dicgroup="truefalseType" name="hvacCar"></truefalse-Dic> 221 + <sa-Radiogroup model="ctrl.busInfoForDetail.hvacCar" disabled="true" dicgroup="truefalseType" name="hvacCar"></sa-Radiogroup>
222 </div> 222 </div>
223 </div> 223 </div>
224 224
225 <div class="form-group"> 225 <div class="form-group">
226 <label class="col-md-2 control-label">有无人售票:</label> 226 <label class="col-md-2 control-label">有无人售票:</label>
227 <div class="col-md-3"> 227 <div class="col-md-3">
228 - <truefalse-Dic model="ctrl.busInfoForDetail.ticketType" disabled="true" dicgroup="truefalseType" name="ticketType"></truefalse-Dic> 228 + <sa-Radiogroup model="ctrl.busInfoForDetail.ticketType" disabled="true" dicgroup="truefalseType" name="ticketType"></sa-Radiogroup>
229 </div> 229 </div>
230 </div> 230 </div>
231 231
232 <div class="form-group"> 232 <div class="form-group">
233 <label class="col-md-2 control-label">是否有LED服务屏:</label> 233 <label class="col-md-2 control-label">是否有LED服务屏:</label>
234 <div class="col-md-3"> 234 <div class="col-md-3">
235 - <truefalse-Dic model="ctrl.busInfoForDetail.ledScreen" disabled="true" dicgroup="truefalseType" name="ledScreen"></truefalse-Dic> 235 + <sa-Radiogroup model="ctrl.busInfoForDetail.ledScreen" disabled="true" dicgroup="truefalseType" name="ledScreen"></sa-Radiogroup>
236 </div> 236 </div>
237 </div> 237 </div>
238 238
239 <div class="form-group"> 239 <div class="form-group">
240 <label class="col-md-2 control-label">是否有TV视屏:</label> 240 <label class="col-md-2 control-label">是否有TV视屏:</label>
241 <div class="col-md-3"> 241 <div class="col-md-3">
242 - <truefalse-Dic model="ctrl.busInfoForDetail.tvVideoType" disabled="true" dicgroup="truefalseType" name="tvVideoType"></truefalse-Dic> 242 + <sa-Radiogroup model="ctrl.busInfoForDetail.tvVideoType" disabled="true" dicgroup="truefalseType" name="tvVideoType"></sa-Radiogroup>
243 </div> 243 </div>
244 </div> 244 </div>
245 245
@@ -247,7 +247,7 @@ @@ -247,7 +247,7 @@
247 <label class="col-md-2 control-label">车辆类型:</label> 247 <label class="col-md-2 control-label">车辆类型:</label>
248 <div class="col-md-3"> 248 <div class="col-md-3">
249 <input type="text" class="form-control" 249 <input type="text" class="form-control"
250 - name="carType" ng-model="ctrl.busInfoForDetail.carType" readonly/> 250 + name="carType" ng-value="ctrl.busInfoForDetail.carType | dict:'carType':'未知'" readonly/>
251 </div> 251 </div>
252 </div> 252 </div>
253 253
@@ -255,7 +255,7 @@ @@ -255,7 +255,7 @@
255 <label class="col-md-2 control-label">是否机动车:</label> 255 <label class="col-md-2 control-label">是否机动车:</label>
256 <div class="col-md-3"> 256 <div class="col-md-3">
257 <input type="text" class="form-control" 257 <input type="text" class="form-control"
258 - name="vehicleStats" ng-model="ctrl.busInfoForDetail.vehicleStats" readonly/> 258 + name="vehicleStats" ng-value="ctrl.busInfoForDetail.vehicleStats | dict:'jdcType':'未知'" readonly/>
259 </div> 259 </div>
260 </div> 260 </div>
261 261
@@ -263,7 +263,7 @@ @@ -263,7 +263,7 @@
263 <label class="col-md-2 control-label">营运状态:</label> 263 <label class="col-md-2 control-label">营运状态:</label>
264 <div class="col-md-3"> 264 <div class="col-md-3">
265 <input type="text" class="form-control" 265 <input type="text" class="form-control"
266 - name="operatorsState" ng-model="ctrl.busInfoForDetail.operatorsState" readonly/> 266 + name="operatorsState" ng-value="ctrl.busInfoForDetail.operatorsState | dict:'yyztType':'未知'" readonly/>
267 </div> 267 </div>
268 </div> 268 </div>
269 269
@@ -279,7 +279,7 @@ @@ -279,7 +279,7 @@
279 <div class="form-group"> 279 <div class="form-group">
280 <label class="col-md-2 control-label">是否电车:</label> 280 <label class="col-md-2 control-label">是否电车:</label>
281 <div class="col-md-3"> 281 <div class="col-md-3">
282 - <truefalse-Dic model="ctrl.busInfoForDetail.sfdc" disabled="true" dicgroup="truefalseType" name="sfdc"></truefalse-Dic> 282 + <sa-Radiogroup model="ctrl.busInfoForDetail.sfdc" disabled="true" dicgroup="truefalseType" name="sfdc"></sa-Radiogroup>
283 </div> 283 </div>
284 </div> 284 </div>
285 285
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/edit.html
@@ -45,7 +45,8 @@ @@ -45,7 +45,8 @@
45 <div class="col-md-3"> 45 <div class="col-md-3">
46 <input type="text" class="form-control" 46 <input type="text" class="form-control"
47 name="insideCode" ng-model="ctrl.busInfoForSave.insideCode" 47 name="insideCode" ng-model="ctrl.busInfoForSave.insideCode"
48 - required ng-maxlength="8" placeholder="请输入车辆内部编码"/> 48 + required ng-maxlength="8" remote-Validaton rvtype="insideCode"
  49 + placeholder="请输入车辆内部编码"/>
49 </div> 50 </div>
50 <!-- 隐藏块,显示验证信息 --> 51 <!-- 隐藏块,显示验证信息 -->
51 <div class="alert alert-danger well-sm" ng-show="myForm.insideCode.$error.required"> 52 <div class="alert alert-danger well-sm" ng-show="myForm.insideCode.$error.required">
@@ -54,26 +55,22 @@ @@ -54,26 +55,22 @@
54 <div class="alert alert-danger well-sm" ng-show="myForm.insideCode.$error.maxlength"> 55 <div class="alert alert-danger well-sm" ng-show="myForm.insideCode.$error.maxlength">
55 内部编号长度不能超过8位 56 内部编号长度不能超过8位
56 </div> 57 </div>
  58 + <div class="alert alert-danger well-sm" ng-show="myForm.insideCode.$error.remote">
  59 + 内部编号不能重复
  60 + </div>
57 </div> 61 </div>
58 62
59 <div class="form-group has-success has-feedback"> 63 <div class="form-group has-success has-feedback">
60 <label class="col-md-2 control-label">所属公司*:</label> 64 <label class="col-md-2 control-label">所属公司*:</label>
61 <div class="col-md-3"> 65 <div class="col-md-3">
62 - <div class="input-group">  
63 - <ui-select ng-model="ctrl.busInfoForSave.gs_selected"  
64 - on-select="ctrl.gs_selected_change($item, $model)"  
65 - theme="bootstrap" name="gs" required>  
66 - <ui-select-match placeholder="请选择所属公司...">{{$select.selected.gsmc}}</ui-select-match>  
67 - <ui-select-choices repeat="item in ctrl.gses">  
68 - <span ng-bind="item.gsmc"></span>  
69 - </ui-select-choices>  
70 - </ui-select>  
71 - <span class="input-group-btn">  
72 - <button type="button" ng-click="ctrl.gs_selected_remove()" class="btn btn-default">  
73 - <span class="glyphicon glyphicon-trash"></span>  
74 - </button>  
75 - </span>  
76 - </div> 66 + <sa-Select model="ctrl.busInfoForSave"
  67 + dicgroup="gsType"
  68 + placeholder="请选择所属公司..."
  69 + name="gs"
  70 + codename="businessCode"
  71 + dicname="company"
  72 + required="true">
  73 + </sa-Select>
77 </div> 74 </div>
78 <!-- 隐藏块,显示验证信息 --> 75 <!-- 隐藏块,显示验证信息 -->
79 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required"> 76 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required">
@@ -124,21 +121,13 @@ @@ -124,21 +121,13 @@
124 <div class="form-group has-success has-feedback"> 121 <div class="form-group has-success has-feedback">
125 <label class="col-md-2 control-label">设备供应厂商*:</label> 122 <label class="col-md-2 control-label">设备供应厂商*:</label>
126 <div class="col-md-3"> 123 <div class="col-md-3">
127 - <div class="input-group">  
128 - <ui-select ng-model="ctrl.busInfoForSave.supplierName_selected"  
129 - on-select="ctrl.supplierName_selected_change($item, $model)"  
130 - theme="bootstrap" name="supplierName" required>  
131 - <ui-select-match placeholder="请选择设备厂商...">{{$select.selected.name}}</ui-select-match>  
132 - <ui-select-choices repeat="item in ctrl.supplierNames">  
133 - <span ng-bind="item.name"></span>  
134 - </ui-select-choices>  
135 - </ui-select>  
136 - <span class="input-group-btn">  
137 - <button type="button" ng-click="ctrl.supplierName_selected_remove()" class="btn btn-default">  
138 - <span class="glyphicon glyphicon-trash"></span>  
139 - </button>  
140 - </span>  
141 - </div> 124 + <sa-Select model="ctrl.busInfoForSave"
  125 + dicgroup="snames"
  126 + placeholder="请选择设备厂商..."
  127 + name="supplierName"
  128 + codename="supplierName"
  129 + required="true">
  130 + </sa-Select>
142 </div> 131 </div>
143 <!-- 隐藏快,显示验证信息 --> 132 <!-- 隐藏快,显示验证信息 -->
144 <div class="alert alert-danger well-sm" ng-show="myForm.supplierName.$error.required"> 133 <div class="alert alert-danger well-sm" ng-show="myForm.supplierName.$error.required">
@@ -320,98 +309,71 @@ @@ -320,98 +309,71 @@
320 <div class="form-group"> 309 <div class="form-group">
321 <label class="col-md-2 control-label">是否空调车:</label> 310 <label class="col-md-2 control-label">是否空调车:</label>
322 <div class="col-md-3"> 311 <div class="col-md-3">
323 - <truefalse-Dic model="ctrl.busInfoForSave.hvacCar" dicgroup="truefalseType" name="hvacCar"></truefalse-Dic> 312 + <sa-Radiogroup model="ctrl.busInfoForSave.hvacCar" dicgroup="truefalseType" name="hvacCar"></sa-Radiogroup>
324 </div> 313 </div>
325 </div> 314 </div>
326 315
327 <div class="form-group"> 316 <div class="form-group">
328 <label class="col-md-2 control-label">有无人售票:</label> 317 <label class="col-md-2 control-label">有无人售票:</label>
329 <div class="col-md-3"> 318 <div class="col-md-3">
330 - <truefalse-Dic model="ctrl.busInfoForSave.ticketType" dicgroup="truefalseType" name="ticketType"></truefalse-Dic> 319 + <sa-Radiogroup model="ctrl.busInfoForSave.ticketType" dicgroup="truefalseType" name="ticketType"></sa-Radiogroup>
331 </div> 320 </div>
332 </div> 321 </div>
333 322
334 <div class="form-group"> 323 <div class="form-group">
335 <label class="col-md-2 control-label">是否有LED服务屏:</label> 324 <label class="col-md-2 control-label">是否有LED服务屏:</label>
336 <div class="col-md-3"> 325 <div class="col-md-3">
337 - <truefalse-Dic model="ctrl.busInfoForSave.ledScreen" dicgroup="truefalseType" name="ledScreen"></truefalse-Dic> 326 + <sa-Radiogroup model="ctrl.busInfoForSave.ledScreen" dicgroup="truefalseType" name="ledScreen"></sa-Radiogroup>
338 </div> 327 </div>
339 </div> 328 </div>
340 329
341 <div class="form-group"> 330 <div class="form-group">
342 <label class="col-md-2 control-label">是否有TV视屏:</label> 331 <label class="col-md-2 control-label">是否有TV视屏:</label>
343 <div class="col-md-3"> 332 <div class="col-md-3">
344 - <truefalse-Dic model="ctrl.busInfoForSave.tvVideoType" dicgroup="truefalseType" name="tvVideoType"></truefalse-Dic> 333 + <sa-Radiogroup model="ctrl.busInfoForSave.tvVideoType" dicgroup="truefalseType" name="tvVideoType"></sa-Radiogroup>
345 </div> 334 </div>
346 </div> 335 </div>
347 336
348 <div class="form-group"> 337 <div class="form-group">
349 <label class="col-md-2 control-label">车辆类型:</label> 338 <label class="col-md-2 control-label">车辆类型:</label>
350 <div class="col-md-3"> 339 <div class="col-md-3">
351 - <div class="input-group">  
352 - <ui-select ng-model="ctrl.busInfoForSave.carType_selected"  
353 - on-select="ctrl.carType_selected_change($item, $model)"  
354 - theme="bootstrap" name="carType">  
355 - <ui-select-match placeholder="请选择车辆类型...">{{$select.selected.type}}</ui-select-match>  
356 - <ui-select-choices repeat="item in ctrl.carTypes">  
357 - <span ng-bind="item.type"></span>  
358 - </ui-select-choices>  
359 - </ui-select>  
360 - <span class="input-group-btn">  
361 - <button type="button" ng-click="ctrl.carType_selected_remove()" class="btn btn-default">  
362 - <span class="glyphicon glyphicon-trash"></span>  
363 - </button>  
364 - </span>  
365 - </div> 340 + <sa-Select model="ctrl.busInfoForSave"
  341 + dicgroup="carType"
  342 + placeholder="请选择车辆类型..."
  343 + name="carType"
  344 + codename="carType" >
  345 + </sa-Select>
366 </div> 346 </div>
367 </div> 347 </div>
368 348
369 <div class="form-group"> 349 <div class="form-group">
370 <label class="col-md-2 control-label">是否机动车:</label> 350 <label class="col-md-2 control-label">是否机动车:</label>
371 <div class="col-md-3"> 351 <div class="col-md-3">
372 - <div class="input-group">  
373 - <ui-select ng-model="ctrl.busInfoForSave.vehicleStats_selected"  
374 - on-select="ctrl.vehicleStats_selected_change($item, $model)"  
375 - theme="bootstrap" name="vehicleStats">  
376 - <ui-select-match placeholder="请选择机动车类型...">{{$select.selected.type}}</ui-select-match>  
377 - <ui-select-choices repeat="item in ctrl.vehicleStates">  
378 - <span ng-bind="item.type"></span>  
379 - </ui-select-choices>  
380 - </ui-select>  
381 - <span class="input-group-btn">  
382 - <button type="button" ng-click="ctrl.vehicleStats_selected_remove()" class="btn btn-default">  
383 - <span class="glyphicon glyphicon-trash"></span>  
384 - </button>  
385 - </span>  
386 - </div> 352 + <sa-Select model="ctrl.busInfoForSave"
  353 + dicgroup="jdcType"
  354 + placeholder="请选择机动车类型..."
  355 + name="vehicleStats"
  356 + codename="vehicleStats" >
  357 + </sa-Select>
387 </div> 358 </div>
388 </div> 359 </div>
389 360
390 <div class="form-group"> 361 <div class="form-group">
391 <label class="col-md-2 control-label">营运状态:</label> 362 <label class="col-md-2 control-label">营运状态:</label>
392 <div class="col-md-3"> 363 <div class="col-md-3">
393 - <div class="input-group">  
394 - <ui-select ng-model="ctrl.busInfoForSave.operatorsState_selected"  
395 - on-select="ctrl.operatorsState_selected_change($item, $model)"  
396 - theme="bootstrap" name="operatorsState">  
397 - <ui-select-match placeholder="请选择营运状态...">{{$select.selected.type}}</ui-select-match>  
398 - <ui-select-choices repeat="item in ctrl.operatorsStates">  
399 - <span ng-bind="item.type"></span>  
400 - </ui-select-choices>  
401 - </ui-select>  
402 - <span class="input-group-btn">  
403 - <button type="button" ng-click="ctrl.operatorsState_selected_remove()" class="btn btn-default">  
404 - <span class="glyphicon glyphicon-trash"></span>  
405 - </button>  
406 - </span>  
407 - </div> 364 + <sa-Select model="ctrl.busInfoForSave"
  365 + dicgroup="yyztType"
  366 + placeholder="请选择营运状态..."
  367 + name="operatorsState"
  368 + codename="operatorsState" >
  369 + </sa-Select>
408 </div> 370 </div>
409 </div> 371 </div>
410 372
411 <div class="form-group"> 373 <div class="form-group">
412 <label class="col-md-2 control-label">是否电车:</label> 374 <label class="col-md-2 control-label">是否电车:</label>
413 <div class="col-md-3"> 375 <div class="col-md-3">
414 - <truefalse-Dic model="ctrl.busInfoForSave.sfdc" dicgroup="truefalseType" name="sfdc"></truefalse-Dic> 376 + <sa-Radiogroup model="ctrl.busInfoForSave.sfdc" dicgroup="truefalseType" name="sfdc"></sa-Radiogroup>
415 </div> 377 </div>
416 </div> 378 </div>
417 379
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/form.html
@@ -45,7 +45,7 @@ @@ -45,7 +45,7 @@
45 <div class="col-md-3"> 45 <div class="col-md-3">
46 <input type="text" class="form-control" 46 <input type="text" class="form-control"
47 name="insideCode" ng-model="ctrl.busInfoForSave.insideCode" 47 name="insideCode" ng-model="ctrl.busInfoForSave.insideCode"
48 - required ng-maxlength="8" remote-Validaton rvtype="zbh" 48 + required ng-maxlength="8" remote-Validaton rvtype="insideCode"
49 placeholder="请输入车辆内部编码"/> 49 placeholder="请输入车辆内部编码"/>
50 </div> 50 </div>
51 <!-- 隐藏块,显示验证信息 --> 51 <!-- 隐藏块,显示验证信息 -->
@@ -63,21 +63,14 @@ @@ -63,21 +63,14 @@
63 <div class="form-group has-success has-feedback"> 63 <div class="form-group has-success has-feedback">
64 <label class="col-md-2 control-label">所属公司*:</label> 64 <label class="col-md-2 control-label">所属公司*:</label>
65 <div class="col-md-3"> 65 <div class="col-md-3">
66 - <div class="input-group">  
67 - <ui-select ng-model="ctrl.busInfoForSave.gs_selected"  
68 - on-select="ctrl.gs_selected_change($item, $model)"  
69 - theme="bootstrap" name="gs" required>  
70 - <ui-select-match placeholder="请选择所属公司...">{{$select.selected.gsmc}}</ui-select-match>  
71 - <ui-select-choices repeat="item in ctrl.gses">  
72 - <span ng-bind="item.gsmc"></span>  
73 - </ui-select-choices>  
74 - </ui-select>  
75 - <span class="input-group-btn">  
76 - <button type="button" ng-click="ctrl.gs_selected_remove()" class="btn btn-default">  
77 - <span class="glyphicon glyphicon-trash"></span>  
78 - </button>  
79 - </span>  
80 - </div> 66 + <sa-Select model="ctrl.busInfoForSave"
  67 + dicgroup="gsType"
  68 + placeholder="请选择所属公司..."
  69 + name="gs"
  70 + codename="businessCode"
  71 + dicname="company"
  72 + required="true">
  73 + </sa-Select>
81 </div> 74 </div>
82 <!-- 隐藏块,显示验证信息 --> 75 <!-- 隐藏块,显示验证信息 -->
83 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required"> 76 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required">
@@ -128,21 +121,13 @@ @@ -128,21 +121,13 @@
128 <div class="form-group has-success has-feedback"> 121 <div class="form-group has-success has-feedback">
129 <label class="col-md-2 control-label">设备供应厂商*:</label> 122 <label class="col-md-2 control-label">设备供应厂商*:</label>
130 <div class="col-md-3"> 123 <div class="col-md-3">
131 - <div class="input-group">  
132 - <ui-select ng-model="ctrl.busInfoForSave.supplierName_selected"  
133 - on-select="ctrl.supplierName_selected_change($item, $model)"  
134 - theme="bootstrap" name="supplierName" required>  
135 - <ui-select-match placeholder="请选择设备厂商...">{{$select.selected.name}}</ui-select-match>  
136 - <ui-select-choices repeat="item in ctrl.supplierNames">  
137 - <span ng-bind="item.name"></span>  
138 - </ui-select-choices>  
139 - </ui-select>  
140 - <span class="input-group-btn">  
141 - <button type="button" ng-click="ctrl.supplierName_selected_remove()" class="btn btn-default">  
142 - <span class="glyphicon glyphicon-trash"></span>  
143 - </button>  
144 - </span>  
145 - </div> 124 + <sa-Select model="ctrl.busInfoForSave"
  125 + dicgroup="snames"
  126 + placeholder="请选择设备厂商..."
  127 + name="supplierName"
  128 + codename="supplierName"
  129 + required="true">
  130 + </sa-Select>
146 </div> 131 </div>
147 <!-- 隐藏快,显示验证信息 --> 132 <!-- 隐藏快,显示验证信息 -->
148 <div class="alert alert-danger well-sm" ng-show="myForm.supplierName.$error.required"> 133 <div class="alert alert-danger well-sm" ng-show="myForm.supplierName.$error.required">
@@ -324,133 +309,71 @@ @@ -324,133 +309,71 @@
324 <div class="form-group"> 309 <div class="form-group">
325 <label class="col-md-2 control-label">是否空调车:</label> 310 <label class="col-md-2 control-label">是否空调车:</label>
326 <div class="col-md-3"> 311 <div class="col-md-3">
327 - <label class="radio-inline">  
328 - <input type="radio" name="hvacCar"  
329 - ng-value="true" ng-model="ctrl.busInfoForSave.hvacCar"/>是  
330 - </label>  
331 - <label class="radio-inline">  
332 - <input type="radio" name="hvacCar"  
333 - ng-value="false" ng-model="ctrl.busInfoForSave.hvacCar"/>否  
334 - </label> 312 + <sa-Radiogroup model="ctrl.busInfoForSave.hvacCar" dicgroup="truefalseType" name="hvacCar"></sa-Radiogroup>
335 </div> 313 </div>
336 </div> 314 </div>
337 315
338 <div class="form-group"> 316 <div class="form-group">
339 <label class="col-md-2 control-label">有无人售票:</label> 317 <label class="col-md-2 control-label">有无人售票:</label>
340 <div class="col-md-3"> 318 <div class="col-md-3">
341 - <label class="radio-inline">  
342 - <input type="radio" name="ticketType"  
343 - ng-value="true" ng-model="ctrl.busInfoForSave.ticketType"/>是  
344 - </label>  
345 - <label class="radio-inline">  
346 - <input type="radio" name="ticketType"  
347 - ng-value="false" ng-model="ctrl.busInfoForSave.ticketType"/>否  
348 - </label> 319 + <sa-Radiogroup model="ctrl.busInfoForSave.ticketType" dicgroup="truefalseType" name="ticketType"></sa-Radiogroup>
349 </div> 320 </div>
350 </div> 321 </div>
351 322
352 <div class="form-group"> 323 <div class="form-group">
353 <label class="col-md-2 control-label">是否有LED服务屏:</label> 324 <label class="col-md-2 control-label">是否有LED服务屏:</label>
354 <div class="col-md-3"> 325 <div class="col-md-3">
355 - <label class="radio-inline">  
356 - <input type="radio" name="ledScreen"  
357 - ng-value="true" ng-model="ctrl.busInfoForSave.ledScreen"/>是  
358 - </label>  
359 - <label class="radio-inline">  
360 - <input type="radio" name="ledScreen"  
361 - ng-value="false" ng-model="ctrl.busInfoForSave.ledScreen"/>否  
362 - </label> 326 + <sa-Radiogroup model="ctrl.busInfoForSave.ledScreen" dicgroup="truefalseType" name="ledScreen"></sa-Radiogroup>
363 </div> 327 </div>
364 </div> 328 </div>
365 329
366 <div class="form-group"> 330 <div class="form-group">
367 <label class="col-md-2 control-label">是否有TV视屏:</label> 331 <label class="col-md-2 control-label">是否有TV视屏:</label>
368 <div class="col-md-3"> 332 <div class="col-md-3">
369 - <label class="radio-inline">  
370 - <input type="radio" name="tvVideoType"  
371 - ng-value="true" ng-model="ctrl.busInfoForSave.tvVideoType"/>是  
372 - </label>  
373 - <label class="radio-inline">  
374 - <input type="radio" name="tvVideoType"  
375 - ng-value="false" ng-model="ctrl.busInfoForSave.tvVideoType"/>否  
376 - </label> 333 + <sa-Radiogroup model="ctrl.busInfoForSave.tvVideoType" dicgroup="truefalseType" name="tvVideoType"></sa-Radiogroup>
377 </div> 334 </div>
378 </div> 335 </div>
379 336
380 <div class="form-group"> 337 <div class="form-group">
381 <label class="col-md-2 control-label">车辆类型:</label> 338 <label class="col-md-2 control-label">车辆类型:</label>
382 <div class="col-md-3"> 339 <div class="col-md-3">
383 - <div class="input-group">  
384 - <ui-select ng-model="ctrl.busInfoForSave.carType_selected"  
385 - on-select="ctrl.carType_selected_change($item, $model)"  
386 - theme="bootstrap" name="carType">  
387 - <ui-select-match placeholder="请选择车辆类型...">{{$select.selected.type}}</ui-select-match>  
388 - <ui-select-choices repeat="item in ctrl.carTypes">  
389 - <span ng-bind="item.type"></span>  
390 - </ui-select-choices>  
391 - </ui-select>  
392 - <span class="input-group-btn">  
393 - <button type="button" ng-click="ctrl.carType_selected_remove()" class="btn btn-default">  
394 - <span class="glyphicon glyphicon-trash"></span>  
395 - </button>  
396 - </span>  
397 - </div> 340 + <sa-Select model="ctrl.busInfoForSave"
  341 + dicgroup="carType"
  342 + placeholder="请选择车辆类型..."
  343 + name="carType"
  344 + codename="carType" >
  345 + </sa-Select>
398 </div> 346 </div>
399 </div> 347 </div>
400 348
401 <div class="form-group"> 349 <div class="form-group">
402 <label class="col-md-2 control-label">是否机动车:</label> 350 <label class="col-md-2 control-label">是否机动车:</label>
403 <div class="col-md-3"> 351 <div class="col-md-3">
404 - <div class="input-group">  
405 - <ui-select ng-model="ctrl.busInfoForSave.vehicleStats_Selected"  
406 - on-select="ctrl.vehicleStats_selected_change($item, $model)"  
407 - theme="bootstrap" name="vehicleStats">  
408 - <ui-select-match placeholder="请选择机动车类型...">{{$select.selected.type}}</ui-select-match>  
409 - <ui-select-choices repeat="item in ctrl.vehicleStates">  
410 - <span ng-bind="item.type"></span>  
411 - </ui-select-choices>  
412 - </ui-select>  
413 - <span class="input-group-btn">  
414 - <button type="button" ng-click="ctrl.vehicleStats_selected_remove()" class="btn btn-default">  
415 - <span class="glyphicon glyphicon-trash"></span>  
416 - </button>  
417 - </span>  
418 - </div> 352 + <sa-Select model="ctrl.busInfoForSave"
  353 + dicgroup="jdcType"
  354 + placeholder="请选择机动车类型..."
  355 + name="vehicleStats"
  356 + codename="vehicleStats" >
  357 + </sa-Select>
419 </div> 358 </div>
420 </div> 359 </div>
421 360
422 <div class="form-group"> 361 <div class="form-group">
423 <label class="col-md-2 control-label">营运状态:</label> 362 <label class="col-md-2 control-label">营运状态:</label>
424 <div class="col-md-3"> 363 <div class="col-md-3">
425 - <div class="input-group">  
426 - <ui-select ng-model="ctrl.busInfoForSave.operatorsState_Selected"  
427 - on-select="ctrl.operatorsState_selected_change($item, $model)"  
428 - theme="bootstrap" name="operatorsState">  
429 - <ui-select-match placeholder="请选择营运状态...">{{$select.selected.type}}</ui-select-match>  
430 - <ui-select-choices repeat="item in ctrl.operatorsStates">  
431 - <span ng-bind="item.type"></span>  
432 - </ui-select-choices>  
433 - </ui-select>  
434 - <span class="input-group-btn">  
435 - <button type="button" ng-click="ctrl.operatorsState_selected_remove()" class="btn btn-default">  
436 - <span class="glyphicon glyphicon-trash"></span>  
437 - </button>  
438 - </span>  
439 - </div> 364 + <sa-Select model="ctrl.busInfoForSave"
  365 + dicgroup="yyztType"
  366 + placeholder="请选择营运状态..."
  367 + name="operatorsState"
  368 + codename="operatorsState" >
  369 + </sa-Select>
440 </div> 370 </div>
441 </div> 371 </div>
442 372
443 <div class="form-group"> 373 <div class="form-group">
444 <label class="col-md-2 control-label">是否电车:</label> 374 <label class="col-md-2 control-label">是否电车:</label>
445 <div class="col-md-3"> 375 <div class="col-md-3">
446 - <label class="radio-inline">  
447 - <input type="radio" name="sfdc"  
448 - ng-value="true" ng-model="ctrl.busInfoForSave.sfdc"/>是  
449 - </label>  
450 - <label class="radio-inline">  
451 - <input type="radio" name="sfdc"  
452 - ng-value="false" ng-model="ctrl.busInfoForSave.sfdc"/>否  
453 - </label> 376 + <sa-Radiogroup model="ctrl.busInfoForSave.sfdc" dicgroup="truefalseType" name="sfdc"></sa-Radiogroup>
454 </div> 377 </div>
455 </div> 378 </div>
456 379
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/index.html
@@ -40,6 +40,12 @@ @@ -40,6 +40,12 @@
40 </a> 40 </a>
41 <ul class="dropdown-menu pull-right"> 41 <ul class="dropdown-menu pull-right">
42 <li> 42 <li>
  43 + <a href="javascript:" class="tool-action" ng-click="ctrl.importData()">
  44 + <i class="fa fa-file-excel-o"></i>
  45 + 导入excel
  46 + </a>
  47 + </li>
  48 + <li>
43 <a href="javascript:" class="tool-action"> 49 <a href="javascript:" class="tool-action">
44 <i class="fa fa-file-excel-o"></i> 50 <i class="fa fa-file-excel-o"></i>
45 导出excel 51 导出excel
@@ -48,8 +54,8 @@ @@ -48,8 +54,8 @@
48 <li class="divider"></li> 54 <li class="divider"></li>
49 <li> 55 <li>
50 <a href="javascript:" class="tool-action"> 56 <a href="javascript:" class="tool-action">
51 - <i class="fa fa-refresh"></i>  
52 - 刷行数据 57 + <i class="fa fa-download"></i>
  58 + excel模版
53 </a> 59 </a>
54 </li> 60 </li>
55 </ul> 61 </ul>
src/main/resources/static/pages/scheduleApp/module/basicInfo/employeeInfoManage/detail.html
@@ -79,19 +79,14 @@ @@ -79,19 +79,14 @@
79 <div class="form-group"> 79 <div class="form-group">
80 <label class="col-md-2 control-label">性别:</label> 80 <label class="col-md-2 control-label">性别:</label>
81 <div class="col-md-4"> 81 <div class="col-md-4">
82 - <label class="radio-inline">  
83 - <input type="radio" name="ledScreen" ng-value="'男性'" ng-model="ctrl.employeeInfoForDetail.personnelType" disabled/>男性  
84 - </label>  
85 - <label class="radio-inline">  
86 - <input type="radio" name="ledScreen" ng-value="'女性'" ng-model="ctrl.employeeInfoForDetail.personnelType" disabled/>女性  
87 - </label> 82 + <sa-Radiogroup model="ctrl.employeeInfoForDetail.personnelType" disabled="true" dicgroup="sexType" name="personnelType"></sa-Radiogroup>
88 </div> 83 </div>
89 </div> 84 </div>
90 <div class="form-group"> 85 <div class="form-group">
91 <label class="col-md-2 control-label">工种:</label> 86 <label class="col-md-2 control-label">工种:</label>
92 <div class="col-md-4"> 87 <div class="col-md-4">
93 <input type="text" class="form-control" name="posts" 88 <input type="text" class="form-control" name="posts"
94 - ng-model="ctrl.employeeInfoForDetail.posts" readonly/> 89 + ng-value="ctrl.employeeInfoForDetail.posts | dict:'gzType':'未知'" readonly/>
95 </div> 90 </div>
96 </div> 91 </div>
97 92
src/main/resources/static/pages/scheduleApp/module/basicInfo/employeeInfoManage/edit.html
@@ -36,21 +36,14 @@ @@ -36,21 +36,14 @@
36 <div class="form-group has-success has-feedback"> 36 <div class="form-group has-success has-feedback">
37 <label class="col-md-2 control-label">所属公司*:</label> 37 <label class="col-md-2 control-label">所属公司*:</label>
38 <div class="col-md-3"> 38 <div class="col-md-3">
39 - <div class="input-group">  
40 - <ui-select ng-model="ctrl.employeeInfoForSave.gs_selected"  
41 - on-select="ctrl.gs_selected_change($item, $model)"  
42 - theme="bootstrap" name="gs" required>  
43 - <ui-select-match placeholder="请选择所属公司...">{{$select.selected.gsmc}}</ui-select-match>  
44 - <ui-select-choices repeat="item in ctrl.gses">  
45 - <span ng-bind="item.gsmc"></span>  
46 - </ui-select-choices>  
47 - </ui-select>  
48 - <span class="input-group-btn">  
49 - <button type="button" ng-click="ctrl.gs_selected_remove()" class="btn btn-default">  
50 - <span class="glyphicon glyphicon-trash"></span>  
51 - </button>  
52 - </span>  
53 - </div> 39 + <sa-Select model="ctrl.employeeInfoForSave"
  40 + dicgroup="gsType"
  41 + placeholder="请选择所属公司..."
  42 + name="gs"
  43 + codename="companyCode"
  44 + dicname="company"
  45 + required="true">
  46 + </sa-Select>
54 </div> 47 </div>
55 <!-- 隐藏块,显示验证信息 --> 48 <!-- 隐藏块,显示验证信息 -->
56 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required"> 49 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required">
@@ -77,12 +70,16 @@ @@ -77,12 +70,16 @@
77 <div class="col-md-3"> 70 <div class="col-md-3">
78 <input type="text" class="form-control" 71 <input type="text" class="form-control"
79 name="jobCode" ng-model="ctrl.employeeInfoForSave.jobCode" 72 name="jobCode" ng-model="ctrl.employeeInfoForSave.jobCode"
  73 + remote-Validaton rvtype="jobCode" rv1="{{ctrl.employeeInfoForSave.companyCode}}"
80 required placeholder="请输入工号"/> 74 required placeholder="请输入工号"/>
81 </div> 75 </div>
82 <!-- 隐藏块,显示验证信息 --> 76 <!-- 隐藏块,显示验证信息 -->
83 <div class="alert alert-danger well-sm" ng-show="myForm.jobCode.$error.required"> 77 <div class="alert alert-danger well-sm" ng-show="myForm.jobCode.$error.required">
84 工号必须填写 78 工号必须填写
85 </div> 79 </div>
  80 + <div class="alert alert-danger well-sm" ng-show="myForm.jobCode.$error.remote">
  81 + 选择公司并且相同公司工号不能重复
  82 + </div>
86 </div> 83 </div>
87 84
88 <div class="form-group has-success has-feedback"> 85 <div class="form-group has-success has-feedback">
@@ -117,35 +114,19 @@ @@ -117,35 +114,19 @@
117 <div class="form-group"> 114 <div class="form-group">
118 <label class="col-md-2 control-label">性别:</label> 115 <label class="col-md-2 control-label">性别:</label>
119 <div class="col-md-4"> 116 <div class="col-md-4">
120 - <label class="radio-inline">  
121 - <input type="radio" name="personnelType"  
122 - ng-value="'男性'" ng-model="ctrl.employeeInfoForSave.personnelType"/>男性  
123 - </label>  
124 - <label class="radio-inline">  
125 - <input type="radio" name="personnelType"  
126 - ng-value="'女性'" ng-model="ctrl.employeeInfoForSave.personnelType"/>女性  
127 - </label> 117 + <sa-Radiogroup model="ctrl.employeeInfoForSave.personnelType" dicgroup="sexType" name="personnelType"></sa-Radiogroup>
128 </div> 118 </div>
129 </div> 119 </div>
130 120
131 <div class="form-group"> 121 <div class="form-group">
132 <label class="col-md-2 control-label">工种:</label> 122 <label class="col-md-2 control-label">工种:</label>
133 <div class="col-md-4"> 123 <div class="col-md-4">
134 - <div class="input-group">  
135 - <ui-select ng-model="ctrl.employeeInfoForSave.posts_selected"  
136 - on-select="ctrl.posts_selected_change($item, $model)"  
137 - theme="bootstrap" name="posts">  
138 - <ui-select-match placeholder="请选择工种...">{{$select.selected.type}}</ui-select-match>  
139 - <ui-select-choices repeat="item in ctrl.postes">  
140 - <span ng-bind="item.type"></span>  
141 - </ui-select-choices>  
142 - </ui-select>  
143 - <span class="input-group-btn">  
144 - <button type="button" ng-click="ctrl.posts_selected_remove()" class="btn btn-default">  
145 - <span class="glyphicon glyphicon-trash"></span>  
146 - </button>  
147 - </span>  
148 - </div> 124 + <sa-Select model="ctrl.employeeInfoForSave"
  125 + dicgroup="gzType"
  126 + placeholder="请选择工种..."
  127 + name="posts"
  128 + codename="posts" >
  129 + </sa-Select>
149 </div> 130 </div>
150 </div> 131 </div>
151 132
src/main/resources/static/pages/scheduleApp/module/basicInfo/employeeInfoManage/employeeInfoManage.js
1 // 人员信息管理 service controller等写在一起 1 // 人员信息管理 service controller等写在一起
2 2
3 angular.module('ScheduleApp').factory('EmployeeInfoManageService', ['EmployeeInfoManageService_g', function(service) { 3 angular.module('ScheduleApp').factory('EmployeeInfoManageService', ['EmployeeInfoManageService_g', function(service) {
4 - /** 公司字典 */  
5 - var gses = [  
6 - {gsdm: "55", gsmc: "上南公司"},  
7 - {gsdm: "22", gsmc: "金高公司"},  
8 - {gsdm: "05", gsmc: "杨高公司"},  
9 - {gsdm: "26", gsmc: "南汇公司"}  
10 - ];  
11 - /** 工种类型字典 */  
12 - var postes = [  
13 - {type: "公共汽电车驾驶员"},  
14 - {type: "公共汽电车调度员"},  
15 - {type: "公共汽电车售票员"},  
16 - {type: "站员"},  
17 - {type: "管理员"},  
18 - {type: "安检员"},  
19 - {type: "机务"},  
20 - {type: "引导员"},  
21 - {type: "乘务员"},  
22 - {type: "车队长(线长、主"},  
23 - {type: "公司管理人员"},  
24 - {type: "警消人员"},  
25 - {type: "票务人员"},  
26 - {type: "其他服务人员"}  
27 - ];  
28 4
29 /** 当前的查询条件信息 */ 5 /** 当前的查询条件信息 */
30 var currentSearchCondition = { 6 var currentSearchCondition = {
@@ -39,18 +15,6 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf @@ -39,18 +15,6 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf
39 15
40 return { 16 return {
41 /** 17 /**
42 - * 获取公司字典。  
43 - */  
44 - getGses: function() {  
45 - return gses;  
46 - },  
47 - /**  
48 - * 获取工种类型字典。  
49 - */  
50 - getPostes: function() {  
51 - return postes;  
52 - },  
53 - /**  
54 * 获取查询条件信息, 18 * 获取查询条件信息,
55 * 用于给controller用来和页面数据绑定。 19 * 用于给controller用来和页面数据绑定。
56 */ 20 */
@@ -81,7 +45,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf @@ -81,7 +45,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf
81 getPage: function() { 45 getPage: function() {
82 var params = currentSearchCondition; // 查询条件 46 var params = currentSearchCondition; // 查询条件
83 params.page = currentPageNo - 1; // 服务端页码从0开始 47 params.page = currentPageNo - 1; // 服务端页码从0开始
84 - return service.list(params).$promise; 48 + return service.rest.list(params).$promise;
85 }, 49 },
86 /** 50 /**
87 * 获取明细信息。 51 * 获取明细信息。
@@ -90,7 +54,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf @@ -90,7 +54,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf
90 */ 54 */
91 getDetail: function(id) { 55 getDetail: function(id) {
92 var params = {id: id}; 56 var params = {id: id};
93 - return service.get(params).$promise; 57 + return service.rest.get(params).$promise;
94 }, 58 },
95 /** 59 /**
96 * 保存信息。 60 * 保存信息。
@@ -98,7 +62,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf @@ -98,7 +62,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeInfoManageService&#39;, [&#39;EmployeeInf
98 * @return 返回一个 promise 62 * @return 返回一个 promise
99 */ 63 */
100 saveDetail: function(obj) { 64 saveDetail: function(obj) {
101 - return service.save(obj).$promise; 65 + return service.rest.save(obj).$promise;
102 } 66 }
103 } 67 }
104 68
@@ -110,7 +74,7 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployeeInfoManageCtrl&#39;, [&#39;EmployeeInf @@ -110,7 +74,7 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployeeInfoManageCtrl&#39;, [&#39;EmployeeInf
110 // 切换到form状态 74 // 切换到form状态
111 self.goForm = function() { 75 self.goForm = function() {
112 //alert("切换"); 76 //alert("切换");
113 - $state.go("deviceInfoManage_form"); 77 + $state.go("employeeInfoManage_form");
114 } 78 }
115 }]); 79 }]);
116 80
@@ -170,30 +134,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployeeInfoManageFormCtrl&#39;, [&#39;Employe @@ -170,30 +134,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployeeInfoManageFormCtrl&#39;, [&#39;Employe
170 // 欲保存的busInfo信息,绑定 134 // 欲保存的busInfo信息,绑定
171 self.employeeInfoForSave = {}; 135 self.employeeInfoForSave = {};
172 136
173 - // 公司 selectedItem  
174 - self.employeeInfoForSave.gs_selected = null;  
175 - self.gses = employeeInfoManageService.getGses();  
176 - self.gs_selected_change = function($item, $model) {  
177 - self.employeeInfoForSave.companyCode = $item.gsdm;  
178 - self.employeeInfoForSave.company = $item.gsmc;  
179 - };  
180 - self.gs_selected_remove = function() {  
181 - self.employeeInfoForSave.gs_selected = null;  
182 - self.employeeInfoForSave.companyCode = null;  
183 - self.employeeInfoForSave.company = null;  
184 - };  
185 -  
186 - // 工种 selectedItem  
187 - self.employeeInfoForSave.posts_selected = null;  
188 - self.postes = employeeInfoManageService.getPostes();  
189 - self.posts_selected_change = function($item, $model) {  
190 - self.employeeInfoForSave.posts = $item.type;  
191 - };  
192 - self.posts_selected_remove = function() {  
193 - self.employeeInfoForSave.posts_selected = null;  
194 - self.employeeInfoForSave.posts = null;  
195 - };  
196 -  
197 // 获取传过来的id,有的话就是修改,获取一遍数据 137 // 获取传过来的id,有的话就是修改,获取一遍数据
198 var id = $stateParams.id; 138 var id = $stateParams.id;
199 if (id) { 139 if (id) {
@@ -204,24 +144,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployeeInfoManageFormCtrl&#39;, [&#39;Employe @@ -204,24 +144,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployeeInfoManageFormCtrl&#39;, [&#39;Employe
204 for (key in result) { 144 for (key in result) {
205 self.employeeInfoForSave[key] = result[key]; 145 self.employeeInfoForSave[key] = result[key];
206 } 146 }
207 - // 填写所有的 select 控件选中框数据  
208 - // 公司字典  
209 - if (self.employeeInfoForSave.companyCode) {  
210 - angular.forEach(self.gses, function(data) {  
211 - if (self.employeeInfoForSave.companyCode == data.gsdm) {  
212 - self.employeeInfoForSave.gs_selected = data;  
213 - }  
214 - });  
215 - }  
216 - // 工种字典  
217 - if (self.employeeInfoForSave.posts) {  
218 - angular.forEach(self.postes, function(data) {  
219 - if (self.employeeInfoForSave.posts == data.type) {  
220 - self.employeeInfoForSave.posts_selected = data;  
221 - }  
222 - });  
223 - }  
224 -  
225 }, 147 },
226 function(result) { 148 function(result) {
227 alert("出错啦!"); 149 alert("出错啦!");
src/main/resources/static/pages/scheduleApp/module/basicInfo/employeeInfoManage/form.html
@@ -36,21 +36,14 @@ @@ -36,21 +36,14 @@
36 <div class="form-group has-success has-feedback"> 36 <div class="form-group has-success has-feedback">
37 <label class="col-md-2 control-label">所属公司*:</label> 37 <label class="col-md-2 control-label">所属公司*:</label>
38 <div class="col-md-3"> 38 <div class="col-md-3">
39 - <div class="input-group">  
40 - <ui-select ng-model="ctrl.employeeInfoForSave.gs_selected"  
41 - on-select="ctrl.gs_selected_change($item, $model)"  
42 - theme="bootstrap" name="gs" required>  
43 - <ui-select-match placeholder="请选择所属公司...">{{$select.selected.gsmc}}</ui-select-match>  
44 - <ui-select-choices repeat="item in ctrl.gses">  
45 - <span ng-bind="item.gsmc"></span>  
46 - </ui-select-choices>  
47 - </ui-select>  
48 - <span class="input-group-btn">  
49 - <button type="button" ng-click="ctrl.gs_selected_remove()" class="btn btn-default">  
50 - <span class="glyphicon glyphicon-trash"></span>  
51 - </button>  
52 - </span>  
53 - </div> 39 + <sa-Select model="ctrl.employeeInfoForSave"
  40 + dicgroup="gsType"
  41 + placeholder="请选择所属公司..."
  42 + name="gs"
  43 + codename="companyCode"
  44 + dicname="company"
  45 + required="true">
  46 + </sa-Select>
54 </div> 47 </div>
55 <!-- 隐藏块,显示验证信息 --> 48 <!-- 隐藏块,显示验证信息 -->
56 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required"> 49 <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required">
@@ -77,12 +70,16 @@ @@ -77,12 +70,16 @@
77 <div class="col-md-3"> 70 <div class="col-md-3">
78 <input type="text" class="form-control" 71 <input type="text" class="form-control"
79 name="jobCode" ng-model="ctrl.employeeInfoForSave.jobCode" 72 name="jobCode" ng-model="ctrl.employeeInfoForSave.jobCode"
  73 + remote-Validaton rvtype="jobCode" rv1="{{ctrl.employeeInfoForSave.companyCode}}"
80 required placeholder="请输入工号"/> 74 required placeholder="请输入工号"/>
81 </div> 75 </div>
82 <!-- 隐藏块,显示验证信息 --> 76 <!-- 隐藏块,显示验证信息 -->
83 <div class="alert alert-danger well-sm" ng-show="myForm.jobCode.$error.required"> 77 <div class="alert alert-danger well-sm" ng-show="myForm.jobCode.$error.required">
84 工号必须填写 78 工号必须填写
85 </div> 79 </div>
  80 + <div class="alert alert-danger well-sm" ng-show="myForm.jobCode.$error.remote">
  81 + 选择公司并且相同公司工号不能重复
  82 + </div>
86 </div> 83 </div>
87 84
88 <div class="form-group has-success has-feedback"> 85 <div class="form-group has-success has-feedback">
@@ -117,35 +114,19 @@ @@ -117,35 +114,19 @@
117 <div class="form-group"> 114 <div class="form-group">
118 <label class="col-md-2 control-label">性别:</label> 115 <label class="col-md-2 control-label">性别:</label>
119 <div class="col-md-4"> 116 <div class="col-md-4">
120 - <label class="radio-inline">  
121 - <input type="radio" name="personnelType"  
122 - ng-value="'男性'" ng-model="ctrl.employeeInfoForSave.personnelType"/>男性  
123 - </label>  
124 - <label class="radio-inline">  
125 - <input type="radio" name="personnelType"  
126 - ng-value="'女性'" ng-model="ctrl.employeeInfoForSave.personnelType"/>女性  
127 - </label> 117 + <sa-Radiogroup model="ctrl.employeeInfoForSave.personnelType" dicgroup="sexType" name="personnelType"></sa-Radiogroup>
128 </div> 118 </div>
129 </div> 119 </div>
130 120
131 <div class="form-group"> 121 <div class="form-group">
132 <label class="col-md-2 control-label">工种:</label> 122 <label class="col-md-2 control-label">工种:</label>
133 <div class="col-md-4"> 123 <div class="col-md-4">
134 - <div class="input-group">  
135 - <ui-select ng-model="ctrl.employeeInfoForSave.posts_selected"  
136 - on-select="ctrl.posts_selected_change($item, $model)"  
137 - theme="bootstrap" name="posts">  
138 - <ui-select-match placeholder="请选择工种...">{{$select.selected.type}}</ui-select-match>  
139 - <ui-select-choices repeat="item in ctrl.postes">  
140 - <span ng-bind="item.type"></span>  
141 - </ui-select-choices>  
142 - </ui-select>  
143 - <span class="input-group-btn">  
144 - <button type="button" ng-click="ctrl.posts_selected_remove()" class="btn btn-default">  
145 - <span class="glyphicon glyphicon-trash"></span>  
146 - </button>  
147 - </span>  
148 - </div> 124 + <sa-Select model="ctrl.employeeInfoForSave"
  125 + dicgroup="gzType"
  126 + placeholder="请选择工种..."
  127 + name="posts"
  128 + codename="posts" >
  129 + </sa-Select>
149 </div> 130 </div>
150 </div> 131 </div>
151 132
src/main/resources/static/pages/scheduleApp/module/basicInfo/employeeInfoManage/list.html
@@ -106,7 +106,7 @@ @@ -106,7 +106,7 @@
106 <span ng-bind="info.jobCode"></span> 106 <span ng-bind="info.jobCode"></span>
107 </td> 107 </td>
108 <td> 108 <td>
109 - <span ng-bind="info.personnelType"></span> 109 + <span ng-bind="info.personnelType | dict:'sexType':'未知'"></span>
110 </td> 110 </td>
111 <td> 111 <td>
112 <span ng-bind="info.company"></span> 112 <span ng-bind="info.company"></span>
@@ -115,7 +115,7 @@ @@ -115,7 +115,7 @@
115 <span ng-bind="info.brancheCompany"></span> 115 <span ng-bind="info.brancheCompany"></span>
116 </td> 116 </td>
117 <td> 117 <td>
118 - <span ng-bind="info.posts"></span> 118 + <span ng-bind="info.posts | dict:'gzType':'未知'"></span>
119 </td> 119 </td>
120 <td> 120 <td>
121 <span ng-bind="info.icCardCode"></span> 121 <span ng-bind="info.icCardCode"></span>
src/main/resources/static/pages/scheduleApp/module/main.css
@@ -17,4 +17,14 @@ form input.ng-valid.ng-dirty.ng-valid-required { @@ -17,4 +17,14 @@ form input.ng-valid.ng-dirty.ng-valid-required {
17 } 17 }
18 .ui-select-container.ng-valid.ng-dirty.ng-valid-required .form-control { 18 .ui-select-container.ng-valid.ng-dirty.ng-valid-required .form-control {
19 background-color: #78FA89; 19 background-color: #78FA89;
  20 +}
  21 +
  22 +.center-modal {
  23 + position: fixed;
  24 + top: 10%;
  25 + left: 18.5%;
  26 + z-index: 1050;
  27 + width: 80%;
  28 + height: 80%;
  29 + margin-left: -10%;
20 } 30 }
21 \ No newline at end of file 31 \ No newline at end of file
src/main/resources/static/pages/scheduleApp/module/main.js
@@ -62,6 +62,7 @@ ScheduleApp.config([&#39;$stateProvider&#39;, &#39;$urlRouterProvider&#39;, function($stateProvi @@ -62,6 +62,7 @@ ScheduleApp.config([&#39;$stateProvider&#39;, &#39;$urlRouterProvider&#39;, function($stateProvi
62 name: 'busInfoManage_module', 62 name: 'busInfoManage_module',
63 insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置 63 insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置
64 files: [ 64 files: [
  65 + "assets/bower_components/angular-file-upload/dist/angular-file-upload.min.js",
65 "pages/scheduleApp/module/basicInfo/busInfoManage/busInfoManage.js" 66 "pages/scheduleApp/module/basicInfo/busInfoManage/busInfoManage.js"
66 ] 67 ]
67 }); 68 });
@@ -666,45 +667,67 @@ ScheduleApp.config([&#39;$stateProvider&#39;, &#39;$urlRouterProvider&#39;, function($stateProvi @@ -666,45 +667,67 @@ ScheduleApp.config([&#39;$stateProvider&#39;, &#39;$urlRouterProvider&#39;, function($stateProvi
666 667
667 // 车辆信息service 668 // 车辆信息service
668 angular.module('ScheduleApp').factory('BusInfoManageService_g', ['$resource', function($resource) { 669 angular.module('ScheduleApp').factory('BusInfoManageService_g', ['$resource', function($resource) {
669 - return $resource(  
670 - '/cars/:id',  
671 - {order: 'carCode', direction: 'ASC', id: '@id_route'},  
672 - {  
673 - list: {  
674 - method: 'GET',  
675 - params: {  
676 - page: 0 670 + return {
  671 + rest: $resource(
  672 + '/cars/:id',
  673 + {order: 'carCode', direction: 'ASC', id: '@id_route'},
  674 + {
  675 + list: {
  676 + method: 'GET',
  677 + params: {
  678 + page: 0
  679 + }
  680 + },
  681 + get: {
  682 + method: 'GET'
  683 + },
  684 + save: {
  685 + method: 'POST'
677 } 686 }
678 - },  
679 - get: {  
680 - method: 'GET'  
681 - },  
682 - save: {  
683 - method: 'POST'  
684 } 687 }
685 - }  
686 - ); 688 + ),
  689 + validate: $resource(
  690 + '/cars/validate/:type',
  691 + {},
  692 + {
  693 + insideCode: {
  694 + method: 'GET'
  695 + }
  696 + }
  697 + )
  698 + };
687 }]); 699 }]);
688 // 人员信息service 700 // 人员信息service
689 angular.module('ScheduleApp').factory('EmployeeInfoManageService_g', ['$resource', function($resource) { 701 angular.module('ScheduleApp').factory('EmployeeInfoManageService_g', ['$resource', function($resource) {
690 - return $resource(  
691 - '/personnel/:id',  
692 - {order: 'jobCode', direction: 'ASC', id: '@id_route'},  
693 - {  
694 - list: {  
695 - method: 'GET',  
696 - params: {  
697 - page: 0 702 + return {
  703 + rest : $resource(
  704 + '/personnel/:id',
  705 + {order: 'jobCode', direction: 'ASC', id: '@id_route'},
  706 + {
  707 + list: {
  708 + method: 'GET',
  709 + params: {
  710 + page: 0
  711 + }
  712 + },
  713 + get: {
  714 + method: 'GET'
  715 + },
  716 + save: {
  717 + method: 'POST'
698 } 718 }
699 - },  
700 - get: {  
701 - method: 'GET'  
702 - },  
703 - save: {  
704 - method: 'POST'  
705 } 719 }
706 - }  
707 - ); 720 + ),
  721 + validate: $resource(
  722 + '/personnel/validate/:type',
  723 + {},
  724 + {
  725 + jobCode: {
  726 + method: 'GET'
  727 + }
  728 + }
  729 + )
  730 + };
708 }]); 731 }]);
709 // 车辆设备信息service 732 // 车辆设备信息service
710 angular.module('ScheduleApp').factory('DeviceInfoManageService_g', ['$resource', function($resource) { 733 angular.module('ScheduleApp').factory('DeviceInfoManageService_g', ['$resource', function($resource) {
@@ -895,50 +918,182 @@ angular.module(&#39;ScheduleApp&#39;).filter(&quot;dict&quot;, [function() { @@ -895,50 +918,182 @@ angular.module(&#39;ScheduleApp&#39;).filter(&quot;dict&quot;, [function() {
895 }; 918 };
896 }]); 919 }]);
897 920
898 -angular.module('ScheduleApp').directive("truefalseDic", [function() { 921 +angular.module('ScheduleApp').directive("saSelect", ['$timeout', function($timeout) {
  922 + return {
  923 + restrict: 'E',
  924 + templateUrl: '/pages/scheduleApp/module/other/MyDictionarySelectTemplate.html',
  925 + scope: {
  926 + model: "="
  927 + },
  928 + controllerAs: "$saSelectCtrl",
  929 + bindToController: true,
  930 + controller: function($scope) {
  931 + var self = this;
  932 + self.datas = []; // 关联的字典数据,内部格式 {code:{值},name:{名字}}
  933 + },
  934 + /**
  935 + * 此阶段可以改dom结构,此时angular还没扫描指令,
  936 + * 这里就可以动态添加其他angularjs的指令字符串,如required指令字符串。
  937 + * @param tElem
  938 + * @param tAttrs
  939 + * @returns {{pre: Function, post: Function}}
  940 + */
  941 + compile: function(tElem, tAttrs) {
  942 + // 确定是否使用angularjs required验证
  943 + // 属性 required
  944 + // 如果没有填写,内部不添加验证,如果填写了,并且等于true添加验证,否则不添加
  945 + var required_attr = tAttrs["required"];
  946 + if (required_attr) {
  947 + if (required_attr == "true") {
  948 + // 添加required属性指令
  949 + tElem.find("ui-select").attr("required", "");
  950 + } else {
  951 + // 不等于true,不添加required属性指令
  952 + }
  953 + } else {
  954 + // 不添加required属性指令
  955 + }
  956 +
  957 + //console.log("saSelect" + ":compile = >" + tElem.html());
  958 +
  959 + return {
  960 + pre: function(scope, element, attr) {
  961 + // TODO:
  962 + },
  963 + /**
  964 + * 相当于link函数。
  965 + *
  966 + * 重要属性如下:
  967 + * model 是绑定外部值。
  968 + * dicgroup 字典组的类型
  969 + * name input name属性值
  970 + */
  971 + post: function(scope, element, attr) {
  972 + // 1、获取属性
  973 + var dicgroup_attr = attr['dicgroup']; // 字典组的类型
  974 + var name_attr = attr['name']; // input name属性值
  975 + var dicname_attr = attr['dicname']; // model关联的字典名字段
  976 + var codename_attr = attr['codename']; // model关联的字典值字段
  977 + var placeholder_attr = attr['placeholder']; // select placeholder提示
  978 +
  979 + // 系统的字典对象,使用dictionaryUtils类获取
  980 + var origin_dicgroup;
  981 + var dic_key; // 字典key
  982 +
  983 + if (dicgroup_attr) { // 赋值指定的字典数据
  984 + origin_dicgroup = dictionaryUtils.getByGroup(dicgroup_attr);
  985 + for (dic_key in origin_dicgroup) {
  986 + var data = {}; // 重新组合的字典元素对象
  987 + if (dic_key == "true")
  988 + data.code = true;
  989 + else
  990 + data.code = dic_key;
  991 + data.name = origin_dicgroup[dic_key];
  992 + scope["$saSelectCtrl"].datas.push(data);
  993 + }
  994 + }
  995 +
  996 + if (name_attr) {
  997 + scope["$saSelectCtrl"].nv = name_attr;
  998 + }
  999 + if (placeholder_attr) {
  1000 + scope["$saSelectCtrl"].ph = placeholder_attr;
  1001 + }
  1002 +
  1003 + scope["$saSelectCtrl"].select = function($item) {
  1004 + if (codename_attr) {
  1005 + scope["$saSelectCtrl"].model[codename_attr] = $item.code;
  1006 + }
  1007 + if (dicname_attr) {
  1008 + scope["$saSelectCtrl"].model[dicname_attr] = $item.name;
  1009 + }
  1010 + };
  1011 +
  1012 + scope["$saSelectCtrl"].remove = function() {
  1013 + if (codename_attr) {
  1014 + scope["$saSelectCtrl"].model[codename_attr] = null;
  1015 + }
  1016 + if (dicname_attr) {
  1017 + scope["$saSelectCtrl"].model[dicname_attr] = null;
  1018 + }
  1019 + scope["$saSelectCtrl"].cmodel = null;
  1020 + };
  1021 +
  1022 + $timeout(function() {
  1023 + // 创建内部使用的绑定对象
  1024 + var model_code = scope["$saSelectCtrl"].model[codename_attr];
  1025 + scope["$saSelectCtrl"].cmodel = model_code;
  1026 + }, 0);
  1027 + }
  1028 + }
  1029 + }
  1030 + };
  1031 +}]);
  1032 +
  1033 +angular.module('ScheduleApp').directive("saRadiogroup", [function() {
899 /** 1034 /**
900 - * true,false组合的单元按钮组的指令。 1035 + * 使用字典数据的单选按钮组的指令。
901 * 指令名称:truefalse-Dic 1036 * 指令名称:truefalse-Dic
902 */ 1037 */
903 return { 1038 return {
904 restrict: 'E', 1039 restrict: 'E',
905 - templateUrl: '/pages/scheduleApp/module/other/truefalseRadioGroupTemplate.html', 1040 + templateUrl: '/pages/scheduleApp/module/other/MyDictionaryRadioGroupTemplate.html',
906 scope: { 1041 scope: {
907 model: "=" 1042 model: "="
908 }, 1043 },
  1044 + controllerAs: "ctrl",
  1045 + bindToController: true,
  1046 + controller: function($scope) {
  1047 + //$scope["model"] = {selectedOption: null};
  1048 + //console.log("controller");
  1049 + //console.log("controller:" + $scope["model"]);
  1050 + },
909 /** 1051 /**
  1052 + * 重要属性如下:
910 * model 是绑定外部值。 1053 * model 是绑定外部值。
911 * disabled 说明是否不能修改 1054 * disabled 说明是否不能修改
912 * dicgroup 字典组的类型 1055 * dicgroup 字典组的类型
  1056 + * name input name属性值
913 */ 1057 */
914 link: function(scope, element, attr) { 1058 link: function(scope, element, attr) {
  1059 + //console.log("link");
  1060 + //console.log("link:" + scope.model);
  1061 + //scope["model"] = {selectedOption: null};
  1062 +
915 if (attr["name"]) { 1063 if (attr["name"]) {
916 - scope["nv"] = attr["name"]; 1064 + scope["ctrl"].nv = attr["name"];
917 } 1065 }
918 1066
919 if (attr["disabled"]) { 1067 if (attr["disabled"]) {
920 - element.find("input").attr("disabled", ""); 1068 + scope["ctrl"].disabled = true;
921 } 1069 }
922 if (attr["dicgroup"]) { 1070 if (attr["dicgroup"]) {
923 var obj = dictionaryUtils.getByGroup(attr['dicgroup']); 1071 var obj = dictionaryUtils.getByGroup(attr['dicgroup']);
924 - if (obj["true"])  
925 - scope["trueDesc"] = obj["true"];  
926 - else  
927 - scope["trueDesc"] = "未知true";  
928 -  
929 - if (obj["false"])  
930 - scope["falseDesc"] = obj["false"];  
931 - else  
932 - scope["falseDesc"] = "未知false";  
933 - } else {  
934 - scope["trueDesc"] = "未知true";  
935 - scope["falseDesc"] = "未知false"; 1072 + scope["ctrl"].dic = obj;
  1073 + // 处理 scope["dic"] key值
  1074 + scope["ctrl"].dicvalueCalcu = function(value) {
  1075 + if (value == "true") {
  1076 + //console.log(value);
  1077 + return true;
  1078 + } else if (value == "false") {
  1079 + //console.log(value);
  1080 + return false;
  1081 + } else {
  1082 + return value;
  1083 + }
  1084 + };
936 } 1085 }
937 } 1086 }
938 }; 1087 };
939 }]); 1088 }]);
940 1089
941 -angular.module('ScheduleApp').directive("remoteValidaton", [function() { 1090 +angular.module('ScheduleApp').directive("remoteValidaton", [
  1091 + 'BusInfoManageService_g',
  1092 + 'EmployeeInfoManageService_g',
  1093 + function(
  1094 + busInfoManageService_g,
  1095 + employeeInfoManageService_g
  1096 + ) {
942 /** 1097 /**
943 * 远端验证指令,依赖于ngModel 1098 * 远端验证指令,依赖于ngModel
944 * 指令名称 remote-Validation 1099 * 指令名称 remote-Validation
@@ -946,17 +1101,82 @@ angular.module(&#39;ScheduleApp&#39;).directive(&quot;remoteValidaton&quot;, [function() { @@ -946,17 +1101,82 @@ angular.module(&#39;ScheduleApp&#39;).directive(&quot;remoteValidaton&quot;, [function() {
946 */ 1101 */
947 return { 1102 return {
948 restrict: "A", 1103 restrict: "A",
949 - require: "ngModel", 1104 + require: "^ngModel",
950 link: function(scope, element, attr, ngModelCtrl) { 1105 link: function(scope, element, attr, ngModelCtrl) {
951 element.bind("keyup", function() { 1106 element.bind("keyup", function() {
  1107 + var modelValue = ngModelCtrl.$modelValue;
  1108 + var rv1_attr = attr["rv1"];
952 if (attr["rvtype"]) { 1109 if (attr["rvtype"]) {
  1110 +
953 // 根据rvtype的值,确定使用那个远端验证的url, 1111 // 根据rvtype的值,确定使用那个远端验证的url,
  1112 + // rv1, rv2, rv3是关联比较值,暂时使用rv1
954 // 这个貌似没法通用,根据业务变换 1113 // 这个貌似没法通用,根据业务变换
955 - console.log(attr['rvtype']); 1114 + // TODO:暂时有点乱以后改
  1115 + if (attr["rvtype"] == "insideCode") {
  1116 + busInfoManageService_g.validate.insideCode(
  1117 + {"insideCode_eq": modelValue, type: "equale"},
  1118 + function(result) {
  1119 + //console.log(result);
  1120 + if (result.status == "SUCCESS") {
  1121 + ngModelCtrl.$setValidity('remote', true);
  1122 + } else {
  1123 + ngModelCtrl.$setValidity('remote', false);
  1124 + }
  1125 + },
  1126 + function(result) {
  1127 + //console.log(result);
  1128 + ngModelCtrl.$setValidity('remote', true);
  1129 + }
  1130 + );
  1131 + } else if (attr["rvtype"] == "jobCode") {
  1132 + if (!rv1_attr) {
  1133 + ngModelCtrl.$setValidity('remote', false);
  1134 + return;
  1135 + }
  1136 +
  1137 + employeeInfoManageService_g.validate.jobCode(
  1138 + {"jobCode_eq": modelValue, "companyCode_eq": rv1_attr, type: "equale"},
  1139 + function(result) {
  1140 + //console.log(result);
  1141 + if (result.status == "SUCCESS") {
  1142 + ngModelCtrl.$setValidity('remote', true);
  1143 + } else {
  1144 + ngModelCtrl.$setValidity('remote', false);
  1145 + }
  1146 + },
  1147 + function(result) {
  1148 + //console.log(result);
  1149 + ngModelCtrl.$setValidity('remote', true);
  1150 + }
  1151 + );
  1152 + }
956 } else { 1153 } else {
957 // 没有rvtype,就不用远端验证了 1154 // 没有rvtype,就不用远端验证了
958 ngModelCtrl.$setValidity('remote', true); 1155 ngModelCtrl.$setValidity('remote', true);
959 } 1156 }
  1157 +
  1158 + attr.$observe("rv1", function(value) {
  1159 + if (!value) {
  1160 + ngModelCtrl.$setValidity('remote', false);
  1161 + return;
  1162 + }
  1163 +
  1164 + employeeInfoManageService_g.validate.jobCode(
  1165 + {"jobCode_eq": modelValue, "companyCode_eq": rv1_attr, type: "equale"},
  1166 + function(result) {
  1167 + //console.log(result);
  1168 + if (result.status == "SUCCESS") {
  1169 + ngModelCtrl.$setValidity('remote', true);
  1170 + } else {
  1171 + ngModelCtrl.$setValidity('remote', false);
  1172 + }
  1173 + },
  1174 + function(result) {
  1175 + //console.log(result);
  1176 + ngModelCtrl.$setValidity('remote', true);
  1177 + }
  1178 + );
  1179 + });
960 }); 1180 });
961 } 1181 }
962 }; 1182 };
src/main/resources/static/pages/scheduleApp/module/other/MyDictionaryRadioGroupTemplate.html 0 → 100644
  1 +<div>
  2 + <!--<label class="radio-inline">-->
  3 + <!--<input type="radio" name="{{nv}}"-->
  4 + <!--ng-value="true" ng-model="model" {{disabled}}/>{{trueDesc}}-->
  5 + <!--</label>-->
  6 + <!--<label class="radio-inline">-->
  7 + <!--<input type="radio" name="{{nv}}"-->
  8 + <!--ng-value="false" ng-model="model" {{disabled}}/>{{falseDesc}}-->
  9 + <!--</label>-->
  10 +
  11 + <!-- 单选按钮组模版 -->
  12 + <!--
  13 + 使用 ng-repeat 循环生成input radio时候,双向绑定会有问题,因为ng-repeat有自己的controller,
  14 + 会影响外部的controller绑定,网上有很多解决方法,这里使用controllerAs方式,让指令定义自己的控制器别名,
  15 + 模版里指定别名就不会和ng-repeat控制器混了。
  16 + -->
  17 +
  18 + <label class="radio-inline" ng-repeat="(dicvalue, dicdesc) in ctrl.dic">
  19 + <input type="radio" name="{{ctrl.nv}}"
  20 + ng-value="ctrl.dicvalueCalcu(dicvalue)" ng-model="ctrl.model" ng-disabled="ctrl.disabled" />{{dicdesc}}
  21 + </label>
  22 +</div>
0 \ No newline at end of file 23 \ No newline at end of file
src/main/resources/static/pages/scheduleApp/module/other/MyDictionarySelectTemplate.html 0 → 100644
  1 +
  2 +<div class="input-group">
  3 + <ui-select ng-model="$saSelectCtrl.cmodel" on-select="$saSelectCtrl.select($item)"
  4 + theme="bootstrap" name="{{$saSelectCtrl.nv}}" >
  5 + <ui-select-match placeholder="{{$saSelectCtrl.ph}}">{{$select.selected.name}}</ui-select-match>
  6 + <ui-select-choices repeat="item.code as item in $saSelectCtrl.datas">
  7 + <span ng-bind="item.name"></span>
  8 + </ui-select-choices>
  9 + </ui-select>
  10 + <span class="input-group-btn">
  11 + <button type="button" ng-click="$saSelectCtrl.remove()" class="btn btn-default">
  12 + <span class="glyphicon glyphicon-trash"></span>
  13 + </button>
  14 + </span>
  15 +</div>
src/main/resources/static/pages/scheduleApp/module/other/truefalseRadioGroupTemplate.html deleted 100644 → 0
1 -<div>  
2 - <label class="radio-inline">  
3 - <input type="radio" name="{{nv}}"  
4 - ng-value="true" ng-model="model" {{disabled}}/>{{trueDesc}}  
5 - </label>  
6 - <label class="radio-inline">  
7 - <input type="radio" name="{{nv}}"  
8 - ng-value="false" ng-model="model" {{disabled}}/>{{falseDesc}}  
9 - </label>  
10 -</div>  
11 \ No newline at end of file 0 \ No newline at end of file