|
|
@@ -19,10 +19,10 @@ let basicInfoView = {
|
|
|
allowUserDragFill: false,
|
|
|
scrollbarMaxAlign : true
|
|
|
},
|
|
|
- dateRows: [5, 18],
|
|
|
- numRows: [7],
|
|
|
+ dateRows: [],
|
|
|
+ numRows: [],
|
|
|
locked: {
|
|
|
- rows: [0, 19, 23, 27],
|
|
|
+ rows: [],
|
|
|
cols: [0]
|
|
|
}
|
|
|
},
|
|
|
@@ -70,6 +70,8 @@ let basicInfoView = {
|
|
|
for(let i = 0, len = headers.length; i < len; i++){
|
|
|
sheet.setValue(0, i, headers[i].name, 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);
|
|
|
@@ -91,6 +93,7 @@ let basicInfoView = {
|
|
|
let sheet = workBook.getActiveSheet();
|
|
|
sheet.bind(_events.EditStarting, this.onEditStarting);
|
|
|
sheet.bind(_events.EditEnded, this.onEditEnded);
|
|
|
+ sheet.bind(_events.EnterCell, this.onEnterCell);
|
|
|
sheet.bind(_events.ClipboardPasting, this.onClipboardPasting);
|
|
|
sheet.bind(_events.ClipboardPasted, this.onClipboardPasted);
|
|
|
},
|
|
|
@@ -102,15 +105,28 @@ let basicInfoView = {
|
|
|
let fuc = function () {
|
|
|
sheet.setRowCount(datas.length);
|
|
|
me.initTree(sheet, true, datas);
|
|
|
- me.setDatePicker(sheet, me.setting.dateRows);
|
|
|
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']]);
|
|
|
}
|
|
|
}
|
|
|
+ me.setDatePicker(sheet, me.setting.dateRows);
|
|
|
};
|
|
|
this.renderSheetFuc(sheet, fuc);
|
|
|
},
|
|
|
@@ -120,8 +136,7 @@ let basicInfoView = {
|
|
|
if(args.col === 0){
|
|
|
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;
|
|
|
}
|
|
|
},
|
|
|
@@ -130,8 +145,12 @@ let basicInfoView = {
|
|
|
let me = basicInfoView;
|
|
|
let v = args.editingText ? args.editingText.toString().trim() : '';
|
|
|
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
|
|
|
- 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){
|
|
|
v = formatDate(new Date(v), 'yyyy-MM-dd');
|
|
|
v = me.filtDate(v);
|
|
|
@@ -141,8 +160,7 @@ let basicInfoView = {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- else if(me.setting.numRows.indexOf(args.row) !== -1){//控制数值
|
|
|
+ } else if(me.setting.numRows.indexOf(args.row) !== -1){//控制数值
|
|
|
if(!me.isNum(v)){
|
|
|
alert('只能输入数值');
|
|
|
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) {
|
|
|
let me = basicInfoView;
|
|
|
if(args.cellRange.col === 0){
|
|
|
@@ -166,23 +188,25 @@ let basicInfoView = {
|
|
|
let recRows = [];
|
|
|
for(let i = 0, len = items.length; i < len; i++){
|
|
|
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){
|
|
|
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);
|
|
|
if(!me.isDef(items[i].value)){
|
|
|
recRows.push(row);
|
|
|
- }
|
|
|
- else {
|
|
|
+ } else {
|
|
|
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);
|
|
|
- }
|
|
|
- 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){
|
|
|
@@ -191,7 +215,7 @@ let basicInfoView = {
|
|
|
let staticV = me.datas[recRows[i]].value || '';
|
|
|
args.sheet.setValue(recRows[i], args.cellRange.col, staticV);
|
|
|
}
|
|
|
- })
|
|
|
+ });
|
|
|
}
|
|
|
},
|
|
|
|
|
|
@@ -219,44 +243,47 @@ let basicInfoView = {
|
|
|
},
|
|
|
|
|
|
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) {
|
|
|
- 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) {
|
|
|
- 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) {
|
|
|
@@ -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;
|
|
|
- if(init){
|
|
|
- datas[i].collapsed=false;
|
|
|
+ if (init) {
|
|
|
+ datas[i].collapsed = false;
|
|
|
collapsed = true;
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
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')){
|
|
|
//方框外1像素内都有效
|
|
|
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) {
|
|
|
var collapsed = recode.collapsed==undefined?true:recode.collapsed;
|
|
|
collapsed = !collapsed
|
|
|
@@ -473,8 +517,7 @@ let basicInfoView = {
|
|
|
};
|
|
|
|
|
|
$(document).ready(function () {
|
|
|
- //暂时隐藏
|
|
|
- $('#poj-set').on('shown.bs.modal', function (e) {
|
|
|
+ $('#poj-set').on('shown.bs.modal', function (e) {
|
|
|
//init Spread
|
|
|
basicInfoView.initDatas(basicInfoView.orgDatas);
|
|
|
basicInfoView.buildSheet();
|
|
|
@@ -494,10 +537,15 @@ $(document).ready(function () {
|
|
|
});
|
|
|
|
|
|
$('#tab_poj-settings-basicInfo').on('shown.bs.tab', function () {
|
|
|
- basicInfoView.workBook.refresh();
|
|
|
+ sheetCommonObj.refreshWorkbookDelDefer(basicInfoView.workBook, 100);
|
|
|
});
|
|
|
$('#openProjSet').click(function () {
|
|
|
$('[data-toggle="tooltip"]').tooltip('hide');
|
|
|
$('#poj-set').modal('show');
|
|
|
- });
|
|
|
+ })
|
|
|
+ /* $('#property_ok').bind('click', function () {
|
|
|
+ if(basicInfoView.toUpdate(basicInfoView.orgDatas, basicInfoView.datas)){
|
|
|
+ basicInfoView.a_updateInfo(basicInfoView.toSaveDatas(basicInfoView.datas));
|
|
|
+ }
|
|
|
+ });*/
|
|
|
});
|