Jelajahi Sumber

Merge remote-tracking branch 'origin/dev' into dev

heqinwei 7 tahun lalu
induk
melakukan
e901149963
84 mengubah file dengan 1597 tambahan dan 5913 penghapusan
  1. 34 6
      README.md
  2. 3 1
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ExcelController.java
  3. 0 2
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/CommonMapper.java
  4. 1 4
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/CommonServiceImpl.java
  5. 48 36
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java
  6. 0 3
      applications/commons/commons-server/src/main/resources/mapper/CommonMapper.xml
  7. 1 1
      applications/commons/commons-server/src/main/resources/mapper/DataImportDetailMapper.xml
  8. 2 2
      applications/commons/commons-server/src/main/resources/mapper/DataImportMapper.xml
  9. 1 1
      applications/commons/commons-server/src/main/resources/mapper/DataTempletMapper.xml
  10. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/EmployeeMapper.java
  11. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java
  12. 13 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java
  13. 6 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java
  14. 3 0
      applications/document/document-server/src/main/resources/mapper/EmployeeMapper.xml
  15. 15 0
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  16. 1 1
      applications/sale/sale-server/src/main/resources/config/application-docker-test.yml
  17. 11 1
      framework/core/src/main/java/com/usoftchina/saas/utils/DateUtils.java
  18. 31 18
      frontend/saas-portal-web/src/components/conenter/addgongsi.vue
  19. 7 7
      frontend/saas-portal-web/src/components/conenter/company.vue
  20. 3 22
      frontend/saas-portal-web/src/components/conenter/home.vue
  21. 13 3
      frontend/saas-portal-web/src/components/conenter/problem.vue
  22. 1 12
      frontend/saas-portal-web/src/pages/index/index.html
  23. 0 3188
      frontend/saas-portal-web/static/css/animate.css
  24. 0 274
      frontend/saas-portal-web/static/css/jquery.fancybox.css
  25. 0 231
      frontend/saas-portal-web/static/css/owl.carousel.css
  26. 0 221
      frontend/saas-portal-web/static/css/slit-slider.css
  27. 0 12
      frontend/saas-portal-web/static/js/jquery.ba-cond.min.js
  28. 0 46
      frontend/saas-portal-web/static/js/jquery.fancybox.pack.js
  29. 0 10
      frontend/saas-portal-web/static/js/jquery.form.min.js
  30. 0 676
      frontend/saas-portal-web/static/js/jquery.slitslider.js
  31. 0 1
      frontend/saas-portal-web/static/js/jquery.validate.min.js
  32. 6 107
      frontend/saas-portal-web/static/js/mains.js
  33. 0 3
      frontend/saas-portal-web/static/js/modernizr-2.6.2.min.js
  34. 0 9
      frontend/saas-portal-web/static/js/owl.carousel.min.js
  35. 0 1
      frontend/saas-portal-web/static/js/wow.min.js
  36. 35 50
      frontend/saas-web/app.json
  37. 5 0
      frontend/saas-web/app/view/core/base/ImportWindow.js
  38. 1 1
      frontend/saas-web/app/view/core/dbfind/types/BankInfoDbfindTrigger.js
  39. 1 1
      frontend/saas-web/app/view/core/dbfind/types/EmployeeDbfindTrigger.js
  40. 2 64
      frontend/saas-web/app/view/core/dbfind/types/WarehouseDbfindTrigger.js
  41. 21 7
      frontend/saas-web/app/view/core/report/ReportPanel.js
  42. 42 0
      frontend/saas-web/app/view/document/address/DataList.js
  43. 48 0
      frontend/saas-web/app/view/document/address/DataListModel.js
  44. 32 0
      frontend/saas-web/app/view/document/address/Window.js
  45. 82 0
      frontend/saas-web/app/view/document/bankinformation/DataList.js
  46. 54 0
      frontend/saas-web/app/view/document/bankinformation/DataListModel.js
  47. 128 0
      frontend/saas-web/app/view/document/bankinformation/Window.js
  48. 94 0
      frontend/saas-web/app/view/document/employee/DataList.js
  49. 51 0
      frontend/saas-web/app/view/document/employee/DataListModel.js
  50. 123 0
      frontend/saas-web/app/view/document/employee/Window.js
  51. 1 209
      frontend/saas-web/app/view/document/kind/ChildForm.js
  52. 0 200
      frontend/saas-web/app/view/document/kind/Kind.js
  53. 1 1
      frontend/saas-web/app/view/document/kind/KindController.js
  54. 0 247
      frontend/saas-web/app/view/document/kind/KindModel.js
  55. 0 30
      frontend/saas-web/app/view/document/other/Address.js
  56. 0 31
      frontend/saas-web/app/view/document/other/BankInformation.js
  57. 0 28
      frontend/saas-web/app/view/document/other/Employee.js
  58. 0 30
      frontend/saas-web/app/view/document/other/ProductBrand.js
  59. 0 30
      frontend/saas-web/app/view/document/other/ProductUnit.js
  60. 0 28
      frontend/saas-web/app/view/document/other/Warehouse.js
  61. 4 8
      frontend/saas-web/app/view/document/product/FormPanel.js
  62. 42 0
      frontend/saas-web/app/view/document/productbrand/DataList.js
  63. 48 0
      frontend/saas-web/app/view/document/productbrand/DataListModel.js
  64. 32 0
      frontend/saas-web/app/view/document/productbrand/Window.js
  65. 42 0
      frontend/saas-web/app/view/document/productunit/DataList.js
  66. 48 0
      frontend/saas-web/app/view/document/productunit/DataListModel.js
  67. 32 0
      frontend/saas-web/app/view/document/productunit/Window.js
  68. 94 0
      frontend/saas-web/app/view/document/warehouse/DataList.js
  69. 52 0
      frontend/saas-web/app/view/document/warehouse/DataListModel.js
  70. 121 0
      frontend/saas-web/app/view/document/warehouse/Window.js
  71. 0 1
      frontend/saas-web/app/view/home/InfoCard.scss
  72. 2 5
      frontend/saas-web/app/view/purchase/purchase/FormPanel.js
  73. 17 1
      frontend/saas-web/app/view/sale/sale/FormPanel.js
  74. 8 6
      frontend/saas-web/app/view/stock/appropriationInOut/QueryPanel.js
  75. 6 0
      frontend/saas-web/app/view/stock/make/QueryPanel.js
  76. 7 1
      frontend/saas-web/app/view/stock/otherIn/QueryPanel.js
  77. 7 1
      frontend/saas-web/app/view/stock/otherOut/QueryPanel.js
  78. 70 6
      frontend/saas-web/app/view/stock/report/DataList.js
  79. 17 4
      frontend/saas-web/app/view/stock/report/DataListController.js
  80. 1 0
      frontend/saas-web/app/view/sys/power/TreePanel.js
  81. 6 2
      frontend/saas-web/ext/packages/ux/src/feature/MySummary.js
  82. 2 2
      frontend/saas-web/overrides/form/field/TrimVtype.js
  83. 3 3
      frontend/saas-web/package.json
  84. 11 16
      frontend/saas-web/resources/json/navigation.json

+ 34 - 6
README.md

@@ -106,13 +106,15 @@
 | 192.168.0.178 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
 | 192.168.0.179 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
 | 192.168.0.180 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
-| 192.168.0.181 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 80G |
+| 192.168.0.181 |  root  | select123*** |  CentOS7, Docker  | Cpu: 8, Mem: 16G, Disk: 80G |
 | 192.168.0.182 |  root  | select123*** |  CentOS7, Redis  | Cpu: 2, Mem: 8G, Disk: 20G |
 | 192.168.0.183 |  root  | select123*** |  CentOS7, Mongo  | Cpu: 4, Mem: 8G, Disk: 50G |
+| 192.168.0.184 |  root  | select123*** |  CentOS7, Docker  | Cpu: 8, Mem: 16G, Disk: 50G |
+| 192.168.0.185 |  root  | select123*** |  CentOS7, Docker  | Cpu: 8, Mem: 16G, Disk: 50G |
 
 > 构建
 
