Browse Source

fix:项目属性-基本信息,各字段根据类型配置绘制出对应的单元格,及必填项标红显示

vian 5 years ago
parent
commit
b01c66c591

+ 4 - 1
public/web/sheet/sheet_common.js

@@ -789,7 +789,7 @@ var sheetCommonObj = {
         }
         }
         return new getTipsCombo();
         return new getTipsCombo();
     },
     },
-    getTreeNodeCellType: function (datas, row, parentMap,treeCol) {// 2018-09-26  不用spreadjs默认的树结构,自定义控件
+    getTreeNodeCellType: function (datas, row, parentMap,treeCol, paintFunc) {// 2018-09-26  不用spreadjs默认的树结构,自定义控件
         var ns = GC.Spread.Sheets;
         var ns = GC.Spread.Sheets;
         let rectW = 10;
         let rectW = 10;
         let rectH = 10;
         let rectH = 10;
@@ -802,6 +802,9 @@ var sheetCommonObj = {
         }
         }
         TreeNodeCellType.prototype = new ns.CellTypes.Text();
         TreeNodeCellType.prototype = new ns.CellTypes.Text();
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
+            if (paintFunc) {
+                paintFunc(ctx, value, x, y, w, h, style, { rectW, rectH, margin }, datas[row]);
+            }
             let offset = 0;
             let offset = 0;
             let step = 7;
             let step = 7;
             let level = getTreeLevel(datas[row], datas);//从0开始,取当前节点是第几级的
             let level = getTreeLevel(datas[row], datas);//从0开始,取当前节点是第几级的

+ 111 - 63
web/building_saas/main/js/views/project_property_basicInfo.js

@@ -19,10 +19,10 @@ let basicInfoView = {
             allowUserDragFill: false,
             allowUserDragFill: false,
             scrollbarMaxAlign : true
             scrollbarMaxAlign : true
         },
         },
-        dateRows: [5, 18],
-        numRows: [7],
+        dateRows: [],
+        numRows: [],
         locked: {
         locked: {
-            rows: [0, 19, 23, 27],
+            rows: [],
             cols: [0]
             cols: [0]
         }
         }
     },
     },
@@ -70,6 +70,8 @@ let basicInfoView = {
             for(let i = 0, len = headers.length; i < len; i++){
             for(let i = 0, len = headers.length; i < len; i++){
                 sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
                 sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
                 sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
                 sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
+                sheet.getRange(-1, i, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[i]['hAlign']]);
+                sheet.getRange(-1, i, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[i]['vAlign']]);
             }
             }
         };
         };
         me.renderSheetFuc(sheet, fuc);
         me.renderSheetFuc(sheet, fuc);
@@ -91,6 +93,7 @@ let basicInfoView = {
         let sheet = workBook.getActiveSheet();
         let sheet = workBook.getActiveSheet();
         sheet.bind(_events.EditStarting, this.onEditStarting);
         sheet.bind(_events.EditStarting, this.onEditStarting);
         sheet.bind(_events.EditEnded, this.onEditEnded);
         sheet.bind(_events.EditEnded, this.onEditEnded);
+        sheet.bind(_events.EnterCell, this.onEnterCell);
         sheet.bind(_events.ClipboardPasting, this.onClipboardPasting);
         sheet.bind(_events.ClipboardPasting, this.onClipboardPasting);
         sheet.bind(_events.ClipboardPasted, this.onClipboardPasted);
         sheet.bind(_events.ClipboardPasted, this.onClipboardPasted);
     },
     },
@@ -102,15 +105,28 @@ let basicInfoView = {
         let fuc = function () {
         let fuc = function () {
             sheet.setRowCount(datas.length);
             sheet.setRowCount(datas.length);
             me.initTree(sheet, true, datas);
             me.initTree(sheet, true, datas);
-            me.setDatePicker(sheet, me.setting.dateRows);
             sheet.setFormatter(-1, 1, '@');
             sheet.setFormatter(-1, 1, '@');
-            for(let col = 0, cLen = cols.length; col < cLen; col++){
-                sheet.getRange(-1, col, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[cols[col]['hAlign']]);
-                sheet.getRange(-1, col, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[cols[col]['vAlign']]);
-                for(let row = 0, rLen = datas.length; row < rLen; row++){
+            //兼容旧数据,旧数据可能没有设置cellType
+            let compatNumKeys = ['grossArea'],
+                compatDateKeys = ['constructionDate', 'establishDate'];
+            for(let row = 0;row < datas.length ; row ++){
+                if(datas[row].cellType == 'number' || compatNumKeys.includes(datas[row].key)){
+                    me.setting.numRows.push(row);
+                } else if (datas[row].cellType === 'date' || compatDateKeys.includes(datas[row].key)) {
+                    me.setting.dateRows.push(row);
+                } else if(datas[row].cellType === 'comboBox'){
+                    let options = datas[row].options ? datas[row].options.split("@") : [];
+                    projFeatureView.setCombo(sheet, row, options);
+                }
+                let readOnly = typeof datas[row].readOnly === 'string' ? JSON.parse(datas[row].readOnly) : datas[row].readOnly;
+                if (readOnly || datas[row].items) {
+                    me.setting.locked.rows.push(row);
+                }
+                for(let col = 0;col < cols.length;col++){
                     sheet.setValue(row, col, datas[row][cols[col]['dataCode']]);
                     sheet.setValue(row, col, datas[row][cols[col]['dataCode']]);
                 }
                 }
             }
             }
+            me.setDatePicker(sheet, me.setting.dateRows);
         };
         };
         this.renderSheetFuc(sheet, fuc);
         this.renderSheetFuc(sheet, fuc);
     },
     },
