|
@@ -783,6 +783,7 @@ const showSelectTab = function(select, spread, afterShow) {
|
|
|
billsTags = [];
|
|
|
billsIndexes = {};
|
|
|
for (const d of datas) {
|
|
|
+ if (!d.node) continue;
|
|
|
billsTags.push(d);
|
|
|
_addToBillsIndex(d);
|
|
|
}
|
|
@@ -851,6 +852,18 @@ const showSelectTab = function(select, spread, afterShow) {
|
|
|
}) : undefined;
|
|
|
};
|
|
|
|
|
|
+ const afterDeleteBills = function (nodes) {
|
|
|
+ for (const node of nodes) {
|
|
|
+ const bi = billsIndexes[node.id];
|
|
|
+ delete billsIndexes[node.id];
|
|
|
+ for (const biTag of bi) {
|
|
|
+ const delTag = billsTags.find(x => {return x.id === biTag.id});
|
|
|
+ billsTags.splice(billsTags.indexOf(delTag), 1);
|
|
|
+ $('#bills-tag-' + delTag.id).remove();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
$('body').on('click', '[name=bills-tag-locate]', function () {
|
|
|
const lid = parseInt(this.getAttribute('lid'));
|
|
|
SpreadJsObj.locateTreeNode(setting.relaSpread.getActiveSheet(), lid);
|
|
@@ -935,7 +948,7 @@ const showSelectTab = function(select, spread, afterShow) {
|
|
|
$('#bills-tag-search').bind('click', () => {searchTagsAndShow();});
|
|
|
$('#bills-tag-keyword').bind('keydown', e => {if (e.keyCode === 13) searchTagsAndShow();});
|
|
|
|
|
|
- return { loadDatas, updateDatasAndShow, show, getBillsTagsColor, getBillsTagsInfo, refreshBillsTagView, }
|
|
|
+ return { loadDatas, updateDatasAndShow, show, getBillsTagsColor, getBillsTagsInfo, refreshBillsTagView, afterDeleteBills }
|
|
|
};
|
|
|
|
|
|
$.sumLoadMiss = function (setting) {
|
|
@@ -1074,4 +1087,223 @@ const showSelectTab = function(select, spread, afterShow) {
|
|
|
};
|
|
|
}
|
|
|
};
|
|
|
+
|
|
|
+ $.stdLib = function (setting) {
|
|
|
+ if (!setting.selector) return;
|
|
|
+ const obj = $(setting.selector);
|
|
|
+ const stdLibHtml = setting.libs.map(l => {
|
|
|
+ return `<option value="${l.id}" >${l.name}</option>`;
|
|
|
+ });
|
|
|
+ const relaSelect = {
|
|
|
+ showLevel: `std-${setting.stdType}-sl`,
|
|
|
+ searchText: `std-${setting.stdType}-st`,
|
|
|
+ searchResult: `std-${setting.stdType}-sr`,
|
|
|
+ searchPre: `std-${setting.stdType}-sp`,
|
|
|
+ searchNext: `std-${setting.stdType}-sn`,
|
|
|
+ searchClose: `std-${setting.stdType}-sc`,
|
|
|
+ };
|
|
|
+ obj.html(
|
|
|
+ '<div class="sjs-bar d-flex">\n' +
|
|
|
+ ' <div class="dropdown mr-1">\n' +
|
|
|
+ ' <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">\n' +
|
|
|
+ ' <i class="fa fa-list-ol"></i> 显示层级\n' +
|
|
|
+ ' </button>\n' +
|
|
|
+ ' <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">\n' +
|
|
|
+ ` <a class="dropdown-item" href="javascript: void(0);" tag="1" name="${relaSelect.showLevel}">第一层</a>\n` +
|
|
|
+ ` <a class="dropdown-item" href="javascript: void(0);" tag="2" name="${relaSelect.showLevel}">第二层</a>\n` +
|
|
|
+ ` <a class="dropdown-item" href="javascript: void(0);" tag="3" name="${relaSelect.showLevel}">第三层</a>\n` +
|
|
|
+ ` <a class="dropdown-item" href="javascript: void(0);" tag="4" name="${relaSelect.showLevel}">第四层</a>\n` +
|
|
|
+ ` <a class="dropdown-item" href="javascript: void(0);" tag="5" name="${relaSelect.showLevel}">第五层</a>\n` +
|
|
|
+ ` <a class="dropdown-item" href="javascript: void(0);" tag="last" name="${relaSelect.showLevel}">最底层</a>\n` +
|
|
|
+ ' </div>\n' +
|
|
|
+ ' </div>' +
|
|
|
+ ` <div class=input-group input-group-sm pr-1"><select class="form-control form-control-sm">${stdLibHtml.join('')}</select></div>\n` +
|
|
|
+ ' <div class="ml-1">\n' +
|
|
|
+ ' <div class="dropdown">\n' +
|
|
|
+ ' <button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">\n' +
|
|
|
+ ' <i class="fa fa-search"></i>\n' +
|
|
|
+ ' </button>\n' +
|
|
|
+ ' <div class="dropdown-menu dropdown-menu-right">\n' +
|
|
|
+ ' <div class="px-2 border-primary border-1 d-flex" style="width: 300px">\n' +
|
|
|
+ ' <div class="d-inline-block">\n' +
|
|
|
+ ' <div class="input-group input-group-sm mr-1">' +
|
|
|
+ ` <input type="text" class="form-control" placeholder="输入编号/名称查找" id="${relaSelect.searchText}">\n` +
|
|
|
+ ` <div class="input-group-append" ><span class="input-group-text" id="${relaSelect.searchResult}">结果:0</span></div>\n` +
|
|
|
+ ' <div class="input-group-append" >\n' +
|
|
|
+ ` <button class="btn btn-outline-secondary" type="button" title="上一个" id="${relaSelect.searchPre}"><i class="fa fa-angle-double-left"></i></button>\n` +
|
|
|
+ ` <button class="btn btn-outline-secondary" type="button" title="下一个" id="${relaSelect.searchNext}"><i class="fa fa-angle-double-right"></i></button>\n` +
|
|
|
+ ' </div>\n' +
|
|
|
+ ' </div>\n' +
|
|
|
+ ' </div>\n' +
|
|
|
+ ` <div class="d-inline-block"><button class="btn btn-light text-danger btn-sm ml-1" type="button" id="${relaSelect.searchClose}"><i class="fa fa-remove"></i></button></div>\n` +
|
|
|
+ ' </div>\n' +
|
|
|
+ ' </div>\n' +
|
|
|
+ ' </div>\n' +
|
|
|
+ ' </div>' +
|
|
|
+ '</div>\n' +
|
|
|
+ `<div id="std-${setting.stdType}-spread" class="sjs-sh"></div>\n`
|
|
|
+ );
|
|
|
+ autoFlashHeight();
|
|
|
+ const pathTree = createNewPathTree('base', setting.treeSetting);
|
|
|
+
|
|
|
+ const spreadSetting = {
|
|
|
+ cols: [
|
|
|
+ {title: '名称', field: 'name', hAlign: 0, width: 180, formatter: '@'},
|
|
|
+ {title: '单位', field: 'unit', hAlign: 1, width: 60, formatter: '@'},
|
|
|
+ ],
|
|
|
+ treeCol: 0,
|
|
|
+ emptyRows: 0,
|
|
|
+ headRows: 1,
|
|
|
+ headRowHeight: [32],
|
|
|
+ defaultRowHeight: 21,
|
|
|
+ headerFont: '12px 微软雅黑',
|
|
|
+ font: '12px 微软雅黑',
|
|
|
+ headColWidth: [30],
|
|
|
+ selectedBackColor: '#fffacd',
|
|
|
+ readOnly: true,
|
|
|
+ stdType: setting.stdType,
|
|
|
+ };
|
|
|
+ spreadSetting.cols.unshift(setting.stdType === 'xmj'
|
|
|
+ ? {title: '项目节编号', field: 'code', hAlign: 0, width: 150, formatter: '@', cellType: 'tree'}
|
|
|
+ : {title: '清单编号', field: 'b_code', hAlign: 0, width: 150, formatter: '@', cellType: 'tree'});
|
|
|
+
|
|
|
+ const spread = SpreadJsObj.createNewSpread($(`#std-${setting.stdType}-spread`)[0]);
|
|
|
+ const sheet = spread.getActiveSheet();
|
|
|
+ SpreadJsObj.initSheet(sheet, spreadSetting);
|
|
|
+
|
|
|
+
|
|
|
+ if (setting.cellDoubleClick) sheet.bind(spreadNS.Events.CellDoubleClick, setting.cellDoubleClick);
|
|
|
+ sheet.bind(spreadNS.Events.SelectionChanged, function (e, info) {
|
|
|
+ if (!info.oldSelections || !info.oldSelections[0] || info.newSelections[0].row !== info.oldSelections[0].row) {
|
|
|
+ SpreadJsObj.saveTopAndSelect(info.sheet, cacheKey.node);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ sheet.bind(spreadNS.Events.TopRowChanged, function (e, info) {
|
|
|
+ SpreadJsObj.saveTopAndSelect(info.sheet, cacheKey.node);
|
|
|
+ });
|
|
|
+
|
|
|
+ const cacheLib = [];
|
|
|
+ const cacheKey = {
|
|
|
+ lib: setting.page + '-' + setting.tid + '-' + setting.stdType,
|
|
|
+ };
|
|
|
+
|
|
|
+ $('select', setting.selector).change(function () {
|
|
|
+ loadLib(parseInt(this.value), true);
|
|
|
+ });
|
|
|
+ (function (select, sheet) {
|
|
|
+ $(select).click(function () {
|
|
|
+ if (!sheet.zh_tree) return;
|
|
|
+ const tag = $(this).attr('tag');
|
|
|
+ const tree = sheet.zh_tree;
|
|
|
+ setTimeout(() => {
|
|
|
+ switch (tag) {
|
|
|
+ case "1":
|
|
|
+ case "2":
|
|
|
+ case "3":
|
|
|
+ case "4":
|
|
|
+ case "5":
|
|
|
+ tree.expandByLevel(parseInt(tag));
|
|
|
+ SpreadJsObj.refreshTreeRowVisible(sheet);
|
|
|
+ break;
|
|
|
+ case "last":
|
|
|
+ tree.expandByCustom(() => { return true; });
|
|
|
+ SpreadJsObj.refreshTreeRowVisible(sheet);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }, 100);
|
|
|
+ });
|
|
|
+ })(`a[name=${relaSelect.showLevel}]`, sheet);
|
|
|
+
|
|
|
+ const loadLib = function(listId, reload = false) {
|
|
|
+ cacheKey.node = cacheLib.lib + '-' + listId;
|
|
|
+ const locateMemory = function () {
|
|
|
+ if (!reload) {
|
|
|
+ SpreadJsObj.loadTopAndSelect(sheet, cacheKey.node);
|
|
|
+ } else {
|
|
|
+ removeLocalCache(cacheKey.node);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const cacheData = cacheLib.find(function (lib) {
|
|
|
+ return lib.id === listId;
|
|
|
+ });
|
|
|
+ if (cacheData) {
|
|
|
+ pathTree.loadDatas(cacheData.data);
|
|
|
+ SpreadJsObj.loadSheetData(sheet, 'tree', pathTree);
|
|
|
+ locateMemory();
|
|
|
+ setLocalCache(cacheKey.lib, listId);
|
|
|
+ } else {
|
|
|
+ postData(`/std-lib/get-data`, {stdType: setting.stdType, list_id: listId}, function (data) {
|
|
|
+ cacheLib.push({id: listId, data: data});
|
|
|
+ pathTree.loadDatas(data);
|
|
|
+ SpreadJsObj.loadSheetData(sheet, 'tree', pathTree);
|
|
|
+ locateMemory();
|
|
|
+ setLocalCache(cacheKey.lib, listId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const _loadCacheLib = function() {
|
|
|
+ let libId = getLocalCache(cacheKey.lib);
|
|
|
+ if (libId) {
|
|
|
+ $('select', setting.selector).val(libId);
|
|
|
+ loadLib(parseInt(libId));
|
|
|
+ } else {
|
|
|
+ loadLib(parseInt($('select', setting.selector).val()));
|
|
|
+ }
|
|
|
+ };
|
|
|
+ _loadCacheLib();
|
|
|
+
|
|
|
+ const searchObj = {
|
|
|
+ result: [],
|
|
|
+ cur: 0,
|
|
|
+ searchStdNode: function() {
|
|
|
+ const keyword = $(`#${relaSelect.searchText}`).val();
|
|
|
+ searchObj.result = keyword ? pathTree.nodes.filter(x => {
|
|
|
+ return x.code.indexOf(keyword) >= 0 || x.b_code.indexOf(keyword) >= 0 || x.name.indexOf(keyword) >= 0;
|
|
|
+ }) : [];
|
|
|
+ // searchObj.result = [];
|
|
|
+ // for (const x of pathTree.nodes) {
|
|
|
+ // if (x.code.indexOf(keyword) >= 0 || x.b_code.indexOf(keyword) >= 0 || x.name.indexOf(keyword) >= 0) {
|
|
|
+ // searchObj.result.push(x);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ $(`#${relaSelect.searchResult}`)[0].innerText = `结果:${searchObj.result.length}`;
|
|
|
+ searchObj.cur = 0;
|
|
|
+ if (searchObj.result.length > 0) {
|
|
|
+ SpreadJsObj.locateTreeNode(sheet, pathTree.getNodeKey(searchObj.result[searchObj.cur]));
|
|
|
+ }
|
|
|
+ },
|
|
|
+ searchPre: function () {
|
|
|
+ if (searchObj.result.length <= 1) return;
|
|
|
+ searchObj.cur = searchObj.cur === 0 ? searchObj.result.length - 1 : this.cur - 1;
|
|
|
+ SpreadJsObj.locateTreeNode(sheet, pathTree.getNodeKey(searchObj.result[searchObj.cur]), true);
|
|
|
+ },
|
|
|
+ searchNext: function () {
|
|
|
+ if (searchObj.result.length <= 1) return;
|
|
|
+ searchObj.cur = searchObj.cur === searchObj.result.length - 1 ? 0 : searchObj.cur + 1;
|
|
|
+ SpreadJsObj.locateTreeNode(sheet, pathTree.getNodeKey(searchObj.result[searchObj.cur]), true);
|
|
|
+ },
|
|
|
+ clear: function () {
|
|
|
+ $(`#${relaSelect.searchText}`).val('');
|
|
|
+ $(`#${relaSelect.searchResult}`)[0].innerText = `结果:${0}`;
|
|
|
+ searchObj.result = [];
|
|
|
+ searchObj.cur = 0;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ $(`#${relaSelect.searchText}`).change(searchObj.searchStdNode);
|
|
|
+ $(`#${relaSelect.searchPre}`).click(function (e) {
|
|
|
+ searchObj.searchPre();
|
|
|
+ e.stopPropagation();
|
|
|
+ });
|
|
|
+ $(`#${relaSelect.searchNext}`).click(function (e) {
|
|
|
+ searchObj.searchNext();
|
|
|
+ e.stopPropagation();
|
|
|
+ });
|
|
|
+ $(`#${relaSelect.searchClose}`).click(function (e) {
|
|
|
+ searchObj.clear();
|
|
|
+ e.stopPropagation();
|
|
|
+ });
|
|
|
+
|
|
|
+ return { spread }
|
|
|
+ };
|
|
|
})(jQuery);
|