-* [jenkins](http://192.168.0.181:8080/job/saas) **账号** admin **密码** select123***
+* [jenkins](http://192.168.0.181:8080/job/saas/view/dev) **账号** admin **密码** select123***
 
 > 日志
 
@@ -123,11 +125,9 @@
 > 服务
 
 * [eureka http://192.168.0.181:8500](http://192.168.0.181:8500) **账号** admin **密码** select111***
-* [eureka 本地调试 http://192.168.0.181:8510](http://192.168.0.181:8510) **账号** admin **密码** select111***
 * [gateway http://192.168.0.181:8560](http://192.168.0.181:8560)
-* [gateway 本地调试 http://192.168.0.181:8570](http://192.168.0.181:8570)
-* [admin](http://192.168.0.181:8520) **账号** admin **密码** select111***
-* [zipkin](http://192.168.0.181:8540) **账号** admin **密码** select111***
+* [admin http://192.168.0.181:8520](http://192.168.0.181:8520) **账号** admin **密码** select111***
+* [zipkin http://192.168.0.181:8540](http://192.168.0.181:8540) **账号** admin **密码** select111***
 
 > 访问
 
@@ -136,6 +136,34 @@
 * [打印 https://saas-report-dev.usoftchina.com:5443](https://saas-report-dev.usoftchina.com:5443)
 * [接口 https://saas-api-dev.usoftchina.com:5443](https://saas-api-dev.usoftchina.com:5443)
 
+# 本地调试环境
+
+> 服务
+
+* [eureka http://192.168.0.181:8510](http://192.168.0.181:8510) **账号** admin **密码** select111***
+* [gateway http://192.168.0.181:8570](http://192.168.0.181:8570)
+
+
+# 测试环境
+
+> 构建
+
+* [jenkins](http://192.168.0.181:8080/job/saas/view/test) **账号** admin **密码** select123***
+
+> 服务
+
+* [eureka http://192.168.0.181:8515](http://192.168.0.181:8515) **账号** admin **密码** select111***
+* [gateway http://192.168.0.181:8575](http://192.168.0.181:8575)
+* [admin http://192.168.0.181:8535](http://192.168.0.181:8535) **账号** admin **密码** select111***
+* [zipkin http://192.168.0.181:8555](http://192.168.0.181:8555) **账号** admin **密码** select111***
+
+> 访问
+
+* [门户 https://saas-test.usoftchina.com:5443](https://saas-test.usoftchina.com:5443)
+* [系统 https://trade-test.usoftchina.com:5443](https://trade-test.usoftchina.com:5443)
+* [打印 https://saas-report-dev.usoftchina.com:5443](https://saas-report-dev.usoftchina.com:5443)
+* [接口 https://saas-api-test.usoftchina.com:5443](https://saas-api-test.usoftchina.com:5443)
+
 # 生产环境
 
 > 数据库

+ 3 - 1
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ExcelController.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.commons.controller;
 import com.usoftchina.saas.auth.client.annotation.IgnoreAuth;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.service.ExcelService;
+import com.usoftchina.saas.utils.DateUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
@@ -15,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
+import java.util.Date;
 import java.util.Map;
 
 /**导入模板下载、解析
@@ -32,7 +34,7 @@ public class ExcelController {
     public void CreateTemplet(@RequestParam("caller") String caller, HttpServletResponse response) throws IOException {
         Map<String, Object> map = excelService.CreateTemplet(caller);
         SXSSFWorkbook workbook = (SXSSFWorkbook)map.get("workbook");
-        String title = map.get("title").toString();
+        String title = map.get("title").toString() + "_" + DateUtils.format(new Date(), "yyyyMMdd");
         String filename = URLEncoder.encode(title + ".xlsx", "UTF-8");
         response.setContentType("application/vnd.ms-excel");
         response.setHeader("Content-Disposition", "attachment;filename=" + filename);

+ 0 - 2
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/CommonMapper.java

@@ -4,8 +4,6 @@ import org.apache.ibatis.annotations.Param;
 
 public interface CommonMapper {
 
-    int getCountBaseSet(@Param("companyId") Long companyId);
-
     int getCountWarehouse(@Param("companyId") Long companyId);
 
     int getCountProduct(@Param("companyId") Long companyId);

+ 1 - 4
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/CommonServiceImpl.java

@@ -23,10 +23,7 @@ public class CommonServiceImpl implements CommonService {
         InitStatusDTO result = new InitStatusDTO();
         int count = 0;
         Long companyId = BaseContextHolder.getCompanyId();
-        count = commonMapper.getCountBaseSet(companyId);
-        if (count > 0){
-            result.setBaseSet(true);
-        }
+        result.setBaseSet(true);
         count = commonMapper.getCountWarehouse(companyId);
         if (count > 0){
             result.setWarehouse(true);

+ 48 - 36
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java

@@ -12,6 +12,7 @@ import com.usoftchina.saas.commons.service.ExcelService;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.utils.CollectionUtils;
+import com.usoftchina.saas.utils.DateUtils;
 import com.usoftchina.saas.utils.StringUtils;
 import org.apache.poi.hssf.util.HSSFColor;
 import org.apache.poi.ss.usermodel.*;
@@ -45,6 +46,9 @@ public class ExcelServiceImpl implements ExcelService{
         Map<String, Object> map = new HashMap<>();
         SXSSFWorkbook workbook = new SXSSFWorkbook();
         DataTemplet dataTemplet = dataTempletMapper.selectByCaller(caller, companyId);
+        if (null == dataTemplet) {
+            throw new BizException(9876, "没有查询到对应的excel配置");
+        }
         //列
         String cols = dataTemplet.getDt_columns();
         JSONArray array = (JSONArray) JSONArray.parse(cols);
@@ -70,7 +74,6 @@ public class ExcelServiceImpl implements ExcelService{
     }
 
     @Override
-    @Transactional
     public Integer parseTemplet(Workbook wb, String caller) {
         if (wb == null || StringUtils.isEmpty(caller)) {
             throw new BizException(BizExceptionCode.NULL_DATA);
@@ -136,7 +139,6 @@ public class ExcelServiceImpl implements ExcelService{
             StringBuilder err = new StringBuilder();
             JSONArray mains = new JSONArray();
             JSONArray details = new JSONArray();
-            boolean flag = false;
             //数据行循环
             for (int i = 0; i < datas.size(); i++) {
                 Map<String,String> data = datas.get(i);
@@ -177,25 +179,21 @@ public class ExcelServiceImpl implements ExcelService{
                            if (difference) {
                                dd.setDd_codevalue(codeValue);
                                if ("true".equals(set.getNecessary()) && data.get("*" + set.getDescription()).equals("")) {
-                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 必填字段未填写! ");
+                                   err.append("第" + (i + 3) + "行 " + set.getDescription() + " 必填字段未填写!<br/> ");
                                    break;
                                }
                            }
                            //检测日期类型是否规范
-                           if ("date".equals(set.getType())) {
-                               flag = validateDateFormat(value);
-                               if (!flag) {
-                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
+                           if ("date".equals(set.getType()) && !StringUtils.isEmpty(value)) {
+                               value = praseDate(value);
+                               if (null == value) {
+                                   err.append("第" + (i + 3) + "行 " + set.getDescription() + " 日期格式不正确!<br/> ");
                                    break;
                                }
                            }
                            //插入主表数据
                            if (null != mainData) {
-                               if ("true".equals(set.getNecessary())) {
-                                   mainData.put(set.getField(), value);
-                               } else {
-                                   mainData.put(set.getField(), value);
-                               }
+                               mainData.put(set.getField(), value);
                            }
                        }
                        //所有主表数据进行分类
@@ -214,24 +212,20 @@ public class ExcelServiceImpl implements ExcelService{
                            } else {
                                value = data.get(set.getDescription());
                            }
-                           //拼从表数据
-                           if ("true".equals(set.getNecessary())) {
-                               detailData.put(set.getField(), data.get("*" + set.getDescription()));
-                           } else {
-                               detailData.put(set.getField(), data.get(set.getDescription()));
-                           }
-                           if ("true".equals(set.getNecessary()) && data.get("*" + set.getDescription()).equals("")) {
-                               err.append("第" + (i + 2) + "行 " + set.getDescription() + " 必填字段未填写! ");
+                           if ("true".equals(set.getNecessary()) && value.equals("")) {
+                               err.append("第" + (i + 3) + "行 " + set.getDescription() + " 必填字段未填写!<br/> ");
                                break;
                            }
                            //检测日期类型是否规范
-                           if ("date".equals(set.getType())) {
-                               flag = validateDateFormat(value);
-                               if (!flag) {
-                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
+                           if ("date".equals(set.getType()) && !StringUtils.isEmpty(value)) {
+                               value = praseDate(value);
+                               if (null == value) {
+                                   err.append("第" + (i + 3) + "行 " + set.getDescription() + " 日期格式不正确!<br/> ");
                                    break;
                                }
                            }
+                           //拼从表数据
+                           detailData.put(set.getField(), value);
                        }
                        if (detailData.size() > 0) {
                            dd.setDd_codevalue(codeValue);
@@ -257,7 +251,7 @@ public class ExcelServiceImpl implements ExcelService{
         if (StringUtils.isEmpty(date)) {
             return false;
         }
-        String regEx1 = "[0-9]{8}";
+        String regEx1 = "[0-9]{4}/[0-9]{2}/[0-9]{2}";
         String regEX2 = "[0-9]{4}-[0-9]{2}-[0-9]{2}";
         // 编译正则表达式
         Pattern pattern1 = Pattern.compile(regEx1);
@@ -271,6 +265,15 @@ public class ExcelServiceImpl implements ExcelService{
         return flag;
     }
 
+    private String praseDate(String num) {
+        try {
+            Integer days = Integer.valueOf(num);
+            return DateUtils.plusDay(days, "1899-12-30");
+        }catch (Exception e) {
+            return null;
+        }
+    }
+
     //保证先遍历主表
     private List<String> SetToList(Set<String> sets) {
         List<String> list = new ArrayList<>();
@@ -290,6 +293,10 @@ public class ExcelServiceImpl implements ExcelService{
             switch(cell.getCellType()){
                 case Cell.CELL_TYPE_NUMERIC:{
                     cellValue = String.valueOf(cell.getNumericCellValue());
+                    //判断是否为INT类型
+                    if (Double.valueOf(cellValue.toString()).intValue() - Double.valueOf(cellValue.toString()) == 0) {
+                        return cellValue.toString().substring(0, cellValue.toString().indexOf("."));
+                    }
                     break;
                 }
                 case Cell.CELL_TYPE_FORMULA:{
@@ -336,9 +343,10 @@ public class ExcelServiceImpl implements ExcelService{
      */
     private void createWorkbook(SXSSFWorkbook workbook, int sheetIdx, JSONArray cols, JSONArray datas, String remark){
         Sheet sheet = workbook.createSheet("sheet" + sheetIdx);
-        CellStyle style = getCellStyle(workbook);
-        //sheet.autoSizeColumn((short) 2);
-        sheet.createFreezePane(0, 1);// 固定列
+        CellStyle style = getCellStyle(workbook, true);
+        CellStyle detailStyle = getCellStyle(workbook, false);
+        //sheet.autoSizeColumn(2);
+       // sheet.createFreezePane(0, 1);// 固定列
         Cell cell = null;
         int rIdx = 0;
         int cIdx = 0;
@@ -347,8 +355,8 @@ public class ExcelServiceImpl implements ExcelService{
         Row row = null;
         if (remark != null) {
             row = sheet.createRow(rIdx);
-            row.setHeightInPoints((short) 100);
-            sheet.setColumnWidth(cIdx, 1000);
+            row.setHeightInPoints((short) 50);
+            sheet.setColumnWidth(cIdx, 500);
             cell = getCell(sheet, rIdx, cIdx);
             cell.setCellValue(remark);
             sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cols.size() - 1));
@@ -365,19 +373,23 @@ public class ExcelServiceImpl implements ExcelService{
                 width = (short) (obj.get("width") == null ? 0 : (int)obj.get("width")*35.7);
                 width = width == 0 ? 4000 : width;
                 sheet.setColumnWidth(cIdx, width);
-                sheet.createFreezePane(cols.size() + 1, 2);
+               // sheet.createFreezePane(cols.size() + 1, 2);
                 cell = getCell(sheet, rIdx, cIdx);
                 value = obj.get("description") == null ? value : obj.get("description").toString();
                 if ("true".equals(obj.get("necessary"))) {
                     value = "*" + value;
                 }
-                cell.setCellValue(value);
-                keys.add(String.valueOf(obj.get("description")));
                 if ("date".equals(obj.get("type"))) {
                     short df= workbook.createDataFormat().getFormat("yyyy-MM-dd");
                     style.setDataFormat(df);
                 }
-                cell.setCellStyle(style);
+                if ("main".equals(obj.get("position"))) {
+                    cell.setCellStyle(style);
+                } else {
+                    cell.setCellStyle(detailStyle);
+                }
+                cell.setCellValue(value);
+                keys.add(String.valueOf(obj.get("description")));
                 cIdx++;
                 value = "";
             }
@@ -410,7 +422,7 @@ public class ExcelServiceImpl implements ExcelService{
         }
     }
 
-    private CellStyle getCellStyle(SXSSFWorkbook workbook) {
+    private CellStyle getCellStyle(SXSSFWorkbook workbook, boolean main) {
         CellStyle style = workbook.createCellStyle();
         style.setFillBackgroundColor((short) 18);
         style.setFillPattern(FillPatternType.LEAST_DOTS);
@@ -421,7 +433,7 @@ public class ExcelServiceImpl implements ExcelService{
         style.setFont(font);
         style.setAlignment(HorizontalAlignment.CENTER);
         style.setFillForegroundColor(HSSFColor.GREEN.index);
-        style.setFillBackgroundColor(HSSFColor.PALE_BLUE.index);
+        style.setFillBackgroundColor(main ? HSSFColor.LIGHT_YELLOW.index : HSSFColor.PALE_BLUE.index);
         style.setBorderBottom(BorderStyle.MEDIUM);
         style.setBorderLeft(BorderStyle.MEDIUM);
         style.setBorderRight(BorderStyle.MEDIUM);

+ 0 - 3
applications/commons/commons-server/src/main/resources/mapper/CommonMapper.xml

@@ -1,9 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.usoftchina.saas.commons.mapper.CommonMapper" >
-    <select id="getCountBaseSet" resultType="int">
-        SELECT COUNT(*) FROM ENTERPRISE WHERE COMPANYID = #{companyId}
-    </select>
     <select id="getCountWarehouse" resultType="int">
         SELECT COUNT(*) FROM WAREHOUSE WHERE COMPANYID=#{companyId} AND WH_STATUSCODE = 'OPEN'
     </select>

+ 1 - 1
applications/commons/commons-server/src/main/resources/mapper/DataImportDetailMapper.xml

@@ -15,7 +15,7 @@
   </resultMap>
 
   <delete id="deleteByIds">
-    delete from data_importdetail where dd_diid in (${ids})
+    delete from data_importdetail where dd_diid in (${value})
   </delete>
 
   <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImportDetail" >

+ 2 - 2
applications/commons/commons-server/src/main/resources/mapper/DataImportMapper.xml

@@ -6,7 +6,7 @@
   il_toformal=0 and il_result is not null
 </delete>
   <delete id="deleteByIds">
-    delete from data_import where di_id in (${ids});
+    delete from data_import where di_id in (${value});
   </delete>
 
   <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImport" >
@@ -72,7 +72,7 @@
     update data_import
     set
     di_result = #{err},
-    di_success = 0,
+    di_success = 0
     where di_id = #{id}
   </update>
 

+ 1 - 1
applications/commons/commons-server/src/main/resources/mapper/DataTempletMapper.xml

@@ -12,6 +12,6 @@
   </resultMap>
 
   <select id="selectByCaller" resultMap="BaseResultMap">
-    select * from data_Templet where dt_caller=#{caller} and companyid = #{companyid}
+    select * from data_Templet where dt_caller=#{caller}
   </select>
 </mapper>

+ 2 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/EmployeeMapper.java

@@ -32,4 +32,6 @@ public interface EmployeeMapper extends CommonBaseMapper<Employee> {
     int validateNameAndCodeWhenInsert(@Param("code") String code,@Param("name") String em_name,@Param("companyId") Long companyId);
 
     int validateNameAndCodeWhenUpdate(@Param("code") String code,@Param("name") String em_name,@Param("id") Long id,@Param("companyId") Long companyId);
+
+    List<Employee> selectByName(@Param("name") String name, @Param("companyId") Long companyId);
 }

+ 2 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java

@@ -50,4 +50,6 @@ public interface ProductMapper extends CommonBaseMapper<Product> {
     boolean deleteProdIODetailByCode(@Param("code") String code, @Param("companyId") Long companyId);
 
     Long selectIdByCode(@Param("code") String code, @Param("companyId") Long companyId);
+
+    List<ProductReserveCostDTO> selectReserveCostByIgnoreWarehouse(@Param("con") String con, @Param("companyId") Long companyId);
 }

+ 13 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java

@@ -491,6 +491,8 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
         return getMapper().getCombo(id,BaseContextHolder.getCompanyId());
     }
 
+    @Autowired
+    private EmployeeMapper employeeMapper;
     @Override
     public void saveToFormal(Integer id, boolean update) {
         if (null == id || "0".equals(id)) {
@@ -511,6 +513,17 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
                 List<DataImportDetail> data = datas.get(code);
                 DataImportDetail main = dataImportMapper.selectMainBycode(code, id, companyId);
                 CustomerDTO customerDTO = JSONObject.parseObject(main.getDd_maindata(), CustomerDTO.class);
+                //验证业务员
+                if (!StringUtils.isEmpty(customerDTO.getCu_sellername())) {
+                    List<Employee> employees = employeeMapper.selectByName(customerDTO.getCu_sellername(), companyId);
+                    if (null == employees || employees.size() == 0 || StringUtils.isEmpty(employees.get(0))) {
+                        err.append("客户编号为: " + customerDTO.getCu_code() + " 的业务员: "+ customerDTO.getCu_sellername() +" 在系统中不存在,请确认数据是否正确");
+                        break;
+                    }
+                    customerDTO.setCu_sellerid(Integer.valueOf(employees.get(0).getId().toString()));
+                    customerDTO.setCu_sellercode(employees.get(0).getEm_code());
+                    customerDTO.setCu_sellername(employees.get(0).getEm_name());
+                }
                 customerDTO.setCu_status(Status.OPEN.getDisplay());
                 customerDTO.setCu_statuscode(Status.OPEN.name());
                 //编号不存在

+ 6 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java

@@ -617,7 +617,12 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         if(condition == null){
             condition = "1=1";
         }
-        return getMapper().selectReserveCost(condition, companyId);
+        if ("DETAIL".equals(listReqDTO.getMode())) {
+            return getMapper().selectReserveCost(condition, companyId);
+        } else {
+            return getMapper().selectReserveCostByIgnoreWarehouse(condition, companyId);
+        }
+
     }
 
     private List<ProductDTO> getList(ListReqDTO listReqDTO){

+ 3 - 0
applications/document/document-server/src/main/resources/mapper/EmployeeMapper.xml

@@ -244,5 +244,8 @@
     select count(*) from Employee where (em_code = #{code} or em_name = #{name}) and em_id !=#{id}  and companyId =#{companyId}
   </select>
 
+  <select id="selectByName" resultMap="BaseResultMap">
+    select * from employee where em_name = #{name} and companyId=#{companyId}
+  </select>
 
 </mapper>

+ 15 - 0
applications/document/document-server/src/main/resources/mapper/ProductMapper.xml

@@ -476,6 +476,21 @@
         </where>
         ORDER BY PR_ID DESC
     </select>
+    <select id="selectReserveCostByIgnoreWarehouse" resultMap="ProdReserveCostResultMap">
+        select pr_code,pr_spec,pr_detail,pr_unit,sum(pw_onhand) pw_onhand,sum(pw_amount) pw_amount
+        from productWH tab left join Product on pw_prodcode=pr_code left join warehouse on pw_whid=wh_id
+        <where>
+            <if test="con!=null">
+                ${con}
+            </if>
+            <if test="companyId!=null">
+                and tab.companyId=#{companyId} and Product.companyId=#{companyId} and warehouse.companyId=#{companyId}
+                and pw_onhand!=0
+            </if>
+        </where>
+        group by pr_code,pr_spec,pr_detail,pr_unit,pr_id
+        ORDER BY PR_ID DESC
+    </select>
     <select id="getCountFromPurc" resultType="int">
         SELECT COUNT(*) FROM PURCHASEDETAIL
         WHERE PD_PRODID = #{id} AND COMPANYID=#{companyId}

+ 1 - 1
applications/sale/sale-server/src/main/resources/config/application-docker-test.yml

@@ -4,7 +4,7 @@ eureka:
     prefer-ip-address: false
   client:
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-dev:8515/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-test:8515/eureka/
 spring:
   rabbitmq:
     virtual-host: test

+ 11 - 1
framework/core/src/main/java/com/usoftchina/saas/utils/DateUtils.java

@@ -543,9 +543,19 @@ public class DateUtils {
     //获取期间
     public static int getYm(Date date){
         String dates = date2String(date, "yyyyMM");
-//        dates = dates + "01";
         int d = Integer.parseInt(dates);
         return d;
     }
 
+    public static String plusDay(int num,String newDate) throws ParseException{
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        Date currdate = format.parse(newDate);
+        Calendar ca = Calendar.getInstance();
+        ca.setTime(currdate);
+        ca.add(Calendar.DATE, num);// num为增加的天数,可以改变的
+        Date next = ca.getTime();
+        String enddate = format.format(next);
+        return enddate;
+    }
+
 }

+ 31 - 18
frontend/saas-portal-web/src/components/conenter/addgongsi.vue

@@ -1,5 +1,9 @@
 <template>
     <div>
+        <div class="tanchuang addspace" v-if="isadd">
+            <div class="tc-conent"><img src="/static/img/qiye/dengji@1x.png" alt=""></div>
+            <div class="tc-text"><span>添加企业成功</span></div>
+        </div>
         <span class="tjtishi" ref="tjtishi"></span>
         <div>
             <div class="gs-worp qy-worp tj-up">
@@ -82,6 +86,7 @@
 <script>
 import Session from '@/utils/session'
 import VDistpicker from 'v-distpicker'
+import { setTimeout } from 'timers';
     export default {
         data(){
             return {
@@ -97,7 +102,8 @@ import VDistpicker from 'v-distpicker'
                 isname: true,//姓名验证
                 isspaceName: false,//公司名验证
                 isemail: true,//验证邮箱
-                disabled: true
+                disabled: true,
+                isadd: false,//添加成功弹窗
             }
         },
         components:{
@@ -216,9 +222,9 @@ import VDistpicker from 'v-distpicker'
                 // console.log('企业名字',this.isspaceName)//企业名字正则
                 // console.log('邮箱',this.isemail)//邮箱正则
                 if (name == '') {
-                    this.$refs.tjtishi.innerHTML = '个人姓名不能为空'
+                    this.$refs.tjtishi.innerHTML = '个人姓名不能为空';
                 } else if (qyname == '') {
-                    this.$refs.tjtishi.innerHTML = '企业名字不能为空'
+                    this.$refs.tjtishi.innerHTML = '企业名字不能为空';
                 } else {
                     switch (this.qymingzi && this.isaddress && this.isname && this.isspaceName && this.isemail && this.isaddressname) {
                         case this.qymingzi:
@@ -236,35 +242,38 @@ import VDistpicker from 'v-distpicker'
                                 }
                             })
                             .then(res=>{
-                                let id = res.data.data
-                                let logoUrl = null
-                                let name = qyname
-                                let addenterprise = {'id':id, 'logoUrl': logoUrl, 'name': name}
-                                let session = JSON.parse(window.localStorage.getItem('app-state-session'))
-                                session.account.companies.push(addenterprise)
+                                let id = res.data.data;
+                                let logoUrl = null;
+                                let name = qyname;
+                                let addenterprise = {'id':id, 'logoUrl': logoUrl, 'name': name};
+                                let session = JSON.parse(window.localStorage.getItem('app-state-session'));
+                                session.account.companies.push(addenterprise);
                                 Session.set(session);
-                                document.documentElement.scrollTop = 0;
-                                this.$router.push({name:'company'})
+                                this.isadd = true;
+                                setTimeout(()=>{
+                                    document.documentElement.scrollTop = 0;
+                                    this.$router.push({name:'company'})
+                                },1000)
                             })
-                            this.$refs.tjtishi.innerHTML = ''
+                            this.$refs.tjtishi.innerHTML = '';
                         } else {
-                            this.$refs.tjtishi.innerHTML = '企业名字已在优软云注册'
+                            this.$refs.tjtishi.innerHTML = '企业名字已在优软云注册';
                         }
                         break;
                         case this.isaddressname:
-                        this.$refs.tjtishi.innerHTML = '企业地址不能为空'
+                        this.$refs.tjtishi.innerHTML = '企业地址不能为空';
                         break;
                         case this.isaddress:
-                        this.$refs.tjtishi.innerHTML = '企业地址不能包含非法字符'
+                        this.$refs.tjtishi.innerHTML = '企业地址不能包含非法字符';
                         break;
                         case this.isname:
-                        this.$refs.tjtishi.innerHTML = '个人姓名不能包含非法字符'
+                        this.$refs.tjtishi.innerHTML = '个人姓名不能包含非法字符';
                         break;
                         case this.isspaceName:
-                        this.$refs.tjtishi.innerHTML = '企业名字不能包含非法字符'
+                        this.$refs.tjtishi.innerHTML = '企业名字不能包含非法字符';
                         break;
                         case this.isemail:
-                        this.$refs.tjtishi.innerHTML = '请输入正确邮箱'
+                        this.$refs.tjtishi.innerHTML = '请输入正确邮箱';
                         break;
                     }
                 }
@@ -287,6 +296,10 @@ import VDistpicker from 'v-distpicker'
     text-align: center;
     height: 20px;
 }
+.addspace {
+    height: 200px;
+    border: 1px solid #cccccc
+}
 .tj-up {
     width: 100%;
     margin-bottom: 0px;

+ 7 - 7
frontend/saas-portal-web/src/components/conenter/company.vue

@@ -261,8 +261,8 @@
                 .then(res=>{
                     // console.log('请求成功',res)
                     if (res.data.success) {
-                        // this.saasid = res.data.data
-                        // this.ktsass = false;
+                        this.saasid = res.data.data
+                        this.ktsass = false;
                         let id = res.data.data
                         let name = qyname
                         let logoUrl = null
@@ -284,11 +284,11 @@
                 })
             },
             //进入saas服务
-            // showServeWin(){
-            //     let id = this.saasid;
-            //     this.isOpensaas = false;
-            //     this.selectServe(id)
-            // },
+            showServeWin(){
+                let id = this.saasid;
+                this.isOpensaas = false;
+                this.selectServe(id)
+            },
             //查看企业详情
             getEnterpriseInfo(d){
                 document.documentElement.scrollTop = 0;

+ 3 - 22
frontend/saas-portal-web/src/components/conenter/home.vue

@@ -15,7 +15,7 @@
                     </a>
                 </h1>
             </div>
-            <div class="collapse navbar-collapse navbar-right" role="navigation">
+        <div class="collapse navbar-collapse navbar-right" role="navigation">
           <ul @click="gohome" id="nav" class="nav navbar-nav menu">
             <li><a href="#"><span>首页</span></a></li>
             <li><a href="https://www.usoftchina.com/" target="_blank"><span>优软云</span></a></li>
@@ -76,27 +76,8 @@
       </div>
     <main v-if="isproblem" class="site-content" role="main">
       <!--Home Slider==================================== -->
-      <!-- <section id="home-slider">
-        <div id="slider" class="sl-slider-wrapper">
-          <div class="sl-slider">
-            <div class="sl-slide" data-orientation="horizontal" data-slice1-rotation="-25" data-slice2-rotation="-25"
-                 data-slice1-scale="2" data-slice2-scale="2">
-              <div class="mask-overly"></div>
-              <div class="bg-img slider-1">
-                <img src="/static/img/banner@3x@2x.png" alt="">
-              </div>
-              <div class="my-text">
-                <button class='my-tiyan' @click="experience">立即体验</button>
-              </div>
-              <div class="slide-caption">
-                <div class="caption-content"></div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </section> -->
       <div>
-        <div class="bg-img slider-1" style="position: relative;">
+        <div class="slider-1" style="position: relative;">
           <img src="/static/img/banner@3x@2x.png" alt="">
           <div class="my-text" style="top:63%">
             <button class='my-tiyan' @click="experience">立即体验</button>
@@ -342,7 +323,7 @@
             me.isLogin = false
             if (!account.companyId) {
               // 添加企业
-              me.$router.push({path: '/enterprise', query: {mydata: account}})
+              me.$router.push({path: '/enterprise'})
               me.$store.commit('Logintrue')
             } else {
               // 跳转应用页面

+ 13 - 3
frontend/saas-portal-web/src/components/conenter/problem.vue

@@ -16,7 +16,7 @@
               <div class="bz-right-conent">
                 <ul>
                   <li v-for="(d , i) in arr" :key="i">
-                    <div class="over" @click="shows(d,i)" style="cursor: pointer">
+                    <div class="over Text-title" @click="shows(d,i)">
                       <span class="left bz-yuandian"></span>
                       <span class="left">{{d.title}}</span>
                       <img  class="right bz-copy" :class="d.isshow ? 'rotates' : 'norotate'" src="/static/img/Triangle Copy 4.png" alt="">
@@ -39,8 +39,8 @@
           return {
             arr:[
               {isshow: true, title:'方式不同吧好像是差不多',centent:'警方圣诞快乐JFK的实力积分积分累积角度考虑实际疯狂的世界佛教埃及空军看见反抗类毒素解放就'},
-              {isshow: false, title:'XXXXXXXXXXXXXXX操作文档',centent:'警方圣诞快发顺丰到付乐JFK的实力积分积分累积角度狂的世界佛教埃及空军看见反抗类毒素解放就'},
-              {isshow: false, title:'XXXXXXXXXXXXX操作文档',centent:'警方圣诞快分积分累积角度考虑实际疯狂的世界佛教埃及空军看见反抗类毒素解放就'},
+              {isshow: false, title:'上的换个环境操作文档',centent:'警方圣诞K的实力积分积分累积角度狂的世界佛教埃及空军看见反抗类毒素解放就'},
+              {isshow: false, title:'房贷首付操作文档',centent:'警方圣诞快分积分累积角度考虑实际疯狂的世界佛教埃及空军看见反抗类毒素解放就'},
             ]
           }
         },
@@ -69,9 +69,19 @@
   -moz-transition: All 0.4s ease-in-out;
   -o-transition: All 0.4s ease-in-out;
 }
+.Text-title {
+  cursor: pointer;
+  opacity: 0.9;
+  font-family: PingFangSC-Regular;
+  font-size: 14px;
+  color: #0D253E;
+  letter-spacing: 0;
+  line-height: 30px;
+}
 .Text-content {
   float: left;
   width: 90%;
+  font-size: 14px;
   margin-left: 4%;
   margin-top: 2%;
 }

+ 1 - 12
frontend/saas-portal-web/src/pages/index/index.html

@@ -15,30 +15,19 @@
         <meta name="author" content="优软科技">
         <meta name="Robots" content="all|index|follow">
         
-        <!-- <link rel="icon" type="image/x-icon" href="./static/img/logo.png"/> -->
-        <link rel="icon" type="image/x-icon" href="../../../static/img/logo.png"/>
+        <link rel="icon" type="image/x-icon" href="/static/img/logo.png"/>
 
-        <link rel="stylesheet" href="./static/css/animate.css">
         <link rel="stylesheet" href="./static/css/bootstrap.min.css">
         <link rel="stylesheet" href="./static/css/ionicons.min.css">
-        <link rel="stylesheet" href="./static/css/jquery.fancybox.css">
-        <link rel="stylesheet" href="./static/css/owl.carousel.css">
-        <link rel="stylesheet" href="./static/css/slit-slider.css">
         <link rel="stylesheet" href="./static/css/main.css">
         <link rel="stylesheet" href="./static/css/gongsi.css">
 
-        <script src="./static/js/modernizr-2.6.2.min.js"></script>
 
         <script src="./static/js/jquery-1.11.1.min.js"></script>
         <script src="./static/js/bootstrap.min.js"></script>
         <script src="./static/js/jquery.singlePageNav.min.js"></script> 
-        <script src="./static/js/jquery.fancybox.pack.js"></script>
-        <script src="./static/js/owl.carousel.min.js"></script>
         <script src="./static/js/isotope.pkgd.min.js"></script>
         <script src="./static/js/jquery.easing.min.js"></script>
-        <script src="./static/js/jquery.slitslider.js"></script>
-        <script src="./static/js/jquery.ba-cond.min.js"></script>
-        <script src="./static/js/wow.min.js"></script>
         <script src="./static/js/mains.js"></script>
 
         <script src="./static/js/sockjs.min.js"></script>

+ 0 - 3188
frontend/saas-portal-web/static/css/animate.css

@@ -1,3188 +0,0 @@
-/*!
-Animate.css - http://daneden.me/animate
-Licensed under the MIT license - http://opensource.org/licenses/MIT
-
-Copyright (c) 2013 Daniel Eden
-*/
-
-
-.animated {
-  -webkit-animation-duration: 1s;
-          animation-duration: 1s;
-  -webkit-animation-fill-mode: both;
-          animation-fill-mode: both;
-}
-
-.animated.infinite {
-  -webkit-animation-iteration-count: infinite;
-          animation-iteration-count: infinite;
-}
-
-.animated.hinge {
-  -webkit-animation-duration: 2s;
-          animation-duration: 2s;
-}
-
-/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
-
-
-@-webkit-keyframes rubberBand {
-  0% {
-    -webkit-transform: scale(1);
-    transform: scale(1);
-  }
-
-  30% {
-    -webkit-transform: scaleX(1.25) scaleY(0.75);
-    transform: scaleX(1.25) scaleY(0.75);
-  }
-
-  40% {
-    -webkit-transform: scaleX(0.75) scaleY(1.25);
-    transform: scaleX(0.75) scaleY(1.25);
-  }
-
-  60% {
-    -webkit-transform: scaleX(1.15) scaleY(0.85);
-    transform: scaleX(1.15) scaleY(0.85);
-  }
-
-  100% {
-    -webkit-transform: scale(1);
-    transform: scale(1);
-  }
-}
-
-@keyframes rubberBand {
-  0% {
-    -webkit-transform: scale(1);
-    -ms-transform: scale(1);
-    transform: scale(1);
-  }
-
-  30% {
-    -webkit-transform: scaleX(1.25) scaleY(0.75);
-    -ms-transform: scaleX(1.25) scaleY(0.75);
-    transform: scaleX(1.25) scaleY(0.75);
-  }
-
-  40% {
-    -webkit-transform: scaleX(0.75) scaleY(1.25);
-    -ms-transform: scaleX(0.75) scaleY(1.25);
-    transform: scaleX(0.75) scaleY(1.25);
-  }
-
-  60% {
-    -webkit-transform: scaleX(1.15) scaleY(0.85);
-    -ms-transform: scaleX(1.15) scaleY(0.85);
-    transform: scaleX(1.15) scaleY(0.85);
-  }
-
-  100% {
-    -webkit-transform: scale(1);
-    -ms-transform: scale(1);
-    transform: scale(1);
-  }
-}
-
-.rubberBand {
-  -webkit-animation-name: rubberBand;
-  animation-name: rubberBand;
-}
-
-@-webkit-keyframes shake {
-  0%, 100% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  10%, 30%, 50%, 70%, 90% {
-    -webkit-transform: translateX(-10px);
-    transform: translateX(-10px);
-  }
-
-  20%, 40%, 60%, 80% {
-    -webkit-transform: translateX(10px);
-    transform: translateX(10px);
-  }
-}
-
-@keyframes shake {
-  0%, 100% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  10%, 30%, 50%, 70%, 90% {
-    -webkit-transform: translateX(-10px);
-    -ms-transform: translateX(-10px);
-    transform: translateX(-10px);
-  }
-
-  20%, 40%, 60%, 80% {
-    -webkit-transform: translateX(10px);
-    -ms-transform: translateX(10px);
-    transform: translateX(10px);
-  }
-}
-
-.shake {
-  -webkit-animation-name: shake;
-  animation-name: shake;
-}
-
-@-webkit-keyframes swing {
-  20% {
-    -webkit-transform: rotate(15deg);
-    transform: rotate(15deg);
-  }
-
-  40% {
-    -webkit-transform: rotate(-10deg);
-    transform: rotate(-10deg);
-  }
-
-  60% {
-    -webkit-transform: rotate(5deg);
-    transform: rotate(5deg);
-  }
-
-  80% {
-    -webkit-transform: rotate(-5deg);
-    transform: rotate(-5deg);
-  }
-
-  100% {
-    -webkit-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-}
-
-@keyframes swing {
-  20% {
-    -webkit-transform: rotate(15deg);
-    -ms-transform: rotate(15deg);
-    transform: rotate(15deg);
-  }
-
-  40% {
-    -webkit-transform: rotate(-10deg);
-    -ms-transform: rotate(-10deg);
-    transform: rotate(-10deg);
-  }
-
-  60% {
-    -webkit-transform: rotate(5deg);
-    -ms-transform: rotate(5deg);
-    transform: rotate(5deg);
-  }
-
-  80% {
-    -webkit-transform: rotate(-5deg);
-    -ms-transform: rotate(-5deg);
-    transform: rotate(-5deg);
-  }
-
-  100% {
-    -webkit-transform: rotate(0deg);
-    -ms-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-}
-
-.swing {
-  -webkit-transform-origin: top center;
-  -ms-transform-origin: top center;
-  transform-origin: top center;
-  -webkit-animation-name: swing;
-  animation-name: swing;
-}
-
-@-webkit-keyframes tada {
-  0% {
-    -webkit-transform: scale(1);
-    transform: scale(1);
-  }
-
-  10%, 20% {
-    -webkit-transform: scale(0.9) rotate(-3deg);
-    transform: scale(0.9) rotate(-3deg);
-  }
-
-  30%, 50%, 70%, 90% {
-    -webkit-transform: scale(1.1) rotate(3deg);
-    transform: scale(1.1) rotate(3deg);
-  }
-
-  40%, 60%, 80% {
-    -webkit-transform: scale(1.1) rotate(-3deg);
-    transform: scale(1.1) rotate(-3deg);
-  }
-
-  100% {
-    -webkit-transform: scale(1) rotate(0);
-    transform: scale(1) rotate(0);
-  }
-}
-
-@keyframes tada {
-  0% {
-    -webkit-transform: scale(1);
-    -ms-transform: scale(1);
-    transform: scale(1);
-  }
-
-  10%, 20% {
-    -webkit-transform: scale(0.9) rotate(-3deg);
-    -ms-transform: scale(0.9) rotate(-3deg);
-    transform: scale(0.9) rotate(-3deg);
-  }
-
-  30%, 50%, 70%, 90% {
-    -webkit-transform: scale(1.1) rotate(3deg);
-    -ms-transform: scale(1.1) rotate(3deg);
-    transform: scale(1.1) rotate(3deg);
-  }
-
-  40%, 60%, 80% {
-    -webkit-transform: scale(1.1) rotate(-3deg);
-    -ms-transform: scale(1.1) rotate(-3deg);
-    transform: scale(1.1) rotate(-3deg);
-  }
-
-  100% {
-    -webkit-transform: scale(1) rotate(0);
-    -ms-transform: scale(1) rotate(0);
-    transform: scale(1) rotate(0);
-  }
-}
-
-.tada {
-  -webkit-animation-name: tada;
-  animation-name: tada;
-}
-
-/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
-
-@-webkit-keyframes wobble {
-  0% {
-    -webkit-transform: translateX(0%);
-    transform: translateX(0%);
-  }
-
-  15% {
-    -webkit-transform: translateX(-25%) rotate(-5deg);
-    transform: translateX(-25%) rotate(-5deg);
-  }
-
-  30% {
-    -webkit-transform: translateX(20%) rotate(3deg);
-    transform: translateX(20%) rotate(3deg);
-  }
-
-  45% {
-    -webkit-transform: translateX(-15%) rotate(-3deg);
-    transform: translateX(-15%) rotate(-3deg);
-  }
-
-  60% {
-    -webkit-transform: translateX(10%) rotate(2deg);
-    transform: translateX(10%) rotate(2deg);
-  }
-
-  75% {
-    -webkit-transform: translateX(-5%) rotate(-1deg);
-    transform: translateX(-5%) rotate(-1deg);
-  }
-
-  100% {
-    -webkit-transform: translateX(0%);
-    transform: translateX(0%);
-  }
-}
-
-@keyframes wobble {
-  0% {
-    -webkit-transform: translateX(0%);
-    -ms-transform: translateX(0%);
-    transform: translateX(0%);
-  }
-
-  15% {
-    -webkit-transform: translateX(-25%) rotate(-5deg);
-    -ms-transform: translateX(-25%) rotate(-5deg);
-    transform: translateX(-25%) rotate(-5deg);
-  }
-
-  30% {
-    -webkit-transform: translateX(20%) rotate(3deg);
-    -ms-transform: translateX(20%) rotate(3deg);
-    transform: translateX(20%) rotate(3deg);
-  }
-
-  45% {
-    -webkit-transform: translateX(-15%) rotate(-3deg);
-    -ms-transform: translateX(-15%) rotate(-3deg);
-    transform: translateX(-15%) rotate(-3deg);
-  }
-
-  60% {
-    -webkit-transform: translateX(10%) rotate(2deg);
-    -ms-transform: translateX(10%) rotate(2deg);
-    transform: translateX(10%) rotate(2deg);
-  }
-
-  75% {
-    -webkit-transform: translateX(-5%) rotate(-1deg);
-    -ms-transform: translateX(-5%) rotate(-1deg);
-    transform: translateX(-5%) rotate(-1deg);
-  }
-
-  100% {
-    -webkit-transform: translateX(0%);
-    -ms-transform: translateX(0%);
-    transform: translateX(0%);
-  }
-}
-
-.wobble {
-  -webkit-animation-name: wobble;
-  animation-name: wobble;
-}
-
-@-webkit-keyframes bounceIn {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    transform: scale(.3);
-  }
-
-  50% {
-    opacity: 1;
-    -webkit-transform: scale(1.05);
-    transform: scale(1.05);
-  }
-
-  70% {
-    -webkit-transform: scale(.9);
-    transform: scale(.9);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: scale(1);
-    transform: scale(1);
-  }
-}
-
-@keyframes bounceIn {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    -ms-transform: scale(.3);
-    transform: scale(.3);
-  }
-
-  50% {
-    opacity: 1;
-    -webkit-transform: scale(1.05);
-    -ms-transform: scale(1.05);
-    transform: scale(1.05);
-  }
-
-  70% {
-    -webkit-transform: scale(.9);
-    -ms-transform: scale(.9);
-    transform: scale(.9);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: scale(1);
-    -ms-transform: scale(1);
-    transform: scale(1);
-  }
-}
-
-.bounceIn {
-  -webkit-animation-name: bounceIn;
-  animation-name: bounceIn;
-}
-
-@-webkit-keyframes bounceInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateY(30px);
-    transform: translateY(30px);
-  }
-
-  80% {
-    -webkit-transform: translateY(-10px);
-    transform: translateY(-10px);
-  }
-
-  100% {
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes bounceInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    -ms-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateY(30px);
-    -ms-transform: translateY(30px);
-    transform: translateY(30px);
-  }
-
-  80% {
-    -webkit-transform: translateY(-10px);
-    -ms-transform: translateY(-10px);
-    transform: translateY(-10px);
-  }
-
-  100% {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.bounceInDown {
-  -webkit-animation-name: bounceInDown;
-  animation-name: bounceInDown;
-}
-
-@-webkit-keyframes bounceInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateX(30px);
-    transform: translateX(30px);
-  }
-
-  80% {
-    -webkit-transform: translateX(-10px);
-    transform: translateX(-10px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes bounceInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    -ms-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateX(30px);
-    -ms-transform: translateX(30px);
-    transform: translateX(30px);
-  }
-
-  80% {
-    -webkit-transform: translateX(-10px);
-    -ms-transform: translateX(-10px);
-    transform: translateX(-10px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.bounceInLeft {
-  -webkit-animation-name: bounceInLeft;
-  animation-name: bounceInLeft;
-}
-
-@-webkit-keyframes bounceInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateX(-30px);
-    transform: translateX(-30px);
-  }
-
-  80% {
-    -webkit-transform: translateX(10px);
-    transform: translateX(10px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes bounceInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    -ms-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateX(-30px);
-    -ms-transform: translateX(-30px);
-    transform: translateX(-30px);
-  }
-
-  80% {
-    -webkit-transform: translateX(10px);
-    -ms-transform: translateX(10px);
-    transform: translateX(10px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.bounceInRight {
-  -webkit-animation-name: bounceInRight;
-  animation-name: bounceInRight;
-}
-
-@-webkit-keyframes bounceInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateY(-30px);
-    transform: translateY(-30px);
-  }
-
-  80% {
-    -webkit-transform: translateY(10px);
-    transform: translateY(10px);
-  }
-
-  100% {
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes bounceInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    -ms-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: translateY(-30px);
-    -ms-transform: translateY(-30px);
-    transform: translateY(-30px);
-  }
-
-  80% {
-    -webkit-transform: translateY(10px);
-    -ms-transform: translateY(10px);
-    transform: translateY(10px);
-  }
-
-  100% {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.bounceInUp {
-  -webkit-animation-name: bounceInUp;
-  animation-name: bounceInUp;
-}
-
-@-webkit-keyframes bounceOut {
-  0% {
-    -webkit-transform: scale(1);
-    transform: scale(1);
-  }
-
-  25% {
-    -webkit-transform: scale(.95);
-    transform: scale(.95);
-  }
-
-  50% {
-    opacity: 1;
-    -webkit-transform: scale(1.1);
-    transform: scale(1.1);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    transform: scale(.3);
-  }
-}
-
-@keyframes bounceOut {
-  0% {
-    -webkit-transform: scale(1);
-    -ms-transform: scale(1);
-    transform: scale(1);
-  }
-
-  25% {
-    -webkit-transform: scale(.95);
-    -ms-transform: scale(.95);
-    transform: scale(.95);
-  }
-
-  50% {
-    opacity: 1;
-    -webkit-transform: scale(1.1);
-    -ms-transform: scale(1.1);
-    transform: scale(1.1);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    -ms-transform: scale(.3);
-    transform: scale(.3);
-  }
-}
-
-.bounceOut {
-  -webkit-animation-name: bounceOut;
-  animation-name: bounceOut;
-}
-
-@-webkit-keyframes bounceOutDown {
-  0% {
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateY(-20px);
-    transform: translateY(-20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-}
-
-@keyframes bounceOutDown {
-  0% {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateY(-20px);
-    -ms-transform: translateY(-20px);
-    transform: translateY(-20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    -ms-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-}
-
-.bounceOutDown {
-  -webkit-animation-name: bounceOutDown;
-  animation-name: bounceOutDown;
-}
-
-@-webkit-keyframes bounceOutLeft {
-  0% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateX(20px);
-    transform: translateX(20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-}
-
-@keyframes bounceOutLeft {
-  0% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateX(20px);
-    -ms-transform: translateX(20px);
-    transform: translateX(20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    -ms-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-}
-
-.bounceOutLeft {
-  -webkit-animation-name: bounceOutLeft;
-  animation-name: bounceOutLeft;
-}
-
-@-webkit-keyframes bounceOutRight {
-  0% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateX(-20px);
-    transform: translateX(-20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-}
-
-@keyframes bounceOutRight {
-  0% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateX(-20px);
-    -ms-transform: translateX(-20px);
-    transform: translateX(-20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    -ms-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-}
-
-.bounceOutRight {
-  -webkit-animation-name: bounceOutRight;
-  animation-name: bounceOutRight;
-}
-
-@-webkit-keyframes bounceOutUp {
-  0% {
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateY(20px);
-    transform: translateY(20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-}
-
-@keyframes bounceOutUp {
-  0% {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  20% {
-    opacity: 1;
-    -webkit-transform: translateY(20px);
-    -ms-transform: translateY(20px);
-    transform: translateY(20px);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    -ms-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-}
-
-.bounceOutUp {
-  -webkit-animation-name: bounceOutUp;
-  animation-name: bounceOutUp;
-}
-
-@-webkit-keyframes fadeIn {
-  0% {
-    opacity: 0;
-  }
-
-  100% {
-    opacity: 1;
-  }
-}
-
-@keyframes fadeIn {
-  0% {
-    opacity: 0;
-  }
-
-  100% {
-    opacity: 1;
-  }
-}
-
-.fadeIn {
-  -webkit-animation-name: fadeIn;
-  animation-name: fadeIn;
-}
-
-@-webkit-keyframes fadeInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-20px);
-    transform: translateY(-20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes fadeInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-20px);
-    -ms-transform: translateY(-20px);
-    transform: translateY(-20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.fadeInDown {
-  -webkit-animation-name: fadeInDown;
-  animation-name: fadeInDown;
-}
-
-@-webkit-keyframes fadeInDownBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes fadeInDownBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    -ms-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.fadeInDownBig {
-  -webkit-animation-name: fadeInDownBig;
-  animation-name: fadeInDownBig;
-}
-
-@-webkit-keyframes fadeInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-20px);
-    transform: translateX(-20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes fadeInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-20px);
-    -ms-transform: translateX(-20px);
-    transform: translateX(-20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.fadeInLeft {
-  -webkit-animation-name: fadeInLeft;
-  animation-name: fadeInLeft;
-}
-
-@-webkit-keyframes fadeInLeftBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes fadeInLeftBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    -ms-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.fadeInLeftBig {
-  -webkit-animation-name: fadeInLeftBig;
-  animation-name: fadeInLeftBig;
-}
-
-@-webkit-keyframes fadeInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(20px);
-    transform: translateX(20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes fadeInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(20px);
-    -ms-transform: translateX(20px);
-    transform: translateX(20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.fadeInRight {
-  -webkit-animation-name: fadeInRight;
-  animation-name: fadeInRight;
-}
-
-@-webkit-keyframes fadeInRightBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes fadeInRightBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    -ms-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.fadeInRightBig {
-  -webkit-animation-name: fadeInRightBig;
-  animation-name: fadeInRightBig;
-}
-
-@-webkit-keyframes fadeInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(20px);
-    transform: translateY(20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes fadeInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(20px);
-    -ms-transform: translateY(20px);
-    transform: translateY(20px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.fadeInUp {
-  -webkit-animation-name: fadeInUp;
-  animation-name: fadeInUp;
-}
-
-@-webkit-keyframes fadeInUpBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes fadeInUpBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    -ms-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.fadeInUpBig {
-  -webkit-animation-name: fadeInUpBig;
-  animation-name: fadeInUpBig;
-}
-
-@-webkit-keyframes fadeOut {
-  0% {
-    opacity: 1;
-  }
-
-  100% {
-    opacity: 0;
-  }
-}
-
-@keyframes fadeOut {
-  0% {
-    opacity: 1;
-  }
-
-  100% {
-    opacity: 0;
-  }
-}
-
-.fadeOut {
-  -webkit-animation-name: fadeOut;
-  animation-name: fadeOut;
-}
-
-@-webkit-keyframes fadeOutDown {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(20px);
-    transform: translateY(20px);
-  }
-}
-
-@keyframes fadeOutDown {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(20px);
-    -ms-transform: translateY(20px);
-    transform: translateY(20px);
-  }
-}
-
-.fadeOutDown {
-  -webkit-animation-name: fadeOutDown;
-  animation-name: fadeOutDown;
-}
-
-@-webkit-keyframes fadeOutDownBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-}
-
-@keyframes fadeOutDownBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    -ms-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-}
-
-.fadeOutDownBig {
-  -webkit-animation-name: fadeOutDownBig;
-  animation-name: fadeOutDownBig;
-}
-
-@-webkit-keyframes fadeOutLeft {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-20px);
-    transform: translateX(-20px);
-  }
-}
-
-@keyframes fadeOutLeft {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-20px);
-    -ms-transform: translateX(-20px);
-    transform: translateX(-20px);
-  }
-}
-
-.fadeOutLeft {
-  -webkit-animation-name: fadeOutLeft;
-  animation-name: fadeOutLeft;
-}
-
-@-webkit-keyframes fadeOutLeftBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-}
-
-@keyframes fadeOutLeftBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    -ms-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-}
-
-.fadeOutLeftBig {
-  -webkit-animation-name: fadeOutLeftBig;
-  animation-name: fadeOutLeftBig;
-}
-
-@-webkit-keyframes fadeOutRight {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(20px);
-    transform: translateX(20px);
-  }
-}
-
-@keyframes fadeOutRight {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(20px);
-    -ms-transform: translateX(20px);
-    transform: translateX(20px);
-  }
-}
-
-.fadeOutRight {
-  -webkit-animation-name: fadeOutRight;
-  animation-name: fadeOutRight;
-}
-
-@-webkit-keyframes fadeOutRightBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-}
-
-@keyframes fadeOutRightBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    -ms-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-}
-
-.fadeOutRightBig {
-  -webkit-animation-name: fadeOutRightBig;
-  animation-name: fadeOutRightBig;
-}
-
-@-webkit-keyframes fadeOutUp {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-20px);
-    transform: translateY(-20px);
-  }
-}
-
-@keyframes fadeOutUp {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-20px);
-    -ms-transform: translateY(-20px);
-    transform: translateY(-20px);
-  }
-}
-
-.fadeOutUp {
-  -webkit-animation-name: fadeOutUp;
-  animation-name: fadeOutUp;
-}
-
-@-webkit-keyframes fadeOutUpBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-}
-
-@keyframes fadeOutUpBig {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    -ms-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-}
-
-.fadeOutUpBig {
-  -webkit-animation-name: fadeOutUpBig;
-  animation-name: fadeOutUpBig;
-}
-
-@-webkit-keyframes flip {
-  0% {
-    -webkit-transform: perspective(400px) translateZ(0) rotateY(-360deg) scale(1);
-    transform: perspective(400px) translateZ(0) rotateY(-360deg) scale(1);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-
-  40% {
-    -webkit-transform: perspective(400px) translateZ(150px) rotateY(-190deg) scale(1);
-    transform: perspective(400px) translateZ(150px) rotateY(-190deg) scale(1);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-
-  50% {
-    -webkit-transform: perspective(400px) translateZ(150px) rotateY(-170deg) scale(1);
-    transform: perspective(400px) translateZ(150px) rotateY(-170deg) scale(1);
-    -webkit-animation-timing-function: ease-in;
-    animation-timing-function: ease-in;
-  }
-
-  80% {
-    -webkit-transform: perspective(400px) translateZ(0) rotateY(0deg) scale(.95);
-    transform: perspective(400px) translateZ(0) rotateY(0deg) scale(.95);
-    -webkit-animation-timing-function: ease-in;
-    animation-timing-function: ease-in;
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) translateZ(0) rotateY(0deg) scale(1);
-    transform: perspective(400px) translateZ(0) rotateY(0deg) scale(1);
-    -webkit-animation-timing-function: ease-in;
-    animation-timing-function: ease-in;
-  }
-}
-
-@keyframes flip {
-  0% {
-    -webkit-transform: perspective(400px) translateZ(0) rotateY(-360deg) scale(1);
-    -ms-transform: perspective(400px) translateZ(0) rotateY(-360deg) scale(1);
-    transform: perspective(400px) translateZ(0) rotateY(-360deg) scale(1);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-
-  40% {
-    -webkit-transform: perspective(400px) translateZ(150px) rotateY(-190deg) scale(1);
-    -ms-transform: perspective(400px) translateZ(150px) rotateY(-190deg) scale(1);
-    transform: perspective(400px) translateZ(150px) rotateY(-190deg) scale(1);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-
-  50% {
-    -webkit-transform: perspective(400px) translateZ(150px) rotateY(-170deg) scale(1);
-    -ms-transform: perspective(400px) translateZ(150px) rotateY(-170deg) scale(1);
-    transform: perspective(400px) translateZ(150px) rotateY(-170deg) scale(1);
-    -webkit-animation-timing-function: ease-in;
-    animation-timing-function: ease-in;
-  }
-
-  80% {
-    -webkit-transform: perspective(400px) translateZ(0) rotateY(0deg) scale(.95);
-    -ms-transform: perspective(400px) translateZ(0) rotateY(0deg) scale(.95);
-    transform: perspective(400px) translateZ(0) rotateY(0deg) scale(.95);
-    -webkit-animation-timing-function: ease-in;
-    animation-timing-function: ease-in;
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) translateZ(0) rotateY(0deg) scale(1);
-    -ms-transform: perspective(400px) translateZ(0) rotateY(0deg) scale(1);
-    transform: perspective(400px) translateZ(0) rotateY(0deg) scale(1);
-    -webkit-animation-timing-function: ease-in;
-    animation-timing-function: ease-in;
-  }
-}
-
-.animated.flip {
-  -webkit-backface-visibility: visible;
-  -ms-backface-visibility: visible;
-  backface-visibility: visible;
-  -webkit-animation-name: flip;
-  animation-name: flip;
-}
-
-@-webkit-keyframes flipInX {
-  0% {
-    -webkit-transform: perspective(400px) rotateX(90deg);
-    transform: perspective(400px) rotateX(90deg);
-    opacity: 0;
-  }
-
-  40% {
-    -webkit-transform: perspective(400px) rotateX(-10deg);
-    transform: perspective(400px) rotateX(-10deg);
-  }
-
-  70% {
-    -webkit-transform: perspective(400px) rotateX(10deg);
-    transform: perspective(400px) rotateX(10deg);
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateX(0deg);
-    transform: perspective(400px) rotateX(0deg);
-    opacity: 1;
-  }
-}
-
-@keyframes flipInX {
-  0% {
-    -webkit-transform: perspective(400px) rotateX(90deg);
-    -ms-transform: perspective(400px) rotateX(90deg);
-    transform: perspective(400px) rotateX(90deg);
-    opacity: 0;
-  }
-
-  40% {
-    -webkit-transform: perspective(400px) rotateX(-10deg);
-    -ms-transform: perspective(400px) rotateX(-10deg);
-    transform: perspective(400px) rotateX(-10deg);
-  }
-
-  70% {
-    -webkit-transform: perspective(400px) rotateX(10deg);
-    -ms-transform: perspective(400px) rotateX(10deg);
-    transform: perspective(400px) rotateX(10deg);
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateX(0deg);
-    -ms-transform: perspective(400px) rotateX(0deg);
-    transform: perspective(400px) rotateX(0deg);
-    opacity: 1;
-  }
-}
-
-.flipInX {
-  -webkit-backface-visibility: visible !important;
-  -ms-backface-visibility: visible !important;
-  backface-visibility: visible !important;
-  -webkit-animation-name: flipInX;
-  animation-name: flipInX;
-}
-
-@-webkit-keyframes flipInY {
-  0% {
-    -webkit-transform: perspective(400px) rotateY(90deg);
-    transform: perspective(400px) rotateY(90deg);
-    opacity: 0;
-  }
-
-  40% {
-    -webkit-transform: perspective(400px) rotateY(-10deg);
-    transform: perspective(400px) rotateY(-10deg);
-  }
-
-  70% {
-    -webkit-transform: perspective(400px) rotateY(10deg);
-    transform: perspective(400px) rotateY(10deg);
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateY(0deg);
-    transform: perspective(400px) rotateY(0deg);
-    opacity: 1;
-  }
-}
-
-@keyframes flipInY {
-  0% {
-    -webkit-transform: perspective(400px) rotateY(90deg);
-    -ms-transform: perspective(400px) rotateY(90deg);
-    transform: perspective(400px) rotateY(90deg);
-    opacity: 0;
-  }
-
-  40% {
-    -webkit-transform: perspective(400px) rotateY(-10deg);
-    -ms-transform: perspective(400px) rotateY(-10deg);
-    transform: perspective(400px) rotateY(-10deg);
-  }
-
-  70% {
-    -webkit-transform: perspective(400px) rotateY(10deg);
-    -ms-transform: perspective(400px) rotateY(10deg);
-    transform: perspective(400px) rotateY(10deg);
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateY(0deg);
-    -ms-transform: perspective(400px) rotateY(0deg);
-    transform: perspective(400px) rotateY(0deg);
-    opacity: 1;
-  }
-}
-
-.flipInY {
-  -webkit-backface-visibility: visible !important;
-  -ms-backface-visibility: visible !important;
-  backface-visibility: visible !important;
-  -webkit-animation-name: flipInY;
-  animation-name: flipInY;
-}
-
-@-webkit-keyframes flipOutX {
-  0% {
-    -webkit-transform: perspective(400px) rotateX(0deg);
-    transform: perspective(400px) rotateX(0deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateX(90deg);
-    transform: perspective(400px) rotateX(90deg);
-    opacity: 0;
-  }
-}
-
-@keyframes flipOutX {
-  0% {
-    -webkit-transform: perspective(400px) rotateX(0deg);
-    -ms-transform: perspective(400px) rotateX(0deg);
-    transform: perspective(400px) rotateX(0deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateX(90deg);
-    -ms-transform: perspective(400px) rotateX(90deg);
-    transform: perspective(400px) rotateX(90deg);
-    opacity: 0;
-  }
-}
-
-.flipOutX {
-  -webkit-animation-name: flipOutX;
-  animation-name: flipOutX;
-  -webkit-backface-visibility: visible !important;
-  -ms-backface-visibility: visible !important;
-  backface-visibility: visible !important;
-}
-
-@-webkit-keyframes flipOutY {
-  0% {
-    -webkit-transform: perspective(400px) rotateY(0deg);
-    transform: perspective(400px) rotateY(0deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateY(90deg);
-    transform: perspective(400px) rotateY(90deg);
-    opacity: 0;
-  }
-}
-
-@keyframes flipOutY {
-  0% {
-    -webkit-transform: perspective(400px) rotateY(0deg);
-    -ms-transform: perspective(400px) rotateY(0deg);
-    transform: perspective(400px) rotateY(0deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: perspective(400px) rotateY(90deg);
-    -ms-transform: perspective(400px) rotateY(90deg);
-    transform: perspective(400px) rotateY(90deg);
-    opacity: 0;
-  }
-}
-
-.flipOutY {
-  -webkit-backface-visibility: visible !important;
-  -ms-backface-visibility: visible !important;
-  backface-visibility: visible !important;
-  -webkit-animation-name: flipOutY;
-  animation-name: flipOutY;
-}
-
-@-webkit-keyframes lightSpeedIn {
-  0% {
-    -webkit-transform: translateX(100%) skewX(-30deg);
-    transform: translateX(100%) skewX(-30deg);
-    opacity: 0;
-  }
-
-  60% {
-    -webkit-transform: translateX(-20%) skewX(30deg);
-    transform: translateX(-20%) skewX(30deg);
-    opacity: 1;
-  }
-
-  80% {
-    -webkit-transform: translateX(0%) skewX(-15deg);
-    transform: translateX(0%) skewX(-15deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: translateX(0%) skewX(0deg);
-    transform: translateX(0%) skewX(0deg);
-    opacity: 1;
-  }
-}
-
-@keyframes lightSpeedIn {
-  0% {
-    -webkit-transform: translateX(100%) skewX(-30deg);
-    -ms-transform: translateX(100%) skewX(-30deg);
-    transform: translateX(100%) skewX(-30deg);
-    opacity: 0;
-  }
-
-  60% {
-    -webkit-transform: translateX(-20%) skewX(30deg);
-    -ms-transform: translateX(-20%) skewX(30deg);
-    transform: translateX(-20%) skewX(30deg);
-    opacity: 1;
-  }
-
-  80% {
-    -webkit-transform: translateX(0%) skewX(-15deg);
-    -ms-transform: translateX(0%) skewX(-15deg);
-    transform: translateX(0%) skewX(-15deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: translateX(0%) skewX(0deg);
-    -ms-transform: translateX(0%) skewX(0deg);
-    transform: translateX(0%) skewX(0deg);
-    opacity: 1;
-  }
-}
-
-.lightSpeedIn {
-  -webkit-animation-name: lightSpeedIn;
-  animation-name: lightSpeedIn;
-  -webkit-animation-timing-function: ease-out;
-  animation-timing-function: ease-out;
-}
-
-@-webkit-keyframes lightSpeedOut {
-  0% {
-    -webkit-transform: translateX(0%) skewX(0deg);
-    transform: translateX(0%) skewX(0deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: translateX(100%) skewX(-30deg);
-    transform: translateX(100%) skewX(-30deg);
-    opacity: 0;
-  }
-}
-
-@keyframes lightSpeedOut {
-  0% {
-    -webkit-transform: translateX(0%) skewX(0deg);
-    -ms-transform: translateX(0%) skewX(0deg);
-    transform: translateX(0%) skewX(0deg);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: translateX(100%) skewX(-30deg);
-    -ms-transform: translateX(100%) skewX(-30deg);
-    transform: translateX(100%) skewX(-30deg);
-    opacity: 0;
-  }
-}
-
-.lightSpeedOut {
-  -webkit-animation-name: lightSpeedOut;
-  animation-name: lightSpeedOut;
-  -webkit-animation-timing-function: ease-in;
-  animation-timing-function: ease-in;
-}
-
-@-webkit-keyframes rotateIn {
-  0% {
-    -webkit-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(-200deg);
-    transform: rotate(-200deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-@keyframes rotateIn {
-  0% {
-    -webkit-transform-origin: center center;
-    -ms-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(-200deg);
-    -ms-transform: rotate(-200deg);
-    transform: rotate(-200deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: center center;
-    -ms-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-.rotateIn {
-  -webkit-animation-name: rotateIn;
-  animation-name: rotateIn;
-}
-
-@-webkit-keyframes rotateInDownLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-@keyframes rotateInDownLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(-90deg);
-    -ms-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-.rotateInDownLeft {
-  -webkit-animation-name: rotateInDownLeft;
-  animation-name: rotateInDownLeft;
-}
-
-@-webkit-keyframes rotateInDownRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-@keyframes rotateInDownRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(90deg);
-    -ms-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-.rotateInDownRight {
-  -webkit-animation-name: rotateInDownRight;
-  animation-name: rotateInDownRight;
-}
-
-@-webkit-keyframes rotateInUpLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-@keyframes rotateInUpLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(90deg);
-    -ms-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-.rotateInUpLeft {
-  -webkit-animation-name: rotateInUpLeft;
-  animation-name: rotateInUpLeft;
-}
-
-@-webkit-keyframes rotateInUpRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-@keyframes rotateInUpRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(-90deg);
-    -ms-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-}
-
-.rotateInUpRight {
-  -webkit-animation-name: rotateInUpRight;
-  animation-name: rotateInUpRight;
-}
-
-@-webkit-keyframes rotateOut {
-  0% {
-    -webkit-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(200deg);
-    transform: rotate(200deg);
-    opacity: 0;
-  }
-}
-
-@keyframes rotateOut {
-  0% {
-    -webkit-transform-origin: center center;
-    -ms-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: center center;
-    -ms-transform-origin: center center;
-    transform-origin: center center;
-    -webkit-transform: rotate(200deg);
-    -ms-transform: rotate(200deg);
-    transform: rotate(200deg);
-    opacity: 0;
-  }
-}
-
-.rotateOut {
-  -webkit-animation-name: rotateOut;
-  animation-name: rotateOut;
-}
-
-@-webkit-keyframes rotateOutDownLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-}
-
-@keyframes rotateOutDownLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(90deg);
-    -ms-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-}
-
-.rotateOutDownLeft {
-  -webkit-animation-name: rotateOutDownLeft;
-  animation-name: rotateOutDownLeft;
-}
-
-@-webkit-keyframes rotateOutDownRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-}
-
-@keyframes rotateOutDownRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(-90deg);
-    -ms-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-}
-
-.rotateOutDownRight {
-  -webkit-animation-name: rotateOutDownRight;
-  animation-name: rotateOutDownRight;
-}
-
-@-webkit-keyframes rotateOutUpLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-}
-
-@keyframes rotateOutUpLeft {
-  0% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: left bottom;
-    -ms-transform-origin: left bottom;
-    transform-origin: left bottom;
-    -webkit-transform: rotate(-90deg);
-    -ms-transform: rotate(-90deg);
-    transform: rotate(-90deg);
-    opacity: 0;
-  }
-}
-
-.rotateOutUpLeft {
-  -webkit-animation-name: rotateOutUpLeft;
-  animation-name: rotateOutUpLeft;
-}
-
-@-webkit-keyframes rotateOutUpRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-}
-
-@keyframes rotateOutUpRight {
-  0% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform-origin: right bottom;
-    -ms-transform-origin: right bottom;
-    transform-origin: right bottom;
-    -webkit-transform: rotate(90deg);
-    -ms-transform: rotate(90deg);
-    transform: rotate(90deg);
-    opacity: 0;
-  }
-}
-
-.rotateOutUpRight {
-  -webkit-animation-name: rotateOutUpRight;
-  animation-name: rotateOutUpRight;
-}
-
-@-webkit-keyframes slideInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-
-  100% {
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes slideInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    -ms-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-
-  100% {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.slideInDown {
-  -webkit-animation-name: slideInDown;
-  animation-name: slideInDown;
-}
-
-@-webkit-keyframes slideInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes slideInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    -ms-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.slideInLeft {
-  -webkit-animation-name: slideInLeft;
-  animation-name: slideInLeft;
-}
-
-@-webkit-keyframes slideInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-@keyframes slideInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    -ms-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-
-  100% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-}
-
-.slideInRight {
-  -webkit-animation-name: slideInRight;
-  animation-name: slideInRight;
-}
-
-@-webkit-keyframes slideOutLeft {
-  0% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-}
-
-@keyframes slideOutLeft {
-  0% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(-2000px);
-    -ms-transform: translateX(-2000px);
-    transform: translateX(-2000px);
-  }
-}
-
-.slideOutLeft {
-  -webkit-animation-name: slideOutLeft;
-  animation-name: slideOutLeft;
-}
-
-@-webkit-keyframes slideOutRight {
-  0% {
-    -webkit-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-}
-
-@keyframes slideOutRight {
-  0% {
-    -webkit-transform: translateX(0);
-    -ms-transform: translateX(0);
-    transform: translateX(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(2000px);
-    -ms-transform: translateX(2000px);
-    transform: translateX(2000px);
-  }
-}
-
-.slideOutRight {
-  -webkit-animation-name: slideOutRight;
-  animation-name: slideOutRight;
-}
-
-@-webkit-keyframes slideOutUp {
-  0% {
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-}
-
-@keyframes slideOutUp {
-  0% {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-2000px);
-    -ms-transform: translateY(-2000px);
-    transform: translateY(-2000px);
-  }
-}
-
-.slideOutUp {
-  -webkit-animation-name: slideOutUp;
-  animation-name: slideOutUp;
-}
-
-@-webkit-keyframes slideInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes slideInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    -ms-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-.slideInUp {
-  -webkit-animation-name: slideInUp;
-  animation-name: slideInUp;
-}
-
-@-webkit-keyframes slideOutDown {
-  0% {
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-}
-
-@keyframes slideOutDown {
-  0% {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(2000px);
-    -ms-transform: translateY(2000px);
-    transform: translateY(2000px);
-  }
-}
-
-.slideOutDown {
-  -webkit-animation-name: slideOutDown;
-  animation-name: slideOutDown;
-}
-
-@-webkit-keyframes hinge {
-  0% {
-    -webkit-transform: rotate(0);
-    transform: rotate(0);
-    -webkit-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  20%, 60% {
-    -webkit-transform: rotate(80deg);
-    transform: rotate(80deg);
-    -webkit-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  40% {
-    -webkit-transform: rotate(60deg);
-    transform: rotate(60deg);
-    -webkit-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  80% {
-    -webkit-transform: rotate(60deg) translateY(0);
-    transform: rotate(60deg) translateY(0);
-    -webkit-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: translateY(700px);
-    transform: translateY(700px);
-    opacity: 0;
-  }
-}
-
-@keyframes hinge {
-  0% {
-    -webkit-transform: rotate(0);
-    -ms-transform: rotate(0);
-    transform: rotate(0);
-    -webkit-transform-origin: top left;
-    -ms-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  20%, 60% {
-    -webkit-transform: rotate(80deg);
-    -ms-transform: rotate(80deg);
-    transform: rotate(80deg);
-    -webkit-transform-origin: top left;
-    -ms-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  40% {
-    -webkit-transform: rotate(60deg);
-    -ms-transform: rotate(60deg);
-    transform: rotate(60deg);
-    -webkit-transform-origin: top left;
-    -ms-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  80% {
-    -webkit-transform: rotate(60deg) translateY(0);
-    -ms-transform: rotate(60deg) translateY(0);
-    transform: rotate(60deg) translateY(0);
-    -webkit-transform-origin: top left;
-    -ms-transform-origin: top left;
-    transform-origin: top left;
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-    opacity: 1;
-  }
-
-  100% {
-    -webkit-transform: translateY(700px);
-    -ms-transform: translateY(700px);
-    transform: translateY(700px);
-    opacity: 0;
-  }
-}
-
-.hinge {
-  -webkit-animation-name: hinge;
-  animation-name: hinge;
-}
-
-/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
-
-@-webkit-keyframes rollIn {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-100%) rotate(-120deg);
-    transform: translateX(-100%) rotate(-120deg);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0px) rotate(0deg);
-    transform: translateX(0px) rotate(0deg);
-  }
-}
-
-@keyframes rollIn {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateX(-100%) rotate(-120deg);
-    -ms-transform: translateX(-100%) rotate(-120deg);
-    transform: translateX(-100%) rotate(-120deg);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateX(0px) rotate(0deg);
-    -ms-transform: translateX(0px) rotate(0deg);
-    transform: translateX(0px) rotate(0deg);
-  }
-}
-
-.rollIn {
-  -webkit-animation-name: rollIn;
-  animation-name: rollIn;
-}
-
-/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
-
-@-webkit-keyframes rollOut {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0px) rotate(0deg);
-    transform: translateX(0px) rotate(0deg);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(100%) rotate(120deg);
-    transform: translateX(100%) rotate(120deg);
-  }
-}
-
-@keyframes rollOut {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateX(0px) rotate(0deg);
-    -ms-transform: translateX(0px) rotate(0deg);
-    transform: translateX(0px) rotate(0deg);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateX(100%) rotate(120deg);
-    -ms-transform: translateX(100%) rotate(120deg);
-    transform: translateX(100%) rotate(120deg);
-  }
-}
-
-.rollOut {
-  -webkit-animation-name: rollOut;
-  animation-name: rollOut;
-}
-
-@-webkit-keyframes zoomIn {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    transform: scale(.3);
-  }
-
-  50% {
-    opacity: 1;
-  }
-}
-
-@keyframes zoomIn {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    -ms-transform: scale(.3);
-    transform: scale(.3);
-  }
-
-  50% {
-    opacity: 1;
-  }
-}
-
-.zoomIn {
-  -webkit-animation-name: zoomIn;
-  animation-name: zoomIn;
-}
-
-@-webkit-keyframes zoomInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(-2000px);
-    transform: scale(.1) translateY(-2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(60px);
-    transform: scale(.475) translateY(60px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-@keyframes zoomInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(-2000px);
-    -ms-transform: scale(.1) translateY(-2000px);
-    transform: scale(.1) translateY(-2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(60px);
-    -ms-transform: scale(.475) translateY(60px);
-    transform: scale(.475) translateY(60px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-.zoomInDown {
-  -webkit-animation-name: zoomInDown;
-  animation-name: zoomInDown;
-}
-
-@-webkit-keyframes zoomInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(-2000px);
-    transform: scale(.1) translateX(-2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(48px);
-    transform: scale(.475) translateX(48px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-@keyframes zoomInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(-2000px);
-    -ms-transform: scale(.1) translateX(-2000px);
-    transform: scale(.1) translateX(-2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(48px);
-    -ms-transform: scale(.475) translateX(48px);
-    transform: scale(.475) translateX(48px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-.zoomInLeft {
-  -webkit-animation-name: zoomInLeft;
-  animation-name: zoomInLeft;
-}
-
-@-webkit-keyframes zoomInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(2000px);
-    transform: scale(.1) translateX(2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(-48px);
-    transform: scale(.475) translateX(-48px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-@keyframes zoomInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(2000px);
-    -ms-transform: scale(.1) translateX(2000px);
-    transform: scale(.1) translateX(2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(-48px);
-    -ms-transform: scale(.475) translateX(-48px);
-    transform: scale(.475) translateX(-48px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-.zoomInRight {
-  -webkit-animation-name: zoomInRight;
-  animation-name: zoomInRight;
-}
-
-@-webkit-keyframes zoomInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(2000px);
-    transform: scale(.1) translateY(2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(-60px);
-    transform: scale(.475) translateY(-60px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-@keyframes zoomInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(2000px);
-    -ms-transform: scale(.1) translateY(2000px);
-    transform: scale(.1) translateY(2000px);
-    -webkit-animation-timing-function: ease-in-out;
-    animation-timing-function: ease-in-out;
-  }
-
-  60% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(-60px);
-    -ms-transform: scale(.475) translateY(-60px);
-    transform: scale(.475) translateY(-60px);
-    -webkit-animation-timing-function: ease-out;
-    animation-timing-function: ease-out;
-  }
-}
-
-.zoomInUp {
-  -webkit-animation-name: zoomInUp;
-  animation-name: zoomInUp;
-}
-
-@-webkit-keyframes zoomOut {
-  0% {
-    opacity: 1;
-    -webkit-transform: scale(1);
-    transform: scale(1);
-  }
-
-  50% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    transform: scale(.3);
-  }
-
-  100% {
-    opacity: 0;
-  }
-}
-
-@keyframes zoomOut {
-  0% {
-    opacity: 1;
-    -webkit-transform: scale(1);
-    -ms-transform: scale(1);
-    transform: scale(1);
-  }
-
-  50% {
-    opacity: 0;
-    -webkit-transform: scale(.3);
-    -ms-transform: scale(.3);
-    transform: scale(.3);
-  }
-
-  100% {
-    opacity: 0;
-  }
-}
-
-.zoomOut {
-  -webkit-animation-name: zoomOut;
-  animation-name: zoomOut;
-}
-
-@-webkit-keyframes zoomOutDown {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(-60px);
-    transform: scale(.475) translateY(-60px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(2000px);
-    transform: scale(.1) translateY(2000px);
-    -webkit-transform-origin: center bottom;
-    transform-origin: center bottom;
-  }
-}
-
-@keyframes zoomOutDown {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(-60px);
-    -ms-transform: scale(.475) translateY(-60px);
-    transform: scale(.475) translateY(-60px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(2000px);
-    -ms-transform: scale(.1) translateY(2000px);
-    transform: scale(.1) translateY(2000px);
-    -webkit-transform-origin: center bottom;
-    -ms-transform-origin: center bottom;
-    transform-origin: center bottom;
-  }
-}
-
-.zoomOutDown {
-  -webkit-animation-name: zoomOutDown;
-  animation-name: zoomOutDown;
-}
-
-@-webkit-keyframes zoomOutLeft {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(42px);
-    transform: scale(.475) translateX(42px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(-2000px);
-    transform: scale(.1) translateX(-2000px);
-    -webkit-transform-origin: left center;
-    transform-origin: left center;
-  }
-}
-
-@keyframes zoomOutLeft {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(42px);
-    -ms-transform: scale(.475) translateX(42px);
-    transform: scale(.475) translateX(42px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(-2000px);
-    -ms-transform: scale(.1) translateX(-2000px);
-    transform: scale(.1) translateX(-2000px);
-    -webkit-transform-origin: left center;
-    -ms-transform-origin: left center;
-    transform-origin: left center;
-  }
-}
-
-.zoomOutLeft {
-  -webkit-animation-name: zoomOutLeft;
-  animation-name: zoomOutLeft;
-}
-
-@-webkit-keyframes zoomOutRight {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(-42px);
-    transform: scale(.475) translateX(-42px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(2000px);
-    transform: scale(.1) translateX(2000px);
-    -webkit-transform-origin: right center;
-    transform-origin: right center;
-  }
-}
-
-@keyframes zoomOutRight {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateX(-42px);
-    -ms-transform: scale(.475) translateX(-42px);
-    transform: scale(.475) translateX(-42px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateX(2000px);
-    -ms-transform: scale(.1) translateX(2000px);
-    transform: scale(.1) translateX(2000px);
-    -webkit-transform-origin: right center;
-    -ms-transform-origin: right center;
-    transform-origin: right center;
-  }
-}
-
-.zoomOutRight {
-  -webkit-animation-name: zoomOutRight;
-  animation-name: zoomOutRight;
-}
-
-@-webkit-keyframes zoomOutUp {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(60px);
-    transform: scale(.475) translateY(60px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(-2000px);
-    transform: scale(.1) translateY(-2000px);
-    -webkit-transform-origin: center top;
-    transform-origin: center top;
-  }
-}
-
-@keyframes zoomOutUp {
-  40% {
-    opacity: 1;
-    -webkit-transform: scale(.475) translateY(60px);
-    -ms-transform: scale(.475) translateY(60px);
-    transform: scale(.475) translateY(60px);
-    -webkit-animation-timing-function: linear;
-    animation-timing-function: linear;
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(.1) translateY(-2000px);
-    -ms-transform: scale(.1) translateY(-2000px);
-    transform: scale(.1) translateY(-2000px);
-    -webkit-transform-origin: center top;
-    -ms-transform-origin: center top;
-    transform-origin: center top;
-  }
-}
-
-.zoomOutUp {
-  -webkit-animation-name: zoomOutUp;
-  animation-name: zoomOutUp;
-}

+ 0 - 274
frontend/saas-portal-web/static/css/jquery.fancybox.css

@@ -1,274 +0,0 @@
-/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
-.fancybox-wrap,
-.fancybox-skin,
-.fancybox-outer,
-.fancybox-inner,
-.fancybox-image,
-.fancybox-wrap iframe,
-.fancybox-wrap object,
-.fancybox-nav,
-.fancybox-nav span,
-.fancybox-tmp
-{
-	padding: 0;
-	margin: 0;
-	border: 0;
-	outline: none;
-	vertical-align: top;
-}
-
-.fancybox-wrap {
-	position: absolute;
-	top: 0;
-	left: 0;
-	z-index: 8020;
-}
-
-.fancybox-skin {
-	position: relative;
-	background: #f9f9f9;
-	color: #444;
-	text-shadow: none;
-	-webkit-border-radius: 4px;
-	   -moz-border-radius: 4px;
-	        border-radius: 4px;
-}
-
-.fancybox-opened {
-	z-index: 8030;
-}
-
-.fancybox-opened .fancybox-skin {
-	-webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
-	   -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
-	        box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
-}
-
-.fancybox-outer, .fancybox-inner {
-	position: relative;
-}
-
-.fancybox-inner {
-	overflow: hidden;
-}
-
-.fancybox-type-iframe .fancybox-inner {
-	-webkit-overflow-scrolling: touch;
-}
-
-.fancybox-error {
-	color: #444;
-	font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
-	margin: 0;
-	padding: 15px;
-	white-space: nowrap;
-}
-
-.fancybox-image, .fancybox-iframe {
-	display: block;
-	width: 100%;
-	height: 100%;
-}
-
-.fancybox-image {
-	max-width: 100%;
-	max-height: 100%;
-}
-
-#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
-	background-image: url('fancybox_sprite.png');
-}
-
-#fancybox-loading {
-	position: fixed;
-	top: 50%;
-	left: 50%;
-	margin-top: -22px;
-	margin-left: -22px;
-	background-position: 0 -108px;
-	opacity: 0.8;
-	cursor: pointer;
-	z-index: 8060;
-}
-
-#fancybox-loading div {
-	width: 44px;
-	height: 44px;
-	background: url('fancybox_loading.gif') center center no-repeat;
-}
-
-.fancybox-close {
-	position: absolute;
-	top: -18px;
-	right: -18px;
-	width: 36px;
-	height: 36px;
-	cursor: pointer;
-	z-index: 8040;
-}
-
-.fancybox-nav {
-	position: absolute;
-	top: 0;
-	width: 40%;
-	height: 100%;
-	cursor: pointer;
-	text-decoration: none;
-	background: transparent url('blank.gif'); /* helps IE */
-	-webkit-tap-highlight-color: rgba(0,0,0,0);
-	z-index: 8040;
-}
-
-.fancybox-prev {
-	left: 0;
-}
-
-.fancybox-next {
-	right: 0;
-}
-
-.fancybox-nav span {
-	position: absolute;
-	top: 50%;
-	width: 36px;
-	height: 34px;
-	margin-top: -18px;
-	cursor: pointer;
-	z-index: 8040;
-	visibility: hidden;
-}
-
-.fancybox-prev span {
-	left: 10px;
-	background-position: 0 -36px;
-}
-
-.fancybox-next span {
-	right: 10px;
-	background-position: 0 -72px;
-}
-
-.fancybox-nav:hover span {
-	visibility: visible;
-}
-
-.fancybox-tmp {
-	position: absolute;
-	top: -99999px;
-	left: -99999px;
-	visibility: hidden;
-	max-width: 99999px;
-	max-height: 99999px;
-	overflow: visible !important;
-}
-
-/* Overlay helper */
-
-.fancybox-lock {
-    overflow: hidden !important;
-    width: auto;
-}
-
-.fancybox-lock body {
-    overflow: hidden !important;
-}
-
-.fancybox-lock-test {
-    overflow-y: hidden !important;
-}
-
-.fancybox-overlay {
-	position: absolute;
-	top: 0;
-	left: 0;
-	overflow: hidden;
-	display: none;
-	z-index: 8010;
-	background: url('fancybox_overlay.png');
-}
-
-.fancybox-overlay-fixed {
-	position: fixed;
-	bottom: 0;
-	right: 0;
-}
-
-.fancybox-lock .fancybox-overlay {
-	overflow: auto;
-	overflow-y: scroll;
-}
-
-/* Title helper */
-
-.fancybox-title {
-	visibility: hidden;
-	font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
-	position: relative;
-	text-shadow: none;
-	z-index: 8050;
-}
-
-.fancybox-opened .fancybox-title {
-	visibility: visible;
-}
-
-.fancybox-title-float-wrap {
-	position: absolute;
-	bottom: 0;
-	right: 50%;
-	margin-bottom: -35px;
-	z-index: 8050;
-	text-align: center;
-}
-
-.fancybox-title-float-wrap .child {
-	display: inline-block;
-	margin-right: -100%;
-	padding: 2px 20px;
-	background: transparent; /* Fallback for web browsers that doesn't support RGBa */
-	background: rgba(0, 0, 0, 0.8);
-	-webkit-border-radius: 15px;
-	   -moz-border-radius: 15px;
-	        border-radius: 15px;
-	text-shadow: 0 1px 2px #222;
-	color: #FFF;
-	font-weight: bold;
-	line-height: 24px;
-	white-space: nowrap;
-}
-
-.fancybox-title-outside-wrap {
-	position: relative;
-	margin-top: 10px;
-	color: #fff;
-}
-
-.fancybox-title-inside-wrap {
-	padding-top: 10px;
-}
-
-.fancybox-title-over-wrap {
-	position: absolute;
-	bottom: 0;
-	left: 0;
-	color: #fff;
-	padding: 10px;
-	background: #000;
-	background: rgba(0, 0, 0, .8);
-}
-
-/*Retina graphics!*/
-@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
-	   only screen and (min--moz-device-pixel-ratio: 1.5),
-	   only screen and (min-device-pixel-ratio: 1.5){
-
-	#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
-		background-image: url('fancybox_sprite@2x.png');
-		background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/
-	}
-
-	#fancybox-loading div {
-		background-image: url('fancybox_loading@2x.gif');
-		background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/
-	}
-}

+ 0 - 231
frontend/saas-portal-web/static/css/owl.carousel.css

@@ -1,231 +0,0 @@
-/* 
- * 	Core Owl Carousel CSS File
- *	v1.24
- */
-
-/* clearfix */
-.owl-carousel .owl-wrapper:after {
-	content: ".";
-	display: block;
-	clear: both;
-	visibility: hidden;
-	line-height: 0;
-	height: 0;
-}
-/* display none until init */
-.owl-carousel{
-	display: none;
-	position: relative;
-	width: 100%;
-	-ms-touch-action: pan-y;
-}
-.owl-carousel .owl-wrapper{
-	display: none;
-	position: relative;
-	-webkit-transform: translate3d(0px, 0px, 0px);
-}
-.owl-carousel .owl-wrapper-outer{
-	overflow: hidden;
-	position: relative;
-	width: 100%;
-}
-.owl-carousel .owl-wrapper-outer.autoHeight{
-	-webkit-transition: height 500ms ease-in-out;
-	-moz-transition: height 500ms ease-in-out;
-	-ms-transition: height 500ms ease-in-out;
-	-o-transition: height 500ms ease-in-out;
-	transition: height 500ms ease-in-out;
-}
-	
-.owl-carousel .owl-item{
-	float: left;
-}
-.owl-controls .owl-page,
-.owl-controls .owl-buttons div{
-	cursor: pointer;
-}
-.owl-controls {
-	-webkit-user-select: none;
-	-khtml-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-/* mouse grab icon */
-.grabbing { 
-    cursor:url(grabbing.png) 8 8, move;
-}
-
-/* fix */
-.owl-carousel  .owl-wrapper,
-.owl-carousel  .owl-item{
-	-webkit-backface-visibility: hidden;
-	-moz-backface-visibility:    hidden;
-	-ms-backface-visibility:     hidden;
-  -webkit-transform: translate3d(0,0,0);
-  -moz-transform: translate3d(0,0,0);
-  -ms-transform: translate3d(0,0,0);
-}
-
-/* CSS3 Transitions */
-
-.owl-origin {
-	-webkit-perspective: 1200px;
-	-webkit-perspective-origin-x : 50%;
-	-webkit-perspective-origin-y : 50%;
-	-moz-perspective : 1200px;
-	-moz-perspective-origin-x : 50%;
-	-moz-perspective-origin-y : 50%;
-	perspective : 1200px;
-}
-/* fade */
-.owl-fade-out {
-  z-index: 10;
-  -webkit-animation: fadeOut .7s both ease;
-  -moz-animation: fadeOut .7s both ease;
-  animation: fadeOut .7s both ease;
-}
-.owl-fade-in {
-  -webkit-animation: fadeIn .7s both ease;
-  -moz-animation: fadeIn .7s both ease;
-  animation: fadeIn .7s both ease;
-}
-/* backSlide */
-.owl-backSlide-out {
-  -webkit-animation: backSlideOut 1s both ease;
-  -moz-animation: backSlideOut 1s both ease;
-  animation: backSlideOut 1s both ease;
-}
-.owl-backSlide-in {
-  -webkit-animation: backSlideIn 1s both ease;
-  -moz-animation: backSlideIn 1s both ease;
-  animation: backSlideIn 1s both ease;
-}
-/* goDown */
-.owl-goDown-out {
-  -webkit-animation: scaleToFade .7s ease both;
-  -moz-animation: scaleToFade .7s ease both;
-  animation: scaleToFade .7s ease both;
-}
-.owl-goDown-in {
-  -webkit-animation: goDown .6s ease both;
-  -moz-animation: goDown .6s ease both;
-  animation: goDown .6s ease both;
-}
-/* scaleUp */
-.owl-fadeUp-in {
-  -webkit-animation: scaleUpFrom .5s ease both;
-  -moz-animation: scaleUpFrom .5s ease both;
-  animation: scaleUpFrom .5s ease both;
-}
-
-.owl-fadeUp-out {
-  -webkit-animation: scaleUpTo .5s ease both;
-  -moz-animation: scaleUpTo .5s ease both;
-  animation: scaleUpTo .5s ease both;
-}
-/* Keyframes */
-/*empty*/
-@-webkit-keyframes empty {
-  0% {opacity: 1}
-}
-@-moz-keyframes empty {
-  0% {opacity: 1}
-}
-@keyframes empty {
-  0% {opacity: 1}
-}
-@-webkit-keyframes fadeIn {
-  0% { opacity:0; }
-  100% { opacity:1; }
-}
-@-moz-keyframes fadeIn {
-  0% { opacity:0; }
-  100% { opacity:1; }
-}
-@keyframes fadeIn {
-  0% { opacity:0; }
-  100% { opacity:1; }
-}
-@-webkit-keyframes fadeOut {
-  0% { opacity:1; }
-  100% { opacity:0; }
-}
-@-moz-keyframes fadeOut {
-  0% { opacity:1; }
-  100% { opacity:0; }
-}
-@keyframes fadeOut {
-  0% { opacity:1; }
-  100% { opacity:0; }
-}
-@-webkit-keyframes backSlideOut {
-  25% { opacity: .5; -webkit-transform: translateZ(-500px); }
-  75% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); }
-  100% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); }
-}
-@-moz-keyframes backSlideOut {
-  25% { opacity: .5; -moz-transform: translateZ(-500px); }
-  75% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); }
-  100% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); }
-}
-@keyframes backSlideOut {
-  25% { opacity: .5; transform: translateZ(-500px); }
-  75% { opacity: .5; transform: translateZ(-500px) translateX(-200%); }
-  100% { opacity: .5; transform: translateZ(-500px) translateX(-200%); }
-}
-@-webkit-keyframes backSlideIn {
-  0%, 25% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(200%); }
-  75% { opacity: .5; -webkit-transform: translateZ(-500px); }
-  100% { opacity: 1; -webkit-transform: translateZ(0) translateX(0); }
-}
-@-moz-keyframes backSlideIn {
-  0%, 25% { opacity: .5; -moz-transform: translateZ(-500px) translateX(200%); }
-  75% { opacity: .5; -moz-transform: translateZ(-500px); }
-  100% { opacity: 1; -moz-transform: translateZ(0) translateX(0); }
-}
-@keyframes backSlideIn {
-  0%, 25% { opacity: .5; transform: translateZ(-500px) translateX(200%); }
-  75% { opacity: .5; transform: translateZ(-500px); }
-  100% { opacity: 1; transform: translateZ(0) translateX(0); }
-}
-@-webkit-keyframes scaleToFade {
-  to { opacity: 0; -webkit-transform: scale(.8); }
-}
-@-moz-keyframes scaleToFade {
-  to { opacity: 0; -moz-transform: scale(.8); }
-}
-@keyframes scaleToFade {
-  to { opacity: 0; transform: scale(.8); }
-}
-@-webkit-keyframes goDown {
-  from { -webkit-transform: translateY(-100%); }
-}
-@-moz-keyframes goDown {
-  from { -moz-transform: translateY(-100%); }
-}
-@keyframes goDown {
-  from { transform: translateY(-100%); }
-}
-
-@-webkit-keyframes scaleUpFrom {
-  from { opacity: 0; -webkit-transform: scale(1.5); }
-}
-@-moz-keyframes scaleUpFrom {
-  from { opacity: 0; -moz-transform: scale(1.5); }
-}
-@keyframes scaleUpFrom {
-  from { opacity: 0; transform: scale(1.5); }
-}
-
-@-webkit-keyframes scaleUpTo {
-  to { opacity: 0; -webkit-transform: scale(1.5); }
-}
-@-moz-keyframes scaleUpTo {
-  to { opacity: 0; -moz-transform: scale(1.5); }
-}
-@keyframes scaleUpTo {
-  to { opacity: 0; transform: scale(1.5); }
-}

+ 0 - 221
frontend/saas-portal-web/static/css/slit-slider.css

@@ -1,221 +0,0 @@
-.sl-slide, .sl-slides-wrapper, .sl-slide-inner {
-	position: absolute;
-	width: 100%;
-	height: 100%;
-	top: 0;
-	left: 0;
-}
-
-.sl-slider-wrapper {
-	width: 100%;
-	height: 600px;
-	overflow: hidden;
-	position: relative;
-}
-
-
-
-.bg-img {
-	background-position: center center;
-	background-repeat: no-repeat;
-	background-size: cover;
-	height: 100%;
-	width: 100%;
-}
-
-/* Custom navigation arrows */
-
-.nav-arrows span {
-	position: absolute;
-	z-index: 2000;
-	top: 50%;
-	width: 40px;
-	height: 40px;
-	border: 8px solid #ddd;
-	border: 8px solid rgba(150,150,150,0.4);
-	text-indent: -90000px;
-	margin-top: -40px;
-	cursor: pointer;
-	
-	-webkit-transform: rotate(45deg);
-	-moz-transform: rotate(45deg);
-	-o-transform: rotate(45deg);
-	-ms-transform: rotate(45deg);
-	transform: rotate(45deg);
-}
-
-.nav-arrows span:hover {
-	border-color: rgba(150,150,150,0.9);
-}
-
-.nav-arrows span.nav-arrow-prev {
-	left: 5%;
-	border-right: none;
-	border-top: none;
-}
-
-.nav-arrows span.nav-arrow-next {
-	right: 5%;
-	border-left: none;
-	border-bottom: none;
-}
-
-
-/* Custom navigation dots */
-
-.nav-dots {
-	text-align: center;
-	position: absolute;
-	bottom: 2%;
-	height: 30px;
-	width: 100%;
-	left: 0;
-	z-index: 1000;
-}
-
-.nav-dots span {
-	display: inline-block;
-	position: relative;
-	width: 16px;
-	height: 16px;
-	border-radius: 50%;
-	margin: 3px;
-	background: #ddd;
-	background: rgba(150,150,150,0.4);
-	cursor: pointer;
-	box-shadow: 
-		0 1px 1px rgba(255,255,255,0.4), 
-		inset 0 1px 1px rgba(0,0,0,0.1);
-}
-
-.nav-dots span {
-	background: rgba(150,150,150,0.1);
-	margin: 6px;
-	-webkit-transition: all 0.2s;
-	-moz-transition: all 0.2s;
-	-ms-transition: all 0.2s;
-	-o-transition: all 0.2s;
-	transition: all 0.2s;
-	box-shadow: 
-		0 1px 1px rgba(255,255,255,0.4), 
-		inset 0 1px 1px rgba(0,0,0,0.1),
-		0 0 0 2px rgba(255,255,255,0.5);
-}
-
-.nav-dots span.nav-dot-current,
-.nav-dots span:hover {
-	box-shadow: 
-		0 1px 1px rgba(255,255,255,0.4), 
-		inset 0 1px 1px rgba(0,0,0,0.1),
-		0 0 0 5px rgba(255,255,255,0.5);
-}
-
-.nav-dots span.nav-dot-current:after {
-	content: "";
-	position: absolute;
-	width: 10px;
-	height: 10px;
-	top: 3px;
-	left: 3px;
-	border-radius: 50%;
-	background: rgba(255,255,255,0.8);
-}
-
-
-
-/* Animations for content elements */
-
-.sl-trans-elems .caption-content h2 {
-	-webkit-animation: moveUp 1s ease-in-out both;
-	-moz-animation: moveUp 1s ease-in-out both;
-	-o-animation: moveUp 1s ease-in-out both;
-	-ms-animation: moveUp 1s ease-in-out both;
-	animation: moveUp 1s ease-in-out both;
-}
-.sl-trans-elems .caption-content span,
-.sl-trans-elems .caption-content a {
-	-webkit-animation: fadeIn 0.5s linear 0.5s both;
-	-moz-animation: fadeIn 0.5s linear 0.5s both;
-	-o-animation: fadeIn 0.5s linear 0.5s both;
-	-ms-animation: fadeIn 0.5s linear 0.5s both;
-	animation: fadeIn 0.5s linear 0.5s both;
-}
-
-.sl-trans-back-elems .caption-content h2 {
-	-webkit-animation: fadeOut 1s ease-in-out both;
-	-moz-animation: fadeOut 1s ease-in-out both;
-	-o-animation: fadeOut 1s ease-in-out both;
-	-ms-animation: fadeOut 1s ease-in-out both;
-	animation: fadeOut 1s ease-in-out both;
-}
-.sl-trans-back-elems .caption-content span,
-.sl-trans-back-elems .caption-content a {
-	-webkit-animation: fadeOut 1s linear both;
-	-moz-animation: fadeOut 1s linear both;
-	-o-animation: fadeOut 1s linear both;
-	-ms-animation: fadeOut 1s linear both;
-	animation: fadeOut 1s linear both;
-}
-
-@-webkit-keyframes moveUp{
-	0% {-webkit-transform: translateY(40px);}
-	100% {-webkit-transform: translateY(0px);}
-}
-@-moz-keyframes moveUp{
-	0% {-moz-transform: translateY(40px);}
-	100% {-moz-transform: translateY(0px);}
-}
-@-o-keyframes moveUp{
-	0% {-o-transform: translateY(40px);}
-	100% {-o-transform: translateY(0px);}
-}
-@-ms-keyframes moveUp{
-	0% {-ms-transform: translateY(40px);}
-	100% {-ms-transform: translateY(0px);}
-}
-@keyframes moveUp{
-	0% {transform: translateY(40px);}
-	100% {transform: translateY(0px);}
-}
-
-@-webkit-keyframes fadeIn{
-	0% {opacity: 0;}
-	100% {opacity: 1;}
-}
-@-moz-keyframes fadeIn{
-	0% {opacity: 0;}
-	100% {opacity: 1;}
-}
-@-o-keyframes fadeIn{
-	0% {opacity: 0;}
-	100% {opacity: 1;}
-}
-@-ms-keyframes fadeIn{
-	0% {opacity: 0;}
-	100% {opacity: 1;}
-}
-@keyframes fadeIn{
-	0% {opacity: 0;}
-	100% {opacity: 1;}
-}
-
-@-webkit-keyframes fadeOut{
-	0% {opacity: 1;}
-	100% {opacity: 0;}
-}
-@-moz-keyframes fadeOut{
-	0% {opacity: 1;}
-	100% {opacity: 0;}
-}
-@-o-keyframes fadeOut{
-	0% {opacity: 1;}
-	100% {opacity: 0;}
-}
-@-ms-keyframes fadeOut{
-	0% {opacity: 1;}
-	100% {opacity: 0;}
-}
-@keyframes fadeOut{
-	0% {opacity: 1;}
-	100% {opacity: 0;}
-}

+ 0 - 12
frontend/saas-portal-web/static/js/jquery.ba-cond.min.js

@@ -1,12 +0,0 @@
-/*
- * cond - v0.1 - 6/10/2009
- * http://benalman.com/projects/jquery-cond-plugin/
- * 
- * Copyright (c) 2009 "Cowboy" Ben Alman
- * Licensed under the MIT license
- * http://benalman.com/about/license/
- * 
- * Based on suggestions and sample code by Stephen Band and DBJDBJ in the
- * jquery-dev Google group: http://bit.ly/jqba1
- */
-(function($){$.fn.cond=function(){var e,a=arguments,b=0,f,d,c;while(!f&&b<a.length){f=a[b++];d=a[b++];f=$.isFunction(f)?f.call(this):f;c=!d?f:f?d.call(this,f):e}return c!==e?c:this}})(jQuery);

+ 0 - 46
frontend/saas-portal-web/static/js/jquery.fancybox.pack.js

@@ -1,46 +0,0 @@
-/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
-(function(r,G,f,v){var J=f("html"),n=f(r),p=f(G),b=f.fancybox=function(){b.open.apply(this,arguments)},I=navigator.userAgent.match(/msie/i),B=null,s=G.createTouch!==v,t=function(a){return a&&a.hasOwnProperty&&a instanceof f},q=function(a){return a&&"string"===f.type(a)},E=function(a){return q(a)&&0<a.indexOf("%")},l=function(a,d){var e=parseInt(a,10)||0;d&&E(a)&&(e*=b.getViewport()[d]/100);return Math.ceil(e)},w=function(a,b){return l(a,b)+"px"};f.extend(b,{version:"2.1.5",defaults:{padding:15,margin:20,
-width:800,height:600,minWidth:100,minHeight:100,maxWidth:9999,maxHeight:9999,pixelRatio:1,autoSize:!0,autoHeight:!1,autoWidth:!1,autoResize:!0,autoCenter:!s,fitToView:!0,aspectRatio:!1,topRatio:0.5,leftRatio:0.5,scrolling:"auto",wrapCSS:"",arrows:!0,closeBtn:!0,closeClick:!1,nextClick:!1,mouseWheel:!0,autoPlay:!1,playSpeed:3E3,preload:3,modal:!1,loop:!0,ajax:{dataType:"html",headers:{"X-fancyBox":!0}},iframe:{scrolling:"auto",preload:!0},swf:{wmode:"transparent",allowfullscreen:"true",allowscriptaccess:"always"},
-keys:{next:{13:"left",34:"up",39:"left",40:"up"},prev:{8:"right",33:"down",37:"right",38:"down"},close:[27],play:[32],toggle:[70]},direction:{next:"left",prev:"right"},scrollOutside:!0,index:0,type:null,href:null,content:null,title:null,tpl:{wrap:'<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',image:'<img class="fancybox-image" src="{href}" alt="" />',iframe:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen'+
-(I?' allowtransparency="true"':"")+"></iframe>",error:'<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',closeBtn:'<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',next:'<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',prev:'<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0,
-openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1,
-isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=t(a)?f(a).get():[a]),f.each(a,function(e,c){var k={},g,h,j,m,l;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),t(c)?(k={href:c.data("fancybox-href")||c.attr("href"),title:c.data("fancybox-title")||c.attr("title"),isDom:!0,element:c},f.metadata&&f.extend(!0,k,
-c.metadata())):k=c);g=d.href||k.href||(q(c)?c:null);h=d.title!==v?d.title:k.title||"";m=(j=d.content||k.content)?"html":d.type||k.type;!m&&k.isDom&&(m=c.data("fancybox-type"),m||(m=(m=c.prop("class").match(/fancybox\.(\w+)/))?m[1]:null));q(g)&&(m||(b.isImage(g)?m="image":b.isSWF(g)?m="swf":"#"===g.charAt(0)?m="inline":q(c)&&(m="html",j=c)),"ajax"===m&&(l=g.split(/\s+/,2),g=l.shift(),l=l.shift()));j||("inline"===m?g?j=f(q(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):k.isDom&&(j=c):"html"===m?j=g:!m&&(!g&&
-k.isDom)&&(m="inline",j=c));f.extend(k,{href:g,type:m,content:j,title:h,selector:l});a[e]=k}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==v&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1!==b.trigger("onCancel")&&(b.hideLoading(),b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),b.coming=null,b.current||
-b._afterZoomOut(a))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(!b.isOpen||!0===a?(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut()):(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&(b.player.timer=
-setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};if(!0===a||!b.player.isActive&&!1!==a){if(b.current&&(b.current.loop||b.current.index<b.group.length-1))b.player.isActive=!0,p.bind({"onCancel.player beforeClose.player":c,"onUpdate.player":e,"beforeLoad.player":d}),e(),b.trigger("onPlayStart")}else c()},next:function(a){var d=b.current;d&&(q(a)||(a=d.direction.next),b.jumpto(d.index+1,a,"next"))},prev:function(a){var d=b.current;
-d&&(q(a)||(a=d.direction.prev),b.jumpto(d.index-1,a,"prev"))},jumpto:function(a,d,e){var c=b.current;c&&(a=l(a),b.direction=d||c.direction[a>=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==v&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,k;c&&(k=b._getPosition(d),a&&"scroll"===a.type?(delete k.position,c.stop(!0,!0).animate(k,200)):(c.css(k),e.pos=f.extend({},e.dim,k)))},update:function(a){var d=
-a&&a.type,e=!d||"orientationchange"===d;e&&(clearTimeout(B),B=null);b.isOpen&&!B&&(B=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),B=null)},e&&!s?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,s&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"),b.trigger("onUpdate")),
-b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('<div id="fancybox-loading"><div></div></div>').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){if(27===(a.which||a.keyCode))a.preventDefault(),b.cancel()});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}))},getViewport:function(){var a=b.current&&b.current.locked||!1,d={x:n.scrollLeft(),
-y:n.scrollTop()};a?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=s&&r.innerWidth?r.innerWidth:n.width(),d.h=s&&r.innerHeight?r.innerHeight:n.height());return d},unbindEvents:function(){b.wrap&&t(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");n.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(n.bind("orientationchange.fb"+(s?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c=e.which||e.keyCode,k=e.target||e.srcElement;
-if(27===c&&b.coming)return!1;!e.ctrlKey&&(!e.altKey&&!e.shiftKey&&!e.metaKey&&(!k||!k.type&&!f(k).is("[contenteditable]")))&&f.each(d,function(d,k){if(1<a.group.length&&k[c]!==v)return b[d](k[c]),e.preventDefault(),!1;if(-1<f.inArray(c,k))return b[d](),e.preventDefault(),!1})}),f.fn.mousewheel&&a.mouseWheel&&b.wrap.bind("mousewheel.fb",function(d,c,k,g){for(var h=f(d.target||null),j=!1;h.length&&!j&&!h.is(".fancybox-skin")&&!h.is(".fancybox-wrap");)j=h[0]&&!(h[0].style.overflow&&"hidden"===h[0].style.overflow)&&
-(h[0].clientWidth&&h[0].scrollWidth>h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();if(0!==c&&!j&&1<b.group.length&&!a.canShrink){if(0<g||0<k)b.prev(0<g?"down":"left");else if(0>g||0>k)b.next(0>g?"up":"right");d.preventDefault()}}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&&b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,
-{},b.helpers[d].defaults,e),c)});p.trigger(a)}},isImage:function(a){return q(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return q(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=l(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c,c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,
-mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"===c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=
-!0);"iframe"===c&&s&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(s?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,w(d.padding[a]))});b.trigger("onReady");if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");
-"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width=this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=
-this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",s?"auto":a.iframe.scrolling).attr("src",a.href);
-f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);s||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,
-e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,k,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());b.unbindEvents();e=a.content;c=a.type;k=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,
-outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("<div>").html(e).find(a.selector):t(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('<div class="fancybox-placeholder"></div>').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder",!1)}));break;case "image":e=a.tpl.image.replace("{href}",
-g);break;case "swf":e='<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="'+g+'"></param>',h="",f.each(a.swf,function(a,b){e+='<param name="'+a+'" value="'+b+'"></param>';h+=" "+a+'="'+b+'"'}),e+='<embed src="'+g+'" type="application/x-shockwave-flash" width="100%" height="100%"'+h+"></embed></object>"}(!t(e)||!e.parent().is(a.inner))&&a.inner.append(e);b.trigger("beforeShow");a.inner.css("overflow","yes"===k?"scroll":
-"no"===k?"hidden":k);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(b.isOpened){if(d.prevMethod)b.transitions[d.prevMethod]()}else f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,k=b.skin,g=b.inner,h=b.current,c=h.width,j=h.height,m=h.minWidth,u=h.minHeight,n=h.maxWidth,p=h.maxHeight,s=h.scrolling,q=h.scrollOutside?
-h.scrollbarWidth:0,x=h.margin,y=l(x[1]+x[3]),r=l(x[0]+x[2]),v,z,t,C,A,F,B,D,H;e.add(k).add(g).width("auto").height("auto").removeClass("fancybox-tmp");x=l(k.outerWidth(!0)-k.width());v=l(k.outerHeight(!0)-k.height());z=y+x;t=r+v;C=E(c)?(a.w-z)*l(c)/100:c;A=E(j)?(a.h-t)*l(j)/100:j;if("iframe"===h.type){if(H=h.content,h.autoHeight&&1===H.data("ready"))try{H[0].contentWindow.document.location&&(g.width(C).height(9999),F=H.contents().find("body"),q&&F.css("overflow-x","hidden"),A=F.outerHeight(!0))}catch(G){}}else if(h.autoWidth||
-h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(C),h.autoHeight||g.height(A),h.autoWidth&&(C=g.width()),h.autoHeight&&(A=g.height()),g.removeClass("fancybox-tmp");c=l(C);j=l(A);D=C/A;m=l(E(m)?l(m,"w")-z:m);n=l(E(n)?l(n,"w")-z:n);u=l(E(u)?l(u,"h")-t:u);p=l(E(p)?l(p,"h")-t:p);F=n;B=p;h.fitToView&&(n=Math.min(a.w-z,n),p=Math.min(a.h-t,p));z=a.w-y;r=a.h-r;h.aspectRatio?(c>n&&(c=n,j=l(c/D)),j>p&&(j=p,c=l(j*D)),c<m&&(c=m,j=l(c/D)),j<u&&(j=u,c=l(j*D))):(c=Math.max(m,Math.min(c,n)),h.autoHeight&&
-"iframe"!==h.type&&(g.width(c),j=g.height()),j=Math.max(u,Math.min(j,p)));if(h.fitToView)if(g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height(),h.aspectRatio)for(;(a>z||y>r)&&(c>m&&j>u)&&!(19<d++);)j=Math.max(u,Math.min(p,j-10)),c=l(j*D),c<m&&(c=m,j=l(c/D)),c>n&&(c=n,j=l(c/D)),g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height();else c=Math.max(m,Math.min(c,c-(a-z))),j=Math.max(u,Math.min(j,j-(y-r)));q&&("auto"===s&&j<A&&c+x+q<z)&&(c+=q);g.width(c).height(j);e.width(c+x);a=e.width();
-y=e.height();e=(a>z||y>r)&&c>m&&j>u;c=h.aspectRatio?c<F&&j<B&&c<C&&j<A:(c<F||j<B)&&(c<C||j<A);f.extend(h,{dim:{width:w(a),height:w(y)},origWidth:C,origHeight:A,canShrink:e,canExpand:c,wPadding:x,hPadding:v,wrapSpace:y-k.outerHeight(!0),skinSpace:k.height()-j});!H&&(h.autoHeight&&j>u&&j<p&&!c)&&g.height("auto")},_getPosition:function(a){var d=b.current,e=b.getViewport(),c=d.margin,f=b.wrap.width()+c[1]+c[3],g=b.wrap.height()+c[0]+c[2],c={position:"absolute",top:c[0],left:c[3]};d.autoCenter&&d.fixed&&
-!a&&g<=e.h&&f<=e.w?c.position="fixed":d.locked||(c.top+=e.y,c.left+=e.x);c.top=w(Math.max(c.top,c.top+(e.h-g)*d.topRatio));c.left=w(Math.max(c.left,c.left+(e.w-f)*d.leftRatio));return c},_afterZoomIn:function(){var a=b.current;a&&(b.isOpen=b.isOpened=!0,b.wrap.css("overflow","visible").addClass("fancybox-opened"),b.update(),(a.closeClick||a.nextClick&&1<b.group.length)&&b.inner.css("cursor","pointer").bind("click.fb",function(d){!f(d.target).is("a")&&!f(d.target).parent().is("a")&&(d.preventDefault(),
-b[a.closeClick?"close":"next"]())}),a.closeBtn&&f(a.tpl.closeBtn).appendTo(b.skin).bind("click.fb",function(a){a.preventDefault();b.close()}),a.arrows&&1<b.group.length&&((a.loop||0<a.index)&&f(a.tpl.prev).appendTo(b.outer).bind("click.fb",b.prev),(a.loop||a.index<b.group.length-1)&&f(a.tpl.next).appendTo(b.outer).bind("click.fb",b.next)),b.trigger("afterShow"),!a.loop&&a.index===a.group.length-1?b.play(!1):b.opts.autoPlay&&!b.player.isActive&&(b.opts.autoPlay=!1,b.play()))},_afterZoomOut:function(a){a=
-a||b.current;f(".fancybox-wrap").trigger("onReset").remove();f.extend(b,{group:{},opts:{},router:!1,current:null,isActive:!1,isOpened:!1,isOpen:!1,isClosing:!1,wrap:null,skin:null,outer:null,inner:null});b.trigger("afterClose",a)}});b.transitions={getOrigPosition:function(){var a=b.current,d=a.element,e=a.orig,c={},f=50,g=50,h=a.hPadding,j=a.wPadding,m=b.getViewport();!e&&(a.isDom&&d.is(":visible"))&&(e=d.find("img:first"),e.length||(e=d));t(e)?(c=e.offset(),e.is("img")&&(f=e.outerWidth(),g=e.outerHeight())):
-(c.top=m.y+(m.h-g)*a.topRatio,c.left=m.x+(m.w-f)*a.leftRatio);if("fixed"===b.wrap.css("position")||a.locked)c.top-=m.y,c.left-=m.x;return c={top:w(c.top-h*a.topRatio),left:w(c.left-j*a.leftRatio),width:w(f+j),height:w(g+h)}},step:function(a,d){var e,c,f=d.prop;c=b.current;var g=c.wrapSpace,h=c.skinSpace;if("width"===f||"height"===f)e=d.end===d.start?1:(a-d.start)/(d.end-d.start),b.isClosing&&(e=1-e),c="width"===f?c.wPadding:c.hPadding,c=a-c,b.skin[f](l("width"===f?c:c-g*e)),b.inner[f](l("width"===
-f?c:c-g*e-h*e))},zoomIn:function(){var a=b.current,d=a.pos,e=a.openEffect,c="elastic"===e,k=f.extend({opacity:1},d);delete k.position;c?(d=this.getOrigPosition(),a.openOpacity&&(d.opacity=0.1)):"fade"===e&&(d.opacity=0.1);b.wrap.css(d).animate(k,{duration:"none"===e?0:a.openSpeed,easing:a.openEasing,step:c?this.step:null,complete:b._afterZoomIn})},zoomOut:function(){var a=b.current,d=a.closeEffect,e="elastic"===d,c={opacity:0.1};e&&(c=this.getOrigPosition(),a.closeOpacity&&(c.opacity=0.1));b.wrap.animate(c,
-{duration:"none"===d?0:a.closeSpeed,easing:a.closeEasing,step:e?this.step:null,complete:b._afterZoomOut})},changeIn:function(){var a=b.current,d=a.nextEffect,e=a.pos,c={opacity:1},f=b.direction,g;e.opacity=0.1;"elastic"===d&&(g="down"===f||"up"===f?"top":"left","down"===f||"right"===f?(e[g]=w(l(e[g])-200),c[g]="+=200px"):(e[g]=w(l(e[g])+200),c[g]="-=200px"));"none"===d?b._afterZoomIn():b.wrap.css(e).animate(c,{duration:a.nextSpeed,easing:a.nextEasing,complete:b._afterZoomIn})},changeOut:function(){var a=
-b.previous,d=a.prevEffect,e={opacity:0.1},c=b.direction;"elastic"===d&&(e["down"===c||"up"===c?"top":"left"]=("up"===c||"left"===c?"-":"+")+"=200px");a.wrap.animate(e,{duration:"none"===d?0:a.prevSpeed,easing:a.prevEasing,complete:function(){f(this).trigger("onReset").remove()}})}};b.helpers.overlay={defaults:{closeClick:!0,speedOut:200,showEarly:!0,css:{},locked:!s,fixed:!0},overlay:null,fixed:!1,el:f("html"),create:function(a){a=f.extend({},this.defaults,a);this.overlay&&this.close();this.overlay=
-f('<div class="fancybox-overlay"></div>').appendTo(b.coming?b.coming.parent:a.parent);this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(n.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?
-b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){var a,b;n.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),a=n.scrollTop(),b=n.scrollLeft(),this.el.removeClass("fancybox-lock"),n.scrollTop(a).scrollLeft(b));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%");I?(b=Math.max(G.documentElement.offsetWidth,G.body.offsetWidth),
-p.width()>b&&(a=p.width())):p.width()>n.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&(this.fixed&&b.fixed)&&(e||(this.margin=p.height()>n.height()?f("html").css("margin-right").replace("px",""):!1),b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){var e,c;b.locked&&(!1!==this.margin&&(f("*").filter(function(){return"fixed"===
-f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin")),e=n.scrollTop(),c=n.scrollLeft(),this.el.addClass("fancybox-lock"),n.scrollTop(e).scrollLeft(c));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",position:"bottom"},beforeShow:function(a){var d=
-b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(q(e)&&""!==f.trim(e)){d=f('<div class="fancybox-title fancybox-title-'+c+'-wrap">'+e+"</div>");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),I&&d.width(d.width()),d.wrapInner('<span class="child"></span>'),b.current.margin[2]+=Math.abs(l(d.css("margin-bottom")))}d["top"===a.position?"prependTo":"appendTo"](c)}}};f.fn.fancybox=function(a){var d,
-e=f(this),c=this.selector||"",k=function(g){var h=f(this).blur(),j=d,k,l;!g.ctrlKey&&(!g.altKey&&!g.shiftKey&&!g.metaKey)&&!h.is(".fancybox-wrap")&&(k=a.groupAttr||"data-fancybox-group",l=h.attr(k),l||(k="rel",l=h.get(0)[k]),l&&(""!==l&&"nofollow"!==l)&&(h=c.length?f(c):e,h=h.filter("["+k+'="'+l+'"]'),j=h.index(this)),a.index=j,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;!c||!1===a.live?e.unbind("click.fb-start").bind("click.fb-start",k):p.undelegate(c,"click.fb-start").delegate(c+
-":not('.fancybox-item, .fancybox-nav')","click.fb-start",k);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===v&&(f.scrollbarWidth=function(){var a=f('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});if(f.support.fixedPosition===v){a=f.support;d=f('<div style="position:fixed;top:20px;"></div>').appendTo("body");var e=20===
-d[0].offsetTop||15===d[0].offsetTop;d.remove();a.fixedPosition=e}f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(r).width();J.addClass("fancybox-lock-test");d=f(r).width();J.removeClass("fancybox-lock-test");f("<style type='text/css'>.fancybox-margin{margin-right:"+(d-a)+"px;}</style>").appendTo("head")})})(window,document,jQuery);

File diff ditekan karena terlalu besar
+ 0 - 10
frontend/saas-portal-web/static/js/jquery.form.min.js


+ 0 - 676
frontend/saas-portal-web/static/js/jquery.slitslider.js

@@ -1,676 +0,0 @@
-/**
- * jquery.slitslider.js v1.1.0
- * http://www.codrops.com
- *
- * Licensed under the MIT license.
- * http://www.opensource.org/licenses/mit-license.php
- * 
- * Copyright 2012, Codrops
- * http://www.codrops.com
- */
-
-;( function( $, window, undefined ) {
-	
-	'use strict';
-
-	/*
-	* debouncedresize: special jQuery event that happens once after a window resize
-	*
-	* latest version and complete README available on Github:
-	* https://github.com/louisremi/jquery-smartresize/blob/master/jquery.debouncedresize.js
-	*
-	* Copyright 2011 @louis_remi
-	* Licensed under the MIT license.
-	*/
-	var $event = $.event,
-	$special,
-	resizeTimeout;
-
-	$special = $event.special.debouncedresize = {
-		setup: function() {
-			$( this ).on( "resize", $special.handler );
-		},
-		teardown: function() {
-			$( this ).off( "resize", $special.handler );
-		},
-		handler: function( event, execAsap ) {
-			// Save the context
-			var context = this,
-				args = arguments,
-				dispatch = function() {
-					// set correct event type
-					event.type = "debouncedresize";
-					$event.dispatch.apply( context, args );
-				};
-
-			if ( resizeTimeout ) {
-				clearTimeout( resizeTimeout );
-			}
-
-			execAsap ?
-				dispatch() :
-				resizeTimeout = setTimeout( dispatch, $special.threshold );
-		},
-		threshold: 20
-	};
-
-	// global
-	var $window = $( window ),
-		$document = $( document ),
-		Modernizr = window.Modernizr;
-
-	$.Slitslider = function( options, element ) {
-		
-		this.$elWrapper = $( element );
-		this._init( options );
-		
-	};
-
-	$.Slitslider.defaults = {
-		// transitions speed
-		speed : 800,
-		// if true the item's slices will also animate the opacity value
-		optOpacity : false,
-		// amount (%) to translate both slices - adjust as necessary
-		translateFactor : 230,
-		// maximum possible angle
-		maxAngle : 25,
-		// maximum possible scale
-		maxScale : 2,
-		// slideshow on / off
-		autoplay : false,
-		// keyboard navigation
-		keyboard : true,
-		// time between transitions
-		interval : 4000,
-		// callbacks
-		onBeforeChange : function( slide, idx ) { return false; },
-		onAfterChange : function( slide, idx ) { return false; }
-	};
-
-	$.Slitslider.prototype = {
-
-		_init : function( options ) {
-			
-			// options
-			this.options = $.extend( true, {}, $.Slitslider.defaults, options );
-
-			// https://github.com/twitter/bootstrap/issues/2870
-			this.transEndEventNames = {
-				'WebkitTransition' : 'webkitTransitionEnd',
-				'MozTransition' : 'transitionend',
-				'OTransition' : 'oTransitionEnd',
-				'msTransition' : 'MSTransitionEnd',
-				'transition' : 'transitionend'
-			};
-			this.transEndEventName = this.transEndEventNames[ Modernizr.prefixed( 'transition' ) ];
-			// suport for css 3d transforms and css transitions
-			this.support = Modernizr.csstransitions && Modernizr.csstransforms3d;
-			// the slider
-			this.$el = this.$elWrapper.children( '.sl-slider' );
-			// the slides
-			this.$slides = this.$el.children( '.sl-slide' ).hide();
-			// total slides
-			this.slidesCount = this.$slides.length;
-			// current slide
-			this.current = 0;
-			// control if it's animating
-			this.isAnimating = false;
-			// get container size
-			this._getSize();
-			// layout
-			this._layout();
-			// load some events
-			this._loadEvents();
-			// slideshow
-			if( this.options.autoplay ) {
-			
-				this._startSlideshow();
-			
-			}
-
-		},
-		// gets the current container width & height
-		_getSize : function() {
-
-			this.size = {
-				width : this.$elWrapper.outerWidth( true ),
-				height : this.$elWrapper.outerHeight( true )
-			};
-
-		},
-		_layout : function() {
-			
-			this.$slideWrapper = $( '<div class="sl-slides-wrapper" />' );
-			
-			// wrap the slides
-			this.$slides.wrapAll( this.$slideWrapper ).each( function( i ) {
-				
-				var $slide = $( this ),
-					// vertical || horizontal
-					orientation = $slide.data( 'orientation' );
-					
-				$slide.addClass( 'sl-slide-' + orientation )
-					  .children()
-					  .wrapAll( '<div class="sl-content-wrapper" />' )
-					  .wrapAll( '<div class="sl-content" />' );
-			
-			} );
-			
-			// set the right size of the slider/slides for the current window size
-			this._setSize();
-			// show first slide
-			this.$slides.eq( this.current ).show();
-			
-		},
-		_navigate : function( dir, pos ) {
-			
-			if( this.isAnimating || this.slidesCount < 2 ) {
-			
-				return false;
-			
-			}
-
-			this.isAnimating = true;
-
-			var self = this,
-				$currentSlide = this.$slides.eq( this.current );
-
-			// if position is passed
-			if( pos !== undefined ) {
-
-				this.current = pos;
-
-			}
-			// if not check the boundaries
-			else if( dir === 'next' ) {
-
-				this.current = this.current < this.slidesCount - 1 ? ++this.current : 0;
-
-			}
-			else if( dir === 'prev' ) {
-
-				this.current = this.current > 0 ? --this.current : this.slidesCount - 1;
-
-			}
-
-			this.options.onBeforeChange( $currentSlide, this.current );
-			
-			// next slide to be shown
-			var $nextSlide = this.$slides.eq( this.current ),
-				// the slide we want to cut and animate
-				$movingSlide = ( dir === 'next' ) ? $currentSlide : $nextSlide,
-				
-				// the following are the data attrs set for each slide
-				configData = $movingSlide.data(),
-				config = {};
-			
-			config.orientation = configData.orientation || 'horizontal',
-			config.slice1angle = configData.slice1Rotation || 0,
-			config.slice1scale = configData.slice1Scale || 1,
-			config.slice2angle = configData.slice2Rotation || 0,
-			config.slice2scale = configData.slice2Scale || 1;
-				
-			this._validateValues( config );
-			
-			var cssStyle = config.orientation === 'horizontal' ? {
-					marginTop : -this.size.height / 2
-				} : {
-					marginLeft : -this.size.width / 2
-				},
-				// default slide's slices style
-				resetStyle = {
-					'transform' : 'translate(0%,0%) rotate(0deg) scale(1)',
-					opacity : 1 
-				},
-				// slice1 style
-				slice1Style	= config.orientation === 'horizontal' ? {
-					'transform' : 'translateY(-' + this.options.translateFactor + '%) rotate(' + config.slice1angle + 'deg) scale(' + config.slice1scale + ')'
-				} : {
-					'transform' : 'translateX(-' + this.options.translateFactor + '%) rotate(' + config.slice1angle + 'deg) scale(' + config.slice1scale + ')'
-				},
-				// slice2 style
-				slice2Style	= config.orientation === 'horizontal' ? {
-					'transform' : 'translateY(' + this.options.translateFactor + '%) rotate(' + config.slice2angle + 'deg) scale(' + config.slice2scale + ')'
-				} : {
-					'transform' : 'translateX(' + this.options.translateFactor + '%) rotate(' + config.slice2angle + 'deg) scale(' + config.slice2scale + ')'
-				};
-			
-			if( this.options.optOpacity ) {
-			
-				slice1Style.opacity = 0;
-				slice2Style.opacity = 0;
-			
-			}
-			
-			// we are adding the classes sl-trans-elems and sl-trans-back-elems to the slide that is either coming "next"
-			// or going "prev" according to the direction.
-			// the idea is to make it more interesting by giving some animations to the respective slide's elements
-			//( dir === 'next' ) ? $nextSlide.addClass( 'sl-trans-elems' ) : $currentSlide.addClass( 'sl-trans-back-elems' );
-			
-			$currentSlide.removeClass( 'sl-trans-elems' );
-
-			var transitionProp = {
-				'transition' : 'all ' + this.options.speed + 'ms ease-in-out'
-			};
-
-			// add the 2 slices and animate them
-			$movingSlide.css( 'z-index', this.slidesCount )
-						.find( 'div.sl-content-wrapper' )
-						.wrap( $( '<div class="sl-content-slice" />' ).css( transitionProp ) )
-						.parent()
-						.cond(
-							dir === 'prev', 
-							function() {
-							
-								var slice = this;
-								this.css( slice1Style );
-								setTimeout( function() {
-									
-									slice.css( resetStyle );
-
-								}, 50 );
-										 
-							}, 
-							function() {
-								
-								var slice = this;
-								setTimeout( function() {
-									
-									slice.css( slice1Style );
-
-								}, 50 );
-						
-							}
-						)
-						.clone()
-						.appendTo( $movingSlide )
-						.cond(
-							dir === 'prev', 
-							function() {
-								
-								var slice = this;
-								this.css( slice2Style );
-								setTimeout( function() {
-
-									$currentSlide.addClass( 'sl-trans-back-elems' );
-
-									if( self.support ) {
-
-										slice.css( resetStyle ).on( self.transEndEventName, function() {
-
-											self._onEndNavigate( slice, $currentSlide, dir );
-
-										} );
-
-									}
-									else {
-
-										self._onEndNavigate( slice, $currentSlide, dir );
-
-									}
-
-								}, 50 );
-						
-							},
-							function() {
-								
-								var slice = this;
-								setTimeout( function() {
-
-									$nextSlide.addClass( 'sl-trans-elems' );
-									
-									if( self.support ) {
-
-										slice.css( slice2Style ).on( self.transEndEventName, function() {
-
-											self._onEndNavigate( slice, $currentSlide, dir );
-
-										} );
-
-									}
-									else {
-
-										self._onEndNavigate( slice, $currentSlide, dir );
-
-									}
-
-								}, 50 );
-								
-							}
-						)
-						.find( 'div.sl-content-wrapper' )
-						.css( cssStyle );
-			
-			$nextSlide.show();
-			
-		},
-		_validateValues : function( config ) {
-			
-			// OK, so we are restricting the angles and scale values here.
-			// This is to avoid the slices wrong sides to be shown.
-			// you can adjust these values as you wish but make sure you also ajust the
-			// paddings of the slides and also the options.translateFactor value and scale data attrs
-			if( config.slice1angle > this.options.maxAngle || config.slice1angle < -this.options.maxAngle ) {
-				
-				config.slice1angle = this.options.maxAngle;
-			
-			}
-			if( config.slice2angle > this.options.maxAngle  || config.slice2angle < -this.options.maxAngle ) {
-				
-				config.slice2angle = this.options.maxAngle;
-			
-			}
-			if( config.slice1scale > this.options.maxScale || config.slice1scale <= 0 ) {
-			
-				config.slice1scale = this.options.maxScale;
-			
-			}
-			if( config.slice2scale > this.options.maxScale || config.slice2scale <= 0 ) {
-				
-				config.slice2scale = this.options.maxScale;
-			
-			}
-			if( config.orientation !== 'vertical' && config.orientation !== 'horizontal' ) {
-			
-				config.orientation = 'horizontal'
-			
-			}
-			
-		},
-		_onEndNavigate : function( $slice, $oldSlide, dir ) {
-			
-			// reset previous slide's style after next slide is shown
-			var $slide = $slice.parent(),
-				removeClasses = 'sl-trans-elems sl-trans-back-elems';
-			
-			// remove second slide's slice
-			$slice.remove();
-			// unwrap..
-			$slide.css( 'z-index', 1 )
-				  .find( 'div.sl-content-wrapper' )
-				  .unwrap();
-			
-			// hide previous current slide
-			$oldSlide.hide().removeClass( removeClasses );
-			$slide.removeClass( removeClasses );
-			// now we can navigate again..
-			this.isAnimating = false;
-			this.options.onAfterChange( $slide, this.current );
-			
-		},
-		_setSize : function() {
-		
-			// the slider and content wrappers will have the window's width and height
-			var cssStyle = {
-				width : this.size.width,
-				height : this.size.height
-			};
-			
-			this.$el.css( cssStyle ).find( 'div.sl-content-wrapper' ).css( cssStyle );
-		
-		},
-		_loadEvents : function() {
-			
-			var self = this;
-			
-			$window.on( 'debouncedresize.slitslider', function( event ) {
-				
-				// update size values
-				self._getSize();
-				// set the sizes again
-				self._setSize();
-				
-			} );
-
-			if ( this.options.keyboard ) {
-				
-				$document.on( 'keydown.slitslider', function(e) {
-
-					var keyCode = e.keyCode || e.which,
-						arrow = {
-							left: 37,
-							up: 38,
-							right: 39,
-							down: 40
-						};
-
-					switch (keyCode) {
-						
-						case arrow.left :
-
-							self._stopSlideshow();
-							self._navigate( 'prev' );
-							break;
-						
-						case arrow.right :
-							
-							self._stopSlideshow();
-							self._navigate( 'next' );
-							break;
-
-					}
-
-				} );
-
-			}
-		
-		},
-		_startSlideshow: function() {
-
-			var self = this;
-
-			this.slideshow = setTimeout( function() {
-
-				self._navigate( 'next' );
-
-				if ( self.options.autoplay ) {
-
-					self._startSlideshow();
-
-				}
-
-			}, this.options.interval );
-
-		},
-		_stopSlideshow: function() {
-
-			if ( this.options.autoplay ) {
-
-				clearTimeout( this.slideshow );
-				this.isPlaying = false;
-				this.options.autoplay = false;
-
-			}
-
-		},
-		_destroy : function( callback ) {
-			
-			this.$el.off( '.slitslider' ).removeData( 'slitslider' );
-			$window.off( '.slitslider' );
-			$document.off( '.slitslider' );
-			this.$slides.each( function( i ) {
-
-				var $slide = $( this ),
-					$content = $slide.find( 'div.sl-content' ).children();
-
-				$content.appendTo( $slide );
-				$slide.children( 'div.sl-content-wrapper' ).remove();
-
-			} );
-			this.$slides.unwrap( this.$slideWrapper ).hide();
-			this.$slides.eq( 0 ).show();
-			if( callback ) {
-
-				callback.call();
-
-			}
-
-		},
-		// public methos: adds more slides to the slider
-		add : function( $slides, callback ) {
-
-			this.$slides = this.$slides.add( $slides );
-
-			var self = this;
-			
-			
-			$slides.each( function( i ) {
-
-				var $slide = $( this ),
-					// vertical || horizontal
-					orientation = $slide.data( 'orientation' );
-
-				$slide.hide().addClass( 'sl-slide-' + orientation )
-					  .children()
-					  .wrapAll( '<div class="sl-content-wrapper" />' )
-					  .wrapAll( '<div class="sl-content" />' )
-					  .end()
-					  .appendTo( self.$el.find( 'div.sl-slides-wrapper' ) );
-
-			} );
-
-			this._setSize();
-
-			this.slidesCount = this.$slides.length;
-			
-			if ( callback ) {
-
-				callback.call( $items );
-
-			}
-
-		},
-		// public method: shows next slide
-		next : function() {
-
-			this._stopSlideshow();
-			this._navigate( 'next' );
-
-		},
-		// public method: shows previous slide
-		previous : function() {
-
-			this._stopSlideshow();
-			this._navigate( 'prev' );
-
-		},
-		// public method: goes to a specific slide
-		jump : function( pos ) {
-
-			pos -= 1;
-
-			if( pos === this.current || pos >= this.slidesCount || pos < 0 ) {
-
-				return false;
-
-			}
-
-			this._stopSlideshow();
-			this._navigate( pos > this.current ? 'next' : 'prev', pos );
-
-		},
-		// public method: starts the slideshow
-		// any call to next(), previous() or jump() will stop the slideshow
-		play : function() {
-
-			if( !this.isPlaying ) {
-
-				this.isPlaying = true;
-
-				this._navigate( 'next' );
-				this.options.autoplay = true;
-				this._startSlideshow();
-
-			}
-
-		},
-		// public method: pauses the slideshow
-		pause : function() {
-
-			if( this.isPlaying ) {
-
-				this._stopSlideshow();
-
-			}
-
-		},
-		// public method: check if isAnimating is true
-		isActive : function() {
-
-			return this.isAnimating;
-
-		},
-		// publicc methos: destroys the slicebox instance
-		destroy : function( callback ) {
-
-			this._destroy( callback );
-		
-		}
-
-	};
-	
-	var logError = function( message ) {
-
-		if ( window.console ) {
-
-			window.console.error( message );
-		
-		}
-
-	};
-	
-	$.fn.slitslider = function( options ) {
-
-		var self = $.data( this, 'slitslider' );
-		
-		if ( typeof options === 'string' ) {
-			
-			var args = Array.prototype.slice.call( arguments, 1 );
-			
-			this.each(function() {
-			
-				if ( !self ) {
-
-					logError( "cannot call methods on slitslider prior to initialization; " +
-					"attempted to call method '" + options + "'" );
-					return;
-				
-				}
-				
-				if ( !$.isFunction( self[options] ) || options.charAt(0) === "_" ) {
-
-					logError( "no such method '" + options + "' for slitslider self" );
-					return;
-				
-				}
-				
-				self[ options ].apply( self, args );
-			
-			});
-		
-		} 
-		else {
-		
-			this.each(function() {
-				
-				if ( self ) {
-
-					self._init();
-				
-				}
-				else {
-
-					self = $.data( this, 'slitslider', new $.Slitslider( options, this ) );
-				
-				}
-
-			});
-		
-		}
-		
-		return self;
-		
-	};
-	
-} )( jQuery, window );

File diff ditekan karena terlalu besar
+ 0 - 1
frontend/saas-portal-web/static/js/jquery.validate.min.js


+ 6 - 107
frontend/saas-portal-web/static/js/mains.js

@@ -8,55 +8,9 @@ jQuery(window).load(function(){
 
 });
 
-/* ========================================================================= */
-/*  Welcome Section Slider
-/* ========================================================================= */
-
-$(function() {
-    var Page = (function() {
-        var $navArrows = $( '#nav-arrows' ),
-            $nav = $( '#nav-dots > span' ),
-            slitslider = $( '#slider' ).slitslider( {
-                onBeforeChange : function( slide, pos ) {
-                    $nav.removeClass( 'nav-dot-current' );
-                    $nav.eq( pos ).addClass( 'nav-dot-current' );
-                }
-            } ),
-            init = function() {
-                initEvents();
-            },
-            initEvents = function() {
-                // add navigation events
-                $navArrows.children( ':last' ).on( 'click', function() {
-                    slitslider.next();
-                    return false;
-                } );
-                $navArrows.children( ':first' ).on( 'click', function() {
-                    slitslider.previous();
-                    return false;
-                } );
-                $nav.each( function( i ) {
-                    $( this ).on( 'click', function( event ) {
-                        var $dot = $( this );
-                        if( !slitslider.isActive() ) {
-                            $nav.removeClass( 'nav-dot-current' );
-                            $dot.addClass( 'nav-dot-current' );
-                        }
-                        slitslider.jump( i + 1 );
-                        return false;
-                    } );
-                } );
-            };
-            return { init : init };
-    })();
-    Page.init();
-});
-
 
 $(document).ready(function(){
-    /* ========================================================================= */
-    /*  Portfolio
-    /* ========================================================================= */
+// 分类过滤排序插件
     var $projectWrapper = $('.project-wrapper');
     $projectWrapper.isotope({
         filter: '*',
@@ -83,10 +37,8 @@ $(document).ready(function(){
          return false;
     });
 
-	/* ========================================================================= */
-	/*	Menu item highlighting
-	/* ========================================================================= */
 
+// 单页首页翻页特效
 	// $('#nav').singlePageNav({
 	// 	offset: $('#nav').outerHeight(),
 	// 	filter: ':not(.external)',
@@ -101,7 +53,7 @@ $(document).ready(function(){
 	// 		console.log('滚动结束');
 	// 	}
 	// });
-
+// 顶部导航高度变化
     $(window).scroll(function () {
         if ($(window).scrollTop() > 10) {
             $(".navbar-brand a").css("color","#fff");
@@ -117,66 +69,13 @@ $(document).ready(function(){
 	/*	Fix Slider Height
 	/* ========================================================================= */
 
-    // Slider Height
+// 首页图片随屏幕高度变化
     var slideHeight = $(window).height();
     let W = $(window).width();
-    $('#home-slider, #slider, .sl-slider, .sl-content-wrapper').css('height',slideHeight);
+    // $('.sl-slider, .sl-content-wrapper').css('height',slideHeight);
     $(window).resize(function(){
-        $('#home-slider, #slider, .sl-slider, .sl-content-wrapper').css('height',slideHeight);
-        // $(".slider-1 img").css("height",slideHeight)
+        // $('.sl-slider, .sl-content-wrapper').css('height',slideHeight);
         $("bg-img").css('width',W)
     });
-	
-	$("#works, #testimonial").owlCarousel({	 
-		navigation : true,
-		pagination : false,
-		slideSpeed : 700,
-		paginationSpeed : 400,
-		singleItem:true,
-		navigationText: ["<i class='fa fa-angle-left fa-lg'></i>","<i class='fa fa-angle-right fa-lg'></i>"]
-	});
-
-
-	/* ========================================================================= */
-	/*	Featured Project Lightbox
-	/* ========================================================================= */
-
-	$(".fancybox").fancybox({
-		padding: 0,
-
-		openEffect : 'elastic',
-		openSpeed  : 650,
-
-		closeEffect : 'elastic',
-		closeSpeed  : 550,
-
-		closeClick : true,
-
-		beforeShow: function () {
-			this.title = $(this.element).attr('title');
-			this.title = '<h3>' + this.title + '</h3>' + '<p>' + $(this.element).parents('.portfolio-item').find('img').attr('alt') + '</p>';
-		},
-
-		helpers : {
-			title : {
-				type: 'inside'
-			},
-			overlay : {
-				css : {
-					'background' : 'rgba(0,0,0,0.8)'
-				}
-			}
-		}
-	});
 
 });
-
-
-// ========== END GOOGLE MAP ========== //
-
-var wow = new WOW ({
-	offset:       75,          // distance to the element when triggering the animation (default is 0)
-	mobile:       false,       // trigger animations on mobile devices (default is true)
-});
-wow.init();
-

File diff ditekan karena terlalu besar
+ 0 - 3
frontend/saas-portal-web/static/js/modernizr-2.6.2.min.js


File diff ditekan karena terlalu besar
+ 0 - 9
frontend/saas-portal-web/static/js/owl.carousel.min.js


File diff ditekan karena terlalu besar
+ 0 - 1
frontend/saas-portal-web/static/js/wow.min.js


+ 35 - 50
frontend/saas-web/app.json

@@ -275,6 +275,39 @@
         "cacheParam": "_dc"
     },
 
+    "builds": {
+        "dev": {
+            "server": {
+                "accountCenter":"http://192.168.0.181:8000",
+                "accountEnterprise":"http://192.168.0.181:8000/#/enterprise",
+                "basePath": {
+                    "https": "https://saas-api-dev.usoftchina.com:5443",
+                    "http": "http://192.168.0.181:8560"
+                },
+                "urlPattern": "^\/api\/"
+            }
+        },
+        "test": {
+            "server": {
+                "accountCenter": "https://saas-test.usoftchina.com:5443",
+                "accountEnterprise": "https://saas-test.usoftchina.com:5443/#/enterprise",
+                "basePath": {
+                    "https": "https://saas-api-test.usoftchina.com:5443",
+                    "http": "http://192.168.0.181:8575"
+                },
+                "urlPattern": "^\/api\/"
+            }
+        },
+        "prod": {
+            "server": {
+                "accountCenter":"https://saas.usoftchina.com",
+                "accountEnterprise":"https://saas.usoftchina.com/#/enterprise",
+                "basePath": "https://saas-api.usoftchina.com",
+                "urlPattern": "^\/api\/"
+            }
+        }
+    },
+
     /**
      * Settings specific to production builds.
      */
@@ -293,12 +326,6 @@
         },
         "compressor": {
             "type": "yui"
-        },
-        "server": {
-            "accountCenter":"https://saas.usoftchina.com",
-            "accountEnterprise":"https://saas.usoftchina.com/#/enterprise",
-            "basePath": "https://saas-api.usoftchina.com",
-            "urlPattern": "^\/api\/"
         }
     },
 
@@ -306,39 +333,6 @@
      * Settings specific to testing builds.
      */
     "testing": {
-        "output": {
-            "appCache": {
-                "enable": true,
-                "path": "cache.appcache"
-            }
-        },
-        "loader": {
-            "cache": "${build.timestamp}"
-        },
-        "cache": {
-            "enable": true
-        },
-        "compressor": {
-            "type": "yui"
-        },
-        "server": {
-            /** 暂时更改
-            "accountCenter": "https://saas-test.usoftchina.com:5443",
-            "accountEnterprise": "https://saas-test.usoftchina.com:5443/#/enterprise",
-            "basePath": {
-                "https": "https://saas-api-test.usoftchina.com:5443",
-                "http": "http://192.168.0.181:8575"
-            },
-            "urlPattern": "^\/api\/"
-            **/
-            "accountCenter":"http://192.168.0.181:8000",
-            "accountEnterprise":"http://192.168.0.181:8000/#/enterprise",
-            "basePath": {
-                "https": "https://saas-api-dev.usoftchina.com:5443",
-                "http": "http://192.168.0.181:8560"
-            },
-            "urlPattern": "^\/api\/"
-        }
     },
 
     /**
@@ -347,15 +341,6 @@
     "development": {
         "watch": {
             "delay": 250
-        },
-        "server": {
-            "accountCenter":"http://192.168.0.181:8000",
-            "accountEnterprise":"http://192.168.0.181:8000/#/enterprise",
-            "basePath": {
-                "https": "https://saas-api-dev.usoftchina.com:5443",
-                "http": "http://192.168.0.181:8560"
-            },
-            "urlPattern": "^\/api\/"
         }
     },
 
@@ -410,7 +395,7 @@
      *          "css": "${app.output.resources}/${app.name}-all.css",
      *          "js": {
      *              "path": "app.js",
-     *              // This setting constrols the output language level.  Set to 'ES6' to 
+     *              // This setting constrols the output language level.  Set to 'ES6' to
      *              // disable the transpiler
      *              "version": "ES5"
      *          },
@@ -551,4 +536,4 @@
      * Normally you should never change this value.
      */
     "id": "a20e1670-7932-41f6-8e9c-55b77cba3f26"
-}
+}

+ 5 - 0
frontend/saas-web/app/view/core/base/ImportWindow.js

@@ -235,14 +235,19 @@ Ext.define('saas.view.core.base.ImportWindow', {
                                             saas.util.BaseUtil.showSuccessToast('上传成功');
                                             form.importId = id;
                                         }else{
+                                            field.setValue('');
                                             saas.util.BaseUtil.showErrorToast('上传失败:后台未返回信息');
                                         }
                                     }else{
+                                        field.setValue('');
+                                        field.setRawValue('');
+                                        field.value = '';
                                         saas.util.BaseUtil.showErrorToast('上传失败: ' + res.message);
                                     }
                                 },
                                 failure: function (response, opts) {
                                     form.setLoading(false);
+                                    field.setValue('');
                                     var res = Ext.decode(response.responseText);
                                     saas.util.BaseUtil.showErrorToast('上传失败: ' + res.message);
                                 }

+ 1 - 1
frontend/saas-web/app/view/core/dbfind/types/BankInfoDbfindTrigger.js

@@ -6,7 +6,7 @@ Ext.define('saas.view.core.dbfind.types.BankInfoDbfindTrigger', {
     xtype: 'bandinfoDbfindTrigger',
 
     dataUrl: '/api/document/bankinformation/list',
-    addXtype: 'other-bankinformation',
+    addXtype: 'document-bankinformation-datalist',
     addTitle: '资金账户',
     dbtpls: [{
         field: 'bk_bankcode',

+ 1 - 1
frontend/saas-web/app/view/core/dbfind/types/EmployeeDbfindTrigger.js

@@ -7,7 +7,7 @@ Ext.define('saas.view.core.dbfind.types.EmployeeDbfindTrigger', {
 
     //数据接口
     dataUrl:'/api/document/employee/list',
-    addXtype: 'other-employee',
+    addXtype: 'document-employee-datalist',
     addTitle: '人员资料',
     //联想设置
     dbtpls:[{

+ 2 - 64
frontend/saas-web/app/view/core/dbfind/types/WarehouseDbfindTrigger.js

@@ -7,7 +7,7 @@ Ext.define('saas.view.core.dbfind.types.WarehouseDbfindTrigger', {
 
     dataUrl: '/api/document/warehouse/list',
     // dataUrl:'http://localhost:9480/warehouse/list',
-    addXtype: 'other-warehouse',
+    addXtype: 'document-warehouse-datalist',
     addTitle: '仓库资料',
     defaultCondition: "wh_statuscode='ENABLE'",
     dbtpls: [{
@@ -51,72 +51,10 @@ Ext.define('saas.view.core.dbfind.types.WarehouseDbfindTrigger', {
         var tab = saas.util.BaseUtil.getCurrentTab();
         // this.isEdit = !!record;
         this.dialog = tab.add({
-            autoScroll:true,
-            xtype: 'document-kind-childwin',
+            xtype: 'document-warehouse-window',
             bind: {
                 title: '新增仓库资料'
             },
-            dataKind: 'warehouse',
-            belong: {
-                columns: [{
-                    text: '编号',
-                    dataIndex: 'wh_code',
-                    width: 150
-                },{
-                    text: '仓库名称',
-                    dataIndex: 'wh_description',
-                    width: 200
-                },{
-                    text: '类型',
-                    dataIndex: 'wh_type',
-                    width: 110
-                },{  
-                    text: '仓库状态码',
-                    dataIndex: 'wh_status',
-                    hidden:true,
-                },{
-                    text: '仓库状态',
-                    dataIndex: 'wh_statuscode',
-                    width:90,
-                    xtype: 'actioncolumn',
-                    align : 'center',
-                    items: [{
-                        iconCls:'',
-                        getClass: function(v, meta, rec) {
-                            if(rec.get('wh_statuscode')=='ENABLE'){
-                                return 'x-grid-checkcolumn-checked-btn';
-                            }else{
-                                return 'x-grid-checkcolumn-btn';
-                            }
-                        },
-                        handler: function(view, rowIndex, colIndex) {
-                            var rec = view.getStore().getAt(rowIndex);
-                            var type=rec.get('wh_statuscode')=='ENABLE'?true:false;
-                            //  禁用/启用
-                            var form = this.ownerCt.ownerCt.ownerCt;
-                            var grid = this.ownerCt.ownerCt;
-                            saas.util.BaseUtil.request({
-                                url: (!type?form._openUrl:form._closeUrl)+'/'+rec.get('id'),
-                                params: '',
-                                method: 'POST',
-                            })
-                            .then(function(localJson) {
-                                if(localJson.success){
-                                    saas.util.BaseUtil.showSuccessToast('操作成功');
-                                    grid.store.load();
-                                }
-                            })
-                            .catch(function(res) {
-                                console.error(res);
-                                saas.util.BaseUtil.showErrorToast('操作失败: ' + res.message);
-                            });
-                        }
-                    }]
-                }],
-                keyField:'id',
-                reqUrl: '/api/document/warehouse/save',
-                delUrl: '/api/document/warehouse/delete'
-            },
             caller:'WareHouse',
             session: true
         });

+ 21 - 7
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -22,9 +22,14 @@ Ext.define('saas.view.core.report.ReportPanel', {
     searchItems: [], // 查询字段
     reportTitle: '报表',
     autoLoad:true,
+    printAble: true,
+    exportAble: true,
+    queryMode: 'DETAIL',
 
     initComponent: function() {
         var me = this;
+        var printAble = me.printAble;
+        var exportAble = me.exportAble;
         var store = me.initStore();
         columnWidth: 0.25,
         Ext.apply(me, {
@@ -49,6 +54,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     },{
                         xtype:'button',
                         text:'打印',
+                        hidden: !printAble,
                         style: {
                             float: 'right'
                         },
@@ -65,6 +71,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                             float: 'right'
                         },
                         text: '导出',
+                        hidden: !exportAble,
                         menu: {
                             defaults: {
                                 handler: 'exportTo'
@@ -163,7 +170,6 @@ Ext.define('saas.view.core.report.ReportPanel', {
                 }],
                 viewConfig: {
                     deferEmptyText: false,
-                    emptyText: '无数据',
                     listeners: {
                         itemcontextmenu: function(view, rec, node, index, e) {
                             e.stopEvent();
@@ -283,7 +289,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     var params = me.applyParams({
                         number: store.exportNumber?store.exportNumber:op._page,
                         size: store.exportPageSize?store.exportPageSize:store.pageSize,
-                        mode: 'DETAIL',
+                        mode: me.queryMode || 'DETAIL',
                         condition: JSON.stringify(condition),
                         calculateFields: JSON.stringify(summarys)
                     });
@@ -378,6 +384,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
 
     initSearchItems: function() {
         var me = this,
+        queryItems = [],
         items = me.searchItems,
         viewModel = me.getViewModel();
 
@@ -392,6 +399,10 @@ Ext.define('saas.view.core.report.ReportPanel', {
                 item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
             }
 
+            if(!ignore) {
+                queryItems.push(name);
+            }
+
             if(item.xtype == 'numberfield') {
                 Ext.applyIf(item, {
                     hideTrigger: true, // 隐藏trigger
@@ -435,6 +446,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
             });
         });
 
+        me.queryItems = queryItems;
+
         return items;
     },
 
@@ -444,17 +457,19 @@ Ext.define('saas.view.core.report.ReportPanel', {
         formItems = form.items.items,
         viewModel = me.getViewModel(),
         viewModelData = viewModel.getData(),
-        bindItems = viewModelData['form'],
+        formData = viewModelData['form'] || {},
+        queryItems = me.queryItems,
         condition,
         conditions = [];
 
-        for(k in bindItems) {
+        for(var i = 0; i < queryItems.length; i++) {
+            var n = queryItems[i];
             var item = Ext.Array.findBy(formItems, function(i) {
-                return i.name == k;
+                return i.name == n;
             });
             var field = item.name,
             func = item.getCondition,
-            value = bindItems[k],
+            value = formData[n],
             condition;
 
             if(typeof func == 'function') {
@@ -463,7 +478,6 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     value: func(value)
                 }
             }else {
-                // var xtype = item.xtype || 'textfield',
                 type = item.fieldType || me.getDefaultFieldType(item),
                 operation = item.operation || me.getDefaultFieldOperation(item),
                 conditionValue = me.getConditionValue(item, value);

+ 42 - 0
frontend/saas-web/app/view/document/address/DataList.js

@@ -0,0 +1,42 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.address.DataList', {
+    extend: 'saas.view.document.kind.Kind',
+    xtype: 'document-address-datalist',
+    viewModel: 'document-address-datalist',
+    defaultType:'address',
+    windowType:'document-address-window',
+    tbar: ['->',{
+        xtype:'button',
+        text:'新增',
+        listeners: {
+            click: 'onAdd'
+        }
+    },{
+        xtype:'button',
+        text:'刷新',
+        listeners: {
+            click: 'onRefresh'
+        }
+    }],
+    etc:{
+        address:{
+            columns: [{
+                text: '地址名称',
+                dataIndex: 'ad_address',
+                flex: 1
+            }],
+            keyField:'id',
+            reqUrl: '/api/document/address/save',
+            delUrl: '/api/document/address/delete'
+        },
+    },
+    listeners:{
+        afterrender:function(p){
+            p.getViewModel().setData({title:'采购地址'});
+        }
+    }
+})
+
+

+ 48 - 0
frontend/saas-web/app/view/document/address/DataListModel.js

@@ -0,0 +1,48 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.address.DataListModel', {
+    extend: 'Ext.app.ViewModel',
+    alias: 'viewmodel.document-address-datalist',
+    stores: {
+        address: {
+            fields:[
+                {name: 'id', type: 'int'},
+                {name: 'ad_address',  type: 'string'}
+            ],
+            proxy: {
+                type: 'ajax',
+                url: '/api/document/address/list',
+                actionMethods: {
+                    read: 'GET'
+                },
+                reader: {
+                    type: 'json',
+                    rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
+                }
+            },
+            pageSize: null,
+            autoLoad: false,
+            listeners: {
+                beforeload: function (store, op) {
+                    Ext.apply(store.proxy.extraParams, {
+                        number: 1,
+                        size: 1000
+                    });
+                }
+            }
+        }  
+    }
+});

+ 32 - 0
frontend/saas-web/app/view/document/address/Window.js

@@ -0,0 +1,32 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.address.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'document-address-window',
+    dataKind:'address',//类型标识
+    belong:{
+        columns: [{
+            text: '地址名称',
+            dataIndex: 'ad_address',
+            flex: 1
+        }],
+        keyField:'id',
+        reqUrl: '/api/document/address/save',
+        delUrl: '/api/document/address/delete'
+    },
+    etc:{
+        address:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                name:'ad_address',
+                allowBlank:false,
+                fieldLabel:'地址详情',
+                maxLength: 200
+            }]
+        }
+    }
+});

+ 82 - 0
frontend/saas-web/app/view/document/bankinformation/DataList.js

@@ -0,0 +1,82 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.bankinformation.DataList', {
+    extend: 'saas.view.document.kind.Kind',
+    xtype: 'document-bankinformation-datalist',
+    viewModel: 'document-bankinformation-datalist',
+    defaultType:'bankinformation',
+    windowType:'document-bankinformation-window',
+    tbar: ['->',{
+        xtype:'button',
+        text:'新增',
+        listeners: {
+            click: 'onAdd'
+        }
+    },{
+        xtype:'button',
+        text:'刷新',
+        listeners: {
+            click: 'onRefresh'
+        }
+    }],
+    etc:{
+        bankinformation:{
+            columns: [{
+                text: '账户编号',
+                dataIndex: 'bk_bankcode',
+                flex: 1
+            },{
+                text: '账户名称',
+                dataIndex: 'bk_bankname',
+                flex: 1
+            },{
+                text: '账户类别',
+                dataIndex: 'bk_type',
+                flex: 1,
+            },{
+                text: '期初金额',
+                dataIndex: 'bk_beginamount',
+                xtype: 'numbercolumn',
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                flex: 1
+            },{
+                text: '当前余额',
+                dataIndex: 'bk_thisamount',
+                xtype: 'numbercolumn',
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                flex: 1
+            },{
+                xtype:'datecolumn',
+                text: '建账日期',
+                format:'Y-m-d',
+                dataIndex: 'bk_date',
+                flex: 1
+            }, {
+                text: '备注',
+                dataIndex: 'bk_remark',
+                flex: 1
+            }],
+            keyField:'id',
+            reqUrl: '/api/document/bankinformation/save',
+            delUrl: '/api/document/bankinformation/delete'
+        }
+    },
+    listeners:{
+        afterrender:function(p){
+            p.getViewModel().setData({title:'资金账户'});
+        }
+    }
+})
+
+

+ 54 - 0
frontend/saas-web/app/view/document/bankinformation/DataListModel.js

@@ -0,0 +1,54 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.bankinformation.DataListModel', {
+    extend: 'Ext.app.ViewModel',
+    alias: 'viewmodel.document-bankinformation-datalist',
+    stores: {
+        bankinformation:{
+            fields:[
+                {name: 'id', type: 'int'},
+                {name: 'bk_bankname',  type: 'string'},
+                {name: 'bk_bankcode',  type: 'string'},
+                {name: 'bk_type',  type: 'string'},
+                {name: 'bk_beginamount',  type: 'float'},
+                {name: 'bk_thisamount',  type: 'float'},
+                {name: 'bk_date',  type: 'date'},
+                {name: 'updateTime', type: 'date'}
+            ],
+            proxy: {
+                type: 'ajax',
+                url: '/api/document/bankinformation/list',
+                actionMethods: {
+                    read: 'GET'
+                },
+                reader: {
+                    type: 'json',
+                    rootProperty: 'data.list'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
+                }
+            },
+            pageSize: null,
+            autoLoad: false,
+            listeners: {
+                beforeload: function (store, op) {
+                    Ext.apply(store.proxy.extraParams, {
+                        number: 1,
+                        size: 1000
+                    });
+                }
+            }
+        }  
+    }
+});

+ 128 - 0
frontend/saas-web/app/view/document/bankinformation/Window.js

@@ -0,0 +1,128 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.bankinformation.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'document-bankinformation-window',
+    dataKind:'bankinformation',//类型标识
+    belong:{
+        columns: [{
+            text: '账户编号',
+            dataIndex: 'bk_bankcode',
+            flex: 1
+        },{
+            text: '账户名称',
+            dataIndex: 'bk_bankname',
+            flex: 1
+        },{
+            text: '账户类别',
+            dataIndex: 'bk_type',
+            flex: 1,
+        },{
+            text: '期初金额',
+            dataIndex: 'bk_beginamount',
+            xtype: 'numbercolumn',
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            },
+            flex: 1
+        },{
+            text: '当前余额',
+            dataIndex: 'bk_thisamount',
+            xtype: 'numbercolumn',
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            },
+            flex: 1
+        },{
+            xtype:'datecolumn',
+            text: '建账日期',
+            format:'Y-m-d',
+            dataIndex: 'bk_date',
+            flex: 1
+        }, {
+            text: '备注',
+            dataIndex: 'bk_remark',
+            flex: 1
+        }],
+        keyField:'id',
+        reqUrl: '/api/document/bankinformation/save',
+        delUrl: '/api/document/bankinformation/delete'
+    },
+    etc:{
+        bankinformation:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                name:'bk_bankcode',
+                allowBlank:false,
+                fieldLabel:'账户编号',
+                autoCode:true,
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                name:'bk_bankname',
+                allowBlank:false,
+                fieldLabel:'账户名称',
+                maxLength: 20
+            },{
+                xtype:'numberfield',
+                name:'bk_beginamount',
+                allowBlank:false,
+                fieldLabel:'期初金额',
+                hideTrigger: true,
+                mouseWheelEnabled: false,
+                minValue: 0,
+                maxLength:15,
+                decimalPrecision:2,
+                enforceMaxLength:true
+            },
+            // {
+            //     xtype:'numberfield',
+            //     name:'bk_thisamount',
+            //     allowBlank:true,
+            //     fieldLabel:'当前余额',
+            //     hideTrigger: true,
+            //     mouseWheelEnabled: false,
+            //     beforeLabelTextTpl:'',
+            //     minValue: 0
+            // }
+            // ,
+            {
+                xtype:'combo',
+                name:'bk_type',
+                allowBlank:false,
+                editable:false,
+                fieldLabel:'账户类别',
+                store: [
+                    '现金',
+                    '银行'
+                ]
+            },{
+                xtype:'datefield',
+                name:'bk_date',
+                fieldLabel:'建账日期',
+                format:'Y-m-d',
+                listeners:{
+                    beforerender:function(d){
+                        d.setValue(new Date())
+                    }
+                }
+            }, {
+                xtype:'textfield',
+                name:'bk_remark',
+                allowBlank:true,
+                fieldLabel:'备注',
+                beforeLabelTextTpl:''
+            }]
+        }
+    }
+});

+ 94 - 0
frontend/saas-web/app/view/document/employee/DataList.js

@@ -0,0 +1,94 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.employee.DataList', {
+    extend: 'saas.view.document.kind.Kind',
+    xtype: 'document-employee-datalist',
+    viewModel: 'document-employee-datalist',
+    defaultType:'employee',
+    windowType:'document-employee-window',
+    _openUrl:'/api/document/employee/open',
+    _closeUrl:'/api/document/employee/close',
+    tbar: ['->',{
+        xtype:'button',
+        text:'新增',
+        listeners: {
+            click: 'onAdd'
+        }
+    },{
+        xtype:'button',
+        text:'刷新',
+        listeners: {
+            click: 'onRefresh'
+        }
+    }],
+    etc:{
+        employee:{
+            columns: [{
+                text: '人员编号',
+                dataIndex: 'em_code',
+                width: 150
+            },{
+                text: '人员名称',
+                dataIndex: 'em_name',
+                width: 110
+            },{
+                text: '联系电话',
+                dataIndex: 'em_mobile',
+                width: 110
+            },{  
+                text: '邮箱',
+                dataIndex: 'em_email',
+                width: 180
+            },{
+                text: '人员状态',
+                dataIndex: 'em_class',
+                width:90,
+                xtype: 'actioncolumn',
+                align : 'center',
+                items: [{
+                    iconCls:'',
+                    getClass: function(v, meta, rec) {
+                        if(rec.get('em_class')=='正式'){
+                            return 'x-grid-checkcolumn-checked-btn';
+                        }else{
+                            return 'x-grid-checkcolumn-btn';
+                        }
+                    },
+                    handler: function(view, rowIndex, colIndex) {
+                        var rec = view.getStore().getAt(rowIndex);
+                        var type=rec.get('em_class')=='正式'?true:false;
+                        //  禁用/启用
+                        var form = this.ownerCt.ownerCt.ownerCt;
+                        var grid = this.ownerCt.ownerCt;
+                        saas.util.BaseUtil.request({
+                            url: (!type?form._openUrl:form._closeUrl)+'/'+rec.get('id'),
+                            params: '',
+                            method: 'POST',
+                        })
+                        .then(function(localJson) {
+                            if(localJson.success){
+                                saas.util.BaseUtil.showSuccessToast('操作成功');
+                                grid.store.load();
+                            }
+                        })
+                        .catch(function(res) {
+                            console.error(res);
+                            saas.util.BaseUtil.showErrorToast('操作失败: ' + res.message);
+                        });
+                    }
+                }]
+            }],
+            keyField:'id',
+            reqUrl: '/api/document/employee/save',
+            delUrl: '/api/document/employee/delete'
+        }
+    },
+    listeners:{
+        afterrender:function(p){
+            p.getViewModel().setData({title:'人员资料'});
+        }
+    }
+})
+
+

+ 51 - 0
frontend/saas-web/app/view/document/employee/DataListModel.js

@@ -0,0 +1,51 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.employee.DataListModel', {
+    extend: 'Ext.app.ViewModel',
+    alias: 'viewmodel.document-employee-datalist',
+    stores: {
+        employee:{
+            fields:[
+                {name: 'id', type: 'int'},
+                {name: 'em_code',  type: 'string'},
+                {name: 'em_mobile',  type: 'string'},
+                {name: 'em_email',  type: 'string'},
+                {name: 'em_clasee',  type: 'string'}
+            ],
+            proxy: {
+                type: 'ajax',
+                url: '/api/document/employee/list',
+                actionMethods: {
+                    read: 'GET'
+                },
+                reader: {
+                    type: 'json',
+                    rootProperty: 'data.list'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
+                }
+            },
+            pageSize: null,
+            autoLoad: false,
+            listeners: {
+                beforeload: function (store, op) {
+                    Ext.apply(store.proxy.extraParams, {
+                        number: 1,
+                        size: 1000
+                    });
+                }
+            }
+        }
+    }
+});

+ 123 - 0
frontend/saas-web/app/view/document/employee/Window.js

@@ -0,0 +1,123 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.employee.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'document-employee-window',
+    dataKind:'employee',//类型标识
+    belong:{
+        columns: [{
+            text: '人员编号',
+            dataIndex: 'em_code',
+            width: 150
+        },{
+            text: '人员名称',
+            dataIndex: 'em_name',
+            width: 110
+        },{
+            text: '联系电话',
+            dataIndex: 'em_mobile',
+            width: 110
+        },{  
+            text: '邮箱',
+            dataIndex: 'em_email',
+            width: 180
+        },{
+            text: '人员状态',
+            dataIndex: 'em_class',
+            width:90,
+            xtype: 'actioncolumn',
+            align : 'center',
+            items: [{
+                iconCls:'',
+                getClass: function(v, meta, rec) {
+                    if(rec.get('em_class')=='正式'){
+                        return 'x-grid-checkcolumn-checked-btn';
+                    }else{
+                        return 'x-grid-checkcolumn-btn';
+                    }
+                },
+                handler: function(view, rowIndex, colIndex) {
+                    var rec = view.getStore().getAt(rowIndex);
+                    var type=rec.get('em_class')=='正式'?true:false;
+                    //  禁用/启用
+                    var form = this.ownerCt.ownerCt.ownerCt;
+                    var grid = this.ownerCt.ownerCt;
+                    saas.util.BaseUtil.request({
+                        url: (!type?form._openUrl:form._closeUrl)+'/'+rec.get('id'),
+                        params: '',
+                        method: 'POST',
+                    })
+                    .then(function(localJson) {
+                        if(localJson.success){
+                            saas.util.BaseUtil.showSuccessToast('操作成功');
+                            grid.store.load();
+                        }
+                    })
+                    .catch(function(res) {
+                        console.error(res);
+                        saas.util.BaseUtil.showErrorToast('操作失败: ' + res.message);
+                    });
+                }
+            }]
+        }],
+        keyField:'id',
+        reqUrl: '/api/document/employee/save',
+        delUrl: '/api/document/employee/delete'
+    },
+    etc:{
+        employee:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                fieldLabel: '人员编号',
+                autoCode:true,
+                name: 'em_code',
+                allowBlank:false,
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                fieldLabel: '人员名称',
+                name: 'em_name',
+                allowBlank:false,
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                fieldLabel: '联系电话',
+                name: 'em_mobile',
+                allowBlank:false,
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                fieldLabel: '邮箱',
+                name: 'em_email', 
+                allowBlank:true,  
+                beforeLabelTextTpl: '',
+                maxLength: 20
+            },{
+                value:'正式',
+                xtype:'combo',
+                fieldLabel: '人员状态',
+                name: 'em_class',
+                allowBlank:false,
+                displayField : "display", 
+                editable:false,
+                hideTrigger : false, 
+                maxLength : 100.0, 
+                minValue : null, 
+                positiveNum : false, 
+                queryMode : "local", 
+                valueField : "value", 
+                store:{
+                    fields: ['display', 'value'],
+                    data : [
+                        {"display":"正式", "value":'正式'},
+                        {"display":"离职", "value":'离职'}
+                    ]
+                }
+            },]
+        }
+    }
+});

+ 1 - 209
frontend/saas-web/app/view/document/kind/ChildForm.js

@@ -1,7 +1,7 @@
 /**
  * Created by zhouy on 2018/10/18.
  */
-Ext.define('KitchenSink.view.binding.ChildForm', {
+Ext.define('saas.view.document.kind.ChildForm', {
     extend: 'Ext.window.Window',
     xtype: 'document-kind-childwin',
     cls:'x-window-dbfind',
@@ -129,98 +129,6 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                 maxLength: 20
             }]
         },
-        bankinformation:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                name:'bk_bankcode',
-                allowBlank:false,
-                fieldLabel:'账户编号',
-                autoCode:true,
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                name:'bk_bankname',
-                allowBlank:false,
-                fieldLabel:'账户名称',
-                maxLength: 20
-            },{
-                xtype:'numberfield',
-                name:'bk_beginamount',
-                allowBlank:false,
-                fieldLabel:'期初金额',
-                hideTrigger: true,
-                mouseWheelEnabled: false,
-                minValue: 0,
-                maxLength:15,
-                decimalPrecision:2,
-                enforceMaxLength:true
-            },
-            // {
-            //     xtype:'numberfield',
-            //     name:'bk_thisamount',
-            //     allowBlank:true,
-            //     fieldLabel:'当前余额',
-            //     hideTrigger: true,
-            //     mouseWheelEnabled: false,
-            //     beforeLabelTextTpl:'',
-            //     minValue: 0
-            // }
-            // ,
-            {
-                xtype:'combo',
-                name:'bk_type',
-                allowBlank:false,
-                editable:false,
-                fieldLabel:'账户类别',
-                store: [
-                    '现金',
-                    '银行'
-                ]
-            },{
-                xtype:'datefield',
-                name:'bk_date',
-                fieldLabel:'建账日期',
-                format:'Y-m-d',
-                listeners:{
-                    beforerender:function(d){
-                        d.setValue(new Date())
-                    }
-                }
-            }, {
-                xtype:'textfield',
-                name:'bk_remark',
-                allowBlank:true,
-                fieldLabel:'备注',
-                beforeLabelTextTpl:''
-            }]
-        },
-        productbrand:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                name:'pb_name',
-                allowBlank:false,
-                fieldLabel:'物料品牌',
-                maxLength: 20
-            }]
-        },  
-        productunit:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                name:'pu_name',
-                allowBlank:false,
-                fieldLabel:'计量单位',
-                maxLength: 20
-            }]
-        },
         inoutkind:{
             items:[{
                 xtype:'hidden',
@@ -255,18 +163,6 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                 }
             }]
         },
-        address:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                name:'ad_address',
-                allowBlank:false,
-                fieldLabel:'地址详情',
-                maxLength: 200
-            }]
-        },
         accountinformation:{
             items:[{
                 xtype:'hidden',
@@ -431,110 +327,6 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                 maxLength: 30,
             }]
         },
-        warehouse:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                fieldLabel: '仓库编号',
-                name: 'wh_code',
-                autoCode:true,
-                allowBlank:false,
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                fieldLabel: '仓库名称',
-                name: 'wh_description',
-                allowBlank:false,
-                maxLength: 20
-            },{
-                xtype:'combo',
-                fieldLabel: '仓库类型',
-                name: 'wh_type',
-                allowBlank:false,
-                displayField : "display", 
-                editable:false,
-                hideTrigger : false, 
-                maxLength : 100.0, 
-                minValue : null, 
-                positiveNum : false, 
-                queryMode : "local", 
-                valueField : "value", 
-                store:{
-                    fields: ['display', 'value'],
-                    data : [
-                        {"display":"良品仓", "value":'良品仓'},
-                        {"display":"不良品仓", "value":'不良品仓'}
-                    ]
-                }
-            },{
-                readOnly:true,
-                xtype:'textfield',
-                fieldLabel: '仓库状态',
-                name: 'wh_status',   
-                value:'已启用',
-                maxLength: 20
-            },{
-                xtype:'hidden',
-                fieldLabel: '仓库状态码',
-                name: 'wh_statuscode',
-                value:'ENABLE'
-            }]
-        },
-        employee:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                fieldLabel: '人员编号',
-                autoCode:true,
-                name: 'em_code',
-                allowBlank:false,
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                fieldLabel: '人员名称',
-                name: 'em_name',
-                allowBlank:false,
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                fieldLabel: '联系电话',
-                name: 'em_mobile',
-                allowBlank:false,
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                fieldLabel: '邮箱',
-                name: 'em_email', 
-                allowBlank:true,  
-                beforeLabelTextTpl: '',
-                maxLength: 20
-            },{
-                value:'正式',
-                xtype:'combo',
-                fieldLabel: '人员状态',
-                name: 'em_class',
-                allowBlank:false,
-                displayField : "display", 
-                editable:false,
-                hideTrigger : false, 
-                maxLength : 100.0, 
-                minValue : null, 
-                positiveNum : false, 
-                queryMode : "local", 
-                valueField : "value", 
-                store:{
-                    fields: ['display', 'value'],
-                    data : [
-                        {"display":"正式", "value":'正式'},
-                        {"display":"离职", "value":'离职'}
-                    ]
-                }
-            },]
-        },
         maxnumbers:{
             items:[{
                 xtype:'hidden',

+ 0 - 200
frontend/saas-web/app/view/document/kind/Kind.js

@@ -106,76 +106,6 @@ Ext.define('saas.view.document.kind.Kind', {
             reqUrl:'/api/document/producttype/save',
             delUrl:'/api/document/producttype/delete'
         }, 
-        productbrand:{
-            columns: [{
-                text: '物料品牌',
-                dataIndex: 'pb_name',
-                flex: 1
-            }],
-            keyField:'id',
-            reqUrl:'/api/document/productbrand/save',
-            delUrl:'/api/document/productbrand/delete'
-        },
-        productunit:{
-            columns: [{
-                text: '计量单位',
-                dataIndex: 'pu_name',
-                flex: 1
-            }],
-            keyField:'id',
-            reqUrl:'/api/document/productunit/save',
-            delUrl:'/api/document/productunit/delete'
-        },
-        bankinformation:{
-            columns: [{
-                text: '账户编号',
-                dataIndex: 'bk_bankcode',
-                flex: 1
-            },{
-                text: '账户名称',
-                dataIndex: 'bk_bankname',
-                flex: 1
-            },{
-                text: '账户类别',
-                dataIndex: 'bk_type',
-                flex: 1,
-            },{
-                text: '期初金额',
-                dataIndex: 'bk_beginamount',
-                xtype: 'numbercolumn',
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
-                    var format = '0,000.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                },
-                flex: 1
-            },{
-                text: '当前余额',
-                dataIndex: 'bk_thisamount',
-                xtype: 'numbercolumn',
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
-                    var format = '0,000.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                },
-                flex: 1
-            },{
-                xtype:'datecolumn',
-                text: '建账日期',
-                format:'Y-m-d',
-                dataIndex: 'bk_date',
-                flex: 1
-            }, {
-                text: '备注',
-                dataIndex: 'bk_remark',
-                flex: 1
-            }],
-            keyField:'id',
-            reqUrl: '/api/document/bankinformation/save',
-            delUrl: '/api/document/bankinformation/delete'
-        },
         inoutkind:{
             columns: [{
                 text: '收支名称',
@@ -190,16 +120,6 @@ Ext.define('saas.view.document.kind.Kind', {
             reqUrl: '/api/document/fundinouttype/save',
             delUrl: '/api/document/fundinouttype/delete'
         },
-        address:{
-            columns: [{
-                text: '地址名称',
-                dataIndex: 'ad_address',
-                flex: 1
-            }],
-            keyField:'id',
-            reqUrl: '/api/document/address/save',
-            delUrl: '/api/document/address/delete'
-        },
         maxnumbers:{
             columns: [{
                 text : "单据名称", 
@@ -270,126 +190,6 @@ Ext.define('saas.view.document.kind.Kind', {
                 dataIndex: 'email',
             }],
             reqUrl: '/api/account/account/register/add',
-        },
-        employee:{
-            columns: [{
-                text: '人员编号',
-                dataIndex: 'em_code',
-                width: 150
-            },{
-                text: '人员名称',
-                dataIndex: 'em_name',
-                width: 110
-            },{
-                text: '联系电话',
-                dataIndex: 'em_mobile',
-                width: 110
-            },{  
-                text: '邮箱',
-                dataIndex: 'em_email',
-                width: 180
-            },{
-                text: '人员状态',
-                dataIndex: 'em_class',
-                width:90,
-                xtype: 'actioncolumn',
-                align : 'center',
-                items: [{
-                    iconCls:'',
-                    getClass: function(v, meta, rec) {
-                        if(rec.get('em_class')=='正式'){
-                            return 'x-grid-checkcolumn-checked-btn';
-                        }else{
-                            return 'x-grid-checkcolumn-btn';
-                        }
-                    },
-                    handler: function(view, rowIndex, colIndex) {
-                        var rec = view.getStore().getAt(rowIndex);
-                        var type=rec.get('em_class')=='正式'?true:false;
-                        //  禁用/启用
-                        var form = this.ownerCt.ownerCt.ownerCt;
-                        var grid = this.ownerCt.ownerCt;
-                        saas.util.BaseUtil.request({
-                            url: (!type?form._openUrl:form._closeUrl)+'/'+rec.get('id'),
-                            params: '',
-                            method: 'POST',
-                        })
-                        .then(function(localJson) {
-                            if(localJson.success){
-                                saas.util.BaseUtil.showSuccessToast('操作成功');
-                                grid.store.load();
-                            }
-                        })
-                        .catch(function(res) {
-                            console.error(res);
-                            saas.util.BaseUtil.showErrorToast('操作失败: ' + res.message);
-                        });
-                    }
-                }]
-            }],
-            keyField:'id',
-            reqUrl: '/api/document/employee/save',
-            delUrl: '/api/document/employee/delete'
-        },
-        warehouse:{
-            columns: [{
-                text: '编号',
-                dataIndex: 'wh_code',
-                width: 150
-            },{
-                text: '仓库名称',
-                dataIndex: 'wh_description',
-                width: 200
-            },{
-                text: '类型',
-                dataIndex: 'wh_type',
-                width: 110
-            },{  
-                text: '仓库状态码',
-                dataIndex: 'wh_status',
-                hidden:true,
-            },{
-                text: '仓库状态',
-                dataIndex: 'wh_statuscode',
-                width:90,
-                xtype: 'actioncolumn',
-                align : 'center',
-                items: [{
-                    iconCls:'',
-                    getClass: function(v, meta, rec) {
-                        if(rec.get('wh_statuscode')=='ENABLE'){
-                            return 'x-grid-checkcolumn-checked-btn';
-                        }else{
-                            return 'x-grid-checkcolumn-btn';
-                        }
-                    },
-                    handler: function(view, rowIndex, colIndex) {
-                        var rec = view.getStore().getAt(rowIndex);
-                        var type=rec.get('wh_statuscode')=='ENABLE'?true:false;
-                        //  禁用/启用
-                        var form = this.ownerCt.ownerCt.ownerCt;
-                        var grid = this.ownerCt.ownerCt;
-                        saas.util.BaseUtil.request({
-                            url: (!type?form._openUrl:form._closeUrl)+'/'+rec.get('id'),
-                            params: '',
-                            method: 'POST',
-                        })
-                        .then(function(localJson) {
-                            if(localJson.success){
-                                saas.util.BaseUtil.showSuccessToast('操作成功');
-                                grid.store.load();
-                            }
-                        })
-                        .catch(function(res) {
-                            console.error(res);
-                            saas.util.BaseUtil.showErrorToast('操作失败: ' + res.message);
-                        });
-                    }
-                }]
-            }],
-            keyField:'id',
-            reqUrl: '/api/document/warehouse/save',
-            delUrl: '/api/document/warehouse/delete'
         }
     },
     refresh:function(){

+ 1 - 1
frontend/saas-web/app/view/document/kind/KindController.js

@@ -101,7 +101,7 @@ Ext.define('saas.view.document.kind.KindController', {
         this.isEdit = !!record;
         this.dialog = view.add({
             autoScroll:true,
-            xtype: 'document-kind-childwin',
+            xtype: view.windowType?view.windowType:'document-kind-childwin',
             bind: {
                 title: record ? '修改{title}' : '新增{title}'
             },

+ 0 - 247
frontend/saas-web/app/view/document/kind/KindModel.js

@@ -125,90 +125,6 @@ Ext.define('saas.view.document.kind.KindModel', {
                 }
             }
         },
-        productbrand:{
-            fields:[
-                {name: 'id', type: 'int'},
-                {name: 'pb_name',  type: 'string'}
-            ],
-            proxy: {
-                type: 'ajax',
-                url: '/api/document/productbrand/list',
-                actionMethods: {
-                    read: 'GET'
-                },
-                reader: {
-                    type: 'json',
-                    rootProperty: 'data'
-                },
-                listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
-                                saas.util.BaseUtil.showErrorToast('请求超时');
-                            }
-                        }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
-                        }
-                    }
-                }
-            },
-            pageSize: null,
-            autoLoad: false,
-            listeners: {
-                beforeload: function (store, op) {
-                    Ext.apply(store.proxy.extraParams, {
-                        number: 1,
-                        size: 1000
-                    });
-                }
-            }
-        },
-        bankinformation:{
-            fields:[
-                {name: 'id', type: 'int'},
-                {name: 'bk_bankname',  type: 'string'},
-                {name: 'bk_bankcode',  type: 'string'},
-                {name: 'bk_type',  type: 'string'},
-                {name: 'bk_beginamount',  type: 'float'},
-                {name: 'bk_thisamount',  type: 'float'},
-                {name: 'bk_date',  type: 'date'},
-                {name: 'updateTime', type: 'date'}
-            ],
-            proxy: {
-                type: 'ajax',
-                url: '/api/document/bankinformation/list',
-                actionMethods: {
-                    read: 'GET'
-                },
-                reader: {
-                    type: 'json',
-                    rootProperty: 'data.list'
-                },
-                listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
-                                saas.util.BaseUtil.showErrorToast('请求超时');
-                            }
-                        }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
-                        }
-                    }
-                }
-            },
-            pageSize: null,
-            autoLoad: false,
-            listeners: {
-                beforeload: function (store, op) {
-                    Ext.apply(store.proxy.extraParams, {
-                        number: 1,
-                        size: 1000
-                    });
-                }
-            }
-        },
         inoutkind:{ 
             fields:[
                 {name: 'id', type: 'int'},
@@ -249,88 +165,6 @@ Ext.define('saas.view.document.kind.KindModel', {
                 }
             }
         },
-        warehouse: {
-            fields:[
-                {name: 'id', type: 'int'},
-                {name: 'wh_code',  type: 'string'},
-                {name: 'wh_type',  type: 'string'},
-                {name: 'wh_description',  type: 'string'},
-                {name: 'wh_statuscode',  type: 'string'},
-                {name: 'wh_status',  type: 'string'}
-            ],
-            proxy: {
-                type: 'ajax',
-                url: '/api/document/warehouse/list',
-                actionMethods: {
-                    read: 'GET'
-                },
-                reader: {
-                    type: 'json',
-                    rootProperty: 'data.list'
-                },
-                listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
-                                saas.util.BaseUtil.showErrorToast('请求超时');
-                            }
-                        }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
-                        }
-                    }
-                }
-            },
-            pageSize: null,
-            autoLoad: false,
-            listeners: {
-                beforeload: function (store, op) {
-                    Ext.apply(store.proxy.extraParams, {
-                        number: 1,
-                        size: 1000
-                    });
-                }
-            }
-        },
-        address: {
-            fields:[
-                {name: 'id', type: 'int'},
-                {name: 'ad_address',  type: 'string'}
-            ],
-            proxy: {
-                type: 'ajax',
-                url: '/api/document/address/list',
-                actionMethods: {
-                    read: 'GET'
-                },
-                reader: {
-                    type: 'json',
-                    rootProperty: 'data'
-                },
-                listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
-                                saas.util.BaseUtil.showErrorToast('请求超时');
-                            }
-                        }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
-                        }
-                    }
-                }
-            },
-            pageSize: null,
-            autoLoad: false,
-            listeners: {
-                beforeload: function (store, op) {
-                    Ext.apply(store.proxy.extraParams, {
-                        number: 1,
-                        size: 1000
-                    });
-                }
-            }
-        },  
         accountinformation: {    
             fields:[
                 {name: 'id', type: 'int'},
@@ -369,87 +203,6 @@ Ext.define('saas.view.document.kind.KindModel', {
                     });
                 }
             }