@@ -120,8 +136,7 @@ let basicInfoView = {
         if(args.col === 0){
         if(args.col === 0){
             args.cancel = true;
             args.cancel = true;
         }
         }
-        //工程专业
-        if(args.col === 1 && me.setting.locked.rows.indexOf(args.row) !== -1){
+        if(me.setting.locked.rows.indexOf(args.row) !== -1){
             args.cancel = true;
             args.cancel = true;
         }
         }
     },
     },
@@ -130,8 +145,12 @@ let basicInfoView = {
         let me = basicInfoView;
         let me = basicInfoView;
         let v =  args.editingText ? args.editingText.toString().trim() : '';
         let v =  args.editingText ? args.editingText.toString().trim() : '';
         if(args.row < me.datas.length){
         if(args.row < me.datas.length){
+            let required = typeof me.datas[args.row].required === 'string' ? JSON.parse(me.datas[args.row].required) : me.datas[args.row].required;
             //date
             //date
-            if(me.setting.dateRows.indexOf(args.row) !== -1){
+            if (required && !v) {
+                v = me.datas[args.row].value;
+                args.sheet.setValue(args.row, args.col, v);
+            } else if(me.setting.dateRows.indexOf(args.row) !== -1){
                 if(v.length > 0){
                 if(v.length > 0){
                     v = formatDate(new Date(v), 'yyyy-MM-dd');
                     v = formatDate(new Date(v), 'yyyy-MM-dd');
                     v = me.filtDate(v);
                     v = me.filtDate(v);
@@ -141,8 +160,7 @@ let basicInfoView = {
                         return;
                         return;
                     }
                     }
                 }
                 }
-            }
-            else if(me.setting.numRows.indexOf(args.row) !== -1){//控制数值
+            } else if(me.setting.numRows.indexOf(args.row) !== -1){//控制数值
                 if(!me.isNum(v)){
                 if(!me.isNum(v)){
                     alert('只能输入数值');
                     alert('只能输入数值');
                     v = me.datas[args.row].value && me.isNum(me.datas[args.row].value) ? me.datas[args.row].value : '';
                     v = me.datas[args.row].value && me.isNum(me.datas[args.row].value) ? me.datas[args.row].value : '';
@@ -153,6 +171,10 @@ let basicInfoView = {
         }
         }
     },
     },
 
 
+    onEnterCell: function (sender, args) {
+        args.sheet.repaint();
+    },
+
     onClipboardPasting: function (sender, args) {
     onClipboardPasting: function (sender, args) {
         let me = basicInfoView;
         let me = basicInfoView;
         if(args.cellRange.col === 0){
         if(args.cellRange.col === 0){
@@ -166,23 +188,25 @@ let basicInfoView = {
         let recRows = [];
         let recRows = [];
         for(let i = 0, len = items.length; i < len; i++){
         for(let i = 0, len = items.length; i < len; i++){
             let row = i + args.cellRange.row;
             let row = i + args.cellRange.row;
+            let comboItems = projFeatureView.getComboItemsByRow.call(me, row);
+            let required = typeof me.datas[row].required === 'string' ? JSON.parse(me.datas[row].required) : me.datas[row].required;
             if(me.setting.locked.rows.indexOf(row) !== -1){
             if(me.setting.locked.rows.indexOf(row) !== -1){
                 recRows.push(row);
                 recRows.push(row);
-            }
-            else if(me.setting.dateRows.indexOf(row) !== -1){
+            } else if(comboItems && !comboItems.includes(items[i].value)){//粘贴下拉框数据过滤
+                recRows.push(row);
+            } else if(me.setting.dateRows.indexOf(row) !== -1){
                 items[i].value = me.filtDate(items[i].value);
                 items[i].value = me.filtDate(items[i].value);
                 if(!me.isDef(items[i].value)){
                 if(!me.isDef(items[i].value)){
                     recRows.push(row);
                     recRows.push(row);
-                }
-                else {
+                } else {
                     me.datas[row].value = items[i].value;
                     me.datas[row].value = items[i].value;
                 }
                 }
-            }
-            else if(me.setting.numRows.indexOf(row) !== -1 && !me.isNum(items[i].value)){
+            } else if(me.setting.numRows.indexOf(row) !== -1 && !me.isNum(items[i].value)){
                 recRows.push(row);
                 recRows.push(row);
-            }
-            else {
-                me.datas[row].value = items[i].value;
+            } else if (required && !items[i].value) {
+                recRows.push(row);
+            } else
+                {me.datas[row].value = items[i].value;
             }
             }
         }
         }
         if(recRows.length > 0){
         if(recRows.length > 0){
@@ -191,7 +215,7 @@ let basicInfoView = {
                     let staticV = me.datas[recRows[i]].value || '';
                     let staticV = me.datas[recRows[i]].value || '';
                     args.sheet.setValue(recRows[i], args.cellRange.col, staticV);
                     args.sheet.setValue(recRows[i], args.cellRange.col, staticV);
                 }
                 }
-            })
+            });
         }
         }
     },
     },
 
 
@@ -219,44 +243,47 @@ let basicInfoView = {
     },
     },
 
 
     initDatas: function (datas) {
     initDatas: function (datas) {
-        this.datas = [];
-        for(let i = 0, len = datas.length; i < len; i++){
-            this.datas.push(this.copyObj(datas[i]));
-        }
+        this.datas = _.cloneDeep(datas);
     },
     },
 
 
     //数据库读到的数据转换为展示的结构
     //数据库读到的数据转换为展示的结构
     toViewDatas: function (datas) {
     toViewDatas: function (datas) {
-        let rst = [];
-        for(let i = 0, len = datas.length; i < len; i++){
-            let items = datas[i].items || null;
-            if(items){
-                rst.push(datas[i]);
-                for(let j = 0, jLen = items.length; j < jLen; j++){
-                    rst.push(items[j]);
+        // 将数据打平(原数据一些子项数据会嵌套在items数组中)
+        let curID = 1;
+        return extractDataFromItems(datas);
+        // 为了与sheet_common.js -> getTreeNodeCellType共用树结构功能
+        // 需要设置数据的ID、ParentID
+
+        function extractDataFromItems(items, parentID) {
+            const rst = [];
+            items.forEach(item => {
+                // 为了与sheet_common.js -> getTreeNodeCellType共用树结构功能
+                // 需要设置数据的ID、ParentID
+                item.ID = curID++;
+                item.ParentID = parentID || null;
+                rst.push(item);
+                if (item.items && item.items.length) {
+                    rst.push(...extractDataFromItems(item.items, item.ID));
                 }
                 }
-            }
+            });
+            return rst;
         }
         }
-        return rst;
     },
     },
 
 
     //展示的结构转换为入库的结构
     //展示的结构转换为入库的结构
     toSaveDatas: function (datas) {
     toSaveDatas: function (datas) {
-        let rst = [];
-        let index = -1;
-        for(let i = 0, len = datas.length; i < len; i++){
-            let items = datas[i].items || null;
-            if(items){
-                delete datas[i].collapsed;
-                datas[i].items = [];
-                rst.push(datas[i]);
-                index++;
-            }
-            else {
-                rst[index]['items'].push(datas[i]);
-            }
+        const saveData = datas.filter(item => item.ParentID === null);
+        clearJunkAttrs(saveData);
+
+        function clearJunkAttrs(items) {
+            items.forEach(item => {
+                delete item.ID && delete item.ParentID && delete item.collapsed;
+                if (item.items && item.items.length) {
+                    clearJunkAttrs(item.items);
+                }
+            })
         }
         }
-        return rst;
+        return saveData;
     },
     },
 
 
     toUpdate: function (orgDatas, newDatas) {
     toUpdate: function (orgDatas, newDatas) {
@@ -288,19 +315,36 @@ let basicInfoView = {
         });
         });
     },
     },
 
 
