From b6bc2730b91b909386c3bdf1fc1d5df7d29291b9 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 15 Oct 2020 13:24:40 +0200 Subject: [PATCH] fix infinite loop in inner graph optimization fixes #11678 --- lib/optimize/InnerGraph.js | 11 +- .../inner-graph/issue-11678/module.js | 3105 +++++++++++++++++ .../inner-graph/issue-11678/webpack.config.js | 71 + 3 files changed, 3186 insertions(+), 1 deletion(-) create mode 100644 test/configCases/inner-graph/issue-11678/module.js create mode 100644 test/configCases/inner-graph/issue-11678/webpack.config.js diff --git a/lib/optimize/InnerGraph.js b/lib/optimize/InnerGraph.js index 43a4440d8..1910847aa 100644 --- a/lib/optimize/InnerGraph.js +++ b/lib/optimize/InnerGraph.js @@ -116,6 +116,7 @@ exports.inferDependencyUsage = state => { } const { innerGraph, usageCallbackMap } = innerGraphState; + const processed = new Map(); // flatten graph to terminal nodes (string, undefined or true) const nonTerminal = new Set(innerGraph.keys()); while (nonTerminal.size > 0) { @@ -124,7 +125,15 @@ exports.inferDependencyUsage = state => { let newSet = new Set(); let isTerminal = true; const value = innerGraph.get(key); + let alreadyProcessed = processed.get(key); + if (alreadyProcessed === undefined) { + alreadyProcessed = new Set(); + processed.set(key, alreadyProcessed); + } if (value !== true && value !== undefined) { + for (const item of value) { + alreadyProcessed.add(item); + } for (const item of value) { if (typeof item === "string") { newSet.add(item); @@ -137,7 +146,7 @@ exports.inferDependencyUsage = state => { if (itemValue !== undefined) { for (const i of itemValue) { if (i === key) continue; - if (value.has(i)) continue; + if (alreadyProcessed.has(i)) continue; newSet.add(i); if (typeof i !== "string") { isTerminal = false; diff --git a/test/configCases/inner-graph/issue-11678/module.js b/test/configCases/inner-graph/issue-11678/module.js new file mode 100644 index 000000000..b726890d5 --- /dev/null +++ b/test/configCases/inner-graph/issue-11678/module.js @@ -0,0 +1,3105 @@ +import { ResizeObserver as RO } from "resize-observer"; +import * as employeeData from "Source_Data/employee"; +import * as servicesData from "Source_Data/services"; +import * as SplitViewPage from "Source_Framework/splitview/page"; +import * as SplitViewMenu from "Source_Framework/splitview/menu"; +import { + TC as pageTC, + getDeleteDialogText +} from "Source_Framework/splitview/text"; +import * as UiListPicker from "Source_Framework/uilistpicker/UiListPicker"; +import { CookieStorage } from "Source_ODS/cookiestorage"; +import { removeTextEditor } from "Source_Framework/uirichtextedit"; +import { UiElementCheckbox, UiElementRadio } from "Source_Framework/uielement"; +import { switchButtonIcon } from "Source_ODS/UiButton/icon"; +import { setButtonText } from "Source_ODS/UiButton/text"; +import { replacePage } from "Source_Framework/pagelinks"; +import { getSession } from "Source_ODS/ods"; +import { UiButton, UiSelectButton } from "Source_ODS/UiButton"; +import { buttonClasses } from "Source_Framework/defaultButtons"; +import { UiForm } from "Source_Framework/uiform"; +import * as Breadcrumb from "Source_Framework/breadcrumb"; +import * as _ from "Source_ODS/lodash"; +import { DomElement } from "Source_ODS/DomElement"; +import { getUrlParameter, setUrlParameter } from "Source_ODS/url"; +import { addFixedTooltip } from "Source_ODS/tooltip"; +import { showLoadingWarning, showWarningDialog } from "Source_ODS/ui"; +import { checkIsNonemptyObject, isString, isUndefined } from "Source_ODS/types"; +import { UiDialog, confirmDialog } from "Source_ODS/UiDialog"; +import { ModuleNameEnum } from "Source_Framework/common/moduleDispatcher"; +import { showEmployeeAssignDialog } from "Source_Framework/common/employeeassignment"; +import { buttonPdfPreview } from "Source_Framework/common/pdf_preview"; +import { createTaskProgress } from "Source_Framework/common/taskprogress"; +import { CALLBACK_EVENTS } from "Source_Framework/uitable"; +import { + getFilterPara, + saveUniversalTableLayout, + loadDefaultLayout, + saveDefaultLayoutForAgency +} from "Source_Framework/backend/universalData"; +import { selectColumns } from "Source_Framework/common/columnsDialog"; +import { STATUS } from "Source_Framework/backend/jsonData"; +import { + buttonStatusChange, + HeaderDataEnum +} from "Source_Framework/common/statuschange"; +import { genericJobSelectionDialog } from "Source_Framework/common/las_mod_jobselection"; +import { TC } from "./text"; +import { BEC } from "./bec"; +import { POSITIONTYPES } from "./positionTypes"; +import { SETTINGS } from "./settings"; +import * as preferences from "./preferences"; +import * as privileges from "./privileges"; +import * as buttons from "./buttons"; +import * as form from "./form"; +import * as formHelper from "./formHelper"; +import { createTableWidget, createTableWidgetForManualSort } from "./table"; +import { setTechnicalTextButton } from "./techText"; +import { openDialogForNewPositionSi } from "./addPositionToSi"; +import { buttonInsertService, insertServiceDialog } from "./ciPosFromJob"; +import { shiftPosition } from "./shiftPosition"; +import { autoSumsDialog } from "./autoSums"; +import { defineLayoutDialog } from "./defineLayout"; +import { buttonInsertFromTemplate, setInsertData } from "./insertFromTemplate"; +import { buttonMove, movePosition } from "./movePosition"; +import { + buttonCopySelect, + duplicatePosition, + copyPosition, + buttonCopyFromOrderToJob, + copyFromOrderToJob +} from "./copy"; +import { convertData } from "./save"; +import { buttonCreateOrder, onCreateOrder } from "./createOrder"; +import { + buttonConnectOrderPos, + buttonCopyJobToOrderPos, + jobToOrderPos +} from "./orderPosFromJobPos"; +import { showNchInfoDialog } from "./nchInfoDialog"; +import { urlGotoSiFromJobService } from "Source_Modules/las_mod_siheader/url"; +import { TITLE as SITITLE } from "Source_Modules/las_mod_siheader/bec"; +import { TITLE as CETITLE } from "Source_Modules/las_mod_ceheader/bec"; +import { TITLE as ORDERTITLE } from "Source_Modules/las_mod_order/bec"; +import { TITLE as CITITLE } from "Source_Modules/las_mod_ciheader/bec"; + +const _positionSettings = { + parent: { + settings: {}, + headerStatus: "" + }, + settings: { + [SETTINGS.CREATEABLE]: false, + [SETTINGS.DELETABLE]: false + } + }, + _tableOverlayClass = ".tableintableoverlay", + _tableOverlayOffsetLeft = 7, + _showTableInElement = ".tablecont", + _pluginObj = {}; +const resizeObserverInstance = new RO(entries => { + entries.forEach(entry => { + const parentWidth = entry.contentRect.width; + const parentheight = entry.contentRect.height; + const newWidth = parentWidth - _tableOverlayOffsetLeft + 6; + const newHeight = parentheight; + const overlayElement = $(_tableOverlayClass); + overlayElement.css({ width: newWidth, height: newHeight }); + overlayElement.find("#positiontable").css({ + width: newWidth - 2, + height: + parentheight - + overlayElement.find(".title").getHeight() - + _tableOverlayOffsetLeft + }); + }); +}); +let _options; +let _parentModuleSettings, + _parentTableSelection, + _parentTableDataId; +let _isFormInDialog = false, + _isFormInDialogSelector = null, + _isFormInDialogJobPK = null; +let _staticData, + _generalDataEmplLists, + _tableObject, + _tableData, + _tableSelectionPosNo = null, + _tableSelectionJobNo = null, + _tableContainerId = "", + _previousTableTitle = "", + _formIdName, + _formObject, + _formData, + _formEvent, + _isNewDataset = false, + progressbar, + addedBreadcrumbId; +let _tableLayoutInfo = { + moduleName: "", + privAllAgencies: false, + privSaveGlobally: false +}; +let _reloadTable; +let prevRows = null; +let triggerSelectionChangeEvent = true; +async function onReloadTable() { + await _updateTableContent(); +} +async function onExport() { + await _tableObject.toExcel(); +} +async function onConnectPosition() { + const hPk = getPKfromModule(); + const ok = await openDialogForNewPositionSi( + { siBookId: hPk.idSiBook, siHeaderId: hPk.siHeaderId }, + _staticData + ); + if (ok) { + await _updateTableContent(); + } +} +async function onSortPosition() { + await getSortDialog(); +} +async function onSortManual() { + const isManualSort = _tableObject.isSortColumnAvailable(); + const { canBeModified = true } = _positionSettings.parent.settings; + const configuration = _tableObject.getConfiguration(); + const { columns } = configuration; + if (isManualSort) { + _tableObject.clearFilter(); + } + await doCreateAndShowTableWidget( + columns, + _getModuleName(), + canBeModified, + !isManualSort + ); +} +function showSortManualButtonState() { + const isManualSort = _tableObject.isSortColumnAvailable(); + const className = "." + buttons.CLASSNAME.sortManual; + if (isManualSort) { + switchButtonIcon(className, "btn-img-sortManual", "btn-img-sortPrint"); + setButtonText(className, TC.printSort); + } else { + switchButtonIcon(className, "btn-img-sortPrint", "btn-img-sortManual"); + setButtonText(className, TC.manualSort); + } +} +function onGoToSi() { + const selection = _tableObject.getSelection(); + if (selection.length > 0) { + const hPk = getPKfromModule(); + replacePage( + urlGotoSiFromJobService({ + jobId: hPk.jobid, + posNos: _getListofSelectedRow() + }) + ); + } else { + showLoadingWarning(TC.selectionEmpty); + } +} +async function onShiftPosition(state) { + const pk = getPKFromSelection(); + if (pk !== null) { + const ok = await shiftPosition(state, pk); + if (ok) { + await _updateTableContent(); + } + } else { + showLoadingWarning(TC.selectionEmpty); + } +} +async function onInsertFromTemplateDialog() { + if (_parentTableSelection) { + await setInsertData(_getModuleName(), _parentTableSelection); + await _updateTableContent(); + } +} +async function onCopy(toTargetModule = null) { + if (_parentTableSelection) { + const refresh = await copyPosition( + _getModuleName(), + _parentTableSelection, + _staticData, + _getListofSelectedRow(), + toTargetModule + ); + if (refresh) { + await _updateTableContent(); + } + } +} +async function onCopyToJob() { + await onCopy(ModuleNameEnum.JOB); +} +async function onCopyToCe() { + await onCopy(ModuleNameEnum.CEHEADER); +} +async function onDuplicate() { + if (_parentTableSelection) { + const refresh = duplicatePosition( + _getModuleName(), + _parentTableSelection, + _getListofSelectedRow() + ); + if (refresh) { + await _updateTableContent(); + } + } +} +function onCopyList() { + return [ + ...(_getModuleName() === ModuleNameEnum.JOB + ? [ + { + rowId: "duplicateInJob", + rowText: TC.duplicateInJob, + rowListener: onDuplicate + } + ] + : []), + { + rowId: "copyToOtherJob", + rowText: TC.copyToOtherJob, + rowListener: onCopyToJob + }, + { rowId: "copyToCe", rowText: TC.copyToCe, rowListener: onCopyToCe } + ]; +} +async function onCopyFromOrderToJob() { + if (_parentTableSelection) { + const id = _parentTableSelection.orde_orderid; + await copyFromOrderToJob(id, _staticData, _getListofSelectedRow()); + await _updateTableContent(); + } +} +async function onMove() { + if (_parentTableSelection) { + const id = _parentTableSelection.job_jobid; + const ok = await movePosition( + _getModuleName(), + id, + 1, + 1, + _parentTableSelection, + _getListofSelectedRow(), + _staticData + ); + if (ok) { + await _updateTableContent(); + } + } +} +async function onDefineLayout() { + const pk = getPKFromSelection(); + if (pk !== null) { + const ok = await defineLayoutDialog(pk); + if (ok) { + await _updateTableContent(); + } + } +} +async function onJobToOrderPos(withMultipleSelection) { + const hPk = getPKfromModule(); + await jobToOrderPos( + hPk.orderId, + _tableObject.getSelection(), + withMultipleSelection + ); + await _updateTableContent(); +} +function onStatusChange() { + const selection = _tableObject.getSelection(); + const hPk = getPKfromModule(); + return { + idSiBook: hPk.idSiBook, + siHeaderId: hPk.siHeaderId, + theJobID: selection.map(obj => obj.jpos_jobid), + thePosNo: selection.map(obj => obj.jpos_posno), + theHeaderType: selection.map(obj => obj.jpos_headertype), + theSubPosNo: selection.map(obj => obj.jpos_subposno), + multiple: selection.length > 1 + }; +} +async function onAutoSums() { + if (_parentTableSelection) { + await autoSumsDialog( + _getModuleName(), + _parentTableSelection, + _staticData.lists.listPosTypesAutoSum + ); + await _updateTableContent(); + } +} +async function onInsertService() { + const hPk = getPKfromModule(); + const data = { + ciBookId: hPk.ciBookId, + ciHeaderId: hPk.ciHeaderId + }; + const ok = await insertServiceDialog(data); + if (ok) { + await _updateTableContent(); + } +} +function _buttonConnectPosition(callback) { + return new UiButton( + TC.connectSIPosButtonText, + buttons.CLASSNAME.siConnectPosition, + callback, + "btn-img-connectSIPos" + ); +} +function _buttonSortPosition(callback) { + return new UiButton( + TC.automaticSort, + buttons.CLASSNAME.sortPosition, + callback, + "btn-img-sortPos" + ); +} +function _buttonSortManual(callback) { + return new UiButton( + TC.manualSort, + buttons.CLASSNAME.sortManual, + callback, + "btn-img-sortManual" + ); +} +function gotoList() { + return [{ rowId: "gotoSi", rowText: SITITLE, rowListener: onGoToSi }]; +} +function _buttonShiftUpPosition(callback) { + return new UiButton( + TC.hierarchyUp, + buttons.CLASSNAME.shiftUpPosition, + callback, + "btn-img-shiftUpPos" + ); +} +function _buttonShiftDownPosition(callback) { + return new UiButton( + TC.hierarchyDown, + buttons.CLASSNAME.shiftDownPosition, + callback, + "btn-img-shiftDownPos" + ); +} +function _buttonDefineLayout(callback) { + return new UiButton( + TC.setLayout, + buttons.CLASSNAME.defineLayout, + callback, + "btn-img-defineLayoutPos" + ); +} +function _buttonAutoSums(callback) { + return new UiButton( + TC.generateTotals, + buttons.CLASSNAME.autoSums, + callback, + "btn-img-createsubtotals" + ); +} +async function markPositions(data) { + _tableObject.clearRowAttributes(); + if (data !== null && data.jpos_postype === POSITIONTYPES.SUBTOTAL) { + const para = { + theJobID: data.jpos_jobid, + theHeaderType: data.jpos_headertype, + thePosNo: data.jpos_posno, + theSubPosNo: data.jpos_subposno + }; + const subtotals = await servicesData.getPositionsInSubtotal(para); + if (subtotals !== null) { + const filter = subtotals.map(posno => ({ jpos_posno: posno })); + _tableObject.setRowAttributes(filter, { backgroundColor: "aquamarine" }); + } + } +} +function markPositionsTypeText(data) { + _tableObject.clearRowSelectionColor(); + if (data !== null && data.jpos_postype === POSITIONTYPES.TEXT) { + const filter = [ + { + jpos_posno: data.jpos_posno + } + ]; + _tableObject.setRowSelectionColor(filter, "lavender"); + } +} +async function _createToolbarTable(setEvent) { + const data = _getDataFromSelectedEntry(); + const toolbar = new SplitViewMenu.Toolbar("table"); + console.log("_createToolbarTable(", setEvent, ")"); + switch (setEvent) { + + case buttons.STATE.initialize: + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + toolbar.add(_buttonSortPosition(onSortPosition)); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.SIHEADER: + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SICONNECTPOSITION + ) && + _positionSettings.settings[SETTINGS.CREATEABLE] + ) { + toolbar.add(_buttonConnectPosition(onConnectPosition)); + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.CEHEADER: + toolbar.add(_buttonSortPosition(onSortPosition)); + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.AUTOSUMS) + ) { + toolbar.add(_buttonAutoSums(onAutoSums)); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CEHEADER, { + cehe_ceid: getPKfromModule().ceId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.ORDER: + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.COPYORDERPOS + ) && + _positionSettings.settings[SETTINGS.CREATEABLE] + ) { + toolbar.add( + buttonCopyJobToOrderPos(onJobToOrderPos.bind(this, true)) + ); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.ORDER, { + orde_orderid: getPKfromModule().orderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.CIHEADER: + { + const s = { + canBeCreated: + _positionSettings.settings[SETTINGS.CREATEABLE] || false + }; + if (s.canBeCreated) { + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.MODIFY + ) + ) { + toolbar.add(_buttonSortPosition(onSortPosition)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATE + ) + ) { + toolbar.add(buttonInsertService(onInsertService)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.MODIFY + ) + ) { + toolbar.add(_buttonAutoSums(onAutoSums)); + } + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CIHEADER, { + cihe_bookid: getPKfromModule().ciBookId, + cihe_ciheaderid: getPKfromModule().ciHeaderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + } + break; + default: + break; + } + break; + + case buttons.STATE.jobPositionTableMenu: + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.COPYPOS)) { + toolbar.add(buttonCopySelect(onCopyList())); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MOVEPOS)) { + toolbar.add(buttonMove(onMove)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATEORDER) + ) { + const selectedIds = _.map(_tableObject.getSelection(), "jpos_postype"); + + if ( + _.includes(selectedIds, POSITIONTYPES.EXTERNAL) || + _.includes(selectedIds, POSITIONTYPES.MEDIA) + ) { + const hPk = getPKfromModule(); + toolbar.add( + buttonCreateOrder( + onCreateOrder.bind(this, _getListofSelectedRow(), [hPk.jobid]) + ) + ); + } + } + + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.SIMODULE)) { + + if (_tableObject.getOptions().multipleSelection) { + const selectedIds = _.map( + _tableObject.getSelection(), + "jpos_postype" + ); + + if ( + _.includes(selectedIds, POSITIONTYPES.EXTERNAL) || + _.includes(selectedIds, POSITIONTYPES.MEDIA) + ) { + toolbar.addDefaultGoto(gotoList()); + } + } else { + if ( + data !== null && + (data.jpos_postype === POSITIONTYPES.EXTERNAL || + data.jpos_postype === POSITIONTYPES.MEDIA) + ) { + toolbar.addDefaultGoto(gotoList()); + } + } + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + await markPositions(data); + markPositionsTypeText(data); + break; + case buttons.STATE.jobPositionTableMenuMultiple: + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.COPYPOS)) { + toolbar.add(buttonCopySelect(onCopyList())); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MOVEPOS)) { + toolbar.add(buttonMove(onMove)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATEORDER) + ) { + const selectedIds = _.map(_tableObject.getSelection(), "jpos_postype"); + if ( + _.includes(selectedIds, POSITIONTYPES.EXTERNAL) || + _.includes(selectedIds, POSITIONTYPES.MEDIA) + ) { + const hPk = getPKfromModule(); + toolbar.add( + buttonCreateOrder( + onCreateOrder.bind(this, _getListofSelectedRow(), [hPk.jobid]) + ) + ); + } + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + + case buttons.STATE.siPositionTableMenu: + toolbar.add( + buttonStatusChange(HeaderDataEnum.SIPOS, onStatusChange, onReloadTable) + ); + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SICONNECTPOSITION + ) && + _positionSettings.settings[SETTINGS.CREATEABLE] + ) { + toolbar.add(_buttonConnectPosition(onConnectPosition)); + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case buttons.STATE.siPositionTableMenuMultiple: + toolbar.add( + buttonStatusChange(HeaderDataEnum.SIPOS, onStatusChange, onReloadTable) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + + case buttons.STATE.cePositionTableMenu: + case buttons.STATE.cePositionTableMenuMultiple: + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.COPYPOS)) { + + toolbar.add(buttonCopySelect(onCopyList())); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.AUTOSUMS) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonAutoSums(onAutoSums)); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CEHEADER, { + cehe_ceid: getPKfromModule().ceId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + await markPositions(data); + markPositionsTypeText(data); + break; + + case buttons.STATE.orderPositionTableMenu: + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.ORDERCOPYTOJOB + ) + ) { + toolbar.add(buttonCopyFromOrderToJob(onCopyFromOrderToJob)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CONNECTORDERPOS + ) + ) { + toolbar.add(buttonConnectOrderPos(onJobToOrderPos.bind(this, false))); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.COPYORDERPOS + ) && + _positionSettings.settings[SETTINGS.CREATEABLE] + ) { + toolbar.add(buttonCopyJobToOrderPos(onJobToOrderPos.bind(this, true))); + } + + + + + + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.ORDER, { + orde_orderid: getPKfromModule().orderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case buttons.STATE.orderPositionTableMenuMultiple: + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.ORDERCOPYTOJOB + ) + ) { + toolbar.add(buttonCopyFromOrderToJob(onCopyFromOrderToJob)); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.ORDER, { + orde_orderid: getPKfromModule().orderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + + case buttons.STATE.ciPositionTableMenu: + { + const s = { + canBeCreated: _positionSettings.settings[SETTINGS.CREATEABLE] || false + }; + if (s.canBeCreated) { + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add( + _buttonShiftDownPosition(onShiftPosition.bind(this, 1)) + ); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATE) + ) { + toolbar.add(buttonInsertService(onInsertService)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + toolbar.add(_buttonAutoSums(onAutoSums)); + } + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CIHEADER, { + cihe_bookid: getPKfromModule().ciBookId, + cihe_ciheaderid: getPKfromModule().ciHeaderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + } + break; + case buttons.STATE.ciPositionTableMenuMultiple: + { + const s = { + canBeCreated: _positionSettings.settings[SETTINGS.CREATEABLE] || false + }; + if (s.canBeCreated) { + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add( + _buttonShiftDownPosition(onShiftPosition.bind(this, 1)) + ); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATE) + ) { + toolbar.add(buttonInsertService(onInsertService)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + toolbar.add(_buttonAutoSums(onAutoSums)); + } + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CIHEADER, { + cihe_bookid: getPKfromModule().ciBookId, + cihe_ciheaderid: getPKfromModule().ciHeaderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + } + break; + default: + throw new Error('Invalid event "' + setEvent + '"'); + } + const multipleSelection = _tableObject.getOptions().multipleSelection; + const hasFilter = _tableObject.options.hasFilter; + toolbar.addDefaultTableOptions( + { + selectAll: multipleSelection + ? () => { + _tableObject.selectAll(); + if (_tableObject.eventHandler[CALLBACK_EVENTS.SELECTIONCHANGED]) { + _tableObject.eventHandler[CALLBACK_EVENTS.SELECTIONCHANGED]( + _tableObject.getSelection() + ); + } + } + : null, + clearAllFilters: hasFilter + ? () => { + _tableObject.clearFilter(); + } + : null, + selectColumns: async () => { + if (_tableLayoutInfo.moduleName !== "") { + const ok = await selectColumns( + _tableLayoutInfo.moduleName, + _tableObject + ); + if (ok) { + await onReloadTable(); + } + } + }, + adjustColumnSize: _tableObject.adjustColumnSize.bind(_tableObject), + loadDefaultLayout: async () => { + if (_tableLayoutInfo.moduleName !== "") { + const ok = await loadDefaultLayout(_tableLayoutInfo.moduleName); + if (ok) { + await onReloadTable(); + } + } + }, + saveDefaultLayout: _tableLayoutInfo.privSaveGlobally + ? async () => { + if (_tableLayoutInfo.moduleName !== "") { + await saveDefaultLayoutForAgency( + _tableLayoutInfo.moduleName, + _tableObject.getConfiguration() + ); + } + } + : null, + exportTable: onExport + }, + "right" + ); + toolbar.addDefaultReload(onReloadTable, "right"); + toolbar.render(); + showSortManualButtonState(); +} +export async function getDataAndShowTable( + name, + parentTableSelection, + parentSettings, + reloadTable, + serviceID +) { + let getListPK; + _reloadTable = reloadTable; + _parentTableSelection = parentTableSelection; + if (parentTableSelection === null) { + throw new Error("No row selected"); + } + setPKfromModule(parentTableSelection); + removeTextEditor(); + switch (name) { + case ModuleNameEnum.SIHEADER: + { + const hPk = getPKfromModule(); + getListPK = { + theSIBookID: hPk.idSiBook, + theSIHeaderID: hPk.siHeaderId + }; + } + break; + case ModuleNameEnum.CEHEADER: + { + const hPk = getPKfromModule(); + getListPK = { theCEID: hPk.ceId }; + } + break; + case ModuleNameEnum.JOB: + { + const hPk = getPKfromModule(); + getListPK = { theJobID: hPk.jobid }; + } + break; + case ModuleNameEnum.ORDER: + { + const hPk = getPKfromModule(); + getListPK = { theOrderID: hPk.orderId }; + } + break; + case ModuleNameEnum.CIHEADER: + { + const hPk = getPKfromModule(); + getListPK = { ciBookId: hPk.ciBookId, ciHeaderId: hPk.ciHeaderId }; + } + break; + default: + throw new Error(`Invalid name "${name}`); + } + let settingsData = { + canBeCreated: true, + canBeDeleted: true, + headerStatus: "", + showButtonDeleteAndMoveNCH: false + }; + switch (name) { + case ModuleNameEnum.SIHEADER: + case ModuleNameEnum.JOB: + case ModuleNameEnum.CEHEADER: + case ModuleNameEnum.ORDER: + settingsData = { + ...settingsData, + ...(await servicesData.getActionInfo( + getPKfromModule(), + _getModuleType() + )) + }; + break; + case ModuleNameEnum.CIHEADER: + settingsData = await servicesData.getActionInfo( + getPKfromModule(), + _getModuleType() + ); + break; + default: + break; + } + _positionSettings.settings[SETTINGS.CREATEABLE] = settingsData.canBeCreated; + _positionSettings.settings[SETTINGS.DELETABLE] = settingsData.canBeDeleted; + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] = + settingsData.showButtonDeleteAndMoveNCH; + const tableData = await servicesData.getListOfPos( + getListPK, + _getModuleType(), + 1, + 1 + ); + if (tableData === null) { + _showParentTable(false); + return; + } + _tableData = { + cols: tableData.cols, + rows: tableData.rows + }; + _tableLayoutInfo = tableData.info; + _positionSettings.parent.headerStatus = settingsData.headerStatus; + _positionSettings.parent.settings = parentSettings; + const { canBeModified = true } = parentSettings; + await doCreateAndShowTableWidget(tableData.head.columns, name, canBeModified); + if (_isShowFormOnly()) { + $(".overview").removeClass("notable"); + $(".menutableindetails").hide(); + } + if (name === ModuleNameEnum.JOB) { + + const hPk = getPKfromModule(); + const serviceIDForLink = serviceID ? String(serviceID) : ""; + addedBreadcrumbId = await Breadcrumb.add( + _staticData.settings.moduleTitle, + `LAS_MOD_JOB_DLG.page?jobID=${hPk.jobid}&serviceID=${serviceIDForLink}` + ); + if (serviceID) { + + _tableObject.setCurrentRow({ + jpos_posno: serviceID, + jpos_jobid: hPk.jobid + }); + + const selectionLength = getSelectionCount(); + if (selectionLength === 1) { + await _createToolbarTable(buttons.STATE.jobPositionTableMenu); + } else if (selectionLength > 1) { + await _createToolbarTable(buttons.STATE.jobPositionTableMenuMultiple); + } + + await _showForm(buttons.STATE.show, _getDataFromSelectedEntry()); + } + } +} +async function doCreateAndShowTableWidget( + columns, + name, + canBeModified, + isManualSort = false +) { + if (_tableObject) { + _tableObject.destructor(); + $(_tableOverlayClass) + .find(".positiontablecontent") + .html(`
`); + } + if (isManualSort) { + _tableObject = createTableWidgetForManualSort( + columns, + _tableContainerId, + name + ); + } else { + _tableObject = createTableWidget( + columns, + _tableContainerId, + name, + canBeModified || true + ); + } + await _showTableInTable(); + await _removeDetails(); +} +function _addDOMElements() { + let buttonTitle = TC.closeOverlayTableDefault; + if (isString(_previousTableTitle)) { + buttonTitle = TC.closeOverlayTable + _previousTableTitle; + } + $(_showTableInElement).append(` +
+
+
+ +
+
+
+
+
+
+ +
+ `); +} +function _isShowFormOnly() { + return Number(getUrlParameter("theShowFormOnly")) === 1; +} +function _bindClickEvents() { + $(document).on( + "click", + _tableOverlayClass + " button.close", + async function () { + const parent = $(this).closest(_showTableInElement), + parentWidth = parent.width(); + + if (_isShowFormOnly()) { + $(".overview").addClass("notable"); + $(".menutableindetails").show(); + } + $(document) + .find(_tableOverlayClass) + .animate({ left: "-" + parentWidth }, 200, function () { + $(this).css({ visibility: "hidden" }); + $(this).removeAttr("style"); + }); + + if (!isUndefined(addedBreadcrumbId)) { + await Breadcrumb.remove(addedBreadcrumbId); + } + + removeTextEditor(); + + _showParentTable(); + } + ); + const positionTableContainer = new DomElement(_showTableInElement, false); + if (positionTableContainer.size() > 0) { + resizeObserverInstance.observe(positionTableContainer.getDomElement()); + } +} +function _getParentDescription(name) { + let text = ""; + if (_parentTableSelection) { + switch (name) { + case ModuleNameEnum.SIHEADER: + { + const hPk = getPKfromModule(); + text += + SITITLE + + " " + + hPk.idSiBook + + ' / ' + + hPk.siHeaderId + + ""; + } + break; + case ModuleNameEnum.JOB: + text += + _parentTableSelection.job_matchcode + + ' (' + + _parentTableSelection.job_intno + + ")"; + break; + case ModuleNameEnum.CEHEADER: + text += + CETITLE + + " " + + _parentTableSelection.cehe_bookid + + "/" + + _parentTableSelection.cehe_headerid + + " - Var. " + + _parentTableSelection.cehe_variantid; + break; + case ModuleNameEnum.ORDER: + text += + ORDERTITLE + + " " + + _parentTableSelection.orde_orderbookid + + "/" + + _parentTableSelection.orde_orderheaderid; + break; + case ModuleNameEnum.CIHEADER: + text += + CITITLE + + " " + + _parentTableSelection.cihe_bookid + + "/" + + _parentTableSelection.cihe_ciheaderid; + break; + default: + throw new Error('Invalid event "' + name + '"'); + } + } + return text; +} +async function onClickTable(selection, formState) { + const selectionLength = selection.length; + if (selectionLength === 0) { + await _removeDetails(); + } else if (selectionLength === 1) { + + switch (_getModuleName()) { + case ModuleNameEnum.SIHEADER: + await _createToolbarTable(buttons.STATE.siPositionTableMenu); + break; + case ModuleNameEnum.JOB: + await _createToolbarTable(buttons.STATE.jobPositionTableMenu); + break; + case ModuleNameEnum.CEHEADER: + await _createToolbarTable(buttons.STATE.cePositionTableMenu); + break; + case ModuleNameEnum.ORDER: + await _createToolbarTable(buttons.STATE.orderPositionTableMenu); + break; + case ModuleNameEnum.CIHEADER: + await _createToolbarTable(buttons.STATE.ciPositionTableMenu); + break; + default: + throw new Error('Invalid name "' + _getModuleName() + '"'); + } + await _showForm(formState, _getDataFromSelectedEntry()); + } else if (selectionLength > 1) { + switch (_getModuleName()) { + case ModuleNameEnum.SIHEADER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.siPositionTableMenuMultiple); + break; + case ModuleNameEnum.JOB: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.jobPositionTableMenuMultiple); + break; + case ModuleNameEnum.CEHEADER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.cePositionTableMenuMultiple); + break; + case ModuleNameEnum.ORDER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.orderPositionTableMenuMultiple); + break; + case ModuleNameEnum.CIHEADER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.ciPositionTableMenuMultiple); + break; + default: + throw new Error('Invalid name "' + _getModuleName() + '"'); + } + } +} +async function _showTableInTable() { + const tableOverlay = $(_tableOverlayClass); + $(".form_wrapper").addClass("serviceslist"); + const parentTableWidth = $(_showTableInElement).getWidth(); + const parentTableHeight = $(_showTableInElement).getHeight(); + tableOverlay.css({ width: parentTableWidth, height: parentTableHeight }); + tableOverlay + .find(".title span.label1") + .html(_getParentDescription(_getModuleName())); + if (_positionSettings.parent.headerStatus !== "") { + tableOverlay + .find(".title .headerstatus") + .html( + `
${TC.status}: ${_positionSettings.parent.headerStatus}
` + ); + } + tableOverlay.find(_tableContainerId).css({ + width: parentTableWidth - 2, + height: + parentTableHeight - + tableOverlay.find(".title").getHeight() - + _tableOverlayOffsetLeft + }); + tableOverlay.css({ visibility: "visible" }); + await _createToolbarTable(buttons.STATE.initialize); + _rerenderTable(); + _tableObject.on(CALLBACK_EVENTS.SELECTIONCHANGED, async currentRows => { + + console.log("currentRows", currentRows); + + const btnCancel = buttonClasses.cancel; + if ( + !triggerSelectionChangeEvent && + prevRows !== null && + currentRows[0].jpos_posno === prevRows[0].jpos_posno + ) { + return false; + } + + if (_isButtonPresent(btnCancel)) { + _getButtonSelectorObject(btnCancel).trigger("click"); + } else { + prevRows = currentRows; + await onClickTable(currentRows, buttons.STATE.show); + } + return false; + }); + _tableObject.on(CALLBACK_EVENTS.LAYOUTCHANGED, tableConfig => + saveUniversalTableLayout(_tableLayoutInfo.moduleName, tableConfig) + ); + _tableObject.on(CALLBACK_EVENTS.DRAG, (sourceRows, targetRows) => + moveTableRow(sourceRows, targetRows) + ); + _tableObject.on(CALLBACK_EVENTS.FILTERCHANGED, async tableConfig => { + + console.log("FILTERCHANGED", tableConfig, _tableObject.getFilter()); + + await onReloadTable(); + }); +} +async function moveTableRow(sourceRows, targetRows) { + const { canBeModified = true } = _positionSettings.parent.settings; + if (canBeModified) { + const para = { + jobIds: sourceRows.map(el => el.jpos_jobid), + posNos: sourceRows.map(el => el.jpos_posno), + headerTypes: sourceRows.map(el => el.jpos_headertype), + subPosNos: sourceRows.map(el => el.jpos_subposno), + insertAfterPosNo: targetRows[0].jpos_posno, + insertAfterJobId: targetRows[0].jpos_jobid, + insertAfterHeaderType: targetRows[0].jpos_headertype, + insertAfterSubPosNo: targetRows[0].jpos_subposno + }; + const data = await servicesData.setReorderPos(para); + if (data !== null) { + await onReloadTable(); + } + } +} +async function _updateTableContent() { + const moduleName = _getModuleName(); + const filter = _tableObject.getFilter(); + const para = { + ...getFilterPara(filter) + }; + switch (moduleName) { + case ModuleNameEnum.SIHEADER: + { + const hPk = getPKfromModule(); + para.theSIBookID = hPk.idSiBook; + para.theSIHeaderID = hPk.siHeaderId; + } + break; + case ModuleNameEnum.JOB: + { + const hPk = getPKfromModule(); + para.theJobID = hPk.jobid; + } + break; + case ModuleNameEnum.CEHEADER: + { + const hPk = getPKfromModule(); + para.theCEID = hPk.ceId; + } + break; + case ModuleNameEnum.ORDER: + { + const hPk = getPKfromModule(); + para.theOrderID = hPk.orderId; + } + break; + case ModuleNameEnum.CIHEADER: + { + const hPk = getPKfromModule(); + para.ciBookId = hPk.ciBookId; + para.ciHeaderId = hPk.ciHeaderId; + } + break; + default: + throw new Error(`Invalid moduleName "${moduleName}"`); + } + para.theType = _getModuleType(); + const data = await servicesData.getListOfPos(para, _getModuleType(), 1, 1); + if (data !== null) { + + _tableObject.setConfiguration({ + ..._tableObject.getConfiguration(), + columns: data.head.columns + }); + + _setTableData(data); + + _rerenderTable(); + + if (_tableSelectionPosNo) { + _tableObject.setSelection([{ jpos_posno: _tableSelectionPosNo }]); + _tableObject.makeVisible(); + } else { + await _removeDetails(); + } + } +} +function _setTableData(obj) { + _tableData.cols = obj.cols; + _tableData.rows = obj.rows; +} +function _rerenderTable() { + _tableObject.show(_tableData); + if (getSession().userPreferences.autoAdjustColWidth) { + _tableObject.adjustColumnSize(); + } + SplitViewPage.setTableRowCounter(_tableData.rows.length); +} +async function _createFormWidget(positionTypeId, headerPK, contentId = null) { + console.log( + 'Init form for module "' + + _getModuleName() + + '", positiontype ID: ' + + positionTypeId + ); + _formObject = new UiForm( + form.getFormConfig( + _getModuleName(), + positionTypeId, + _formIdName, + _formData, + _staticData, + _isNewDataset + ) + ); + const renderFormInConainter = contentId ? contentId : _getFormSelector(); + await form.initForm( + _getModuleName(), + positionTypeId, + _formEvent, + _formObject, + _formData, + _staticData, + _isNewDataset, + renderFormInConainter, + headerPK + ); +} +function _bindUiListPickerEmployees( + elementName, + defaultTabId, + availableList, + assignedList +) { + const element = _formObject.getElementByName(elementName); + const configuration = {}; + configuration.listOutputElement = "#" + element.getId(); + if (elementName === BEC.LISTEMPLS) { + configuration[BEC.LISTEMPLS] = true; + configuration.Id = "#" + defaultTabId + " dd"; + } + if (!configuration[elementName]) { + throw new Error( + 'function _bindUiListPickerEmployees() only works with elementId: "listEmpls"' + ); + } + if (isUndefined(assignedList)) { + assignedList = []; + } + const $selector = $(configuration.Id); + if ($selector.length === 1) { + UiListPicker.initialize({ + container: configuration.Id, + availableList: { + title: TC.available, + content: _.clone(availableList) + }, + assignedList: { + title: TC.assigned, + content: _.clone(assignedList) + }, + filter: { + lru: "", + onEvent: "keyup blur" + }, + outputElementId: configuration.listOutputElement, + searchParameterArray: ["name", "code"], + textParameterArray: ["name", "code"], + onChange: selection => { + element.__DEPRECATED__setValue(selection.join()); + } + }); + } else { + throw new Error("function _bindUiListPickerEmployees() selector not found"); + } + $selector.find("ul").sortable("disable"); + const taskElementValue = _formObject.__DEPRECATED__getValueStringOpt( + BEC.ISTASK + ); + const setAsNoTask = taskElementValue === BEC.ISTASK + "_false"; + if (taskElementValue === null) { + return; + } + if (!setAsNoTask) { + + if (_formEvent === buttons.STATE.edit || _formEvent === buttons.STATE.new) { + + $selector.find("ul").sortable("enable"); + } else { + + $selector.find("ul").sortable("disable"); + } + + + + if (elementName === BEC.LISTEMPLS && _formEvent === buttons.STATE.edit) { + _showEmployeesDialogButton(configuration.Id); + } + } +} +function _bindUiListPickerPositions( + elementName, + defaultTabId, + availableList, + assignedList +) { + const element = _formObject.getElementByName(elementName); + const configuration = { + listOutputElement: "#" + element.getId(), + id: defaultTabId + }; + const $selector = $("#" + configuration.id); + if ($selector.length === 1) { + UiListPicker.initialize({ + container: "#" + configuration.id, + availableList: { + title: TC.available, + content: _.clone(availableList) + }, + assignedList: { + title: TC.assigned, + content: _.clone(assignedList) + }, + filter: { + lru: "", + onEvent: "keyup blur" + }, + outputElementId: configuration.listOutputElement, + searchParameterArray: ["name"], + textParameterArray: ["name"], + onChange: selection => { + element.__DEPRECATED__setValue(selection.join()); + } + }); + } else { + throw new Error("function _bindUiListPickerPositions() selector not found"); + } + if (_formEvent === buttons.STATE.edit || _formEvent === buttons.STATE.new) { + + $selector.find("ul").sortable("enable"); + } else { + + $selector.find("ul").sortable("disable"); + } +} +function bindTaskProgress(data) { + const elem = _formObject.getElementByName(BEC.PERCCOMPLETED); + let obj; + if (data.basic.isTask) { + obj = { + element: $("#" + elem.getId()), + showpercent: Number(_staticData.settings.taskShowPerc), + prefreopen: Number(_staticData.settings.privTaskReopen), + taskid: data.task.taskID, + status: data.task.taskStatus, + percent: data.task.percCompleted, + decisionResult: false + }; + } else { + + obj = { + element: $("#" + elem.getId()), + showpercent: Number(_staticData.settings.taskShowPerc), + prefreopen: Number(_staticData.settings.privTaskReopen), + taskid: null, + status: 1, + percent: 0, + decisionResult: false + }; + } + _pluginObj[BEC.PERCCOMPLETED] = obj; + progressbar = createTaskProgress( + obj.element, + obj.taskid, + obj.showpercent, + obj.prefreopen, + obj.status, + obj.percent + ); + progressbar.on("change", function (values) { + + progressbar.setStatusOnSuccess(); + + + _pluginObj[BEC.PERCCOMPLETED] = values; + formHelper.setCompleteDate(values.status, _formObject, _staticData); + }); + if (_formEvent !== buttons.STATE.edit && _formEvent !== buttons.STATE.new) { + progressbar.setDisabled(); + } + if (!data.basic.isTask) { + progressbar.setDisabled(); + } +} +function _bindPluginsAfterFormRender(positionTypeId) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + if ( + _.includes( + [ + POSITIONTYPES.EXTERNAL, + POSITIONTYPES.SERVICE, + POSITIONTYPES.MEDIA, + POSITIONTYPES.HOURS, + POSITIONTYPES.INTCOSTS, + POSITIONTYPES.ACONTOSPECIAL, + POSITIONTYPES.ACONTO + ], + positionTypeId + ) + ) { + if ( + preferences.isPreferenceTrue( + _staticData, + preferences.PREFERENCE.HASPROJECTTASKS + ) + ) { + + const elem = _formObject.getElementByName(BEC.LINKCOMM); + addFixedTooltip($("#" + elem.getId()).find("a")); + + _bindUiListPickerEmployees( + BEC.LISTEMPLS, + _formObject.getRowIdOfElementName(BEC.LISTEMPLS), + _generalDataEmplLists.listEmpls, + _formData.task.listEmpls + ); + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.TASKDEPENDENCIES + ) + ) { + + _formObject.__DEPRECATED__setValue( + BEC.LISTTASKS, + formHelper.getDependentTasksList( + _formEvent, + _formObject, + _formData + ) + ); + } + + bindTaskProgress(_formData); + } + } else if (_.includes([POSITIONTYPES.TEXT], positionTypeId)) { + if ( + preferences.isPreferenceTrue( + _staticData, + preferences.PREFERENCE.HASPROJECTTASKS + ) + ) { + + const elem = _formObject.getElementByName(BEC.LINKCOMM); + addFixedTooltip($("#" + elem.getId()).find("a")); + + _bindUiListPickerEmployees( + BEC.LISTEMPLS, + _formObject.getRowIdOfElementName(BEC.LISTEMPLS), + _generalDataEmplLists.listEmpls, + _formData.task.listEmpls + ); + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.TASKDEPENDENCIES + ) + ) { + + _formObject.__DEPRECATED__setValue( + BEC.LISTTASKS, + formHelper.getDependentTasksList( + _formEvent, + _formObject, + _formData + ) + ); + } + + bindTaskProgress(_formData); + } + } else if (_.includes([POSITIONTYPES.SUBTOTAL], positionTypeId)) { + _bindUiListPickerPositions( + BEC.LISTPOS, + _formObject.getRowIdOfElementName(BEC.LISTPOS), + _formData.basic.listPos, + _formData.basic.listPosConnected + ); + } + break; + case ModuleNameEnum.CEHEADER: + if (_.includes([POSITIONTYPES.SUBTOTAL], positionTypeId)) { + _bindUiListPickerPositions( + BEC.LISTPOS, + _formObject.getRowIdOfElementName(BEC.LISTPOS), + _formData.basic.listPos, + _formData.basic.listPosConnected + ); + } + break; + case ModuleNameEnum.CIHEADER: + if (_.includes([POSITIONTYPES.SUBTOTAL], positionTypeId)) { + _bindUiListPickerPositions( + BEC.LISTPOS, + _formObject.getRowIdOfElementName(BEC.LISTPOS), + _formData.basic.listPos, + _formData.basic.listPosConnected + ); + } + break; + default: + break; + } +} +async function _resetDetails() { + setTableOverlayPanel(""); + const isAddTask = + typeof _options !== "undefined" && _options.hasOwnProperty("addTask") + ? _options.addTask === 1 + : false; + if (_tableObject.getCurrentRow() === null || isAddTask) { + + await _removeDetails(); + } else { + + await _showForm(buttons.STATE.show, _getDataFromSelectedEntry()); + } +} +async function _removeDetails() { + _hideTheForm(); + await _createToolbarTable(buttons.STATE.initialize); + _showFormButtons(buttons.STATE.initialize); +} +function urlParameterAvailable(name = "") { + return window.location.href.indexOf(name) !== -1; +} +function setIdToUrl(id) { + if (urlParameterAvailable("serviceID")) { + setUrlParameter("serviceID", id.toString()); + } +} +async function _showForm(setEvent, selection, contentId = null) { + _isNewDataset = false; + triggerSelectionChangeEvent = true; + _formEvent = setEvent; + if (selection) { + _tableSelectionPosNo = selection.jpos_posno; + _tableSelectionJobNo = selection.jpos_jobid; + + const para = { + theJobID: selection.jpos_jobid, + thePosNo: selection.jpos_posno, + theHeaderType: selection.jpos_headertype, + theSubPosNo: selection.jpos_subposno + }; + + const data = await servicesData.getPosData(para); + if (data !== null) { + + if ( + _.includes( + [ + POSITIONTYPES.EXTERNAL, + POSITIONTYPES.MEDIA, + POSITIONTYPES.SERVICE, + POSITIONTYPES.HOURS, + POSITIONTYPES.INTCOSTS, + POSITIONTYPES.TEXT, + POSITIONTYPES.ACONTOSPECIAL, + POSITIONTYPES.ACONTO, + POSITIONTYPES.SUBTOTAL + ], + data.basic.idPosType + ) + ) { + + _formData = data; + + await _createFormWidget( + data.basic.idPosType, + getPKfromModule(), + contentId + ); + + _setCalculationButton(data.basic.idPosType); + + _setEnhanceButton(data.basic.idPosType); + + if ( + preferences.isPreferenceTrue( + _staticData, + preferences.PREFERENCE.HASPROJECTTASKS + ) + ) { + reOpenTaskButton(data.basic.idPosType, setEvent); + } + + _setDefaultLayoutButton(data.basic.idPosType, setEvent); + + setTechnicalTextButton(_formObject, data.basic.idPosType); + + _setCostsButton(data.basic.idPosType, setEvent); + + _bindPluginsAfterFormRender(data.basic.idPosType); + + _showTheForm(); + if (!_isFormInDialog) { + setTableOverlayPanel(setEvent); + + _showFormButtons(setEvent); + + setIdToUrl(selection.jpos_posno); + } else { + _showFormButtons(setEvent); + + } + } else { + showLoadingWarning("form not defined"); + await _removeDetails(); + } + } else { + await _removeDetails(); + } + } else { + + await _removeDetails(); + } +} +async function _showFormNewPosition(setEvent, postypeID, serverData) { + _isNewDataset = true; + _formEvent = setEvent; + if (!_isFormInDialog) { + setTableOverlayPanel(setEvent); + + _tableSelectionPosNo = null; + + _tableObject.setCurrentRow(null); + } + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewPos( + { + theJobID: hPk.jobid, + thePostype: postypeID + }, + servicesData.ServiceHeaderType.JOB + ); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + case ModuleNameEnum.SIHEADER: + if (!serverData) { + throw new Error(); + } + await _showFormNewPositionExtended( + setEvent, + serverData, + getPKfromModule() + ); + break; + case ModuleNameEnum.CEHEADER: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewPos( + { + theJobID: hPk.ceId, + thePostype: postypeID + }, + servicesData.ServiceHeaderType.CE + ); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + case ModuleNameEnum.ORDER: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewPos( + { + theJobID: hPk.orderId, + thePostype: postypeID + }, + servicesData.ServiceHeaderType.ORDER + ); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + case ModuleNameEnum.CIHEADER: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewCIPos({ + ciBookId: hPk.ciBookId, + ciHeaderId: hPk.ciHeaderId, + posType: postypeID + }); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +async function _showFormNewPositionExtended(setEvent, data, headerPK) { + _formData = data; + await _createFormWidget( + data.basic.idPosType, + headerPK, + _isFormInDialogSelector + ); + _setCalculationButton(data.basic.idPosType); + _setEnhanceButton(data.basic.idPosType); + _setDefaultLayoutButton(data.basic.idPosType, setEvent); + setTechnicalTextButton(_formObject, data.basic.idPosType); + _setCostsButton(data.basic.idPosType, setEvent); + _bindPluginsAfterFormRender(data.basic.idPosType); + _showTheForm(); + _showFormButtons(setEvent); +} +function setTableOverlayPanel(setEvent) { + switch (setEvent) { + case buttons.STATE.edit: + case buttons.STATE.new: + SplitViewPage.disableOverviewPage(); + break; + default: + SplitViewPage.enableOverviewPage(); + break; + } +} +async function _saveForm(removeShowWarning, successWithInfoOptions) { + if (_formObject.validate()) { + const hPk = getPKfromModule(); + const saveData = convertData( + hPk, + _formObject.__DEPRECATED__getValues(), + _formData, + _getModuleName(), + _pluginObj, + _isNewDataset, + removeShowWarning, + successWithInfoOptions + ); + + const json = await servicesData.setSavedPos(saveData, _isNewDataset); + if (json.stat.status === STATUS.SUCCESS) { + + if (_isNewDataset) { + _tableSelectionPosNo = json.data.posNo; + } + await _saveCompleted(_tableSelectionPosNo); + return true; + } else if (json.stat.status === STATUS.INFO) { + + + if ( + _.includes(Object.keys(json.data), "askSplitPos") || + _.includes(Object.keys(json.data), "askHowToChange") + ) { + await showSISaveDialog(json.data); + return true; + } + } else if (json.stat.status === STATUS.VALIDATE) { + await showWarningDialog(json.stat.message); + } else if (json.stat.status === STATUS.WARNING) { + + await showSISaveConfirmDialog(json.data.warnings); + } + } else { + showLoadingWarning(pageTC.requiredInformation); + } + return false; +} +async function _saveCompleted(newPosNo) { + _formObject.setActive(false); + _formObject.memorizeCurrentValues(); + if (_isFormInDialog && _isFormInDialogJobPK !== null) { + _isFormInDialogJobPK.jpos_posno = newPosNo; + + await _showForm( + buttons.STATE.show, + _isFormInDialogJobPK, + _isFormInDialogSelector + ); + } else { + + await _updateTableContent(); + } +} +async function showSISaveConfirmDialog(message) { + const ok = await confirmDialog(message); + if (ok) { + await _saveForm(true); + } +} +async function showSISaveDialog(data) { + const defaultSetting = { + doSplitPos: true, + chargeType: 10 + }, + elements = { + chbox: new UiElementCheckbox({ + name: "splitPos", + value: defaultSetting.doSplitPos + }), + radio: new UiElementRadio({ + name: "howToCharge", + value: defaultSetting.chargeType, + selectOptions: _.map(_staticData.lists.listChargeTypes, function (obj) { + return { id: obj.id, name: obj.name }; + }) + }) + }; + let askSplitPosText, + asHowToChargeText, + html = ""; + html += ''; + if (data.askSplitPos) { + if (_formData.settings.ciExists) { + askSplitPosText = TC.askSplitPosCiExists; + } else { + askSplitPosText = TC.askSplitPos; + } + html += ""; + html += ""; + } + if (data.askHowToCharge) { + asHowToChargeText = TC.howToCharge; + html += '"; + html += + '"; + } + html += "
" + elements.chbox.getHTML() + "" + askSplitPosText + "



' + asHowToChargeText + "
' + + elements.radio.getHTML() + + "
"; + const dialog = new UiDialog({ + autoClose: true, + html, + title: pageTC.confirmation, + async onClose(ok) { + return ok ? _saveForm(true, defaultSetting) : true; + } + }); + elements.chbox.onChange(element => { + defaultSetting.doSplitPos = element.getValueBoolean(); + }); + elements.radio.onChange(element => { + defaultSetting.chargeType = element.getValueAsNumber(); + }); + if (data.askSplitPos) { + elements.chbox.bindEvents(); + } + if (data.askHowToCharge) { + elements.radio.bindEvents(); + } + await dialog.open(); +} +async function getSortDialog() { + let sortOrder = 1; + const NAME = "sortPosition"; + const elements = { + radio: new UiElementRadio({ + name: "sortOrder", + value: sortOrder, + selectOptions: [ + { + id: "1", + name: TC.sortByCategory + }, + { + id: "2", + name: TC.sortByGroup + } + ] + }) + }; + const html = `
+ + + + +
${elements.radio.getHTML()}
+
`; + if (_parentTableSelection === null) { + throw new Error("No row selected"); + } + const dialog = new UiDialog({ + autoClose: true, + html, + title: pageTC.confirmation, + onClose(ok) { + if (ok) { + return sendSortCommandToBE(_parentTableSelection, sortOrder); + } + return Promise.resolve(true); + } + }); + elements.radio.onChange(element => { + sortOrder = element.getValueAsNumber(); + }); + elements.radio.bindEvents(); + $("." + NAME + " table").attr("style", "width: 100%"); + $("." + NAME + " table td").attr("style", "text-align: center"); + const isClosed = await dialog.open(); + if (isClosed) { + await _updateTableContent(); + } +} +async function sendSortCommandToBE(currentRow, sortOrder) { + const moduleName = _getModuleName(); + switch (moduleName) { + case ModuleNameEnum.JOB: + return servicesData.setJobSortType(currentRow.job_jobid, sortOrder); + case ModuleNameEnum.CEHEADER: + return servicesData.setCeSortType(currentRow.cehe_ceid, sortOrder); + case ModuleNameEnum.CIHEADER: + return servicesData.setCiSortType( + { + ciBookId: currentRow.cihe_bookid, + ciHeaderId: currentRow.cihe_ciheaderid + }, + sortOrder + ); + default: + throw new Error('Invalid name "' + moduleName + '"'); + } +} +async function deleteEntryJob(para) { + const result = await servicesData.setDeletePosList(para); + if (result) { + if (_isFormInDialog && _isFormInDialogSelector !== null) { + $(_isFormInDialogSelector).html(""); + + _showFormButtons(buttons.STATE.initialize); + } else { + _tableSelectionPosNo = null; + await _updateTableContent(); + + + + + + + + + + + + + + + + + } + } +} +async function deleteEntrySiCheck() { + const selectedListPosNo = _tableObject + .getSelection() + .map(el => el.jpos_posno); + const hPk = getPKfromModule(); + const data = await servicesData.setSiCheckDeletePos({ + idSiBook: hPk.idSiBook, + siHeaderId: hPk.siHeaderId, + listPosNos: selectedListPosNo + }); + if (data.askSupplRemains) { + + const ok = await confirmDialog(TC.askJobservicesStayAssigned); + if (ok) { + await deleteEntrySi(true); + } else { + await deleteEntrySi(false); + } + } else { + + await deleteEntrySi(true); + } +} +async function deleteEntrySi(supplRemains) { + const selectedListPosNo = _tableObject + .getSelection() + .map(el => el.jpos_posno); + const hPk = getPKfromModule(); + const para = { + idSiBook: hPk.idSiBook, + siHeaderId: hPk.siHeaderId, + supplRemains: supplRemains, + lockTimestamp: _formData.settings.lockTimestamp, + listPosNos: selectedListPosNo + }; + await servicesData.setSiDeletePos(para); + _tableSelectionPosNo = null; + await _updateTableContent(); +} +async function setDeletePosList(para) { + const result = await servicesData.setDeletePosList(para); + if (result) { + + _tableSelectionPosNo = null; + await _updateTableContent(); + } +} +async function _deleteEntry(disableWarnings = false) { + let pk = null; + if (_isFormInDialog && _isFormInDialogJobPK !== null) { + pk = { + jobId: _isFormInDialogJobPK.jpos_jobid, + headerType: _isFormInDialogJobPK.jpos_headertype, + listPosNos: _isFormInDialogJobPK.jpos_posno + ? [_isFormInDialogJobPK.jpos_posno] + : [], + subPosNo: _isFormInDialogJobPK.jpos_subposno + }; + } else { + pk = getPKFromSelection(); + } + if (pk === null) { + return; + } + const data = { + jobID: pk.jobId, + headerType: pk.headerType, + listPosNos: pk.listPosNos, + subPosNo: pk.subPosNo, + lockTimestamp: _formData.settings.lockTimestamp, + showWarnings: !disableWarnings + }; + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + await deleteEntryJob(data); + break; + case ModuleNameEnum.SIHEADER: + await deleteEntrySiCheck(); + break; + case ModuleNameEnum.CEHEADER: + await setDeletePosList(data); + break; + case ModuleNameEnum.ORDER: + await setDeletePosList(data); + break; + case ModuleNameEnum.CIHEADER: + await setDeletePosList(data); + break; + default: + throw new Error( + 'Invalid name "' + _getModuleName() + '" in _deleteEntry()' + ); + } +} +function showEnhanceEffect($selector, hiddenClassName, type = "slideandfade") { + switch (type) { + + case "show": + $selector.removeClass(hiddenClassName); + break; + case "fold": + + $selector.hide().removeClass(hiddenClassName).slideDown(500).show(); + break; + case "fade": + + $selector + .css({ opacity: 0 }) + .removeClass(hiddenClassName) + .animate({ opacity: 1 }, 600); + break; + case "slideandfade": + + $selector + .css({ opacity: 0 }) + .hide() + .removeClass(hiddenClassName) + .slideDown(300) + .animate({ opacity: 1 }, 250); + break; + default: + throw new Error('Invalid type "' + type + '" in showEnhanceEffect()'); + } +} +function _setCalculationButton(positionTypeId) { + let showButton = true, + showButtonInTab = 1; + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + + showButtonInTab = 1; + break; + case ModuleNameEnum.SIHEADER: + + showButtonInTab = 1; + break; + case ModuleNameEnum.CEHEADER: + + showButtonInTab = 1; + break; + default: + break; + } + switch (positionTypeId) { + case POSITIONTYPES.TEXT: + showButton = false; + break; + case POSITIONTYPES.SUBTOTAL: + showButton = false; + break; + default: + + break; + } + if (showButton) { + + new UiButton( + TC.showCalculation, + "showCalcBtn", + async function () { + + await _showCalculationDialog(); + }, + "calculator" + ).appendHTML("#" + _formObject.getPageId(showButtonInTab)); + } +} +function _setEnhanceButton(positionTypeId) { + let showButton = true, + showButtonInTab = 1; + switch (_getModuleName()) { + + case ModuleNameEnum.JOB: + showButtonInTab = 1; + break; + case ModuleNameEnum.SIHEADER: + + showButtonInTab = 1; + break; + case ModuleNameEnum.CEHEADER: + + showButtonInTab = 1; + break; + default: + break; + } + switch (positionTypeId) { + case POSITIONTYPES.TEXT: + showButton = false; + break; + case POSITIONTYPES.SUBTOTAL: + showButton = false; + break; + default: + + break; + } + if (showButton) { + const COOKIE = new CookieStorage( + "services_price_enhanced_" + _getModuleName() + ); + + new UiButton( + TC.enhanced, + "enhancedBtn", + function (e) { + const btnIcon = e.currentTarget; + const $enhancedElements = $("#" + _formObject.getFormId()).find( + ".enhanced" + ); + + if (COOKIE.get() === "true") { + + $enhancedElements.addClass("enhanced_hidden"); + switchButtonIcon(btnIcon, "caret-1-n", "caret-1-s"); + COOKIE.set("false"); + } else { + + showEnhanceEffect($enhancedElements, "enhanced_hidden"); + switchButtonIcon(btnIcon, "caret-1-s", "caret-1-n"); + COOKIE.set("true"); + } + }, + "caret-1-s" + ).appendHTML("#" + _formObject.getPageId(showButtonInTab)); + + if (COOKIE.get() === "true") { + switchButtonIcon("#" + _formObject.getFormId(), "caret-1-s", "caret-1-n"); + $("#" + _formObject.getFormId()) + .find(".enhanced") + .removeClass("enhanced_hidden"); + } + } +} +function _setDefaultLayoutButton(positionTypeId, setEvent) { + const $selector = $(".showDefaultBtn"); + const showButtonInTab = _formObject.getPageIndexWithElementName( + BEC.POSITIONPRINT + ); + console.log(_formObject.getPageIdWithElementName(BEC.POSITIONPRINT)); + switch (setEvent) { + + case buttons.STATE.edit: + + if ( + _getModuleName() === ModuleNameEnum.SIHEADER && + _formData.settings[SETTINGS.CIEXISTS] + ) { + break; + } + + if ($selector.length === 0) { + + new UiButton( + TC.defaultSettings, + "showDefaultBtn", + async function () { + + if (_tableSelectionJobNo === null) { + throw new Error( + 'In edit mode the variable "_tableSelectionJobNo" must have a number' + ); + } + await formHelper.setLayoutElementsDefaultRoutine( + _formObject, + _formData, + _tableSelectionJobNo + ); + }, + "gear", + undefined, + false + ).appendHTML("#" + _formObject.getPageId(showButtonInTab)); + } + break; + + default: + + if ($selector.length === 1) { + $selector.remove(); + } + break; + } +} +function _showEmployeesDialogButton(appendTo) { + const className = "changeEmplSelectionInfoBtn"; + const button = new UiButton( + TC.enhancedSelection, + className, + async () => { + await showAssignResourcesDialog(appendTo); + }, + "btn-img-emplAssign" + ); + button.appendHTML(appendTo); + new DomElement(`.${className}`).setCssObject({ + float: "right", + marginTop: 10, + marginRight: 5 + }); +} +async function showAssignResourcesDialog(appendTo) { + const { taskID } = _formData.task; + const ok = await showEmployeeAssignDialog(taskID); + if (ok) { + const formDataPointerCopy = _formData; + const data = await servicesData.getTaskEmpl(taskID); + + formDataPointerCopy.task.listEmpls = data; + _formObject.__DEPRECATED__setValue(BEC.LISTEMPLS, data.join(",")); + + $(appendTo).html(_formObject.getElementByName(BEC.LISTEMPLS).getHTML()); + + _bindPluginsAfterFormRender(formDataPointerCopy.basic.idPosType); + } +} +function _setCostsButton(positionTypeId, event) { + switch (event) { + + case buttons.STATE.initialize: + break; + + case buttons.STATE.show: + break; + + case buttons.STATE.reset: + break; + + case buttons.STATE.edit: + case buttons.STATE.new: + switch (_getModuleName()) { + case ModuleNameEnum.SIHEADER: + if ( + _.includes( + [POSITIONTYPES.EXTERNAL, POSITIONTYPES.MEDIA], + positionTypeId + ) + ) { + formHelper.addButtonFormPageCosts( + _staticData, + _formObject, + BEC.NCHCOSTCENTRE + ); + } + break; + case ModuleNameEnum.CIHEADER: + if (_.includes([POSITIONTYPES.INTCOSTS], positionTypeId)) { + formHelper.addButtonFormPageCosts( + _staticData, + _formObject, + BEC.NCHCOSTCENTRE + ); + } + break; + case ModuleNameEnum.JOB: + case ModuleNameEnum.CEHEADER: + case ModuleNameEnum.ORDER: + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } + break; + default: + throw new Error('Invalid event _setCostsButton("' + event + '")'); + } +} +function reOpenTaskButton(positionTypeId, event) { + switch (_getModuleName()) { + + case ModuleNameEnum.JOB: + + if (positionTypeId !== POSITIONTYPES.SUBTOTAL) { + formHelper.addButtonReOpenTask( + _getModuleName(), + _staticData, + _formObject, + _formData.task.taskID, + event + ); + } + break; + default: + break; + } +} +function _buttonNewPositions() { + const serviceTypes = _staticData.lists.listPosTypes.filter(e => e.isUsed); + const btnArray = serviceTypes.map((obj, i) => { + return { + rowId: "addPosition" + i, + rowText: obj.name, + rowListener: async function () { + await _getNewPositionForm(obj.id); + } + }; + }); + return new UiSelectButton(TC.new, "newPosition", btnArray, "caret-1-s"); +} +export async function onEdit() { + if (_isFormInDialog) { + await _showForm( + buttons.STATE.edit, + _isFormInDialogJobPK, + _isFormInDialogSelector + ); + } else { + await _showForm(buttons.STATE.edit, _getDataFromSelectedEntry()); + } +} +async function onDelete() { + let selectionCount = 0; + if (_isFormInDialog) { + selectionCount = 1; + } else { + selectionCount = _tableObject.getSelectionCount(); + } + const ok = await confirmDialog(getDeleteDialogText(selectionCount)); + if (ok) { + await _deleteEntry(); + } +} +async function onDeleteAndMoveNCH() { + const pk = getPKFromSelection(); + if (pk === null) { + return; + } + const ok = await confirmDialog(TC.confirmationDeleteAndMoveNCH); + if (ok) { + const data = { + jobID: pk.jobId, + headerType: pk.headerType, + listPosNos: pk.listPosNos, + subPosNo: pk.subPosNo + }; + let setNchData = {}; + const infoForDelete = await servicesData.getInfoForDeleteCiPosList(data); + if (infoForDelete.doShowNCHInfo) { + const { nchAccount, nchCostCentre } = infoForDelete; + setNchData = await showNchInfoDialog( + { nchAccount, nchCostCentre }, + _staticData + ); + } + if (setNchData !== null) { + const setDeleteData = { + ...data, + ...setNchData, + lockTimestamp: _formData.settings.lockTimestamp, + showWarnings: true + }; + const result = await servicesData.setDeleteCiPosList(setDeleteData); + if (result) { + + _tableSelectionPosNo = null; + await _updateTableContent(); + } + } + } +} +function _buttonDeleteCiPositions() { + return new UiSelectButton( + TC.buttonDelete, + "deleteCiPosition", + [ + { rowId: "deleteCI", rowText: TC.buttonDelete, rowListener: onDelete }, + { + rowId: "deleteCIAndMoveNCH", + rowText: TC.buttonDeleteAndMoveNCH, + rowListener: onDeleteAndMoveNCH + } + ], + "trash" + ); +} +async function onCancel() { + triggerSelectionChangeEvent = true; + if ( + !_formObject.valuesAreEqualWithMemorizedValues() && + getSession().userPreferences.notifyCancelChanges + ) { + const ok = await confirmDialog(pageTC.dialogTextConfirmCancel); + if (ok) { + if (_isFormInDialog) { + await onCancelInDialog(); + } else { + await _resetDetails(); + } + } else { + if (prevRows !== null) { + triggerSelectionChangeEvent = false; + _tableObject.setSelection(prevRows); + } + } + } else { + if (_isFormInDialog) { + await onCancelInDialog(); + } else { + await _resetDetails(); + } + } +} +async function onCancelInDialog() { + if (_isNewDataset && _isFormInDialogSelector !== null) { + + $(_isFormInDialogSelector).html(""); + + _showFormButtons(buttons.STATE.initialize); + } else { + await _showForm( + buttons.STATE.show, + _isFormInDialogJobPK, + _isFormInDialogSelector + ); + } +} +async function onSave() { + await _saveForm(false); +} +function _showFormButtons(manualSetEvent) { + const p = { + create: privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATE), + modify: privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY), + delete: privileges.getPrivilege(_staticData, privileges.PRIVILEGE.DELETE) + }; + if (_getModuleName() === ModuleNameEnum.SIHEADER) { + p.create = privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SIPOSNEW + ); + } + const s = { + canBeCreated: false, + editable: false, + canBeDeleted: false + }; + if (manualSetEvent) { + _formEvent = manualSetEvent; + } + s.canBeCreated = _positionSettings.settings[SETTINGS.CREATEABLE]; + s.canBeDeleted = _positionSettings.settings[SETTINGS.DELETABLE]; + if ( + _formData && + _formEvent !== buttons.STATE.new && + _formEvent !== buttons.STATE.initialize && + _formEvent !== buttons.STATE.multipleInitialize && + _formEvent !== buttons.STATE.delete + ) { + s.editable = _formData.settings[SETTINGS.MODIFIABLE]; + + + if (!s.editable) { + + console.log( + "entry not editable: set _formEvent from", + _formEvent, + "to", + buttons.STATE.show + ); + + _formEvent = buttons.STATE.show; + } + } + console.log("_showFormButtons: ", _formEvent); + console.log("privileges", p); + console.log("settings", s); + let toolbar; + if (_isFormInDialog) { + toolbar = new SplitViewMenu.Toolbar("showFormOnly"); + } else { + toolbar = new SplitViewMenu.Toolbar("form"); + } + switch (_formEvent) { + + case buttons.STATE.initialize: + if (p.create && s.canBeCreated) { + toolbar.add(_buttonNewPositions()); + } + break; + + case buttons.STATE.multipleInitialize: + if (p.create && s.canBeCreated) { + toolbar.add(_buttonNewPositions()); + } + if (p.delete && s.canBeDeleted) { + if ( + _getModuleName() === ModuleNameEnum.CIHEADER && + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] + ) { + toolbar.add(_buttonDeleteCiPositions(), "right"); + } else { + toolbar.addDefaultDelete(onDelete, "right"); + } + } + break; + + case buttons.STATE.edit: + case buttons.STATE.new: + toolbar.addDefaultCancel(onCancel); + toolbar.addDefaultSave(onSave); + break; + + case buttons.STATE.show: + if (p.create && s.canBeCreated) { + toolbar.add(_buttonNewPositions()); + } + if (p.modify && s.editable) { + toolbar.addDefaultEdit(onEdit); + } + if (p.delete && s.canBeDeleted) { + if ( + _getModuleName() === ModuleNameEnum.CIHEADER && + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] + ) { + toolbar.add(_buttonDeleteCiPositions(), "right"); + } else { + toolbar.addDefaultDelete(onDelete, "right"); + } + } + break; + + case buttons.STATE.reset: + if (p.create && s.canBeCreated) { + + toolbar.add(_buttonNewPositions()); + } + break; + + case buttons.STATE.delete: + if (p.delete && s.canBeDeleted) { + if ( + _getModuleName() === ModuleNameEnum.CIHEADER && + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] + ) { + toolbar.add(_buttonDeleteCiPositions(), "right"); + } else { + toolbar.addDefaultDelete(onDelete, "right"); + } + } + break; + default: + throw new Error('Invalid event "' + _formEvent + '"'); + } + toolbar.render(); +} +async function _showCalculationDialog() { + await form.showCalculationDialog( + _getModuleName(), + TC.calculation, + getPKfromModule() + ); +} +function setPKfromModule(parentTableSelection) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + _parentTableDataId = { + jobid: parentTableSelection.job_jobid + }; + break; + case ModuleNameEnum.SIHEADER: + _parentTableDataId = { + siHeaderId: parentTableSelection.sihd_siheaderid, + idSiBook: parentTableSelection.sihd_bookid + }; + break; + case ModuleNameEnum.CEHEADER: + _parentTableDataId = { + ceId: parentTableSelection.cehe_ceid + }; + break; + case ModuleNameEnum.ORDER: + _parentTableDataId = { + orderId: parentTableSelection.orde_orderid + }; + break; + case ModuleNameEnum.CIHEADER: + _parentTableDataId = { + ciHeaderId: parentTableSelection.cihe_ciheaderid, + ciBookId: parentTableSelection.cihe_bookid + }; + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +function getPKfromModule() { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + return _parentTableDataId; + case ModuleNameEnum.SIHEADER: + return _parentTableDataId; + case ModuleNameEnum.CEHEADER: + return _parentTableDataId; + case ModuleNameEnum.ORDER: + return _parentTableDataId; + case ModuleNameEnum.CIHEADER: + return _parentTableDataId; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +function _getDataFromSelectedEntry() { + return _tableObject.getCurrentRow(); +} +async function _getNewPositionForm(postypeID) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + case ModuleNameEnum.SIHEADER: + + await _showNewJobFromTemplateDialog(postypeID); + break; + case ModuleNameEnum.CEHEADER: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + case ModuleNameEnum.ORDER: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + case ModuleNameEnum.CIHEADER: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +async function _showNewJobFromTemplateDialog(postypeID) { + const options = { + title: TC.selectJobFromTemplateDialogTitle, + showCheckbox: privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SHOWALLJOBS + ), + includeJob: true + }; + const result = await genericJobSelectionDialog( + options, + ".newJobFromTemplate_div" + ); + if (result !== null && result.data.jobRequest.theJobID) { + const hPk = getPKfromModule(); + const para = { + theSIBookID: hPk.idSiBook, + theSIHeaderID: hPk.siHeaderId, + thePostype: postypeID ? postypeID : 1, + theJobID: result.data.jobRequest.theJobID + }; + const data = await servicesData.getDefaultsForNewSIPos(para); + await _showFormNewPosition(buttons.STATE.new, 0, data); + } +} +function _isButtonPresent(buttonName) { + return SplitViewMenu.isButtonPresent(buttonName); +} +function _getButtonSelectorObject(buttonName) { + return SplitViewMenu.getButtonSelectorObject(buttonName); +} +function _showTheForm() { + SplitViewPage.showForm(); +} +function _hideTheForm() { + SplitViewPage.hideForm(); +} +function _getFormSelector() { + return "." + SplitViewPage.getDetailsFormClass(); +} +function _getListofSelectedRow() { + const CURRENT_ROW = _tableObject.getCurrentRow(); + return CURRENT_ROW === null + ? [] + : _.compact(_.map(_tableObject.getSelection(), "jpos_posno")); +} +function getSelectionCount() { + const selection = _tableObject.getSelection(); + return selection.length; +} +function getPKFromSelection() { + const selection = _tableObject.getSelection(); + if (selection.length === 0) { + return null; + } + return { + jobId: Number(selection[0].jpos_jobid), + headerType: Number(selection[0].jpos_headertype), + listPosNos: selection.map(obj => Number(obj.jpos_posno)), + subPosNo: Number(selection[0].jpos_subposno) + }; +} +function _showParentTable(forceReload = true) { + $(".form_wrapper").removeClass("serviceslist"); + if (forceReload) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.SIHEADER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.CEHEADER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.ORDER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.CIHEADER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + default: + break; + } + } +} +function _setParentModulSettings(moduleName) { + switch (moduleName) { + case ModuleNameEnum.JOB: + _parentModuleSettings = { + type: "job", + moduleName: moduleName + }; + break; + case ModuleNameEnum.CEHEADER: + _parentModuleSettings = { + type: "ce", + moduleName: moduleName + }; + break; + case ModuleNameEnum.SIHEADER: + _parentModuleSettings = { + type: "si", + moduleName: moduleName + }; + break; + case ModuleNameEnum.ORDER: + _parentModuleSettings = { + type: "order", + moduleName: moduleName + }; + break; + case ModuleNameEnum.CIHEADER: + _parentModuleSettings = { + type: "ci", + moduleName: moduleName + }; + break; + default: + throw new TypeError("Invalid moduleName: " + moduleName); + } +} +function _getModuleType() { + return _parentModuleSettings.type; +} +function _getModuleName() { + return _parentModuleSettings.moduleName; +} +export async function initialize( + generalDataEmplLists, + newContainerId, + moduleName, + previousTableTitle +) { + _setParentModulSettings(moduleName); + _tableContainerId = "#" + newContainerId; + _formIdName = moduleName + "_" + newContainerId + "-form"; + _previousTableTitle = previousTableTitle; + _addDOMElements(); + _bindClickEvents(); + _staticData = await servicesData.getGeneralData(_getModuleType()); + if (generalDataEmplLists !== null) { + _generalDataEmplLists = generalDataEmplLists; + } else { + _generalDataEmplLists = { + listEmpls: _staticData.lists.listEmpls + }; + } + return _staticData; +} +export async function renderFormInDialog(contentId, data, addTask = false) { + const moduleName = ModuleNameEnum.SERVICES; + const pkForJobService = { + jpos_jobid: data.jobId, + jpos_posno: data.posNo, + jpos_headertype: 1, + jpos_subposno: 1 + }; + _setParentModulSettings(ModuleNameEnum.JOB); + _isFormInDialog = true; + _isFormInDialogSelector = contentId; + _isFormInDialogJobPK = pkForJobService; + _parentTableDataId = { + jobid: data.jobId + }; + _formIdName = moduleName + "_form"; + _staticData = await servicesData.getGeneralData("job"); + checkIsNonemptyObject(_staticData, "staticData in " + moduleName); + const settings = await servicesData.getActionInfo( + getPKfromModule(), + _getModuleType() + ); + _positionSettings.settings[SETTINGS.CREATEABLE] = settings.canBeCreated; + _positionSettings.settings[SETTINGS.DELETABLE] = settings.canBeDeleted; + const emailOfCurrentUser = await employeeData.getEmplList(); + _generalDataEmplLists = { + listEmpls: emailOfCurrentUser + }; + if (addTask) { + + _showFormButtons(buttons.STATE.initialize); + $("#newPosition button").trigger("click"); + } else { + await _showForm(buttons.STATE.show, pkForJobService, contentId); + } +} diff --git a/test/configCases/inner-graph/issue-11678/webpack.config.js b/test/configCases/inner-graph/issue-11678/webpack.config.js new file mode 100644 index 000000000..b66e005aa --- /dev/null +++ b/test/configCases/inner-graph/issue-11678/webpack.config.js @@ -0,0 +1,71 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "resize-observer": ["ResizeObserver"], + "Source_Data/employee": [], + "Source_Data/services": [], + "Source_Framework/splitview/page": [], + "Source_Framework/splitview/menu": [], + "Source_Framework/splitview/text": [], + "Source_Framework/uilistpicker/UiListPicker": [], + "Source_ODS/cookiestorage": [], + "Source_Framework/uirichtextedit": [], + "Source_Framework/uielement": [], + "Source_ODS/UiButton/icon": [], + "Source_ODS/UiButton/text": [], + "Source_Framework/pagelinks": [], + "Source_ODS/ods": [], + "Source_ODS/UiButton": [], + "Source_Framework/defaultButtons": [], + "Source_Framework/uiform": [], + "Source_Framework/breadcrumb": [], + "Source_ODS/lodash": [], + "Source_ODS/DomElement": [], + "Source_ODS/url": [], + "Source_ODS/tooltip": [], + "Source_ODS/ui": [], + "Source_ODS/types": [], + "Source_ODS/UiDialog": [], + "Source_Framework/common/moduleDispatcher": [], + "Source_Framework/common/employeeassignment": [], + "Source_Framework/common/pdf_preview": [], + "Source_Framework/common/taskprogress": [], + "Source_Framework/uitable": [], + "Source_Framework/backend/universalData": [], + "Source_Framework/common/columnsDialog": [], + "Source_Framework/backend/jsonData": [], + "Source_Framework/common/statuschange": [], + "Source_Framework/common/las_mod_jobselection": [], + "./text": [], + "./bec": [], + "./positionTypes": [], + "./settings": ["SETTINGS"], + "./preferences": [], + "./privileges": [], + "./buttons": [], + "./form": [], + "./formHelper": [], + "./table": [], + "./techText": [], + "./addPositionToSi": [], + "./ciPosFromJob": [], + "./shiftPosition": [], + "./autoSums": [], + "./defineLayout": [], + "./insertFromTemplate": [], + "./movePosition": [], + "./copy": [], + "./save": [], + "./createOrder": [], + "./orderPosFromJobPos": [], + "./nchInfoDialog": [], + "Source_Modules/las_mod_siheader/url": [], + "Source_Modules/las_mod_siheader/bec": [], + "Source_Modules/las_mod_ceheader/bec": [], + "Source_Modules/las_mod_order/bec": [], + "Source_Modules/las_mod_ciheader/bec": [] + } + } +});