-        },
-        employee:{
-            fields:[
-                {name: 'id', type: 'int'},
-                {name: 'em_code',  type: 'string'},
-                {name: 'em_mobile',  type: 'string'},
-                {name: 'em_email',  type: 'string'},
-                {name: 'em_clasee',  type: 'string'}
-            ],
-            proxy: {
-                type: 'ajax',
-                url: '/api/document/employee/list',
-                actionMethods: {
-                    read: 'GET'
-                },
-                reader: {
-                    type: 'json',
-                    rootProperty: 'data.list'
-                },
-                listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
-                                saas.util.BaseUtil.showErrorToast('请求超时');
-                            }
-                        }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
-                        }
-                    }
-                }
-            },
-            pageSize: null,
-            autoLoad: false,
-            listeners: {
-                beforeload: function (store, op) {
-                    Ext.apply(store.proxy.extraParams, {
-                        number: 1,
-                        size: 1000
-                    });
-                }
-            }
-        },
-        productunit: {    
-            fields:[
-                {name: 'id', type: 'int'},
-                {name: 'pu_name',  type: 'string'}
-            ],
-            proxy: {
-                type: 'ajax',
-                url: '/api/document/productunit/list',
-                actionMethods: {
-                    read: 'GET'
-                },
-                reader: {
-                    type: 'json',
-                    rootProperty: 'data'
-                },
-                listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
-                                saas.util.BaseUtil.showErrorToast('请求超时');
-                            }
-                        }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
-                        }
-                    }
-                }
-            },
-            pageSize: null,
-            autoLoad: false,
-            listeners: {
-                beforeload: function (store, op) {
-                    Ext.apply(store.proxy.extraParams, {
-                        number: 1,
-                        size: 1000
-                    });
-                }
-            }
         }
     }
 });