-    initTree:function (sheet, init, datas) {
-        sheet.getRange(-1, 0, -1, 1).cellType(this.getTreeNodeCellType(datas));
-        for(let i =0, len = datas.length; i < len; i++){
-            if(datas[i].hasOwnProperty('items')){
+    initTree: function (sheet, init, datas) {
+        //sheet.getRange(-1, 0, -1, 1).cellType(this.getTreeNodeCellType(datas));
+        const parentType = _.groupBy(datas, 'ParentID');
+        const paint = (ctx, value, x, y, w, h, style, rectInfo, data) => {
+            const required = typeof data.required === 'string' ? JSON.parse(data.required) : data.required;
+            const readOnly = typeof data.readOnly === 'string' ? JSON.parse(data.readOnly) : data.readOnly;
+            if (required && !readOnly) {
+                const { rectW, margin } = rectInfo;
+                ctx.save();
+                ctx.fillStyle = 'red';
+                const paddingLeft = 8;
+                const paintX = x + margin + paddingLeft; // 第一层盒子处[+] / [-]
+                const paintY = y + Math.round(h / 2) + paddingLeft;
+                ctx.font = "14px Calibri"
+                ctx.fillText('*', paintX, paintY);
+                ctx.restore();
+            }
+            
+        };
+        for (let i = 0, len = datas.length; i < len; i++) {
+            if (datas[i].hasOwnProperty('items')) {
                 let collapsed = false;
                 let collapsed = false;
-                if(init){
-                    datas[i].collapsed=false;
+                if (init) {
+                    datas[i].collapsed = false;
                     collapsed = true;
                     collapsed = true;
-                }else {
+                } else {
                     collapsed = datas[i].collapsed == undefined ? true : datas[i].collapsed;
                     collapsed = datas[i].collapsed == undefined ? true : datas[i].collapsed;
                 }
                 }
-                //sheet.getRange(i+1, -1, datas[i].items.length, -1).visible(!collapsed);
             }
             }
+            sheet.getCell(i, 0).cellType(sheetCommonObj.getTreeNodeCellType(datas, i, parentType, 0, paint))
         }
         }
     },
     },
 
 
