Bläddra i källkod

Merge branch 'master' of http://192.168.1.41:3000/maixinrong/Calculation

TonyKang 5 år sedan
förälder
incheckning
32b5d22365
57 ändrade filer med 3915 tillägg och 132 borttagningar
  1. 13 6
      app/base/base_bills_service.js
  2. 58 4
      app/const/spread.js
  3. 4 2
      app/controller/ledger_controller.js
  4. 3 1
      app/controller/revise_controller.js
  5. 3 2
      app/controller/stage_controller.js
  6. 20 65
      app/lib/analysis_excel.js
  7. 1 1
      app/lib/stage_im.js
  8. 2 3
      app/public/js/ledger.js
  9. 30 0
      app/public/js/path_tree.js
  10. 74 17
      app/public/js/shares/bills_pos_convert.js
  11. 62 0
      app/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js
  12. 169 0
      app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.d.ts
  13. 944 0
      app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.js
  14. 1 0
      app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.min.js
  15. 496 0
      app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.ts
  16. 1360 0
      app/public/js/spreadjs/sheets/v11/interop/angularjs/gc.spread.sheets.angularjs.11.2.2.js
  17. 13 0
      app/public/js/spreadjs/sheets/v11/interop/angularjs/gc.spread.sheets.angularjs.11.2.2.min.js
  18. 36 0
      app/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js
  19. 3 0
      app/public/js/spreadjs/sheets/v11/interop/gc.spread.sheets.migration.11.2.2.min.js
  20. 1 0
      app/public/js/spreadjs/sheets/v11/interop/react/gc.spread.sheets.react.min.js
  21. 1 0
      app/public/js/spreadjs/sheets/v11/interop/vuejs/gc.spread.sheets.vue.min.js
  22. 17 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.calcengine.11.2.2.min.js
  23. 15 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.calcengine.advancedfunctions.11.2.2.min.js
  24. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.calcengine.basicfunctions.11.2.2.min.js
  25. 16 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.common.11.2.2.min.js
  26. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.bindings.11.2.2.min.js
  27. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.celltypes.11.2.2.min.js
  28. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.comments.11.2.2.min.js
  29. 15 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.conditionalformatting.11.2.2.min.js
  30. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.contextmenu.11.2.2.min.js
  31. 29 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.core.11.2.2.min.js
  32. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.datavalidation.11.2.2.min.js
  33. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.dragmerge.11.2.2.min.js
  34. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.fill.11.2.2.min.js
  35. 16 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.filter.11.2.2.min.js
  36. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.floatingobjects.11.2.2.min.js
  37. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.formulatextbox.11.2.2.min.js
  38. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.outlinecolumn.11.2.2.min.js
  39. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.outlines.11.2.2.min.js
  40. 13 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.search.11.2.2.min.js
  41. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.slicers.11.2.2.min.js
  42. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.sparklines.11.2.2.min.js
  43. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.tables.11.2.2.min.js
  44. 14 0
      app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.touch.11.2.2.min.js
  45. 39 0
      app/public/js/spreadjs/sheets/v11/plugins/gc.spread.sheets.charts.11.2.2.min.js
  46. 39 0
      app/public/js/spreadjs/sheets/v11/plugins/gc.spread.sheets.pdf.11.2.2.min.js
  47. 14 0
      app/public/js/spreadjs/sheets/v11/plugins/gc.spread.sheets.print.11.2.2.min.js
  48. 17 0
      app/public/js/spreadjs/sheets/v11/resources/ja/gc.spread.sheets.resources.ja.11.2.2.min.js
  49. 17 0
      app/public/js/spreadjs/sheets/v11/resources/ko/gc.spread.sheets.resources.ko.11.2.2.min.js
  50. 16 0
      app/public/js/spreadjs/sheets/v11/resources/zh/gc.spread.sheets.resources.zh.11.2.2.min.js
  51. 97 2
      app/public/js/spreadjs_rela/spreadjs_zh.js
  52. 1 1
      app/public/js/stage_bwtz.js
  53. 21 7
      app/service/ledger.js
  54. 1 1
      app/view/measure/audit.ejs
  55. 1 1
      app/view/measure/work.ejs
  56. 1 0
      app/view/stage/bwtz.ejs
  57. 19 19
      config/web.js

+ 13 - 6
app/base/base_bills_service.js