+ 0 - 30
frontend/saas-web/app/view/document/other/Address.js

@@ -1,30 +0,0 @@
-/**
- * Created by zhouy on 2018/10/18.
- */
-Ext.define('saas.view.document.other.Address', {
-    extend: 'saas.view.document.kind.Kind',
-    xtype: 'other-address',
-    autoScroll: true,
-    layout:'fit',
-    defaultType:'address',
-    tbar: ['->',{
-        xtype:'button',
-        text:'新增',
-        listeners: {
-            click: 'onAdd'
-        }
-    },{
-        xtype:'button',
-        text:'刷新',
-        listeners: {
-            click: 'onRefresh'
-        }
-    }],
-    listeners:{
-        afterrender:function(p){
-            p.getViewModel().setData({title:'采购地址'});
-        }
-    }
-})
-
-

+ 0 - 31
frontend/saas-web/app/view/document/other/BankInformation.js

@@ -1,31 +0,0 @@
-/**
- * Created by zhouy on 2018/10/18.
- */
-Ext.define('saas.view.document.other.BankInformation', {
-    extend: 'saas.view.document.kind.Kind',
-    xtype: 'other-bankinformation',
-    autoScroll: true,
-    layout:'fit',
-    caller:'BankInformation',
-    defaultType:'bankinformation',
-    tbar: ['->',{
-        xtype:'button',
-        text:'新增',
-        listeners: {
-            click: 'onAdd'
-        }
-    },{
-        xtype:'button',
-        text:'刷新',
-        listeners: {
-            click: 'onRefresh'
-        }
-    }],
-    listeners:{
-        afterrender:function(p){
-            p.getViewModel().setData({title:'资金账户'});
-        }
-    }
-})
-
-