@@ -406,7 +450,7 @@ let basicInfoView = {
             if(recode&&recode.hasOwnProperty('items')){
             if(recode&&recode.hasOwnProperty('items')){
                 //方框外1像素内都有效
                 //方框外1像素内都有效
                 const boxLengh = 10;
                 const boxLengh = 10;
-                if (hitinfo.x >= centerX - halfBoxLength - 2 && hitinfo.x <= centerX + halfBoxLength + 1 &&
+                if (hitinfo.x >= centerX - halfBoxLength - 1 && hitinfo.x <= centerX + halfBoxLength + 1 &&
                     hitinfo.y >= centerY - halfBoxLength - 1 && hitinfo.y <= centerY + halfBoxLength + 1) {
                     hitinfo.y >= centerY - halfBoxLength - 1 && hitinfo.y <= centerY + halfBoxLength + 1) {
                     var collapsed = recode.collapsed==undefined?true:recode.collapsed;
                     var collapsed = recode.collapsed==undefined?true:recode.collapsed;
                     collapsed = !collapsed
                     collapsed = !collapsed
@@ -473,8 +517,7 @@ let basicInfoView = {
 };
 };
 
 
 $(document).ready(function () {
 $(document).ready(function () {
-    //暂时隐藏
-   $('#poj-set').on('shown.bs.modal', function (e) {
+    $('#poj-set').on('shown.bs.modal', function (e) {
         //init Spread
         //init Spread
         basicInfoView.initDatas(basicInfoView.orgDatas);
         basicInfoView.initDatas(basicInfoView.orgDatas);
         basicInfoView.buildSheet();
         basicInfoView.buildSheet();
@@ -494,10 +537,15 @@ $(document).ready(function () {
     });
     });
 
 
     $('#tab_poj-settings-basicInfo').on('shown.bs.tab', function () {
     $('#tab_poj-settings-basicInfo').on('shown.bs.tab', function () {
-        basicInfoView.workBook.refresh();
+        sheetCommonObj.refreshWorkbookDelDefer(basicInfoView.workBook, 100);
     });
     });
     $('#openProjSet').click(function () {
     $('#openProjSet').click(function () {
         $('[data-toggle="tooltip"]').tooltip('hide');
         $('[data-toggle="tooltip"]').tooltip('hide');
         $('#poj-set').modal('show');
         $('#poj-set').modal('show');
-    });
+    })
+   /* $('#property_ok').bind('click', function () {
+        if(basicInfoView.toUpdate(basicInfoView.orgDatas, basicInfoView.datas)){
+            basicInfoView.a_updateInfo(basicInfoView.toSaveDatas(basicInfoView.datas));
+        }
+    });*/
 });
 });