@@ -16,6 +16,7 @@ const readOnlyFields = ['id', 'tender_id', 'ledger_id', 'ledger_pid', 'order', '
 const upFields = ['unit_price'];
 const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty', 'dgn_qty1', 'dgn_qty2'];
 const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
+const measureType = require('../const/tender').measureType;
 
 class BaseBillsSerivce extends TreeService {
 
@@ -462,7 +463,7 @@ class BaseBillsSerivce extends TreeService {
 
         const datas = [];
         for (const node of cacheData.items) {
-            datas.push({
+            const data = {
                 id: node.id, tender_id: this.ctx.tender.id,
                 ledger_id: node.ledger_id,
                 ledger_pid: node.ledger_pid,
@@ -473,13 +474,19 @@ class BaseBillsSerivce extends TreeService {
                 b_code: node.b_code,
                 name: node.name,
                 unit: node.unit,
-                sgfh_qty: node.sgfh_qty,
-                sgfh_tp: node.sgfh_tp,
-                quantity: node.quantity,
                 unit_price: node.unit_price,
-                total_price: node.total_price,
                 crid: node.crid,
-            });
+            };
+            if (this.ctx.tender.data.measure_type === measureType.tz.value) {
+                data.sgfh_qty = node.quantity;
+                data.sgfh_tp = node.total_price;
+                data.quantity = node.quantity;
+                data.total_price = node.total_price;
+            } else if (this.ctx.tender.data.measure_type === measureType.gcl.value) {
+                data.deal_qty = node.quantity;
+                data.deal_tp = node.total_price;
+            }
+            datas.push(data);
         }
         const conn = await this.db.beginTransaction();
         try {

+ 58 - 4
app/const/spread.js

@@ -98,6 +98,62 @@ const withoutCl = {
         font: '12px 微软雅黑',
     }
 };
+const withClGcl = {
+    ledger: {
+        cols: [
+            {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', cellType: 'tree'},
+            {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 70, formatter: '@'},
+            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@'},
+            {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', cellType: 'unit'},
+            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
+            {title: '项目节数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number'},
+            {title: '经济指标',  colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '设计量|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sgfh_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'sgfh_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '设计错漏增减|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sjcl_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'sjcl_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '其他错漏增减|数量', colSpan: '2|1', rowSpan: '1|1', field: 'qtcl_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'qtcl_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '台账小计|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@'},
+            {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}
+        ],
+        emptyRows: 3,
+        headRows: 2,
+        headRowHeight: [25, 25],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+    }
+};
+const withoutClGcl = {
+    ledger: {
+        cols: [
+            {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', cellType: 'tree'},
+            {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 70, formatter: '@'},
+            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@'},
+            {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', cellType: 'unit'},
+            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
+            {title: '签约|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'deal_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '项目节数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number'},
+            {title: '经济指标',  colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '设计量|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sgfh_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'sgfh_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@'},
+            {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}
+        ],
+        emptyRows: 3,
+        headRows: 2,
+        headRowHeight: [25, 25],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+    }
+};
 // 期 -- 本期计量台账
 const stageTz = {
     ledger: {
@@ -292,10 +348,6 @@ const stageNoCl = {
         font: '12px 微软雅黑',
     }
 };
-// 期 -- 部位台账
-const stageBwtz = {
-
-};
 // 期 -- 清单汇总
 const stageGather = {
     gcl: {
@@ -449,6 +501,8 @@ measure.compare.pos = {
 module.exports = {
     withCl,
     withoutCl,
+    withClGcl,
+    withoutClGcl,
     stageTz,
     stageCl,
     stageNoCl,

+ 4 - 2
app/controller/ledger_controller.js

@@ -78,13 +78,15 @@ module.exports = app => {
             // const tpFormatter = this.ctx.helper.getNumberFormatter(this.ctx.tender.info.decimal.tp);
             // const upFormatter = this.ctx.helper.getNumberFormatter(this.ctx.tender.info.decimal.up);
             const tender = this.ctx.tender;
-            const setting = tender.info.display.ledger.clQty ? spreadConst.withCl : spreadConst.withoutCl;
+            const setting = tender.data.measure_type === measureType.tz.value
+                ? (tender.info.display.ledger.clQty ? spreadConst.withCl : spreadConst.withoutCl)
+                : (tender.info.display.ledger.clQty ? spreadConst.withClGcl : spreadConst.withoutClGcl);
             const ledger = JSON.parse(JSON.stringify(setting.ledger));
             // setColFormat(ledger.cols, 'unit_price', upFormatter);
             // setColFormat(ledger.cols, 'dgn_price', upFormatter);
             // setColFormat(ledger.cols, 'total_price', tpFormatter);
             // setColFormat(ledger.cols, 'deal_tp', tpFormatter);
-            const pos = JSON.parse(JSON.stringify(setting.pos));
+            const pos = setting.pos ? JSON.parse(JSON.stringify(setting.pos)) : {};
 
             if (this._ledgerReadOnly(tender.data)) {
                 ledger.readOnly = true;

+ 3 - 1
app/controller/revise_controller.js

@@ -189,7 +189,9 @@ module.exports = app => {
                 });
             }
             const tender = this.ctx.tender;
-            const setting = tender.info.display.ledger.clQty ? spreadConst.withCl : spreadConst.withoutCl;
+            const setting = tender.data.measure_type === measureType.tz.value
+                ? (tender.info.display.ledger.clQty ? spreadConst.withCl : spreadConst.withoutCl)
+                : (tender.info.display.ledger.clQty ? spreadConst.withClGcl : spreadConst.withoutClGcl);
             const ledger = JSON.parse(JSON.stringify(setting.ledger));
             const pos = JSON.parse(JSON.stringify(setting.pos));
 

+ 3 - 2
app/controller/stage_controller.js

@@ -87,8 +87,9 @@ module.exports = app => {
             // const tpFormatter = this.ctx.helper.getNumberFormatter(this.ctx.tender.info.decimal.tp);
             // const upFormatter = this.ctx.helper.getNumberFormatter(2);
             const tender = this.ctx.tender, stage = this.ctx.stage;
-            const stageSetting = tender.data.measure_type === measureType.tz.value ? spreadConst.stageTz :
-                (tender.info.display.ledger.clQty ? spreadConst.stageCl : spreadConst.stageNoCl);
+            const stageSetting = tender.data.measure_type === measureType.tz.value
+                ? spreadConst.stageTz
+                : (tender.info.display.ledger.clQty ? spreadConst.stageCl : spreadConst.stageNoCl);
             const ledger = JSON.parse(JSON.stringify(stageSetting.ledger));
             // setColFormat(ledger.cols, 'unit_price', upFormatter);
             // setColFormat(ledger.cols, 'total_price', tpFormatter);

+ 20 - 65
app/lib/analysis_excel.js

@@ -205,8 +205,7 @@ class ImportBaseTree {
             pos.add_user = this.ctx.session.sessionUser.accountId;
             this.finalNode.pos.push(pos);
             this.pos.push(pos);
-            pos.sgfh_qty = this.ctx.helper.round(pos.sgfh_qty, this.finalPrecision.value);
-            pos.quantity = pos.sgfh_qty;
+            pos.quantity = this.ctx.helper.round(pos.quantity, this.finalPrecision.value);
             return pos;
         }
     }
@@ -235,28 +234,12 @@ class ImportBaseTree {
         for (const node of this.items) {
             if (node.children && node.children.length > 0) { continue; }
             if (!node.pos || node.pos.length === 0) { continue; }
-            // node.sgfh_qty = this.ctx.helper.sum(_.map(node.pos, 'sgfh_qty'));
-            // if (node.sgfh_qty && node.unit_price) {
-            //     node.sgfh_tp = this.ctx.helper.round(this.ctx.helper.mul(node.sgfh_qty, node.unit_price),
-            //         this.ctx.tender.info.decimal.tp);
-            // } else {
-            //     node.sgfh_tp = null;
-            // }
-            // node.quantity = this.ctx.helper.sum(_.map(node.pos, 'quantity'));
-            // if (node.quantity && node.unit_price) {
-            //     node.total_price = this.ctx.helper.round(this.ctx.helper.mul(node.quantity, node.unit_price),
-            //         this.ctx.tender.info.decimal.tp);
-            // } else {
-            //     node.total_price = null;
-            // }
-            node.sgfh_qty = this.ctx.helper.sum(_.map(node.pos, 'sgfh_qty'));
-            if (node.sgfh_qty && node.unit_price) {
-                node.sgfh_tp = this.ctx.helper.mul(node.sgfh_qty, node.unit_price, this.ctx.tender.info.decimal.tp);
+            node.quantity = this.ctx.helper.sum(_.map(node.pos, 'quantity'));
+            if (node.quantity && node.unit_price) {
+                node.total_price = this.ctx.helper.mul(node.quantity, node.unit_price, this.ctx.tender.info.decimal.tp);
             } else {
-                node.sgfh_tp = null;
+                node.total_price = null;
             }
-            node.quantity = node.sgfh_qty;
-            node.total_price = node.sgfh_tp;
         }
     }
 }
@@ -274,7 +257,7 @@ class AnalysisExcelTree {
             pos: ['部位明细'],
             name: ['名称'],
             unit: ['单位'],
-            sgfh_qty: ['清单数量'], // 施工图复核数量
+            quantity: ['清单数量'],
             dgn_qty1: ['设计数量1'],
             dgn_qty2: ['设计数量2'],
             unit_price: ['单价'],
@@ -295,30 +278,17 @@ class AnalysisExcelTree {
         node.name = this.ctx.helper.replaceReturn(row[this.colsDef.name]);
         node.unit = this.ctx.helper.replaceReturn(row[this.colsDef.unit]);
         const precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, node.unit);
-        node.sgfh_qty = this.ctx.helper.round(aeUtils.toNumber(row[this.colsDef.sgfh_qty]), precision.value);
+        node.quantity = this.ctx.helper.round(aeUtils.toNumber(row[this.colsDef.quantity]), precision.value);
         node.dgn_qty1 = aeUtils.toNumber(row[this.colsDef.dgn_qty1]);
         node.dgn_qty2 = aeUtils.toNumber(row[this.colsDef.dgn_qty2]);
         node.unit_price = aeUtils.toNumber(row[this.colsDef.unit_price]);
         node.drawing_code = this.ctx.helper.replaceReturn(row[this.colsDef.drawing_code]);
         node.memo = this.ctx.helper.replaceReturn(row[this.colsDef.memo]);
-        // if (node.sgfh_qty && node.unit_price) {
-        //     node.sgfh_tp = this.ctx.helper.round(this.ctx.helper.mul(node.sgfh_qty, node.unit_price), this.ctx.tender.info.decimal.tp);
-        // } else {
-        //     node.sgfh_tp = null;
-        // }
-        // node.quantity = node.sgfh_qty;
-        // if (node.quantity && node.unit_price) {
-        //     node.total_price = this.ctx.helper.round(this.ctx.helper.mul(node.quantity, node.unit_price), this.ctx.tender.info.decimal.tp);
-        // } else {
-        //     node.total_price = null;
-        // }
-        if (node.sgfh_qty && node.unit_price) {
-            node.sgfh_tp = this.ctx.helper.mul(node.sgfh_qty, node.unit_price, this.ctx.tender.info.decimal.tp);
+        if (node.quantity && node.unit_price) {
+            node.total_price = this.ctx.helper.mul(node.quantity, node.unit_price, this.ctx.tender.info.decimal.tp);
         } else {
-            node.sgfh_tp = null;
+            node.total_price = null;
         }
-        node.quantity = node.sgfh_qty;
-        node.total_price = node.sgfh_tp;
         return this.cacheTree.addXmjNode(node);
     }
     /**
@@ -333,28 +303,15 @@ class AnalysisExcelTree {
         node.name = this.ctx.helper.replaceReturn(row[this.colsDef.name]);
         node.unit = this.ctx.helper.replaceReturn(row[this.colsDef.unit]);
         const precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, node.unit);
-        node.sgfh_qty = this.ctx.helper.round(aeUtils.toNumber(row[this.colsDef.sgfh_qty]), precision.value);
+        node.quantity = this.ctx.helper.round(aeUtils.toNumber(row[this.colsDef.quantity]), precision.value);
         node.unit_price = aeUtils.toNumber(row[this.colsDef.unit_price]);
         node.drawing_code = this.ctx.helper.replaceReturn(row[this.colsDef.drawing_code]);
         node.memo = this.ctx.helper.replaceReturn(row[this.colsDef.memo]);
-        // if (node.sgfh_qty && node.unit_price) {
-        //     node.sgfh_tp = this.ctx.helper.round(this.ctx.helper.mul(node.sgfh_qty, node.unit_price), this.ctx.tender.info.decimal.tp);
-        // } else {
-        //     node.sgfh_tp = null;
-        // }
-        // node.quantity = node.sgfh_qty;
-        // if (node.quantity && node.unit_price) {
-        //     node.total_price = this.ctx.helper.round(this.ctx.helper.mul(node.quantity, node.unit_price), this.ctx.tender.info.decimal.tp);
-        // } else {
-        //     node.total_price = null;
-        // }
-        if (node.sgfh_qty && node.unit_price) {
-            node.sgfh_tp = this.ctx.helper.mul(node.sgfh_qty, node.unit_price, this.ctx.tender.info.decimal.tp);
+        if (node.quantity && node.unit_price) {
+            node.total_price = this.ctx.helper.mul(node.quantity, node.unit_price, this.ctx.tender.info.decimal.tp);
         } else {
-            node.sgfh_tp = null;
+            node.total_price = null;
         }
-        node.quantity = node.sgfh_qty;
-        node.total_price = node.sgfh_tp;
         return this.cacheTree.addGclNode(node);
     }
     /**
@@ -366,7 +323,7 @@ class AnalysisExcelTree {
     _loadPos(row) {
         const pos = {};
         pos.name = this.ctx.helper.replaceReturn(row[this.colsDef.name]);
-        pos.sgfh_qty = aeUtils.toNumber(row[this.colsDef.sgfh_qty]);
+        pos.quantity = aeUtils.toNumber(row[this.colsDef.quantity]);
         pos.drawing_code = this.ctx.helper.replaceReturn(row[this.colsDef.drawing_code]);
         return this.cacheTree.addPos(pos);
     }
@@ -529,7 +486,7 @@ class AnalysisGclExcelTree {
             b_code: ['编号', '清单编号', '子目号'],
             name: ['名称'],
             unit: ['单位'],
-            sgfh_qty: ['清单数量'], // 施工图复核数量
+            quantity: ['清单数量'], // 施工图复核数量
             unit_price: ['单价'],
         };
     }
@@ -553,15 +510,13 @@ class AnalysisGclExcelTree {
 
         node.unit = this.ctx.helper.replaceReturn(row[this.colsDef.unit]);
         const precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, node.unit);
-        node.sgfh_qty = this.ctx.helper.round(aeUtils.toNumber(row[this.colsDef.sgfh_qty]), precision.value);
+        node.quantity = this.ctx.helper.round(aeUtils.toNumber(row[this.colsDef.quantity]), precision.value);
         node.unit_price = aeUtils.toNumber(row[this.colsDef.unit_price]);
-        if (node.sgfh_qty && node.unit_price) {
-            node.sgfh_tp = this.ctx.helper.mul(node.sgfh_qty, node.unit_price, this.ctx.tender.info.decimal.tp);
+        if (node.quantity && node.unit_price) {
+            node.total_price = this.ctx.helper.mul(node.quantity, node.unit_price, this.ctx.tender.info.decimal.tp);
         } else {
-            node.sgfh_tp = null;
+            node.total_price = null;
         }
-        node.quantity = node.sgfh_qty;
-        node.total_price = node.sgfh_tp;
         return this.cacheTree.addNode(node);
     }
 

+ 1 - 1
app/lib/stage_im.js

@@ -487,7 +487,7 @@ class StageIm {
             let im = nodeImData.find(function (d) {
                 return d.lid === node.id &&
                     d.code === p.b_code && p.name === d.name && p.unit === d.unit &&
-                    this.ctx.helper.checkZero(self.ctx.helper.sub(p.unit_price, d.unit_price));
+                    self.ctx.helper.checkZero(self.ctx.helper.sub(p.unit_price, d.unit_price));
             });
             if (!im) {
                 const peg = this._getPegNode(node);

+ 2 - 3
app/public/js/ledger.js

@@ -31,7 +31,6 @@ $(document).ready(function() {
     autoFlashHeight();
     // 初始化台账
     const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);
-    SpreadJsObj.addDeleteBind(ledgerSpread);
     const treeSetting = {
         id: 'ledger_id',
         pid: 'ledger_pid',
@@ -971,7 +970,7 @@ $(document).ready(function() {
             selector: '#ledger-spread',
             build: function ($trigger, e) {
                 const target = SpreadJsObj.safeRightClickSelection($trigger, e, ledgerSpread);
-                return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+                return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader;
             },
             items: {
                 'create': {
@@ -1275,7 +1274,7 @@ $(document).ready(function() {
         });
         SpreadJsObj.initSheet(posSpread.getActiveSheet(), posSpreadSetting);
     }
-    // 绑定计量单元编辑事件
+    //绑定计量单元编辑事件
     const posOperationObj = {
         editStarting: function (e, info) {
             posOperationObj.ledgerTreeNode = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());

+ 30 - 0
app/public/js/path_tree.js

@@ -1332,6 +1332,36 @@ const createNewPathTree = function (type, setting) {
             }
             return item;
         }
+
+        sortTreeNodeCustom(field, fun, isResort) {
+            const self = this;
+            const sortNodes = function (nodes) {
+                nodes.sort(function (a, b) {
+                    return fun(a[field], b[field]);
+                });
+                for (const [i, node] of nodes.entries()) {
+                    node.order = i+1;
+                }
+            };
+            const addSortNodes = function (nodes) {
+                if (!nodes) { return }
+                for (let i = 0; i < nodes.length; i++) {
+                    self.nodes.push(nodes[i]);
+                    nodes[i].index = self.nodes.length - 1;
+                    if (!isResort) {
+                        nodes[i].children = self.getChildren(nodes[i]);
+                    }
+                    sortNodes(nodes[i].children);
+                    addSortNodes(nodes[i].children);
+                }
+            };
+            this.nodes = [];
+            if (!isResort) {
+                this.children = this.getChildren();
+            }
+            sortNodes(this.children);
+            addSortNodes(this.children);
+        }
     }
 
     if (type === 'base') {

+ 74 - 17
app/public/js/shares/bills_pos_convert.js

@@ -10,8 +10,8 @@
 
 const billsPosConvertModel = (function () {
     // 需要汇总计算的字段
-    const tpFields = ['total_price', 'contract_tp', 'qc_tp',
-        'pre_contract_tp', 'pre_qc_tp', 'end_contract_tp', 'end_qc_tp'];
+    const tpFields = ['total_price', 'contract_tp', 'qc_tp', 'gather_tp',
+        'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp', 'end_contract_tp', 'end_qc_tp'];
     const baseCalcFields = ['quantity', 'contract_qty', 'qc_qty', 'gather_qty',
         'pre_contract_qty', 'pre_qc_qty', 'pre_gather_qty', 'end_contract_qty', 'end_qc_qty', 'end_gather_qty'];
     // 基础数据
@@ -31,7 +31,7 @@ const billsPosConvertModel = (function () {
         updateFields: ['contract_qty', 'qc_qty'],
     };
     const bpcPos = new StagePosData(bpcPosSetting);
-    let bpcChange;
+    let bpcChange, tpDecimal;
 
     // 结果
     const resultTreeSetting = {
@@ -52,21 +52,46 @@ const billsPosConvertModel = (function () {
     function loadPosData(pos) {
         bpcPos.loadDatas(pos);
     }
-    function loadData(ledger, pos, change) {
+    function loadData(ledger, pos, change, decimal) {
         loadLedgerData(ledger);
         loadPosData(pos);
         bpcChange = change;
+        tpDecimal = decimal;
     }
 
     function convertXmj(node) {
         return resultTree.addData(node, ['ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path',
             'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'drawing_code', 'postil', 'memo']);
     }
+    // v1
     function loadField(node, data, fields) {
         for (const prop in data) {
             if (fields.indexOf(prop) >= 0) node[prop] = data[prop];
         }
     }
+    // v2
+    function loadCalcFields(node, data) {
+        node.quantity = ZhCalc.add(node.quantity, data.quantity);
+        node.total_price = ZhCalc.add(node.total_price, ZhCalc.mul(node.unit_price, data.quantity, tpDecimal));
+
+        node.contract_qty = ZhCalc.add(node.contract_qty, data.contract_qty);
+        node.contract_tp = ZhCalc.add(node.contract_tp, ZhCalc.mul(node.unit_price, data.contract_qty, tpDecimal));
+        node.qc_qty = ZhCalc.add(node.qc_qty, data.qc_qty);
+        node.qc_tp = ZhCalc.add(node.qc_tp, ZhCalc.mul(node.unit_price, data.qc_qty, tpDecimal));
+        node.gather_qty = ZhCalc.add(node.gather_qty, data.gather_qty);
+
+        node.pre_contract_qty = ZhCalc.add(node.pre_contract_qty, data.pre_contract_qty);
+        node.pre_contract_tp = ZhCalc.add(node.pre_contract_tp, ZhCalc.mul(node.unit_price, data.pre_contract_qty, tpDecimal));
+        node.pre_qc_qty = ZhCalc.add(node.pre_qc_qty, data.pre_qc_qty);
+        node.pre_qc_tp = ZhCalc.add(node.pre_qc_tp, ZhCalc.mul(node.unit_price, data.pre_qc_qty, tpDecimal));
+        node.pre_gather_qty = ZhCalc.add(node.pre_gather_qty, data.pre_gather_qty);
+
+        node.end_contract_qty = ZhCalc.add(node.end_contract_qty, data.end_contract_qty);
+        node.end_contract_tp = ZhCalc.add(node.end_contract_tp, ZhCalc.mul(node.unit_price, data.end_contract_qty, tpDecimal));
+        node.end_qc_qty = ZhCalc.add(node.end_qc_qty, data.end_qc_qty);
+        node.end_qc_tp = ZhCalc.add(node.end_qc_tp, ZhCalc.mul(node.unit_price, data.end_qc_qty, tpDecimal));
+        node.end_gather_qty = ZhCalc.add(node.end_gather_qty, data.end_gather_qty);
+    }
     function convertGcl(node, xmj) {
         if (!xmj) return;
 
@@ -81,7 +106,8 @@ const billsPosConvertModel = (function () {
                 const gclUnit = xmj.unitTree.addNode({pos_name: null,
                     b_code: node.b_code, name: node.name, unit: node.unit, unit_price: node.unit_price
                 }, posUnit);
-                loadField(gclUnit, p, baseCalcFields);
+                //loadField(gclUnit, p, baseCalcFields);
+                loadCalcFields(gclUnit, p);
                 if (!gclUnit.changes) gclUnit.changes = [];
                 for (const c of bpcChange) {
                     if (c.lid === node.id && c.pid === p.id && c.qty && c.qty !== 0) {
@@ -92,7 +118,8 @@ const billsPosConvertModel = (function () {
         } else {
             const unit = xmj.unitTree.addNode({pos_name: null,
                 b_code: node.b_code, name: node.name, unit: node.unit, unit_price: node.unit_price});
-            loadField(unit, node, baseCalcFields);
+            //loadField(unit, node, baseCalcFields);
+            loadCalcFields(unit, node);
             if (!unit.changes) unit.changes = [];
             for (const c of bpcChange) {
                 if (c.lid === node.id && c.pid == -1 && c.qty && c.qty !== 0) {
@@ -124,16 +151,22 @@ const billsPosConvertModel = (function () {
         node.end_qc_qty = ZhCalc.add(node.qc_qty, node.pre_qc_qty);
         node.end_gather_qty = ZhCalc.add(node.gather_qty, node.pre_gather_qty);
 
-        node.total_price = ZhCalc.mul(node.unit_price, node.quantity);
-        node.contract_tp = ZhCalc.mul(node.unit_price, node.contract_qty);
-        node.qc_tp = ZhCalc.mul(node.unit_price, node.qc_qty);
-        node.gather_tp = ZhCalc.mul(node.unit_price, node.gather_qty);
-        node.pre_contract_tp = ZhCalc.mul(node.unit_price, node.pre_contract_qty);
-        node.pre_qc_tp = ZhCalc.mul(node.unit_price, node.pre_qc_qty);
-        node.pre_gather_tp = ZhCalc.mul(node.unit_price, node.pre_gather_qty);
-        node.end_contract_tp = ZhCalc.mul(node.unit_price, node.end_contract_qty);
-        node.end_qc_tp = ZhCalc.mul(node.unit_price, node.end_qc_qty);
-        node.end_gather_tp = ZhCalc.mul(node.unit_price, node.end_gather_qty);
+        // v1
+        // node.total_price = ZhCalc.mul(node.unit_price, node.quantity, tpDecimal);
+        // node.contract_tp = ZhCalc.mul(node.unit_price, node.contract_qty, tpDecimal);
+        // node.qc_tp = ZhCalc.mul(node.unit_price, node.qc_qty, tpDecimal);
+        // node.gather_tp = ZhCalc.mul(node.unit_price, node.gather_qty, tpDecimal);
+        // node.pre_contract_tp = ZhCalc.mul(node.unit_price, node.pre_contract_qty, tpDecimal);
+        // node.pre_qc_tp = ZhCalc.mul(node.unit_price, node.pre_qc_qty, tpDecimal);
+        // node.pre_gather_tp = ZhCalc.mul(node.unit_price, node.pre_gather_qty, tpDecimal);
+        // node.end_contract_tp = ZhCalc.mul(node.unit_price, node.end_contract_qty, tpDecimal);
+        // node.end_qc_tp = ZhCalc.mul(node.unit_price, node.end_qc_qty, tpDecimal);
+        // node.end_gather_tp = ZhCalc.mul(node.unit_price, node.end_gather_qty, tpDecimal);
+
+        // v2
+        node.gather_tp = ZhCalc.add(node.contract_tp, node.qc_tp);
+        node.pre_gather_tp = ZhCalc.add(node.pre_contract_tp, node.pre_qc_tp);
+        node.end_gather_tp = ZhCalc.add(node.end_contract_tp, node.end_qc_tp);
 
         node.final_tp = ZhCalc.add(node.total_price, node.end_qc_tp);
         node.end_gather_percent = ZhCalc.mul(ZhCalc.div(node.end_gather_tp, node.final_tp, 4), 100);
@@ -174,7 +207,31 @@ const billsPosConvertModel = (function () {
         for (const node of nodes) {
             recursiveCalculateAndSort(node.children);
             if (node.unitTree) {
-                node.unitTree.sortTreeNode();
+                node.unitTree.sortTreeNodeCustom('b_code', function (a, b) {
+                    function compareCode(code1, code2) {
+                        if (numReg.test(code1)) {
+                            if (numReg.test(code2)) {
+                                return _.toNumber(code1) - _.toNumber(code2);
+                            } else {
+                                return -1
+                            }
+                        } else {
+                            if (numReg.test(code2)) {
+                                return 1;
+                            } else {
+                                return code1 === code2 ? 0 : (code1 < code2 ? -1 : 1);
+                            }
+                        }
+                    }
+                    const numReg = /^[0-9]+$/;
+                    const aCodes = a ? a.split('-') : [], bCodes = b ? b.split('-') : [];
+                    for (let i = 0, iLength = Math.min(aCodes.length, bCodes.length); i < iLength; ++i) {
+                        const iCompare = compareCode(aCodes[i], bCodes[i]);
+                        if (iCompare !== 0) {
+                            return iCompare;
+                        }
+                    }
+                }, false);
                 recursiveCalcUnitNodes(node.unitTree.children);
                 calculateNode(node, node.unitTree.children, tpFields);
             } else if (node.children && node.children.length > 0) {

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 62 - 0
app/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js


+ 169 - 0
app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.d.ts

@@ -0,0 +1,169 @@
+/// <reference path="GC.Spread.Sheets.d.ts" />
+import { OnChanges, SimpleChanges, AfterViewInit, QueryList, OnDestroy, EventEmitter, ElementRef } from '@angular/core';
+export declare class ColumnComponent implements OnChanges {
+    private changes;
+    private sheet;
+    private index;
+    width: number;
+    dataField: string;
+    headerText: string;
+    visible: boolean;
+    resizable: boolean;
+    autoFit: boolean;
+    style: GC.Spread.Sheets.Style;
+    cellType: GC.Spread.Sheets.CellTypes.Base;
+    headerStyle: GC.Spread.Sheets.Style;
+    formatter: any;
+    onAttached(sheet: GC.Spread.Sheets.Worksheet, index: number): void;
+    private onColumnChanged();
+    ngOnChanges(changes: SimpleChanges): void;
+}
+export declare class WorksheetComponent implements OnChanges, AfterViewInit {
+    private sheet;
+    columns: QueryList<ColumnComponent>;
+    rowCount: number;
+    colCount: number;
+    dataSource: any;
+    name: string;
+    frozenColumnCount: number;
+    frozenRowCount: number;
+    frozenTrailingRowCount: number;
+    frozenTrailingColumnCount: number;
+    allowCellOverflow: boolean;
+    frozenlineColor: string;
+    sheetTabColor: string;
+    selectionPolicy: number;
+    selectionUnit: number;
+    zoom: number;
+    currentTheme: string;
+    clipBoardOptions: number;
+    rowHeaderVisible: boolean;
+    colHeaderVisible: boolean;
+    rowHeaderAutoText: number;
+    colHeaderAutoText: number;
+    rowHeaderAutoTextIndex: number;
+    colHeaderAutoTextIndex: number;
+    isProtected: boolean;
+    showRowOutline: boolean;
+    showColumnOutline: boolean;
+    selectionBackColor: string;
+    selectionBorderColor: string;
+    defaultStyle: GC.Spread.Sheets.Style;
+    rowOutlineInfo: any[];
+    columnOutlineInfo: any[];
+    autoGenerateColumns: boolean;
+    constructor();
+    onAttached(): void;
+    getSheet(): GC.Spread.Sheets.Worksheet;
+    ngOnChanges(changes: SimpleChanges): void;
+    ngAfterViewInit(): void;
+    ngOnDestroy(): void;
+}
+export declare class SpreadSheetsComponent implements OnChanges, AfterViewInit, OnDestroy {
+    private elRef;
+    private spread;
+    private spreadOptions;
+    style: {
+        width: string;
+        height: string;
+    };
+    allowUserResize: boolean;
+    allowUserZoom: boolean;
+    allowUserEditFormula: boolean;
+    allowUserDragFill: boolean;
+    allowUserDragDrop: boolean;
+    highlightInvalidData: boolean;
+    newTabVisible: boolean;
+    tabStripVisible: boolean;
+    tabEditable: boolean;
+    autoFitType: number;
+    referenceStyle: number;
+    backColor: string;
+    grayAreaBackColor: string;
+    showVerticalScrollbar: boolean;
+    showHorizontalScrollbar: boolean;
+    hostStyle: any;
+    hostClass: string;
+    name: string;
+    backgroundImage: string;
+    backgroundImageLayout: number;
+    showScrollTip: number;
+    showResizeTip: number;
+    showDragDropTip: boolean;
+    showDragFillTip: boolean;
+    workbookInitialized: EventEmitter<any>;
+    validationError: EventEmitter<any>;
+    cellClick: EventEmitter<any>;
+    cellDoubleClick: EventEmitter<any>;
+    enterCell: EventEmitter<any>;
+    leaveCell: EventEmitter<any>;
+    valueChanged: EventEmitter<any>;
+    topRowChanged: EventEmitter<any>;
+    leftColumnChanged: EventEmitter<any>;
+    invalidOperation: EventEmitter<any>;
+    rangeFiltering: EventEmitter<any>;
+    rangeFiltered: EventEmitter<any>;
+    tableFiltering: EventEmitter<any>;
+    tableFiltered: EventEmitter<any>;
+    rangeSorting: EventEmitter<any>;
+    rangeSorted: EventEmitter<any>;
+    clipboardChanging: EventEmitter<any>;
+    clipboardChanged: EventEmitter<any>;
+    clipboardPasting: EventEmitter<any>;
+    clipboardPasted: EventEmitter<any>;
+    columnWidthChanging: EventEmitter<any>;
+    columnWidthChanged: EventEmitter<any>;
+    rowHeightChanging: EventEmitter<any>;
+    rowHeightChanged: EventEmitter<any>;
+    dragDropBlock: EventEmitter<any>;
+    dragDropBlockCompleted: EventEmitter<any>;
+    dragFillBlock: EventEmitter<any>;
+    dragFillBlockCompleted: EventEmitter<any>;
+    editStarting: EventEmitter<any>;
+    editChange: EventEmitter<any>;
+    editEnding: EventEmitter<any>;
+    editEnd: EventEmitter<any>;
+    editEnded: EventEmitter<any>;
+    rangeGroupStateChanging: EventEmitter<any>;
+    rangeGroupStateChanged: EventEmitter<any>;
+    selectionChanging: EventEmitter<any>;
+    selectionChanged: EventEmitter<any>;
+    sheetTabClick: EventEmitter<any>;
+    sheetTabDoubleClick: EventEmitter<any>;
+    sheetNameChanging: EventEmitter<any>;
+    sheetNameChanged: EventEmitter<any>;
+    userZooming: EventEmitter<any>;
+    userFormulaEntered: EventEmitter<any>;
+    cellChanged: EventEmitter<any>;
+    columnChanged: EventEmitter<any>;
+    rowChanged: EventEmitter<any>;
+    activeSheetChanging: EventEmitter<any>;
+    activeSheetChanged: EventEmitter<any>;
+    sparklineChanged: EventEmitter<any>;
+    rangeChanged: EventEmitter<any>;
+    buttonClicked: EventEmitter<any>;
+    editorStatusChanged: EventEmitter<any>;
+    floatingObjectChanged: EventEmitter<any>;
+    floatingObjectSelectionChanged: EventEmitter<any>;
+    pictureChanged: EventEmitter<any>;
+    floatingObjectRemoving: EventEmitter<any>;
+    floatingObjectRemoved: EventEmitter<any>;
+    pictureSelectionChanged: EventEmitter<any>;
+    floatingObjectLoaded: EventEmitter<any>;
+    touchToolStripOpening: EventEmitter<any>;
+    commentChanged: EventEmitter<any>;
+    commentRemoving: EventEmitter<any>;
+    commentRemoved: EventEmitter<any>;
+    slicerChanged: EventEmitter<any>;
+    sheets: QueryList<WorksheetComponent>;
+    constructor(elRef: ElementRef);
+    ngAfterViewInit(): void;
+    private onSheetsChanged(sheetComponents);
+    private initSheets();
+    private bindCustomEvent(spread);
+    setSpreadOptions(): void;
+    ngOnChanges(changes: SimpleChanges): void;
+    ngOnDestroy(): void;
+}
+export declare class SpreadSheetsModule {
+}

+ 944 - 0
app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.js

@@ -0,0 +1,944 @@
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (this && this.__metadata) || function (k, v) {
+    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+var __param = (this && this.__param) || function (paramIndex, decorator) {
+    return function (target, key) { decorator(target, key, paramIndex); }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var core_1 = require("@angular/core");
+var common_1 = require("@angular/common");
+var ColumnComponent = (function () {
+    function ColumnComponent() {
+        this.changes = {};
+    }
+    ColumnComponent.prototype.onAttached = function (sheet, index) {
+        this.sheet = sheet;
+        this.index = index;
+        this.onColumnChanged();
+    };
+    ColumnComponent.prototype.onColumnChanged = function () {
+        if (this.sheet) {
+            var sheet = this.sheet;
+            sheet.suspendPaint();
+            sheet.suspendEvent();
+            var changes = this.changes;
+            for (var changeName in changes) {
+                var newValue = changes[changeName].currentValue;
+                if (newValue === null || newValue === void 0) {
+                    continue;
+                }
+                switch (changeName) {
+                    case 'width':
+                        sheet.setColumnWidth(this.index, newValue);
+                        break;
+                    case 'visible':
+                        sheet.setColumnVisible(this.index, newValue);
+                        break;
+                    case 'resizable':
+                        sheet.setColumnResizable(this.index, newValue);
+                        break;
+                    case 'autoFit':
+                        if (newValue) {
+                            sheet.autoFitColumn(this.index);
+                        }
+                        break;
+                    case 'style':
+                        sheet.setStyle(-1, this.index, newValue);
+                        break;
+                    case 'headerStyle':
+                        sheet.setStyle(-1, this.index, newValue, GC.Spread.Sheets.SheetArea.colHeader);
+                        break;
+                    case 'cellType':
+                        sheet.setCellType(-1, this.index, newValue);
+                        break;
+                    case 'formatter':
+                        sheet.setFormatter(-1, this.index, newValue, GC.Spread.Sheets.SheetArea.viewport);
+                        break;
+                }
+            }
+            sheet.resumeEvent();
+            sheet.resumePaint();
+        }
+    };
+    ColumnComponent.prototype.ngOnChanges = function (changes) {
+        this.changes = {};
+        var changesCache = this.changes;
+        for (var changeName in changes) {
+            changesCache[changeName] = changes[changeName];
+        }
+        this.onColumnChanged();
+    };
+    return ColumnComponent;
+}());
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], ColumnComponent.prototype, "width", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], ColumnComponent.prototype, "dataField", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], ColumnComponent.prototype, "headerText", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], ColumnComponent.prototype, "visible", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], ColumnComponent.prototype, "resizable", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], ColumnComponent.prototype, "autoFit", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", GC.Spread.Sheets.Style)
+], ColumnComponent.prototype, "style", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", GC.Spread.Sheets.CellTypes.Base)
+], ColumnComponent.prototype, "cellType", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", GC.Spread.Sheets.Style)
+], ColumnComponent.prototype, "headerStyle", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Object)
+], ColumnComponent.prototype, "formatter", void 0);
+ColumnComponent = __decorate([
+    core_1.Component({
+        selector: 'gc-column',
+        template: "\n        <ng-content></ng-content>\n    "
+    })
+], ColumnComponent);
+exports.ColumnComponent = ColumnComponent;
+var WorksheetComponent = (function () {
+    function WorksheetComponent() {
+        this.sheet = new GC.Spread.Sheets.Worksheet("");
+    }
+    WorksheetComponent.prototype.onAttached = function () {
+        var _this = this;
+        var sheet = this.sheet;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        if (this.dataSource) {
+            sheet.setDataSource(this.dataSource);
+            this.columns.forEach(function (columnComponent, index) {
+                if (columnComponent.dataField) {
+                    sheet.bindColumn(index, {
+                        name: columnComponent.dataField,
+                        displayName: columnComponent.headerText
+                    });
+                }
+            });
+        }
+        if (this.columns.length > 0) {
+            sheet.setColumnCount(this.columns.length);
+            this.columns.forEach(function (columnComponent, index) {
+                columnComponent.onAttached(_this.sheet, index);
+            });
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    };
+    WorksheetComponent.prototype.getSheet = function () {
+        return this.sheet;
+    };
+    WorksheetComponent.prototype.ngOnChanges = function (changes) {
+        var sheet = this.sheet;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        for (var changeName in changes) {
+            var newValue = changes[changeName].currentValue;
+            if (newValue === null || newValue === void 0) {
+                continue;
+            }
+            switch (changeName) {
+                case "rowCount":
+                    sheet.setRowCount(newValue);
+                    break;
+                case "colCount":
+                    sheet.setColumnCount(newValue);
+                    break;
+                case "name":
+                    sheet.name(newValue);
+                    break;
+                case "frozenColumnCount":
+                    sheet.frozenColumnCount(newValue);
+                    break;
+                case "frozenRowCount":
+                    sheet.frozenRowCount(newValue);
+                    break;
+                case "frozenTrailingRowCount":
+                    sheet.frozenTrailingRowCount(newValue);
+                    break;
+                case "frozenTrailingColumnCount":
+                    sheet.frozenTrailingColumnCount(newValue);
+                    break;
+                case "selectionPolicy":
+                    sheet.selectionPolicy(newValue);
+                    break;
+                case "selectionUnit":
+                    sheet.selectionUnit(newValue);
+                    break;
+                case "zoom":
+                    sheet.zoom(newValue);
+                    break;
+                case "currentTheme":
+                    sheet.currentTheme(newValue);
+                    break;
+                case "defaultStyle":
+                    sheet.setDefaultStyle(newValue);
+                    break;
+                case "rowOutlineInfo":
+                    newValue.forEach(function (item) {
+                        sheet.rowOutlines.group(item.index, item.count);
+                    });
+                    sheet.repaint();
+                    break;
+                case "columnOutlineInfo":
+                    newValue.forEach(function (item) {
+                        sheet.columnOutlines.group(item.index, item.count);
+                    });
+                    sheet.repaint();
+                    break;
+                case "showRowOutline":
+                    sheet.showRowOutline(newValue);
+                    break;
+                case "showColumnOutline":
+                    sheet.showColumnOutline(newValue);
+                    break;
+                case "dataSource":
+                    sheet.setDataSource(newValue);
+                    break;
+                case "autoGenerateColumns":
+                    sheet[changeName] = newValue;
+                default:
+                    sheet.options[changeName] = newValue;
+            }
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    };
+    WorksheetComponent.prototype.ngAfterViewInit = function () {
+        var _this = this;
+        this.columns.changes.subscribe(function () { _this.onAttached(); });
+    };
+    WorksheetComponent.prototype.ngOnDestroy = function () {
+        var sheet = this.sheet;
+        var spread = sheet ? sheet.getParent() : null;
+        if (spread) {
+            var sheetIndex = spread.getSheetIndex(sheet.name());
+            if (sheetIndex !== void 0) {
+                spread.removeSheet(sheetIndex);
+            }
+        }
+    };
+    return WorksheetComponent;
+}());
+__decorate([
+    core_1.ContentChildren(ColumnComponent),
+    __metadata("design:type", core_1.QueryList)
+], WorksheetComponent.prototype, "columns", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "rowCount", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "colCount", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Object)
+], WorksheetComponent.prototype, "dataSource", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], WorksheetComponent.prototype, "name", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "frozenColumnCount", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "frozenRowCount", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "frozenTrailingRowCount", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "frozenTrailingColumnCount", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], WorksheetComponent.prototype, "allowCellOverflow", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], WorksheetComponent.prototype, "frozenlineColor", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], WorksheetComponent.prototype, "sheetTabColor", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "selectionPolicy", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "selectionUnit", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "zoom", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], WorksheetComponent.prototype, "currentTheme", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "clipBoardOptions", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], WorksheetComponent.prototype, "rowHeaderVisible", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], WorksheetComponent.prototype, "colHeaderVisible", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "rowHeaderAutoText", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "colHeaderAutoText", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "rowHeaderAutoTextIndex", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], WorksheetComponent.prototype, "colHeaderAutoTextIndex", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], WorksheetComponent.prototype, "isProtected", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], WorksheetComponent.prototype, "showRowOutline", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], WorksheetComponent.prototype, "showColumnOutline", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], WorksheetComponent.prototype, "selectionBackColor", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], WorksheetComponent.prototype, "selectionBorderColor", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", GC.Spread.Sheets.Style)
+], WorksheetComponent.prototype, "defaultStyle", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Array)
+], WorksheetComponent.prototype, "rowOutlineInfo", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Array)
+], WorksheetComponent.prototype, "columnOutlineInfo", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], WorksheetComponent.prototype, "autoGenerateColumns", void 0);
+WorksheetComponent = __decorate([
+    core_1.Component({
+        selector: 'gc-worksheet',
+        template: "\n        <ng-content></ng-content>\n    "
+    }),
+    __metadata("design:paramtypes", [])
+], WorksheetComponent);
+exports.WorksheetComponent = WorksheetComponent;
+var SpreadSheetsComponent = (function () {
+    function SpreadSheetsComponent(elRef) {
+        this.style = {
+            width: '800px',
+            height: '600px'
+        };
+        this.workbookInitialized = new core_1.EventEmitter();
+        this.validationError = new core_1.EventEmitter();
+        this.cellClick = new core_1.EventEmitter();
+        this.cellDoubleClick = new core_1.EventEmitter();
+        this.enterCell = new core_1.EventEmitter();
+        this.leaveCell = new core_1.EventEmitter();
+        this.valueChanged = new core_1.EventEmitter();
+        this.topRowChanged = new core_1.EventEmitter();
+        this.leftColumnChanged = new core_1.EventEmitter();
+        this.invalidOperation = new core_1.EventEmitter();
+        this.rangeFiltering = new core_1.EventEmitter();
+        this.rangeFiltered = new core_1.EventEmitter();
+        this.tableFiltering = new core_1.EventEmitter();
+        this.tableFiltered = new core_1.EventEmitter();
+        this.rangeSorting = new core_1.EventEmitter();
+        this.rangeSorted = new core_1.EventEmitter();
+        this.clipboardChanging = new core_1.EventEmitter();
+        this.clipboardChanged = new core_1.EventEmitter();
+        this.clipboardPasting = new core_1.EventEmitter();
+        this.clipboardPasted = new core_1.EventEmitter();
+        this.columnWidthChanging = new core_1.EventEmitter();
+        this.columnWidthChanged = new core_1.EventEmitter();
+        this.rowHeightChanging = new core_1.EventEmitter();
+        this.rowHeightChanged = new core_1.EventEmitter();
+        this.dragDropBlock = new core_1.EventEmitter();
+        this.dragDropBlockCompleted = new core_1.EventEmitter();
+        this.dragFillBlock = new core_1.EventEmitter();
+        this.dragFillBlockCompleted = new core_1.EventEmitter();
+        this.editStarting = new core_1.EventEmitter();
+        this.editChange = new core_1.EventEmitter();
+        this.editEnding = new core_1.EventEmitter();
+        this.editEnd = new core_1.EventEmitter();
+        this.editEnded = new core_1.EventEmitter();
+        this.rangeGroupStateChanging = new core_1.EventEmitter();
+        this.rangeGroupStateChanged = new core_1.EventEmitter();
+        this.selectionChanging = new core_1.EventEmitter();
+        this.selectionChanged = new core_1.EventEmitter();
+        this.sheetTabClick = new core_1.EventEmitter();
+        this.sheetTabDoubleClick = new core_1.EventEmitter();
+        this.sheetNameChanging = new core_1.EventEmitter();
+        this.sheetNameChanged = new core_1.EventEmitter();
+        this.userZooming = new core_1.EventEmitter();
+        this.userFormulaEntered = new core_1.EventEmitter();
+        this.cellChanged = new core_1.EventEmitter();
+        this.columnChanged = new core_1.EventEmitter();
+        this.rowChanged = new core_1.EventEmitter();
+        this.activeSheetChanging = new core_1.EventEmitter();
+        this.activeSheetChanged = new core_1.EventEmitter();
+        this.sparklineChanged = new core_1.EventEmitter();
+        this.rangeChanged = new core_1.EventEmitter();
+        this.buttonClicked = new core_1.EventEmitter();
+        this.editorStatusChanged = new core_1.EventEmitter();
+        this.floatingObjectChanged = new core_1.EventEmitter();
+        this.floatingObjectSelectionChanged = new core_1.EventEmitter();
+        this.pictureChanged = new core_1.EventEmitter();
+        this.floatingObjectRemoving = new core_1.EventEmitter();
+        this.floatingObjectRemoved = new core_1.EventEmitter();
+        this.pictureSelectionChanged = new core_1.EventEmitter();
+        this.floatingObjectLoaded = new core_1.EventEmitter();
+        this.touchToolStripOpening = new core_1.EventEmitter();
+        this.commentChanged = new core_1.EventEmitter();
+        this.commentRemoving = new core_1.EventEmitter();
+        this.commentRemoved = new core_1.EventEmitter();
+        this.slicerChanged = new core_1.EventEmitter();
+        this.elRef = elRef;
+    }
+    SpreadSheetsComponent.prototype.ngAfterViewInit = function () {
+        var _this = this;
+        var elRef = this.elRef;
+        var dom = elRef.nativeElement;
+        var hostElement = dom.querySelector('div');
+        this.spread = new GC.Spread.Sheets.Workbook(hostElement, { sheetCount: 0 });
+        this.setSpreadOptions();
+        this.initSheets();
+        this.sheets.changes.subscribe(function (changes) { _this.onSheetsChanged(changes); });
+        this.bindCustomEvent(this.spread);
+        this.workbookInitialized.emit({ spread: this.spread });
+    };
+    SpreadSheetsComponent.prototype.onSheetsChanged = function (sheetComponents) {
+        var spread = this.spread;
+        spread.suspendPaint();
+        if (sheetComponents) {
+            sheetComponents.forEach(function (sheetComponent, index) {
+                var sheet = sheetComponent.getSheet();
+                if (sheet && !sheet.getParent()) {
+                    spread.addSheet(index, sheetComponent.getSheet());
+                    sheetComponent.onAttached();
+                }
+            });
+        }
+        spread.resumePaint();
+    };
+    SpreadSheetsComponent.prototype.initSheets = function () {
+        var sheets = this.sheets;
+        var spread = this.spread;
+        spread.clearSheets();
+        sheets.forEach(function (sheetComponent, index) {
+            spread.addSheet(index, sheetComponent.getSheet());
+            sheetComponent.onAttached();
+        });
+        if (sheets.length === 0) {
+            this.spread.addSheet(0, new GC.Spread.Sheets.Worksheet(""));
+        }
+    };
+    SpreadSheetsComponent.prototype.bindCustomEvent = function (spread) {
+        var _this = this;
+        var customEventNameSpace = '.ng';
+        var events = ['ValidationError', 'CellClick', 'CellDoubleClick', 'EnterCell',
+            'LeaveCell', 'ValueChanged', 'TopRowChanged', 'LeftColumnChanged',
+            'InvalidOperation', 'RangeFiltering', 'RangeFiltered', 'TableFiltering',
+            'TableFiltered', 'RangeSorting', 'RangeSorted', 'ClipboardChanging',
+            'ClipboardChanged', 'ClipboardPasting', 'ClipboardPasted', 'ColumnWidthChanging',
+            'ColumnWidthChanged', 'RowHeightChanging', 'RowHeightChanged', 'DragDropBlock',
+            'DragDropBlockCompleted', 'DragFillBlock', 'DragFillBlockCompleted', 'EditStarting',
+            'EditChange', 'EditEnding', 'EditEnd', 'EditEnded', 'RangeGroupStateChanging',
+            'RangeGroupStateChanged', 'SelectionChanging', 'SelectionChanged', 'SheetTabClick',
+            'SheetTabDoubleClick', 'SheetNameChanging', 'SheetNameChanged',
+            'UserZooming', 'UserFormulaEntered', 'CellChanged', 'ColumnChanged',
+            'RowChanged', 'ActiveSheetChanging', 'ActiveSheetChanged',
+            'SparklineChanged',
+            'RangeChanged', 'ButtonClicked', 'EditorStatusChanged',
+            'FloatingObjectChanged', 'FloatingObjectSelectionChanged', 'PictureChanged', 'FloatingObjectRemoving', 'FloatingObjectRemoved', 'PictureSelectionChanged',
+            'FloatingObjectLoaded', 'TouchToolStripOpening', 'CommentChanged', 'CommentRemoving', 'CommentRemoved', 'SlicerChanged'];
+        events.forEach(function (event) {
+            spread.bind(event + customEventNameSpace, function (event, data) {
+                var eventType = event.type;
+                var camelCaseEvent = eventType[0].toLowerCase() + eventType.substr(1);
+                _this[camelCaseEvent].emit(data);
+            });
+        });
+    };
+    SpreadSheetsComponent.prototype.setSpreadOptions = function () {
+        var spread = this.spread;
+        if (!this.spread) {
+            return;
+        }
+        spread.suspendEvent();
+        spread.suspendPaint();
+        var options = this.spreadOptions;
+        options && options.forEach(function (option) {
+            if (option.name === 'name') {
+                spread.name = option.value;
+            }
+            else {
+                spread.options[option.name] = option.value;
+            }
+        });
+        spread.resumePaint();
+        spread.resumeEvent();
+    };
+    SpreadSheetsComponent.prototype.ngOnChanges = function (changes) {
+        var options = [];
+        for (var changeName in changes) {
+            var newValue = changes[changeName].currentValue;
+            if (newValue !== null && newValue !== void 0) {
+                switch (changeName) {
+                    case 'hostStyle':
+                        this.style = newValue;
+                        break;
+                    case 'hostClass':
+                        break;
+                    default:
+                        options.push({ name: changeName, value: newValue });
+                }
+            }
+        }
+        this.spreadOptions = options;
+        this.setSpreadOptions();
+    };
+    SpreadSheetsComponent.prototype.ngOnDestroy = function () {
+        this.spread.destroy();
+    };
+    return SpreadSheetsComponent;
+}());
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "allowUserResize", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "allowUserZoom", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "allowUserEditFormula", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "allowUserDragFill", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "allowUserDragDrop", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "highlightInvalidData", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "newTabVisible", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "tabStripVisible", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "tabEditable", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], SpreadSheetsComponent.prototype, "autoFitType", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], SpreadSheetsComponent.prototype, "referenceStyle", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], SpreadSheetsComponent.prototype, "backColor", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], SpreadSheetsComponent.prototype, "grayAreaBackColor", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "showVerticalScrollbar", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "showHorizontalScrollbar", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "hostStyle", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], SpreadSheetsComponent.prototype, "hostClass", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], SpreadSheetsComponent.prototype, "name", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", String)
+], SpreadSheetsComponent.prototype, "backgroundImage", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], SpreadSheetsComponent.prototype, "backgroundImageLayout", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], SpreadSheetsComponent.prototype, "showScrollTip", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Number)
+], SpreadSheetsComponent.prototype, "showResizeTip", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "showDragDropTip", void 0);
+__decorate([
+    core_1.Input(),
+    __metadata("design:type", Boolean)
+], SpreadSheetsComponent.prototype, "showDragFillTip", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "workbookInitialized", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "validationError", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "cellClick", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "cellDoubleClick", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "enterCell", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "leaveCell", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "valueChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "topRowChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "leftColumnChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "invalidOperation", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rangeFiltering", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rangeFiltered", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "tableFiltering", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "tableFiltered", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rangeSorting", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rangeSorted", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "clipboardChanging", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "clipboardChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "clipboardPasting", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "clipboardPasted", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "columnWidthChanging", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "columnWidthChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rowHeightChanging", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rowHeightChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "dragDropBlock", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "dragDropBlockCompleted", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "dragFillBlock", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "dragFillBlockCompleted", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "editStarting", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "editChange", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "editEnding", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "editEnd", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "editEnded", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rangeGroupStateChanging", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rangeGroupStateChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "selectionChanging", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "selectionChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "sheetTabClick", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "sheetTabDoubleClick", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "sheetNameChanging", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "sheetNameChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "userZooming", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "userFormulaEntered", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "cellChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "columnChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rowChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "activeSheetChanging", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "activeSheetChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "sparklineChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "rangeChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "buttonClicked", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "editorStatusChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "floatingObjectChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "floatingObjectSelectionChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "pictureChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "floatingObjectRemoving", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "floatingObjectRemoved", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "pictureSelectionChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "floatingObjectLoaded", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "touchToolStripOpening", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "commentChanged", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "commentRemoving", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "commentRemoved", void 0);
+__decorate([
+    core_1.Output(),
+    __metadata("design:type", Object)
+], SpreadSheetsComponent.prototype, "slicerChanged", void 0);
+__decorate([
+    core_1.ContentChildren(WorksheetComponent),
+    __metadata("design:type", core_1.QueryList)
+], SpreadSheetsComponent.prototype, "sheets", void 0);
+SpreadSheetsComponent = __decorate([
+    core_1.Component({
+        selector: 'gc-spread-sheets',
+        template: "\n        <div [ngStyle]=\"style\" [ngClass]=\"hostClass\">\n            <ng-content></ng-content>\n        </div>\n    "
+    }),
+    __param(0, core_1.Inject(core_1.ElementRef)),
+    __metadata("design:paramtypes", [core_1.ElementRef])
+], SpreadSheetsComponent);
+exports.SpreadSheetsComponent = SpreadSheetsComponent;
+var SpreadSheetsModule = (function () {
+    function SpreadSheetsModule() {
+    }
+    return SpreadSheetsModule;
+}());
+SpreadSheetsModule = __decorate([
+    core_1.NgModule({
+        imports: [common_1.CommonModule],
+        declarations: [SpreadSheetsComponent, WorksheetComponent, ColumnComponent],
+        exports: [SpreadSheetsComponent, WorksheetComponent, ColumnComponent]
+    })
+], SpreadSheetsModule);
+exports.SpreadSheetsModule = SpreadSheetsModule;

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 0
app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.min.js


+ 496 - 0
app/public/js/spreadjs/sheets/v11/interop/angular/gc.spread.sheets.angular.11.2.2.ts

@@ -0,0 +1,496 @@
+///<reference path="./GC.Spread.Sheets.d.ts" />
+import { Component, Input, OnChanges, SimpleChanges, AfterViewInit, QueryList, ContentChildren, OnDestroy, Output, EventEmitter, ElementRef, Inject, NgModule } from '@angular/core'; 
+import { CommonModule } from '@angular/common'; 
+
+@Component({
+    selector: 'gc-column',
+    template: `
+        <ng-content></ng-content>
+    `
+})
+export class ColumnComponent implements OnChanges {
+    private changes: any = {};
+    private sheet: GC.Spread.Sheets.Worksheet;
+    private index: number;
+
+    //indicate all inputs
+    @Input() width: number;
+    @Input() dataField: string;
+    @Input() headerText: string;
+    @Input() visible: boolean;
+    @Input() resizable: boolean;
+    @Input() autoFit: boolean;
+    @Input() style: GC.Spread.Sheets.Style;
+    @Input() cellType: GC.Spread.Sheets.CellTypes.Base;
+    @Input() headerStyle: GC.Spread.Sheets.Style;
+    @Input() formatter: any;
+
+    public onAttached(sheet: GC.Spread.Sheets.Worksheet, index: number): void {
+        this.sheet = sheet;
+        this.index = index;
+        this.onColumnChanged();
+    }
+
+    private onColumnChanged() {
+        if (this.sheet) {
+            let sheet = this.sheet;
+            sheet.suspendPaint();
+            sheet.suspendEvent();
+            let changes = this.changes;
+            for (let changeName in changes) {
+                let newValue = changes[changeName].currentValue;
+                if (newValue === null || newValue === void 0) {
+                    continue;
+                }
+                switch (changeName) {
+                    case 'width':
+                        sheet.setColumnWidth(this.index, newValue);
+                        break;
+                    case 'visible':
+                        sheet.setColumnVisible(this.index, newValue);
+                        break;
+                    case 'resizable':
+                        sheet.setColumnResizable(this.index, newValue);
+                        break;
+                    case 'autoFit':
+                        if (newValue) {
+                            sheet.autoFitColumn(this.index);
+                        }
+                        break;
+                    case 'style':
+                        sheet.setStyle(-1, this.index, newValue);
+                        break;
+                    case 'headerStyle':
+                        sheet.setStyle(-1, this.index, newValue, GC.Spread.Sheets.SheetArea.colHeader);
+                        break;
+                    case 'cellType':
+                        sheet.setCellType(-1, this.index, newValue);
+                        break;
+                    case 'formatter':
+                        sheet.setFormatter(-1, this.index, newValue, GC.Spread.Sheets.SheetArea.viewport);
+                        break;
+                }
+            }
+            sheet.resumeEvent();
+            sheet.resumePaint();
+        }
+    }
+
+    ngOnChanges(changes: SimpleChanges) {
+        this.changes = {};
+        let changesCache = this.changes;
+        for (let changeName in changes) {
+            changesCache[changeName] = changes[changeName];
+        }
+        this.onColumnChanged();
+    }
+}
+
+@Component({
+    selector: 'gc-worksheet',
+    template: `
+        <ng-content></ng-content>
+    `
+})
+export class WorksheetComponent implements OnChanges, AfterViewInit {
+    private sheet: GC.Spread.Sheets.Worksheet;
+    @ContentChildren(ColumnComponent)
+    columns: QueryList<ColumnComponent>;
+
+    //indicate all inputs
+    @Input() rowCount: number;
+    @Input() colCount: number;
+    @Input() dataSource: any;
+    @Input() name: string;
+    @Input() frozenColumnCount: number;
+    @Input() frozenRowCount: number;
+    @Input() frozenTrailingRowCount: number;
+    @Input() frozenTrailingColumnCount: number;
+    @Input() allowCellOverflow: boolean;
+    @Input() frozenlineColor: string;
+    @Input() sheetTabColor: string;
+    @Input() selectionPolicy: number;
+    @Input() selectionUnit: number;
+    @Input() zoom: number;
+    @Input() currentTheme: string;
+    @Input() clipBoardOptions: number;
+    @Input() rowHeaderVisible: boolean;
+    @Input() colHeaderVisible: boolean;
+    @Input() rowHeaderAutoText: number;
+    @Input() colHeaderAutoText: number;
+    @Input() rowHeaderAutoTextIndex: number;
+    @Input() colHeaderAutoTextIndex: number;
+    @Input() isProtected: boolean;
+    @Input() showRowOutline: boolean;
+    @Input() showColumnOutline: boolean;
+    @Input() selectionBackColor: string;
+    @Input() selectionBorderColor: string;
+    @Input() defaultStyle: GC.Spread.Sheets.Style;
+    @Input() rowOutlineInfo: any[];
+    @Input() columnOutlineInfo: any[];
+    @Input() autoGenerateColumns: boolean;
+
+
+    constructor() {
+        this.sheet = new GC.Spread.Sheets.Worksheet("");
+    }
+
+    public onAttached(): void {
+        let sheet = this.sheet;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        if (this.dataSource) {
+            sheet.setDataSource(this.dataSource);
+            this.columns.forEach((columnComponent: ColumnComponent, index: number) => {
+                if (columnComponent.dataField) {
+                    sheet.bindColumn(index, {
+                        name: columnComponent.dataField,
+                        displayName: columnComponent.headerText
+                    });
+                }
+            });
+        }
+        if (this.columns.length > 0) {
+            sheet.setColumnCount(this.columns.length);
+            this.columns.forEach((columnComponent: ColumnComponent, index: number) => {
+                columnComponent.onAttached(this.sheet, index);
+            });
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    }
+    public getSheet() {
+        return this.sheet;
+    }
+
+    ngOnChanges(changes: SimpleChanges) {
+        let sheet = this.sheet;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        for (let changeName in changes) {
+            let newValue = changes[changeName].currentValue;
+            if (newValue === null || newValue === void 0) {
+                continue;
+            }
+            switch (changeName) {
+                case "rowCount":
+                    sheet.setRowCount(newValue);
+                    break;
+                case "colCount":
+                    sheet.setColumnCount(newValue);
+                    break;
+                case "name":
+                    sheet.name(newValue);
+                    break;
+                case "frozenColumnCount":
+                    sheet.frozenColumnCount(newValue);
+                    break;
+                case "frozenRowCount":
+                    sheet.frozenRowCount(newValue);
+                    break;
+                case "frozenTrailingRowCount":
+                    sheet.frozenTrailingRowCount(newValue);
+                    break;
+                case "frozenTrailingColumnCount":
+                    sheet.frozenTrailingColumnCount(newValue);
+                    break;
+                case "selectionPolicy":
+                    sheet.selectionPolicy(newValue);
+                    break;
+                case "selectionUnit":
+                    sheet.selectionUnit(newValue);
+                    break;
+                case "zoom":
+                    sheet.zoom(newValue);
+                    break;
+                case "currentTheme":
+                    sheet.currentTheme(newValue);
+                    break;
+                case "defaultStyle":
+                    sheet.setDefaultStyle(newValue);
+                    break;
+                case "rowOutlineInfo":
+                    newValue.forEach((item: any) => {
+                        sheet.rowOutlines.group(item.index, item.count);
+                    });
+                    sheet.repaint();
+                    break;
+                case "columnOutlineInfo":
+                    newValue.forEach((item: any) => {
+                        sheet.columnOutlines.group(item.index, item.count);
+                    });
+                    sheet.repaint();
+                    break;
+                case "showRowOutline":
+                    sheet.showRowOutline(newValue);
+                    break;
+                case "showColumnOutline":
+                    sheet.showColumnOutline(newValue);
+                    break;
+                case "dataSource":
+                    sheet.setDataSource(newValue);
+                    break;
+                case "autoGenerateColumns":
+                    sheet[changeName] = newValue;
+                default:
+                    sheet.options[changeName] = newValue;
+            }
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    }
+
+    ngAfterViewInit() {
+        this.columns.changes.subscribe(() => { this.onAttached() });
+    }
+
+    ngOnDestroy() {
+        let sheet = this.sheet;
+        let spread = sheet ? sheet.getParent() : null;
+        if (spread) {
+            let sheetIndex = spread.getSheetIndex(sheet.name());
+            if (sheetIndex !== void 0) {
+                spread.removeSheet(sheetIndex);
+            }
+        }
+    }
+}
+
+@Component({
+    selector: 'gc-spread-sheets',
+    template: `
+        <div [ngStyle]="style" [ngClass]="hostClass">
+            <ng-content></ng-content>
+        </div>
+    `
+})
+export class SpreadSheetsComponent implements OnChanges, AfterViewInit, OnDestroy {
+    private elRef: ElementRef;
+    private spread: GC.Spread.Sheets.Workbook;
+    private spreadOptions: any[];
+
+    style = {
+        width: '800px',
+        height: '600px'
+    };
+
+    // indicate all options
+    @Input() allowUserResize: boolean;
+    @Input() allowUserZoom: boolean;
+    @Input() allowUserEditFormula: boolean;
+    @Input() allowUserDragFill: boolean;
+    @Input() allowUserDragDrop: boolean;
+    @Input() highlightInvalidData: boolean;
+    @Input() newTabVisible: boolean;
+    @Input() tabStripVisible: boolean;
+    @Input() tabEditable: boolean;
+    @Input() autoFitType: number;
+    @Input() referenceStyle: number;
+    @Input() backColor: string;
+    @Input() grayAreaBackColor: string;
+    @Input() showVerticalScrollbar: boolean;
+    @Input() showHorizontalScrollbar: boolean;
+    @Input() hostStyle: any; // used for get styles form parent host DIV
+    @Input() hostClass: string;
+    @Input() name: string;
+    @Input() backgroundImage: string;
+    @Input() backgroundImageLayout: number;
+    @Input() showScrollTip: number;
+    @Input() showResizeTip: number;
+    @Input() showDragDropTip: boolean;
+    @Input() showDragFillTip: boolean;
+
+
+    //outputs events
+    @Output() workbookInitialized = new EventEmitter<any>();
+    @Output() validationError = new EventEmitter<any>();
+    @Output() cellClick = new EventEmitter<any>();
+    @Output() cellDoubleClick = new EventEmitter<any>();
+    @Output() enterCell = new EventEmitter<any>();
+    @Output() leaveCell = new EventEmitter<any>();
+    @Output() valueChanged = new EventEmitter<any>();
+    @Output() topRowChanged = new EventEmitter<any>();
+    @Output() leftColumnChanged = new EventEmitter<any>();
+    @Output() invalidOperation = new EventEmitter<any>();
+    @Output() rangeFiltering = new EventEmitter<any>();
+    @Output() rangeFiltered = new EventEmitter<any>();
+    @Output() tableFiltering = new EventEmitter<any>();
+    @Output() tableFiltered = new EventEmitter<any>();
+    @Output() rangeSorting = new EventEmitter<any>();
+    @Output() rangeSorted = new EventEmitter<any>();
+    @Output() clipboardChanging = new EventEmitter<any>();
+    @Output() clipboardChanged = new EventEmitter<any>();
+    @Output() clipboardPasting = new EventEmitter<any>();
+    @Output() clipboardPasted = new EventEmitter<any>();
+    @Output() columnWidthChanging = new EventEmitter<any>();
+    @Output() columnWidthChanged = new EventEmitter<any>();
+    @Output() rowHeightChanging = new EventEmitter<any>();
+    @Output() rowHeightChanged = new EventEmitter<any>();
+    @Output() dragDropBlock = new EventEmitter<any>();
+    @Output() dragDropBlockCompleted = new EventEmitter<any>();
+    @Output() dragFillBlock = new EventEmitter<any>();
+    @Output() dragFillBlockCompleted = new EventEmitter<any>();
+    @Output() editStarting = new EventEmitter<any>();
+    @Output() editChange = new EventEmitter<any>();
+    @Output() editEnding = new EventEmitter<any>();
+    @Output() editEnd = new EventEmitter<any>();
+    @Output() editEnded = new EventEmitter<any>();
+    @Output() rangeGroupStateChanging = new EventEmitter<any>();
+    @Output() rangeGroupStateChanged = new EventEmitter<any>();
+    @Output() selectionChanging = new EventEmitter<any>();
+    @Output() selectionChanged = new EventEmitter<any>();
+    @Output() sheetTabClick = new EventEmitter<any>();
+    @Output() sheetTabDoubleClick = new EventEmitter<any>();
+    @Output() sheetNameChanging = new EventEmitter<any>();
+    @Output() sheetNameChanged = new EventEmitter<any>();
+    @Output() userZooming = new EventEmitter<any>();
+    @Output() userFormulaEntered = new EventEmitter<any>();
+    @Output() cellChanged = new EventEmitter<any>();
+    @Output() columnChanged = new EventEmitter<any>();
+    @Output() rowChanged = new EventEmitter<any>();
+    @Output() activeSheetChanging = new EventEmitter<any>();
+    @Output() activeSheetChanged = new EventEmitter<any>();
+    @Output() sparklineChanged = new EventEmitter<any>();
+    @Output() rangeChanged = new EventEmitter<any>();
+    @Output() buttonClicked = new EventEmitter<any>();
+    @Output() editorStatusChanged = new EventEmitter<any>();
+    @Output() floatingObjectChanged = new EventEmitter<any>();
+    @Output() floatingObjectSelectionChanged = new EventEmitter<any>();
+    @Output() pictureChanged = new EventEmitter<any>();
+    @Output() floatingObjectRemoving = new EventEmitter<any>();
+    @Output() floatingObjectRemoved = new EventEmitter<any>();
+    @Output() pictureSelectionChanged = new EventEmitter<any>();
+    @Output() floatingObjectLoaded = new EventEmitter<any>();
+    @Output() touchToolStripOpening = new EventEmitter<any>();
+    @Output() commentChanged = new EventEmitter<any>();
+    @Output() commentRemoving = new EventEmitter<any>();
+    @Output() commentRemoved = new EventEmitter<any>();
+    @Output() slicerChanged = new EventEmitter<any>();
+
+
+    @ContentChildren(WorksheetComponent)
+    sheets: QueryList<WorksheetComponent>;
+
+    constructor(@Inject(ElementRef) elRef: ElementRef) {
+        this.elRef = elRef;
+    }
+
+    ngAfterViewInit() {
+        let elRef = this.elRef;
+        let dom = <HTMLElement>elRef.nativeElement;
+        let hostElement = dom.querySelector('div');
+        this.spread = new GC.Spread.Sheets.Workbook(hostElement, { sheetCount: 0 });
+        this.setSpreadOptions();
+        this.initSheets();
+        this.sheets.changes.subscribe((changes) => { this.onSheetsChanged(changes) }) // may change sheets using bingidng.
+        this.bindCustomEvent(this.spread);
+        this.workbookInitialized.emit({ spread: this.spread });
+    }
+
+    private onSheetsChanged(sheetComponents: QueryList<WorksheetComponent>) {
+        let spread = this.spread;
+        spread.suspendPaint();
+        if (sheetComponents) {
+            sheetComponents.forEach((sheetComponent: WorksheetComponent, index: number) => {
+                let sheet = sheetComponent.getSheet();
+                if (sheet && !sheet.getParent()) {
+                    spread.addSheet(index, sheetComponent.getSheet());
+                    sheetComponent.onAttached();
+                }
+            });
+        }
+        spread.resumePaint();
+    }
+
+    private initSheets() {
+        let sheets = this.sheets;
+        let spread = this.spread;
+        spread.clearSheets();
+        sheets.forEach((sheetComponent, index) => {
+            spread.addSheet(index, sheetComponent.getSheet());
+            sheetComponent.onAttached();
+        });
+        // when there is no sheet, add default sheet to spread
+        if (sheets.length === 0) {
+            this.spread.addSheet(0, new GC.Spread.Sheets.Worksheet(""));
+        }
+    }
+
+    private bindCustomEvent(spread: GC.Spread.Sheets.Workbook) {
+        let customEventNameSpace = '.ng';
+        let events = ['ValidationError', 'CellClick', 'CellDoubleClick', 'EnterCell',
+            'LeaveCell', 'ValueChanged', 'TopRowChanged', 'LeftColumnChanged',
+            'InvalidOperation', 'RangeFiltering', 'RangeFiltered', 'TableFiltering',
+            'TableFiltered', 'RangeSorting', 'RangeSorted', 'ClipboardChanging',
+            'ClipboardChanged', 'ClipboardPasting', 'ClipboardPasted', 'ColumnWidthChanging',
+            'ColumnWidthChanged', 'RowHeightChanging', 'RowHeightChanged', 'DragDropBlock',
+            'DragDropBlockCompleted', 'DragFillBlock', 'DragFillBlockCompleted', 'EditStarting',
+            'EditChange', 'EditEnding', 'EditEnd', 'EditEnded', 'RangeGroupStateChanging',
+            'RangeGroupStateChanged', 'SelectionChanging', 'SelectionChanged', 'SheetTabClick',
+            'SheetTabDoubleClick', 'SheetNameChanging', 'SheetNameChanged',
+            'UserZooming', 'UserFormulaEntered', 'CellChanged', 'ColumnChanged',
+            'RowChanged', 'ActiveSheetChanging', 'ActiveSheetChanged',
+            'SparklineChanged',
+            'RangeChanged', 'ButtonClicked', 'EditorStatusChanged',
+            'FloatingObjectChanged', 'FloatingObjectSelectionChanged', 'PictureChanged', 'FloatingObjectRemoving', 'FloatingObjectRemoved', 'PictureSelectionChanged',
+            'FloatingObjectLoaded', 'TouchToolStripOpening', 'CommentChanged', 'CommentRemoving', 'CommentRemoved', 'SlicerChanged'];
+        events.forEach((event) => {
+            spread.bind(event + customEventNameSpace, (event: any, data: any) => {
+                let eventType = event.type;
+                let camelCaseEvent = eventType[0].toLowerCase() + eventType.substr(1);
+                this[camelCaseEvent].emit(data);
+            });
+        });
+    }
+
+    setSpreadOptions() {
+        let spread = this.spread;
+        if (!this.spread) {
+            return;
+        }
+        spread.suspendEvent();
+        spread.suspendPaint();
+        let options = this.spreadOptions;
+        options && options.forEach((option) => {
+            if (option.name === 'name') {
+                spread.name = option.value;
+            } else {
+                spread.options[option.name] = option.value;
+            }
+        });
+        spread.resumePaint();
+        spread.resumeEvent();
+    }
+
+    ngOnChanges(changes: SimpleChanges) {
+        let options = [];
+        for (let changeName in changes) {
+            let newValue = changes[changeName].currentValue;
+            if (newValue !== null && newValue !== void 0) {
+                switch (changeName) {
+                    case 'hostStyle':
+                        this.style = newValue;
+                        break;
+                    case 'hostClass':
+                        break;
+                    default:
+                        options.push({ name: changeName, value: newValue });
+                }
+            }
+        }
+        this.spreadOptions = options;
+        this.setSpreadOptions();
+    }
+
+    ngOnDestroy() {
+        this.spread.destroy();
+    }
+}
+
+@NgModule({
+    imports: [CommonModule],
+    declarations: [SpreadSheetsComponent, WorksheetComponent, ColumnComponent],
+    exports: [SpreadSheetsComponent, WorksheetComponent, ColumnComponent]
+})
+export class SpreadSheetsModule {
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1360 - 0
app/public/js/spreadjs/sheets/v11/interop/angularjs/gc.spread.sheets.angularjs.11.2.2.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/interop/angularjs/gc.spread.sheets.angularjs.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 36 - 0
app/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 3 - 0
app/public/js/spreadjs/sheets/v11/interop/gc.spread.sheets.migration.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 0
app/public/js/spreadjs/sheets/v11/interop/react/gc.spread.sheets.react.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 0
app/public/js/spreadjs/sheets/v11/interop/vuejs/gc.spread.sheets.vue.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 17 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.calcengine.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 15 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.calcengine.advancedfunctions.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.calcengine.basicfunctions.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 16 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.common.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.bindings.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.celltypes.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.comments.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 15 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.conditionalformatting.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.contextmenu.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 29 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.core.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.datavalidation.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.dragmerge.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.fill.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 16 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.filter.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.floatingobjects.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.formulatextbox.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.outlinecolumn.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.outlines.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 13 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.search.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.slicers.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.sparklines.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.tables.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/modules/gc.spread.sheets.touch.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 39 - 0
app/public/js/spreadjs/sheets/v11/plugins/gc.spread.sheets.charts.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 39 - 0
app/public/js/spreadjs/sheets/v11/plugins/gc.spread.sheets.pdf.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 14 - 0
app/public/js/spreadjs/sheets/v11/plugins/gc.spread.sheets.print.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 17 - 0
app/public/js/spreadjs/sheets/v11/resources/ja/gc.spread.sheets.resources.ja.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 17 - 0
app/public/js/spreadjs/sheets/v11/resources/ko/gc.spread.sheets.resources.ko.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 16 - 0
app/public/js/spreadjs/sheets/v11/resources/zh/gc.spread.sheets.resources.zh.11.2.2.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 97 - 2
app/public/js/spreadjs_rela/spreadjs_zh.js


+ 1 - 1
app/public/js/stage_bwtz.js

@@ -32,7 +32,7 @@ $(document).ready(() => {
     xmjSpread.bind(spreadNS.Events.SelectionChanged, unitTreeObj.loadCurUnitData);
 
     postData(preUrl + '/load', { filter: 'ledger;pos;change' }, function (result) {
-        billsPosConvertModel.loadData(result.ledgerData, result.posData, result.changeData);
+        billsPosConvertModel.loadData(result.ledgerData, result.posData, result.changeData, decimal);
         const xmjTree = billsPosConvertModel.convert();
         SpreadJsObj.loadSheetData(xmjSheet, SpreadJsObj.DataType.Tree, xmjTree);
         unitTreeObj.loadCurUnitData();

+ 21 - 7
app/service/ledger.js

@@ -28,6 +28,7 @@ const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty', '
 const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
 const rootId = -1;
 const keyPre = 'tender_node_maxId:';
+const measureType = require('../const/tender').measureType;
 
 module.exports = app => {
 
@@ -478,6 +479,12 @@ module.exports = app => {
                         id: selectData.id,
                         is_leaf: false,
                         unit_price: null,
+                        sgfh_qty: null,
+                        sgfh_tp: null,
+                        sjcl_qty: null,
+                        sjcl_tp: null,
+                        qtcl_qty: null,
+                        qtcl_tp: null,
                         quantity: null,
                         total_price: null,
                         deal_qty: null,
@@ -684,7 +691,7 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.pos.tableName, {tid: this.ctx.tender.id});
                 const datas = [];
                 for (const node of cacheTree.items) {
-                    datas.push({
+                    const data = {
                         id: node.id,
                         tender_id: this.ctx.tender.id,
                         ledger_id: node.ledger_id,
@@ -697,19 +704,26 @@ module.exports = app => {
                         b_code: node.b_code,
                         name: node.name,
                         unit: node.unit,
-                        sgfh_qty: node.sgfh_qty,
-                        sgfh_tp: node.sgfh_tp,
-                        quantity: node.quantity,
                         unit_price: node.unit_price,
-                        total_price: node.total_price,
                         dgn_qty1: node.dgn_qty1,
                         dgn_qty2: node.dgn_qty2,
                         memo: node.memo,
                         drawing_code: node.drawing_code,
-                    });
+                    };
+                    if (this.ctx.tender.data.measure_type === measureType.tz.value) {
+                        data.sgfh_qty = node.quantity;
+                        data.sgfh_tp = node.total_price;
+                        data.quantity = node.quantity;
+                        data.total_price = node.total_price;
+                    } else if (this.ctx.tender.data.measure_type === measureType.gcl.value) {
+                        data.deal_qty = node.quantity;
+                        data.deal_tp = node.total_price;
+                    }
+                    datas.push(data);
                 }
                 await transaction.insert(this.tableName, datas);
-                if (cacheTree.pos && cacheTree.pos.length > 0) {
+                if (this.ctx.tender.data.measure_type === measureType.tz.value
+                    && cacheTree.pos && cacheTree.pos.length > 0) {
                     await transaction.insert(this.ctx.service.pos.tableName, cacheTree.pos);
                 }
                 await transaction.commit();

+ 1 - 1
app/view/measure/audit.ejs

@@ -260,7 +260,7 @@
     const measureSpreadSetting = JSON.parse('<%- measureSpreadSetting %>');
     const billsData = JSON.parse('<%- billsData %>');
 </script>
-<script src="/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+<script src="/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js"></script>
 <script>
     GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";
 </script>

+ 1 - 1
app/view/measure/work.ejs

@@ -240,7 +240,7 @@
     const userId = <%- ctx.session.sessionUser.accountId%>;
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
 </script>
-<script src="/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+<script src="/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js"></script>
 <script>
     GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";
 </script>

+ 1 - 0
app/view/stage/bwtz.ejs

@@ -98,4 +98,5 @@
         font: '12px 微软雅黑',
         readOnly: true,
     };
+    const decimal = <%- ctx.tender.info.decimal.tp %>;
 </script>

+ 19 - 19
config/web.js

@@ -21,7 +21,7 @@
  *
  *  在Controller中使用时,需添加到renderData.jsFiles中,并调用Layout方法
  *  没有该值时,Layout方法会自动加载app.jsFiles.common
- *  有该值时,例如台账审核页面,renderData.jsFiles = app.jsFiles.ledger.audit = ['/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js', '/public/js/web/ledger_audit.min.1.0.0.js']
+ *  有该值时,例如台账审核页面,renderData.jsFiles = app.jsFiles.ledger.audit = ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/web/ledger_audit.min.1.0.0.js']
  *  则layout方法会同时加载app.jsFiles.common与renderData.jsFiles
  *  加载位置为head
  *
@@ -106,7 +106,7 @@ const JsFiles = {
             tenderInfo: {
                 files: [
                     "/public/js/echarts/echarts.min.js",
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -122,8 +122,8 @@ const JsFiles = {
                 files: [
                     "/public/js/js-xlsx/xlsx.full.min.js",
                     "/public/js/js-xlsx/xlsx.utils.js",
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
-                    "/public/js/spreadjs/sheets/interop/gc.spread.excelio.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
+                    "/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                     "/public/js/math.min.js",
                     "/public/js/file-saver/FileSaver.js",
@@ -144,7 +144,7 @@ const JsFiles = {
             },
             audit: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -160,7 +160,7 @@ const JsFiles = {
             },
             gather: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -176,7 +176,7 @@ const JsFiles = {
             },
             revise: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -197,7 +197,7 @@ const JsFiles = {
                 files: [
                     "/public/js/js-xlsx/xlsx.full.min.js",
                     "/public/js/js-xlsx/xlsx.utils.js",
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                     "/public/js/math.min.js",
                 ],
@@ -216,7 +216,7 @@ const JsFiles = {
             },
             history: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -235,7 +235,7 @@ const JsFiles = {
             // 本期计量台账
             index: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                     "/public/js/math.min.js",
                 ],
@@ -255,7 +255,7 @@ const JsFiles = {
             },
             detail: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                     "/public/js/html2canvas/html2canvas.min.js",
                     "/public/js/html2canvas/canvas2image.js",
@@ -273,7 +273,7 @@ const JsFiles = {
             },
             pay: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                 ],
                 mergeFiles: [
                     "/public/js/sub_menu.js",
@@ -285,7 +285,7 @@ const JsFiles = {
             },
             bwtz: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -302,7 +302,7 @@ const JsFiles = {
             },
             change: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -318,7 +318,7 @@ const JsFiles = {
             },
             gather: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -335,7 +335,7 @@ const JsFiles = {
             },
             compare: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -353,7 +353,7 @@ const JsFiles = {
         measure: {
             compare: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                 ],
                 mergeFiles: [
@@ -370,7 +370,7 @@ const JsFiles = {
         material: {
             info: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                     "/public/js/toastr.min.js",
                 ],
@@ -387,7 +387,7 @@ const JsFiles = {
             },
             list: {
                 files: [
-                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js",
                     "/public/js/decimal.min.js",
                     "/public/js/toastr.min.js",
                 ],