+ 0 - 28
frontend/saas-web/app/view/document/other/Employee.js

@@ -1,28 +0,0 @@
-Ext.define('saas.view.document.other.Employee', {
-    extend: 'saas.view.document.kind.Kind',
-    xtype: 'other-employee',
-    autoScroll: true,
-    layout:'fit',
-    caller:'Employee',
-    _openUrl:'/api/document/employee/open',
-    _closeUrl:'/api/document/employee/close',
-    defaultType:'employee',
-    tbar: ['->',{
-        xtype:'button',
-        text:'新增',
-        listeners: {
-            click: 'onAdd'
-        }
-    },{
-        xtype:'button',
-        text:'刷新',
-        listeners: {
-            click: 'onRefresh'
-        }
-    }],
-    listeners:{
-        afterrender:function(p){
-            p.getViewModel().setData({title:'人员资料'});
-        }
-    }
-})

+ 0 - 30
frontend/saas-web/app/view/document/other/ProductBrand.js

@@ -1,30 +0,0 @@
-/**
- * Created by zhouy on 2018/10/18.
- */
-Ext.define('saas.view.document.other.ProductBrand', {
-    extend: 'saas.view.document.kind.Kind',
-    xtype: 'other-productbrand',
-    autoScroll: true,
-    layout:'fit',
-    defaultType:'productbrand',
-    tbar: ['->',{
-        xtype:'button',
-        text:'新增',
-        listeners: {
-            click: 'onAdd'
-        }
-    },{
-        xtype:'button',
-        text:'刷新',
-        listeners: {
-            click: 'onRefresh'
-        }
-    }],
-    listeners:{
-        afterrender:function(p){
-            p.getViewModel().setData({title:'物料品牌'});
-        }
-    }
-})
-
-

+ 0 - 30
frontend/saas-web/app/view/document/other/ProductUnit.js

@@ -1,30 +0,0 @@
-/**
- * Created by zhouy on 2018/10/18.
- */
-Ext.define('saas.view.document.other.ProductUnit', {
-    extend: 'saas.view.document.kind.Kind',
-    xtype: 'other-productunit',
-    autoScroll: true,
-    layout:'fit',
-    defaultType:'productunit',
-    tbar: ['->',{
-        xtype:'button',
-        text:'新增',
-        listeners: {
-            click: 'onAdd'
-        }
-    },{
-        xtype:'button',
-        text:'刷新',
-        listeners: {
-            click: 'onRefresh'
-        }
-    }],
-    listeners:{
-        afterrender:function(p){
-            p.getViewModel().setData({title:'物料单位'});
-        }
-    }
-})
-
-

+ 0 - 28
frontend/saas-web/app/view/document/other/Warehouse.js

@@ -1,28 +0,0 @@
-Ext.define('saas.view.document.other.Warehouse', {
-    extend: 'saas.view.document.kind.Kind',
-    xtype: 'other-warehouse',
-    autoScroll: true,
-    layout:'fit',
-    caller:'Warehouse',
-    _openUrl:'/api/document/warehouse/open',
-    _closeUrl:'/api/document/warehouse/close',
-    defaultType:'warehouse',
-    tbar: ['->',{
-        xtype:'button',
-        text:'新增',
-        listeners: {
-            click: 'onAdd'
-        }
-    },{
-        xtype:'button',
-        text:'刷新',
-        listeners: {
-            click: 'onRefresh'
-        }
-    }],
-    listeners:{
-        afterrender:function(p){
-            p.getViewModel().setData({title:'仓库'});
-        }
-    }
-})

+ 4 - 8
frontend/saas-web/app/view/document/product/FormPanel.js

@@ -85,15 +85,13 @@ Ext.define('saas.view.document.product.FormPanel', {
         name : "pr_brand", 
         fieldLabel : "品牌", 
         addHandler:function(b){
-            var document = Ext.create('saas.view.document.kind.Kind',{});
             var form = this.ownerCmp.ownerCt;
-            this.dialog = form.getController().getView().add({
-                xtype: 'document-kind-childwin',
+            this.dialog = form.add({
+                xtype: 'document-productbrand-window',
                 bind: {
                     title: '新增物料品牌'
                 },
                 dataKind:'productbrand',
-                belong:document.etc['productbrand'],
                 _parent:form,
                 _combo:this.ownerCmp,
                 record:null,
@@ -110,15 +108,13 @@ Ext.define('saas.view.document.product.FormPanel', {
         allowBlank : false, 
         editable:false,
         addHandler:function(b){
-            var document = Ext.create('saas.view.document.kind.Kind',{});
             var form = this.ownerCmp.ownerCt;
-            this.dialog = form.getController().getView().add({
-                xtype: 'document-kind-childwin',
+            this.dialog = form.add({
+                xtype: 'document-productunit-window',
                 bind: {
                     title: '新增物料单位'
                 },
                 dataKind:'productunit',
-                belong:document.etc['productunit'],
                 _parent:form,
                 _combo:this.ownerCmp,
                 record:null,

+ 42 - 0
frontend/saas-web/app/view/document/productbrand/DataList.js

@@ -0,0 +1,42 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.productbrand.DataList', {
+    extend: 'saas.view.document.kind.Kind',
+    xtype: 'document-productbrand-datalist',
+    viewModel: 'document-productbrand-datalist',
+    defaultType:'productbrand',
+    windowType:'document-productbrand-window',
+    tbar: ['->',{
+        xtype:'button',
+        text:'新增',
+        listeners: {
+            click: 'onAdd'
+        }
+    },{
+        xtype:'button',
+        text:'刷新',
+        listeners: {
+            click: 'onRefresh'
+        }
+    }],
+    etc:{
+        productbrand:{
+            columns: [{
+                text: '物料品牌',
+                dataIndex: 'pb_name',
+                flex: 1
+            }],
+            keyField:'id',
+            reqUrl:'/api/document/productbrand/save',
+            delUrl:'/api/document/productbrand/delete'
+        }
+    },
+    listeners:{
+        afterrender:function(p){
+            p.getViewModel().setData({title:'物料品牌'});
+        }
+    }
+})
+
+

+ 48 - 0
frontend/saas-web/app/view/document/productbrand/DataListModel.js

@@ -0,0 +1,48 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.productbrand.DataListModel', {
+    extend: 'Ext.app.ViewModel',
+    alias: 'viewmodel.document-productbrand-datalist',
+    stores: {
+        productbrand:{
+            fields:[
+                {name: 'id', type: 'int'},
+                {name: 'pb_name',  type: 'string'}
+            ],
+            proxy: {
+                type: 'ajax',
+                url: '/api/document/productbrand/list',
+                actionMethods: {
+                    read: 'GET'
+                },
+                reader: {
+                    type: 'json',
+                    rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
+                }
+            },
+            pageSize: null,
+            autoLoad: false,
+            listeners: {
+                beforeload: function (store, op) {
+                    Ext.apply(store.proxy.extraParams, {
+                        number: 1,
+                        size: 1000
+                    });
+                }
+            }
+        },
+    }
+});

+ 32 - 0
frontend/saas-web/app/view/document/productbrand/Window.js

@@ -0,0 +1,32 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.productbrand.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'document-productbrand-window',
+    dataKind:'productbrand',//类型标识
+    belong:{
+        columns: [{
+            text: '物料品牌',
+            dataIndex: 'pb_name',
+            flex: 1
+        }],
+        keyField:'id',
+        reqUrl:'/api/document/productbrand/save',
+        delUrl:'/api/document/productbrand/delete'
+    },
+    etc:{
+        productbrand:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                name:'pb_name',
+                allowBlank:false,
+                fieldLabel:'物料品牌',
+                maxLength: 20
+            }]
+        }
+    }
+});

+ 42 - 0
frontend/saas-web/app/view/document/productunit/DataList.js

@@ -0,0 +1,42 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.productunit.DataList', {
+    extend: 'saas.view.document.kind.Kind',
+    xtype: 'document-productunit-datalist',
+    viewModel: 'document-productunit-datalist',
+    defaultType:'productunit',
+    windowType:'document-productunit-window',
+    tbar: ['->',{
+        xtype:'button',
+        text:'新增',
+        listeners: {
+            click: 'onAdd'
+        }
+    },{
+        xtype:'button',
+        text:'刷新',
+        listeners: {
+            click: 'onRefresh'
+        }
+    }],
+    etc:{
+        productunit:{
+            columns: [{
+                text: '计量单位',
+                dataIndex: 'pu_name',
+                flex: 1
+            }],
+            keyField:'id',
+            reqUrl:'/api/document/productunit/save',
+            delUrl:'/api/document/productunit/delete'
+        }
+    },
+    listeners:{
+        afterrender:function(p){
+            p.getViewModel().setData({title:'物料单位'});
+        }
+    }
+})
+
+

+ 48 - 0
frontend/saas-web/app/view/document/productunit/DataListModel.js

@@ -0,0 +1,48 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.productunit.DataListModel', {
+    extend: 'Ext.app.ViewModel',
+    alias: 'viewmodel.document-productunit-datalist',
+    stores: {
+        productunit: {    
+            fields:[
+                {name: 'id', type: 'int'},
+                {name: 'pu_name',  type: 'string'}
+            ],
+            proxy: {
+                type: 'ajax',
+                url: '/api/document/productunit/list',
+                actionMethods: {
+                    read: 'GET'
+                },
+                reader: {
+                    type: 'json',
+                    rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
+                }
+            },
+            pageSize: null,
+            autoLoad: false,
+            listeners: {
+                beforeload: function (store, op) {
+                    Ext.apply(store.proxy.extraParams, {
+                        number: 1,
+                        size: 1000
+                    });
+                }
+            }
+        }
+    }
+});

+ 32 - 0
frontend/saas-web/app/view/document/productunit/Window.js

@@ -0,0 +1,32 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.productunit.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'document-productunit-window',
+    dataKind:'productunit',//类型标识
+    belong:{
+        columns: [{
+            text: '计量单位',
+            dataIndex: 'pu_name',
+            flex: 1
+        }],
+        keyField:'id',
+        reqUrl:'/api/document/productunit/save',
+        delUrl:'/api/document/productunit/delete'
+    },
+    etc:{
+        productunit:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                name:'pu_name',
+                allowBlank:false,
+                fieldLabel:'计量单位',
+                maxLength: 20
+            }]
+        }
+    }
+});

+ 94 - 0
frontend/saas-web/app/view/document/warehouse/DataList.js

@@ -0,0 +1,94 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.warehouse.DataList', {
+    extend: 'saas.view.document.kind.Kind',
+    xtype: 'document-warehouse-datalist',
+    viewModel: 'document-warehouse-datalist',
+    defaultType:'warehouse',
+    windowType:'document-warehouse-window',
+    _openUrl:'/api/document/warehouse/open',
+    _closeUrl:'/api/document/warehouse/close',
+    tbar: ['->',{
+        xtype:'button',
+        text:'新增',
+        listeners: {
+            click: 'onAdd'
+        }
+    },{
+        xtype:'button',
+        text:'刷新',
+        listeners: {
+            click: 'onRefresh'
+        }
+    }],
+    etc:{
+        warehouse:{
+            columns: [{
+                text: '编号',
+                dataIndex: 'wh_code',
+                width: 150
+            },{
+                text: '仓库名称',
+                dataIndex: 'wh_description',
+                width: 200
+            },{
+                text: '类型',
+                dataIndex: 'wh_type',
+                width: 110
+            },{  
+                text: '仓库状态码',
+                dataIndex: 'wh_status',
+                hidden:true,
+            },{
+                text: '仓库状态',
+                dataIndex: 'wh_statuscode',
+                width:90,
+                xtype: 'actioncolumn',
+                align : 'center',
+                items: [{
+                    iconCls:'',
+                    getClass: function(v, meta, rec) {
+                        if(rec.get('wh_statuscode')=='ENABLE'){
+                            return 'x-grid-checkcolumn-checked-btn';
+                        }else{
+                            return 'x-grid-checkcolumn-btn';
+                        }
+                    },
+                    handler: function(view, rowIndex, colIndex) {
+                        var rec = view.getStore().getAt(rowIndex);
+                        var type=rec.get('wh_statuscode')=='ENABLE'?true:false;
+                        //  禁用/启用
+                        var form = this.ownerCt.ownerCt.ownerCt;
+                        var grid = this.ownerCt.ownerCt;
+                        saas.util.BaseUtil.request({
+                            url: (!type?form._openUrl:form._closeUrl)+'/'+rec.get('id'),
+                            params: '',
+                            method: 'POST',
+                        })
+                        .then(function(localJson) {
+                            if(localJson.success){
+                                saas.util.BaseUtil.showSuccessToast('操作成功');
+                                grid.store.load();
+                            }
+                        })
+                        .catch(function(res) {
+                            console.error(res);
+                            saas.util.BaseUtil.showErrorToast('操作失败: ' + res.message);
+                        });
+                    }
+                }]
+            }],
+            keyField:'id',
+            reqUrl: '/api/document/warehouse/save',
+            delUrl: '/api/document/warehouse/delete'
+        }
+    },
+    listeners:{
+        afterrender:function(p){
+            p.getViewModel().setData({title:'仓库'});
+        }
+    }
+})
+
+

+ 52 - 0
frontend/saas-web/app/view/document/warehouse/DataListModel.js

@@ -0,0 +1,52 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.warehouse.DataListModel', {
+    extend: 'Ext.app.ViewModel',
+    alias: 'viewmodel.document-warehouse-datalist',
+    stores: {
+        warehouse: {
+            fields:[
+                {name: 'id', type: 'int'},
+                {name: 'wh_code',  type: 'string'},
+                {name: 'wh_type',  type: 'string'},
+                {name: 'wh_description',  type: 'string'},
+                {name: 'wh_statuscode',  type: 'string'},
+                {name: 'wh_status',  type: 'string'}
+            ],
+            proxy: {
+                type: 'ajax',
+                url: '/api/document/warehouse/list',
+                actionMethods: {
+                    read: 'GET'
+                },
+                reader: {
+                    type: 'json',
+                    rootProperty: 'data.list'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
+                }
+            },
+            pageSize: null,
+            autoLoad: false,
+            listeners: {
+                beforeload: function (store, op) {
+                    Ext.apply(store.proxy.extraParams, {
+                        number: 1,
+                        size: 1000
+                    });
+                }
+            }
+        }  
+    }
+});

+ 121 - 0
frontend/saas-web/app/view/document/warehouse/Window.js

@@ -0,0 +1,121 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.document.warehouse.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'document-warehouse-window',
+    dataKind:'warehouse',//类型标识
+    belong:{
+        columns: [{
+            text: '编号',
+            dataIndex: 'wh_code',
+            width: 150
+        },{
+            text: '仓库名称',
+            dataIndex: 'wh_description',
+            width: 200
+        },{
+            text: '类型',
+            dataIndex: 'wh_type',
+            width: 110
+        },{  
+            text: '仓库状态码',
+            dataIndex: 'wh_status',
+            hidden:true,
+        },{
+            text: '仓库状态',
+            dataIndex: 'wh_statuscode',
+            width:90,
+            xtype: 'actioncolumn',
+            align : 'center',
+            items: [{
+                iconCls:'',
+                getClass: function(v, meta, rec) {
+                    if(rec.get('wh_statuscode')=='ENABLE'){
+                        return 'x-grid-checkcolumn-checked-btn';
+                    }else{
+                        return 'x-grid-checkcolumn-btn';
+                    }
+                },
+                handler: function(view, rowIndex, colIndex) {
+                    var rec = view.getStore().getAt(rowIndex);
+                    var type=rec.get('wh_statuscode')=='ENABLE'?true:false;
+                    //  禁用/启用
+                    var form = this.ownerCt.ownerCt.ownerCt;
+                    var grid = this.ownerCt.ownerCt;
+                    saas.util.BaseUtil.request({
+                        url: (!type?form._openUrl:form._closeUrl)+'/'+rec.get('id'),
+                        params: '',
+                        method: 'POST',
+                    })
+                    .then(function(localJson) {
+                        if(localJson.success){
+                            saas.util.BaseUtil.showSuccessToast('操作成功');
+                            grid.store.load();
+                        }
+                    })
+                    .catch(function(res) {
+                        console.error(res);
+                        saas.util.BaseUtil.showErrorToast('操作失败: ' + res.message);
+                    });
+                }
+            }]
+        }],
+        keyField:'id',
+        reqUrl: '/api/document/warehouse/save',
+        delUrl: '/api/document/warehouse/delete'
+    },
+    etc:{
+        warehouse:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                fieldLabel: '仓库编号',
+                name: 'wh_code',
+                autoCode:true,
+                allowBlank:false,
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                fieldLabel: '仓库名称',
+                name: 'wh_description',
+                allowBlank:false,
+                maxLength: 20
+            },{
+                xtype:'combo',
+                fieldLabel: '仓库类型',
+                name: 'wh_type',
+                allowBlank:false,
+                displayField : "display", 
+                editable:false,
+                hideTrigger : false, 
+                maxLength : 100.0, 
+                minValue : null, 
+                positiveNum : false, 
+                queryMode : "local", 
+                valueField : "value", 
+                store:{
+                    fields: ['display', 'value'],
+                    data : [
+                        {"display":"良品仓", "value":'良品仓'},
+                        {"display":"不良品仓", "value":'不良品仓'}
+                    ]
+                }
+            },{
+                readOnly:true,
+                xtype:'textfield',
+                fieldLabel: '仓库状态',
+                name: 'wh_status',   
+                value:'已启用',
+                maxLength: 20
+            },{
+                xtype:'hidden',
+                fieldLabel: '仓库状态码',
+                name: 'wh_statuscode',
+                value:'ENABLE'
+            }]
+        }
+    }
+});

+ 0 - 1
frontend/saas-web/app/view/home/InfoCard.scss

@@ -21,7 +21,6 @@ $max-card-width: 235px;
                         padding: 16px;
                         height: 120px;
                         border-radius: 0.5rem;
-                        box-shadow: 0 0 1px rgba(0,0,0,.125), 0 1px 3px rgba(0,0,0,.2);
                         position: relative;
                         display: block;
                         cursor: pointer;

+ 2 - 5
frontend/saas-web/app/view/purchase/purchase/FormPanel.js

@@ -69,15 +69,12 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
         columnWidth : 0.5,
         hiddenBtn:false,//true 则会关闭新增按钮功能
         addHandler:function(b){
-            var document = Ext.create('saas.view.document.kind.Kind',{});
             var form = this.ownerCmp.ownerCt;
-            this.dialog = form.getController().getView().add({
-                xtype: 'document-kind-childwin',
+            this.dialog = form.add({
+                xtype: 'document-address-window',
                 bind: {
                     title: '新增交货地址'
                 },
-                dataKind:'address',
-                belong:document.etc['address'],
                 _parent:form,
                 _combo:this.ownerCmp,
                 record:null,

+ 17 - 1
frontend/saas-web/app/view/sale/sale/FormPanel.js

@@ -66,7 +66,23 @@ Ext.define('saas.view.sale.sale.FormPanel', {
         name : "sa_toplace", 
         xtype : "textfield", 
         fieldLabel : "交货地址", 
-        columnWidth : 0.5
+        allowBlank : false, 
+        columnWidth : 0.5,
+        hiddenBtn:false,//true 则会关闭新增按钮功能
+        addHandler:function(b){
+            var form = this.ownerCmp.ownerCt;
+            this.dialog = form.add({
+                xtype: 'document-address-window',
+                bind: {
+                    title: '新增交货地址'
+                },
+                _parent:form,
+                _combo:this.ownerCmp,
+                record:null,
+                session: true
+            });
+            this.dialog.show();
+        }
     }, {
         name : "detailGridField", 
         xtype : "detailGridField", 

+ 8 - 6
frontend/saas-web/app/view/stock/appropriationInOut/QueryPanel.js

@@ -184,11 +184,7 @@ Ext.define('saas.view.stock.appropriationInOut.QueryPanel', {
                 dataIndex: 'pr_detail',
                 width: 200
             },{
-                text: '型号',
-                dataIndex: 'pr_orispeccode',
-                width: 150
-            },{
-                text: '规格',
+                text: '型号规格',
                 dataIndex: 'pr_spec',
                 width: 150
             },{
@@ -199,7 +195,13 @@ Ext.define('saas.view.stock.appropriationInOut.QueryPanel', {
                 text: '数量',
                 dataIndex: 'pd_outqty',
                 xtype:'numbercolumn',
-                width: 110
+                width: 110,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
             },{
                 text: '拨出仓',
                 dataIndex: 'pd_whname',

+ 6 - 0
frontend/saas-web/app/view/stock/make/QueryPanel.js

@@ -136,6 +136,12 @@ Ext.define('saas.view.stock.make.QueryPanel', {
             dataIndex: 'ma_qty',
             xtype: 'numbercolumn',
             width: 110,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            },
         },{
             text: '单位',
             dataIndex: 'ma_produnit',

+ 7 - 1
frontend/saas-web/app/view/stock/otherIn/QueryPanel.js

@@ -188,7 +188,13 @@ Ext.define('saas.view.stock.otherIn.QueryPanel', {
             text: '数量',
             dataIndex: 'pd_inqty',
             xtype:'numbercolumn',
-            width: 10
+            width: 10,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            },
         },{
             text: '仓库',
             dataIndex: 'pd_whname',

+ 7 - 1
frontend/saas-web/app/view/stock/otherOut/QueryPanel.js

@@ -188,7 +188,13 @@ Ext.define('saas.view.stock.otherOut.QueryPanel', {
             text: '数量',
             dataIndex: 'pd_inqty',
             xtype:'numbercolumn',
-            width: 10
+            width: 10,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            }
         },{
             text: '仓库',
             dataIndex: 'pd_whname',

+ 70 - 6
frontend/saas-web/app/view/stock/report/DataList.js

@@ -9,33 +9,50 @@ Ext.define('saas.view.stock.report.DataList', {
 
     groupField: null,
     listUrl: '/api/document/product/ReserveCost',
+    // listUrl: 'http://192.168.253.41:8560/api/document/product/ReserveCost',
     defaultCondition: null,
     reportTitle: '物料库存数量金额表',
-    QueryWidth:0.2,
+    QueryWidth:0.15,
+    printAble: false,
+    exportAble: true,
 
     searchItems: [{
         name: 'pr_code',
         xtype: 'textfield',
         emptyText : '物料编号',
-        columnWidth: 0.2
+        columnWidth: 0.15
     },{
         name: 'pr_detail',
         xtype: 'textfield',
         emptyText : '物料名称',
-        columnWidth: 0.2
+        columnWidth: 0.15
     },{
         name: 'wh_code',
         xtype: 'textfield',
         emptyText : '仓库编号',
-        columnWidth: 0.2
+        columnWidth: 0.15
     },{
         name: 'wh_description',
         xtype: 'textfield',
         emptyText : '仓库名称',
-        columnWidth: 0.2
+        columnWidth: 0.15
+    }, {
+        name: 'wh_description',
+        xtype: 'textfield',
+        emptyText : '仓库名称',
+        columnWidth: 0.15
+    }, {
+        name: 'toggle',
+        xtype: 'checkbox',
+        fieldLabel : '分仓库存',
+        columnWidth: 0.1,
+        ignore: true,
+        listeners: {
+            change: 'toggle_change'
+        }
     }],
 
-    reportColumns : [{
+    reportColumns2 : [{
         text : "物料编号", 
         width : 150, 
         dataIndex : "rc_prodCode", 
@@ -102,6 +119,53 @@ Ext.define('saas.view.stock.report.DataList', {
             return Ext.util.Format.number(v, format);
         },
     }],
+
+    reportColumns : [{
+        text : "物料编号", 
+        width : 150, 
+        dataIndex : "rc_prodCode", 
+        xtype : "", 
+    },{
+        text : "物料名称", 
+        width : 200.0, 
+        dataIndex : "rc_prodDetail", 
+    }, 
+    {
+        text : "物料规格", 
+        dataIndex : "rc_prodSpec", 
+        width : 150.0, 
+    }, 
+    {
+        text : "单位", 
+        dataIndex : "rc_prodUnit", 
+        width : 80.0, 
+    }, 
+    {
+        text : "数量",
+        xtype: 'numbercolumn',
+        dataIndex : "rc_number", 
+        width : 110.0, 
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length>3?3:arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, 
+    {
+        text : "金额", 
+        xtype: 'numbercolumn',
+        dataIndex : "rc_amount", 
+        width : 110.0,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length>2?2:arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        flex: 1
+    }],
 })
 
 

+ 17 - 4
frontend/saas-web/app/view/stock/report/DataListController.js

@@ -2,9 +2,22 @@ Ext.define('saas.view.stock.report.DataListController', {
     extend: 'saas.view.core.report.ReportPanelController',
     alias: 'controller.stock-report-datalist',
 
-    init: function (form) {
-        var me = this;
-        this.control({
-        });
+    toggle_change: function(field, newValue, oldValue, eOpts) {
+        var me = this,
+        reportPanel = me.getView(),
+        grid = reportPanel.down('grid'),
+        store = grid.store;
+        
+        if(newValue) {
+            reportPanel.queryMode = 'DETAIL';
+            store.load(function() {
+                grid.reconfigure(store, reportPanel.reportColumns2);
+            });
+        }else {
+            reportPanel.queryMode = 'MAIN';
+            store.load(function() {
+                grid.reconfigure(store, reportPanel.reportColumns);
+            });
+        }
     }
 });

+ 1 - 0
frontend/saas-web/app/view/sys/power/TreePanel.js

@@ -4,6 +4,7 @@ Ext.define('saas.view.sys.power.TreePanel', {
 
     dataUrl:'/api/account/role/list',
     deleteUrl:'/api/account/role/delete/',
+    focusable:false,
 
     initComponent: function () {
         var me = this;

+ 6 - 2
frontend/saas-web/ext/packages/ux/src/feature/MySummary.js

@@ -19,8 +19,7 @@ Ext.define('Ext.ux.feature.MySummary', {
     summaryRowCls: Ext.baseCSSPrefix + 'grid-row-summary ' + Ext.baseCSSPrefix + 'grid-row-total',
     summaryRowSelector: '.' + Ext.baseCSSPrefix + 'grid-row-summary.' + Ext.baseCSSPrefix + 'grid-row-total',
 
-    // turn off feature events.
-    hasFeatureEvent: false,
+    showSummaryRow: true,
 
     init: function(grid) {
         var me = this,
@@ -71,6 +70,7 @@ Ext.define('Ext.ux.feature.MySummary', {
                         '</table>',
                     ],
                     data: summarys,
+                    height: 36,
                     scrollable: {
                         x: false,
                         y: false
@@ -114,6 +114,10 @@ Ext.define('Ext.ux.feature.MySummary', {
 
         grid.summarys = summarys;
 
+        if(summarys.length == 0) {
+            me.showSummaryRow = false;
+        }
+
         return summarys;
     },
 

+ 2 - 2
frontend/saas-web/overrides/form/field/TrimVtype.js

@@ -3,10 +3,10 @@ Ext.define('saas.override.form.field.TrimVtype', {
 
     // vtype validation function
     trim: function(value) {
-        return this.trimRe.test(value);
+        return !this.trimRe.test(value);
     },
     // RegExp for the value to be tested against within the validation function
-    trimRe: /^(?! ).*(?<! )$/i,
+    trimRe: /(^ .*)|(.* $)/,
     // vtype Text property: The error text to display when the validation function returns false
     trimText: '请不要在内容的开头和结尾添加空格'
 });

+ 3 - 3
frontend/saas-web/package.json

@@ -6,9 +6,9 @@
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
     "dev": "sencha app watch",
-    "build-dev": "sencha app build --development",
-    "build-test": "sencha app build --testing",
-    "build": "sencha app build --production"
+    "build-dev": "sencha app build --build dev --testing",
+    "build-test": "sencha app build --build test --production",
+    "build": "sencha app build --build prod --production"
   },
   "keywords": [
     "saas"

+ 11 - 16
frontend/saas-web/resources/json/navigation.json

@@ -204,7 +204,7 @@
         }, {
             "id":"other-warehouse",
             "text": "仓库资料",
-            "viewType": "other-warehouse",
+            "viewType": "document-warehouse-datalist",
             "leaf": true
         }, {
             "id":"document-bom-basepanel",
@@ -213,14 +213,14 @@
             "addType": "document-bom-formpanel",
             "leaf": true
         }, {
-            "id":"other-bankinformation",
+            "id":"document-bankinformation-datalist",
             "text": "资金账户",
-            "viewType": "other-bankinformation",
+            "viewType": "document-bankinformation-datalist",
             "leaf": true
         },{
-            "id":"other-employee",
+            "id":"document-employee-datalist",
             "text": "人员资料",
-            "viewType": "other-employee",
+            "viewType": "document-employee-datalist",
             "leaf": true
         }]
     }, {
@@ -234,7 +234,7 @@
         }, {
             "id":"other-address",
             "text": "采购交货地址",
-            "viewType": "other-address",
+            "viewType": "document-address-datalist",
             "leaf": true
         }, {
             "config":"customerkind",
@@ -243,9 +243,9 @@
             "viewType": "document-kind",
             "leaf": true
         }, {
-            "id":"other-productunit",
+            "id":"document-productunit-datalist",
             "text": "计量单位",
-            "viewType": "other-productunit",
+            "viewType": "document-productunit-datalist",
             "leaf": true
         }, {
             "config":"productkind",
@@ -254,9 +254,9 @@
             "viewType": "document-kind",
             "leaf": true
         }, {
-            "id":"other-productbrand",
+            "id":"document-productbrand-datalist",
             "text": "物料品牌",
-            "viewType": "other-productbrand",
+            "viewType": "document-productbrand-datalist",
             "leaf": true
         }, {
             "config":"inoutkind",
@@ -271,12 +271,7 @@
     "iconCls": "x-sa sa-setting",
     "items": [{
         "text": "系统设置",
-        "items": [{
-            "id":"sys-guide-formpanel",
-            "text": "新手导航",
-            "viewType": "sys-guide-formpanel",
-            "leaf": true
-        }, {  
+        "items": [{  
             "id":"sys-manager-formpanel",
             "text": "系统管理",
             "viewType": "sys-manager-formpanel",

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini