@roomle/web-sdk 3.3.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{BufferGeometry-DDTUVCTZ.mjs → BufferGeometry-Br8QIDeK.mjs} +2 -2
- package/lib/{BufferGeometry-DDTUVCTZ.mjs.map → BufferGeometry-Br8QIDeK.mjs.map} +1 -1
- package/lib/ConfiguratorKernel.wasm +0 -0
- package/lib/{GLTFExporter-C6OIpz7t.mjs → GLTFExporter-DUjuGznV.mjs} +2 -2
- package/lib/{GLTFExporter-C6OIpz7t.mjs.map → GLTFExporter-DUjuGznV.mjs.map} +1 -1
- package/lib/{PointLightHelper-D-8-D0hG.mjs → PointLightHelper-_pWwb-rd.mjs} +3 -3
- package/lib/{PointLightHelper-D-8-D0hG.mjs.map → PointLightHelper-_pWwb-rd.mjs.map} +1 -1
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/{SpotLightHelper-BNxNjZFU.mjs → SpotLightHelper-DiuKfHVi.mjs} +3 -3
- package/lib/{SpotLightHelper-BNxNjZFU.mjs.map → SpotLightHelper-DiuKfHVi.mjs.map} +1 -1
- package/lib/{USDZExporter-B5KX4zn1.mjs → USDZExporter-B9ygWQMw.mjs} +2 -2
- package/lib/{USDZExporter-B5KX4zn1.mjs.map → USDZExporter-B9ygWQMw.mjs.map} +1 -1
- package/lib/{banana-for-scale-D3fCVX5d.mjs → banana-for-scale-Bio4mpMQ.mjs} +2 -2
- package/lib/{banana-for-scale-D3fCVX5d.mjs.map → banana-for-scale-Bio4mpMQ.mjs.map} +1 -1
- package/lib/{component-dimensioning-B8w976QK.mjs → component-dimensioning-Bar2YYNs.mjs} +2 -2
- package/lib/{component-dimensioning-B8w976QK.mjs.map → component-dimensioning-Bar2YYNs.mjs.map} +1 -1
- package/lib/{continuous-drawing-helper-Cl60wfg_.mjs → continuous-drawing-helper-BYjzGaWD.mjs} +2 -2
- package/lib/{continuous-drawing-helper-Cl60wfg_.mjs.map → continuous-drawing-helper-BYjzGaWD.mjs.map} +1 -1
- package/lib/{homag-intelligence-CqhmLFsQ.mjs → homag-intelligence-Bb8gfi80.mjs} +55 -44
- package/lib/homag-intelligence-Bb8gfi80.mjs.map +1 -0
- package/lib/{imos-ix-poc-export-helper-Pz2nfFtn.mjs → imos-ix-poc-export-helper-Bl13RKd1.mjs} +2 -2
- package/lib/{imos-ix-poc-export-helper-Pz2nfFtn.mjs.map → imos-ix-poc-export-helper-Bl13RKd1.mjs.map} +1 -1
- package/lib/{index-pH24sRMW.mjs → index-DYoZpNEJ.mjs} +19 -19
- package/lib/{index-pH24sRMW.mjs.map → index-DYoZpNEJ.mjs.map} +1 -1
- package/lib/{material-viewer-C-w5d8Zk.mjs → material-viewer-DqZ9kv7j.mjs} +2 -2
- package/lib/{material-viewer-C-w5d8Zk.mjs.map → material-viewer-DqZ9kv7j.mjs.map} +1 -1
- package/lib/roomle-sdk.d.ts +2 -0
- package/lib/roomle-sdk.js +1 -1
- package/lib/static/roomle-core-hsc/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleServiceCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleToolsCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/configuratorCoreInterface.d.ts +1 -0
- package/lib/static/roomle-core-hsc/embind/configuratorCoreInterface.d.ts +1 -0
- package/lib/static/roomle-core-hsc/package.json +1 -1
- package/lib/static/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +1 -0
- package/lib/static/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleServiceCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
- package/lib/{stats-helper-CVB69dXL.mjs → stats-helper-BedaceYL.mjs} +2 -2
- package/lib/{stats-helper-CVB69dXL.mjs.map → stats-helper-BedaceYL.mjs.map} +1 -1
- package/lib/{three.webgpu-D0cV0tjO.mjs → three.webgpu-Bk8XgilA.mjs} +3 -3
- package/lib/{three.webgpu-D0cV0tjO.mjs.map → three.webgpu-Bk8XgilA.mjs.map} +1 -1
- package/lib/{tools-core-CDh9Csn-.mjs → tools-core-D1vOTlAR.mjs} +2 -2
- package/lib/{tools-core-CDh9Csn-.mjs.map → tools-core-D1vOTlAR.mjs.map} +1 -1
- package/package.json +1 -1
- package/lib/homag-intelligence-CqhmLFsQ.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as e, u as s, y as t, z as n, A as i } from "./index-
|
|
1
|
+
import { t as e, u as s, y as t, z as n, A as i } from "./index-DYoZpNEJ.mjs";
|
|
2
2
|
const l = [
|
|
3
3
|
new e("script-loader", s)
|
|
4
4
|
];
|
|
@@ -31,4 +31,4 @@ class p extends t {
|
|
|
31
31
|
export {
|
|
32
32
|
p as ToolsCore
|
|
33
33
|
};
|
|
34
|
-
//# sourceMappingURL=tools-core-
|
|
34
|
+
//# sourceMappingURL=tools-core-D1vOTlAR.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-core-
|
|
1
|
+
{"version":3,"file":"tools-core-D1vOTlAR.mjs","sources":["../../packages/tools-core/src/utils/injectables.ts","../../packages/tools-core/src/tools-core.ts"],"sourcesContent":["import ScriptLoader from '../../../common-core/src/script-loader';\nimport { DependencyInjectionAssignment } from '../../../common-core/src/di/container';\n\nexport const INJECTABLES: DependencyInjectionAssignment[] = [\n new DependencyInjectionAssignment('script-loader', ScriptLoader),\n];\n","import './utils/global-definitions';\n\nimport { Main, BASE_CONTEXT } from '../../common-core/src/main';\nimport type Logger from '../../common-core/src/logger';\nimport RoomleDependencyInjection from '../../common-core/src/di/roomle-dependency-injection';\nimport type RoomleToolsCore from './roomle-tools-core';\nimport type ScriptLoader from '../../common-core/src/script-loader';\nimport { INJECTABLES } from './utils/injectables';\n\nexport class ToolsCore extends Main {\n private _tools: RoomleToolsCore;\n\n protected setupGlobals(): void {\n //globals are initialized in bootFinished()\n }\n\n protected setupDependencies(): void {\n RoomleDependencyInjection.setup(INJECTABLES);\n this.lookup<Logger>('logger', this._context);\n }\n\n protected cleanUpGlobals(): void {\n this._tools = undefined;\n if (window.RoomleToolsCore) {\n delete window.RoomleToolsCore;\n }\n }\n\n protected cleanUpDependencies(): void {\n const scriptLoader = this.lookup<ScriptLoader>('script-loader');\n if (scriptLoader) {\n scriptLoader.cleanUp();\n }\n }\n\n protected async bootFinished(): Promise<void> {\n this._tools = this.lookup<RoomleToolsCore>(\n 'roomle-tools-core',\n this._context,\n );\n\n if (!window.RoomleToolsCore) {\n window.RoomleToolsCore = this._tools;\n }\n }\n\n public getApi(): RoomleToolsCore {\n return this._tools;\n }\n\n protected getContextName(): string {\n return BASE_CONTEXT.TOOLS_CORE;\n }\n}\n"],"names":["INJECTABLES","DependencyInjectionAssignment","ScriptLoader","ToolsCore","Main","RoomleDependencyInjection","scriptLoader","BASE_CONTEXT"],"mappings":";AAGO,MAAMA,IAA+C;AAAA,EAC1D,IAAIC,EAA8B,iBAAiBC,CAAY;AACjE;ACIO,MAAMC,UAAkBC,EAAK;AAAA,EAGxB,eAAqB;AAAA,EAE/B;AAAA,EAEU,oBAA0B;AAClC,IAAAC,EAA0B,MAAML,CAAW,GAC3C,KAAK,OAAe,UAAU,KAAK,QAAQ;AAAA,EAC7C;AAAA,EAEU,iBAAuB;AAC/B,SAAK,SAAS,QACV,OAAO,mBACT,OAAO,OAAO;AAAA,EAElB;AAAA,EAEU,sBAA4B;AACpC,UAAMM,IAAe,KAAK,OAAqB,eAAe;AAC9D,IAAIA,KACFA,EAAa,QAAA;AAAA,EAEjB;AAAA,EAEA,MAAgB,eAA8B;AAC5C,SAAK,SAAS,KAAK;AAAA,MACjB;AAAA,MACA,KAAK;AAAA,IAAA,GAGF,OAAO,oBACV,OAAO,kBAAkB,KAAK;AAAA,EAElC;AAAA,EAEO,SAA0B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,iBAAyB;AACjC,WAAOC,EAAa;AAAA,EACtB;AACF;"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"homag-intelligence-CqhmLFsQ.mjs","sources":["../../packages/homag-intelligence/src/rml-plugin.ts","../../../common/src/hi/hi-types.ts","../../packages/homag-intelligence/src/hi-object-selection.ts","../../packages/homag-intelligence/src/glue-logic.ts","../../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/uuid/dist/esm-browser/native.js","../../../../node_modules/uuid/dist/esm-browser/v4.js","../../packages/homag-intelligence/src/callbacks.ts","../../packages/homag-intelligence/src/orders.ts","../../packages/homag-intelligence/src/debug-logging.ts","../../packages/homag-intelligence/src/homag-intelligence.ts"],"sourcesContent":["export abstract class RmlPlugin {\n public abstract init(...args: any[]): Promise<this>;\n}\n","import type { MasterData, PosGroup, PosSaveData } from '@roomle/web-sdk';\n\nexport const HI_PANEL_ACTION = {\n HIDE: 'hide',\n SHOW_ATTRIBUTES: 'attributes',\n SHOW_ARTICLES: 'articles',\n} as const;\n\nexport type HiPanelActionType =\n (typeof HI_PANEL_ACTION)[keyof typeof HI_PANEL_ACTION];\n\nexport interface HiOrderHeader {\n id: string;\n state: string;\n orderNumber: string;\n orderName: string;\n orderDescription: string;\n project: string;\n personInCharge: string;\n orderDate: string;\n deliveryDatePlanned: string;\n addresses: Array<{\n type: string;\n street: string;\n houseNumber: string;\n postalCode: string;\n city: string;\n country: string;\n }>;\n customerName: string;\n customerNumber: string;\n createdAt: string;\n changedAt: string;\n changedBy: string;\n}\n\nexport interface HiOrder extends HiOrderHeader {\n items: HiOrderData[];\n}\n\nexport interface HiOrderData {\n [key: string]: any;\n additionalData: Array<Record<string, any>>;\n}\n\nexport interface HiPriceData {\n [key: string]: any;\n orderData: HiOrder;\n}\n\nexport interface HiCallbacks {\n /**\n * Requests the calculation script for the given library ID.\n * @param libraryId the ID of the library for which the calculation script is requested\n * @returns the calculation script as a string\n */\n onLoadJavascript: (libraryId: string) => Promise<string>;\n\n /**\n * Requests the master data for the given library ID.\n * @param libraryId the ID of the library for which the master data is requested\n * @returns the master data as a Promise\n */\n onLoadMasterData: (libraryId: string) => Promise<MasterData>;\n\n /**\n * Requests the article catalog for the given library ID.\n * @param libraryId the ID of the library for which the article catalog is requested\n * @returns the article catalog as a Promise\n */\n onLoadArticleCatalog: (libraryId: string) => Promise<any>;\n\n /**\n * Notifies the host application that a price calculation should be performed.\n * @param posGroups all groups in the plan\n */\n onPriceCalc?: (posGroups: PosGroup[]) => Promise<void>;\n\n /**\n * Retrieves the current external load data which has to be used to replace the existing groups in the plan.\n * @returns load data or null if no replacement is needed\n */\n onGetSavedPosGroupData?: () => Promise<PosSaveData | null>;\n\n /**\n * \"onCompletelyLoaded\" is invoked when the groups in the plan are completely loaded.\n */\n onPosGroupsCompletelyLoaded?: () => void;\n\n /**\n * \"onPosGroupAdded\" is invoked when a new group was created. (e.g. duplicate object)\n * @param groupData The new group data JSON.\n */\n onPosGroupAdded?: (posGroups: PosGroup[]) => Promise<void>;\n\n /**\n * \"onPosGroupChanged\" is invoked when a new group was modified and recalculated. (e.g. split, merge, change, attribute)\n *\n * @param groupData The new group data JSON.\n */\n onPosGroupChanged?: (posGroups: PosGroup[]) => Promise<void>;\n\n /**\n * \"onPosGroupDeleted\" is invoked when a group was delete. (e.g. delete button in scene)\n * @param groupData The ID of the group which was deleted.\n */\n onPosGroupDeleted?: (posGroupIds: string[]) => Promise<void>;\n\n /**\n * \"onShowHidePanel\" is invoked when a the content of the side panel should be changed or hidden.\n * @param panel The panel to show or hide.\n * @param posGroupId Optional ID of the selected group in case of SHOW_ATTRIBUTES.\n * @param rootModuleId Optional ID of the selected root module in case of SHOW_ATTRIBUTES.\n * @param subModuleId Optional ID of the selected sub module in case of SHOW_ATTRIBUTES.\n */\n onShowHidePanel?: (\n panel: HiPanelActionType,\n posGroupId?: string,\n rootModuleId?: string,\n subModuleId?: string,\n ) => void;\n\n /**\n * \"onSelectModule\" is invoked when a the selected object in the scene was changed.\n * @param posGroupId ID of the selected group\n * @param rootModuleId ID of the selected root module\n * @param subModuleId Optional id of the selected sub module\n */\n onSelectModule?: (\n posGroupId: string,\n rootModuleId: string,\n subModuleId?: string,\n ) => void;\n\n /**\n * Request the price for the given order data.\n * @param orderData order data\n * @returns price data\n */\n onFetchPrice?: (orderData: HiOrder) => Promise<HiPriceData | null>;\n\n /**\n * \"onPlaceOrder\" is invoked when the user wants to place an order.\n * You can use this to send the order data to Order Manager or to a 3rd party service.\n * @param orderData\n */\n onPlaceOrder?: (orderData: any) => Promise<void>;\n\n /**\n * \"onLogMessage\" is invoked when the Homag Intelligence library wants to log a message.\n * You can use this to log messages in your own UI.\n * @param area\n * @param message\n */\n onLogMessage?: (area: string, message: string) => void;\n}\n","import type { HiPanelActionType } from '#/common/src/hi/hi-types';\nimport { HI_PANEL_ACTION } from '#/common/src/hi/hi-types';\nimport type { HiCallbacks } from '#/common/src/hi/hi-types';\nimport { BASE_CONTEXT } from '../../common-core/src/main';\nimport { type PlanElementViewModel } from '../../common-core/src/view-model/plan-element-view-model';\nimport type { SELECTION_MODE } from '../../configurator-core/src/utils/selection-handler';\nimport type { SelectionPayload } from '../../planner-core/src/roomle-planner-ui-callback';\nimport type { CallbackObjectType } from '../../planner-core/src/utils/planner-scene-utils';\nimport type { CancelSelectionReasons } from '../../typings/planner';\n\nexport const HI_SELECTION_TYPE = {\n NONE: 'none',\n GROUP: 'group',\n ROOT_MODULE: 'rootModule',\n SUB_MODULE: 'subModule',\n} as const;\nexport type HiSelectionType =\n (typeof HI_SELECTION_TYPE)[keyof typeof HI_SELECTION_TYPE];\n\nexport const HI_SELECTION_MODE = {\n MULTI_SELECT: 'multiselect',\n TC_CONFIG: 'tc-config',\n RML_OBJECT: 'rml-object',\n} as const;\nexport type HiSelectionMode =\n (typeof HI_SELECTION_MODE)[keyof typeof HI_SELECTION_MODE];\n\ninterface HiSelection {\n type: HiSelectionType;\n groupId: string | null;\n rootModuleId: string | null;\n subModuleId: string | null;\n}\n\ninterface HiEmittedSelection {\n panel: HiPanelActionType | null;\n groupId: string | null;\n rootModuleId: string | null;\n subModuleId: string | null;\n}\n\nexport interface HiObjectSelectionApi {\n setSidebar(viewName: string): void;\n contextChanged(context: BASE_CONTEXT): void;\n groupOrModuleSelected(\n groupId: string,\n rootModuleId: string | null,\n subModuleId: string | null,\n ): void;\n componentSelectionCancel(reason: CancelSelectionReasons): void;\n selectionCancel(reason: CancelSelectionReasons): void;\n selectionChanged(\n selectionMode: SELECTION_MODE,\n objectType: CallbackObjectType,\n payload: SelectionPayload,\n _payloadPromise: Promise<SelectionPayload>,\n _planElementViewModel: PlanElementViewModel,\n ): void;\n}\n\nexport class HiObjectSelection implements HiObjectSelectionApi {\n private _callbacks: HiCallbacks | null = null;\n private _contextType: BASE_CONTEXT = BASE_CONTEXT.PLANNER;\n private _selectionMode: HiSelectionMode | null = null;\n private _hiSelection: HiSelection = {\n type: HI_SELECTION_TYPE.NONE,\n groupId: null,\n rootModuleId: null,\n subModuleId: null,\n };\n private _emittedSelection: HiEmittedSelection = {\n panel: null,\n groupId: null,\n rootModuleId: null,\n subModuleId: null,\n };\n\n constructor(callbacks: HiCallbacks | null) {\n this._callbacks = callbacks;\n }\n\n public setSidebar(viewName: string) {\n if (viewName === 'productSettings') {\n return;\n }\n if (viewName === 'catalog') {\n this._emitSelectionChange(HI_PANEL_ACTION.SHOW_ARTICLES);\n return;\n }\n this._emitSelectionChange(HI_PANEL_ACTION.HIDE);\n }\n\n public contextChanged(context: BASE_CONTEXT): void {\n this._contextType = context;\n if (context === BASE_CONTEXT.PLANNER) {\n this._resetSelection();\n }\n this._handleViewTypeChange();\n }\n\n public groupOrModuleSelected(\n groupId: string,\n rootModuleId: string | null,\n subModuleId: string | null,\n ) {\n this._selectionMode = HI_SELECTION_MODE.TC_CONFIG;\n this._hiSelection.groupId = groupId;\n this._hiSelection.rootModuleId = rootModuleId ?? null;\n this._hiSelection.subModuleId = subModuleId ?? null;\n if (this._hiSelection.rootModuleId && this._hiSelection.subModuleId) {\n this._hiSelection.type = HI_SELECTION_TYPE.SUB_MODULE;\n } else if (this._hiSelection.rootModuleId) {\n this._hiSelection.type = HI_SELECTION_TYPE.ROOT_MODULE;\n } else {\n this._hiSelection.type = HI_SELECTION_TYPE.GROUP;\n }\n this._handleViewTypeChange();\n }\n\n public componentSelectionCancel(reason: CancelSelectionReasons) {\n if (this._contextType !== BASE_CONTEXT.CONFIGURATOR) {\n return;\n }\n if (\n reason === 'click_outside' ||\n reason === 'dock_preview' ||\n reason === 'isolation_mode_cancelled' ||\n reason === 'select_other'\n ) {\n return;\n }\n this._resetSelection();\n this._handleViewTypeChange();\n }\n\n public selectionCancel(reason: CancelSelectionReasons) {\n if (reason === 'select_other') {\n return;\n }\n this._resetSelection();\n this._handleViewTypeChange();\n }\n\n public selectionChanged(\n selectionMode: SELECTION_MODE,\n objectType: CallbackObjectType,\n payload: SelectionPayload,\n _payloadPromise: Promise<SelectionPayload>,\n _planElementViewModel: PlanElementViewModel,\n ) {\n this._selectionHandler(\n BASE_CONTEXT.PLANNER,\n selectionMode,\n objectType,\n payload,\n );\n }\n\n private _resetSelection() {\n this._selectionMode = null;\n }\n\n private _selectionHandler(\n initiatingContext: BASE_CONTEXT,\n mode: SELECTION_MODE,\n type: CallbackObjectType,\n payload: SelectionPayload,\n ): void {\n if (initiatingContext === BASE_CONTEXT.CONFIGURATOR) {\n return;\n }\n if (mode === HI_SELECTION_MODE.MULTI_SELECT) {\n this._selectionMode = mode;\n this._handleViewTypeChange();\n return;\n }\n if (\n type === 'external-configuration' &&\n payload.externalConfigurationType === HI_SELECTION_MODE.TC_CONFIG\n ) {\n this._selectionMode = HI_SELECTION_MODE.TC_CONFIG;\n } else {\n this._selectionMode = HI_SELECTION_MODE.RML_OBJECT;\n }\n this._handleViewTypeChange();\n }\n\n private _handleViewTypeChange() {\n let panelAction: HiPanelActionType = HI_PANEL_ACTION.SHOW_ARTICLES;\n if (\n this._selectionMode === HI_SELECTION_MODE.TC_CONFIG &&\n (this._contextType === BASE_CONTEXT.CONFIGURATOR ||\n this._hiSelection.type !== HI_SELECTION_TYPE.GROUP)\n ) {\n panelAction = HI_PANEL_ACTION.SHOW_ATTRIBUTES;\n }\n this._emitSelectionChange(panelAction);\n }\n\n private _emitSelectionChange(panelAction: HiPanelActionType) {\n if (this._emittedSelection.panel !== panelAction) {\n this._emittedSelection.panel = panelAction;\n const showAttributes = panelAction === HI_PANEL_ACTION.SHOW_ATTRIBUTES;\n this._emittedSelection.groupId = showAttributes\n ? this._hiSelection.groupId\n : null;\n this._emittedSelection.rootModuleId = showAttributes\n ? this._hiSelection.rootModuleId\n : null;\n this._emittedSelection.subModuleId = showAttributes\n ? this._hiSelection.subModuleId\n : null;\n this._callbacks?.onShowHidePanel(\n panelAction,\n this._emittedSelection.groupId,\n this._emittedSelection.rootModuleId,\n this._emittedSelection.subModuleId,\n );\n } else if (\n this._emittedSelection.panel === HI_PANEL_ACTION.SHOW_ATTRIBUTES &&\n (this._emittedSelection.groupId !== this._hiSelection.groupId ||\n this._emittedSelection.rootModuleId !==\n this._hiSelection.rootModuleId ||\n this._emittedSelection.subModuleId !== this._hiSelection.subModuleId)\n ) {\n this._emittedSelection.groupId = this._hiSelection.groupId ?? null;\n this._emittedSelection.rootModuleId =\n this._hiSelection.rootModuleId ?? null;\n this._emittedSelection.subModuleId =\n this._hiSelection.subModuleId ?? null;\n this._callbacks?.onSelectModule(\n this._emittedSelection.groupId,\n this._emittedSelection.rootModuleId,\n this._emittedSelection.subModuleId,\n );\n }\n }\n}\n","import type { HiCallbacks, HiOrderData } from '#/common/src/hi/hi-types';\nimport type {\n ExternalModuleInformation,\n ExternalObjectGroup,\n ExternalObjectGroupPosition,\n ExternalObjectRootModule,\n ExternalObjectValidContainerModules,\n} from './external-object-api-callbacks';\nimport type {\n MasterData,\n PosModuleAttribute,\n PosContour,\n PosGroup,\n PosModuleData,\n PosModuleRootData,\n CheckDropDownEntry,\n CheckResult,\n PosSaveData,\n PosArticle,\n} from './model/oc-scripts-domain.model';\nimport { CheckDropDownEntryKind } from './model/oc-scripts-domain.model';\nimport {\n isExtObjId,\n removeExtObjIdPrefix,\n} from '../../common-core/src/utils/external-objects';\n\nimport {\n HiObjectSelection,\n type HiObjectSelectionApi,\n} from './hi-object-selection';\nimport { deepCopy, wait } from '../../common-core/src/utils/common-utils';\nimport type {\n ExternalObjectSnapshotSaveResult,\n ExternalRoomInformation,\n LoadExternalObjectOptions,\n} from './external-object-api';\n\ntype AttributeOptionsMap = Map<\n string | number | boolean,\n CheckDropDownEntryKind\n>;\n\nexport interface LibraryIdAndLibraryData {\n libraryId?: string;\n libraryData?: LibraryData;\n}\n\nexport interface LibraryData {\n libraryId: string;\n get masterData(): MasterData | null;\n get posGroupVersion(): number;\n calculateGroup(posGroup: PosGroup): PosGroup;\n getOrderData(\n posGroup: PosGroup[],\n roomlePlannerId?: string,\n rooms?: PosContour[],\n ): any;\n getAttributesDropDownValues(\n module: PosModuleData,\n attributeIds?: string | string[],\n ): Promise<Record<string, any[]>>;\n solveModuleAttributeConflict(\n module: PosModuleData,\n attributeName: string,\n value: string | number | boolean,\n ): PosModuleAttribute[] | undefined;\n getValidSubArticles(\n calculatedPosGroup: PosGroup,\n articles: PosArticle[],\n masterData: MasterData,\n ): PosArticle[];\n getValidContainerModulesForSubArticle(\n calculatedPosGroup: PosGroup,\n subArticle: PosArticle,\n masterData: MasterData,\n ): ExternalObjectValidContainerModules[];\n addSubArticle(\n targetPosGroup: PosGroup,\n article: PosArticle,\n rootId: string,\n parentModuleId: string,\n ): PosGroup;\n deleteSubArticle(\n targetPosGroup: PosGroup,\n rootId: string,\n articleModuleId: string,\n ): PosGroup;\n}\n\nexport interface RoomDesignerRequests {\n loadMasterData(masterData: MasterData): void;\n loadPosGroups(\n posDataJson: PosGroup | PosGroup[],\n options: LoadExternalObjectOptions,\n ): Promise<void>;\n completelyLoaded(): void;\n selectGroup(groupId: string): Promise<void>;\n selectRoot(rootModuleId: string): Promise<void>;\n selectModule(rootModuleId: string, subModuleId: string): Promise<void>;\n openCloseGroup(\n groupOrRootModuleId: string,\n subModuleId: string | null,\n open: boolean,\n animate: boolean,\n ): void;\n deleteGroup(groupId: string): void;\n deleteRootModule(rootModuleId: string): void;\n getPosDataOfAllGroups(): Promise<PosGroup[]>;\n getRoomInformation(): Promise<ExternalRoomInformation>;\n saveExternalObjectSnapshot(): Promise<ExternalObjectSnapshotSaveResult | null>;\n}\n\nexport interface GlueLogic {\n hiCallbacks: HiCallbacks | null;\n hiObjectSelection: HiObjectSelectionApi;\n\n isLibraryLoaded(libraryId: string): boolean;\n getLibraryData(libraryId: string): LibraryData | null;\n addLibrary(libraryData: LibraryData): Promise<void>;\n setPosDataForLoading(posData: PosSaveData | null): Promise<void>;\n loadPosData(articleCatalogJson: any, libraryId: string): void;\n mergeGroups(\n targetGroup: ExternalObjectGroup,\n idsOfGroupsMerged: string | string[],\n idOfTargetRootModule: string,\n ): Promise<void>;\n deleteRootModule(\n remainingGroup: ExternalObjectGroup,\n rootModuleIdToDelete: string,\n splitOffGroups: ExternalObjectGroup[],\n ): Promise<void>;\n splitRootModuleFromGroup(\n splitGroup: ExternalObjectGroup,\n newGroupedRootModules: ExternalObjectGroup[],\n ): Promise<void>;\n duplicateGroup(duplicatedGroup: ExternalObjectGroup): Promise<void>;\n swapRootModule(\n groupId: string,\n rootModuleId: string,\n articleId: string,\n ): Promise<void>;\n modifyAttribute(\n groupId: string,\n moduleIdObjects: ExternalModuleInformation[],\n attributeName: string,\n value: string,\n ): Promise<void>;\n updateAttribute(\n rootModuleId: string,\n moduleId: string | null,\n attributeId: string,\n attributeValue: string | boolean,\n ): Promise<void>;\n getVerifiedAttributeOptions(\n moduleId: string,\n attributeIds?: string | string[],\n ): Promise<Record<string, CheckResult> | undefined>;\n getVerifiedGroupAttributeOptions(\n groupId: string,\n attributeIds?: string | string[],\n ): Promise<Record<string, CheckResult> | undefined>;\n updateProperty(\n rootModuleId?: string,\n propertyName?: string,\n propertyValue?: string | number | boolean,\n ): void;\n findValidSubArticles(posGroupIds: string[] | string): PosArticle[];\n getValidContainerModulesForSubArticle(\n posGroupIds: string[] | string,\n subArticleId: string,\n ): ExternalObjectValidContainerModules[];\n addSubArticle(\n articleId: string,\n rootModuleId: string,\n parentModuleId: string,\n ): void;\n deleteSubArticles(\n groupId: string,\n subModuleId: string[] | string,\n ): Promise<void>;\n arrangeRootModulesOfGroup(changedGroup: ExternalObjectGroup): Promise<void>;\n changedGroupPlanningSituation(\n changedGroup: ExternalObjectGroup,\n ): Promise<void>;\n changedGroupFromHistory(historyGroup: PosGroup, reloadGroup: boolean): void;\n loadedGroup(posDataJson: PosGroup): Promise<void>;\n groupsCompletelyLoaded(): void;\n removedGroup(groupId: string): void;\n openCloseGroup(groupId: string): void;\n getSaveDataGroups(): Promise<PosGroup[] | null>;\n newPosDataFromId(id: string): Promise<PosGroup>;\n newPosDataFromGroup(posDataJson: PosGroup): Promise<PosGroup>;\n getGroupDataForOrder(roomlePlannerId?: string): Promise<HiOrderData>;\n}\n\ninterface GroupItem {\n posDataJson: PosGroup;\n opened: boolean;\n /** Prevents concurrent calculations on this group. When true, modifications are blocked until the current calculation completes. */\n calculationInProgress: boolean;\n}\n\nexport class GlueLogicImplementation implements GlueLogic {\n private _designerRequests: RoomDesignerRequests;\n private _libraryData: Map<string, LibraryData> = new Map();\n private _posDataForLoading: PosSaveData | null = null;\n private _posArticleMap: Map<string, PosArticle> = new Map();\n private _posSubArticleMap: Map<string, PosArticle> = new Map();\n private _groupMap: Map<string, GroupItem> = new Map();\n private _nextPosDataId: number = 1;\n private _hiCallbacks: HiCallbacks | null = null;\n private _hiObjectSelection: HiObjectSelectionApi;\n private _pendingGroupsToBeLoaded: PosGroup[] = [];\n private _planCompletelyLoaded: boolean = false;\n private _validSubArticles: PosArticle[] = [];\n\n public constructor(\n designerRequests: RoomDesignerRequests,\n hiCallbacks: HiCallbacks | null = null,\n ) {\n this._designerRequests = designerRequests;\n this._hiCallbacks = hiCallbacks;\n this._hiObjectSelection = new HiObjectSelection(hiCallbacks);\n }\n\n public get hiCallbacks(): HiCallbacks | null {\n return this._hiCallbacks;\n }\n\n public get hiObjectSelection(): HiObjectSelectionApi {\n return this._hiObjectSelection;\n }\n\n private _getGroup(groupId: string): GroupItem | undefined {\n return this._groupMap.get(groupId);\n }\n\n public getLibraryData(data: string | PosGroup): LibraryData | null {\n if (this._libraryData.size === 1) {\n return Array.from(this._libraryData.values())[0];\n }\n let libraryId: string | undefined;\n if (typeof data === 'string') {\n libraryId = data;\n } else {\n libraryId = this._getLibraryIdForPosData(data);\n }\n if (!this._libraryData.has(libraryId)) {\n console.error(`Library data for libraryId '${libraryId}' not found`);\n return null;\n }\n return this._libraryData.get(libraryId) ?? null;\n }\n\n public isLibraryLoaded(libraryId: string): boolean {\n return this._libraryData.has(libraryId);\n }\n\n public async addLibrary(libraryData: LibraryData) {\n if (!this._libraryData.has(libraryData.libraryId)) {\n this._libraryData.set(libraryData.libraryId, libraryData);\n await this._loadPendingGroup(libraryData.libraryId);\n }\n }\n\n public loadPosData(articleCatalogJson: any, libraryId: string) {\n // NOBILIA DEMO HACKS -- connect.homag.com sends differently shaped data.\n if (articleCatalogJson?.articles) {\n articleCatalogJson = articleCatalogJson.articles;\n }\n articleCatalogJson.forEach((posDataGroup: PosArticle) => {\n const articleId = (posDataGroup as any).id || posDataGroup.articleId;\n const posArticle = deepCopy(posDataGroup);\n posArticle.libraryId = libraryId;\n if (posArticle.isConfigDummy) {\n this._posSubArticleMap.set(articleId, posArticle);\n } else {\n this._posArticleMap.set(articleId, posArticle);\n }\n });\n }\n\n public async setPosDataForLoading(posData: PosSaveData | null) {\n this._posDataForLoading = posData;\n const allPosGroups = Array.from(this._groupMap.values()).map(\n (groupItem) => groupItem.posDataJson,\n );\n this._groupMap.clear();\n for (const groupItem of allPosGroups) {\n await this.loadedGroup(groupItem);\n }\n }\n\n public async getSaveDataGroups(): Promise<PosGroup[] | null> {\n return this._posDataForLoading?.groups ?? null;\n }\n\n public async newPosDataFromId(id: string): Promise<PosGroup> {\n if (isExtObjId(id)) {\n id = removeExtObjIdPrefix(id);\n }\n let isSubarticle = false;\n let posArticle: PosArticle | undefined;\n if (this._posArticleMap.has(id)) {\n posArticle = deepCopy(this._posArticleMap.get(id));\n } else if (this._posSubArticleMap.has(id)) {\n isSubarticle = true;\n posArticle = deepCopy(this._posSubArticleMap.get(id));\n }\n if (!posArticle) {\n return undefined;\n }\n const posArticleGroup = posArticle as any as PosGroup;\n posArticleGroup.ver = this.getLibraryData(\n posArticleGroup.libraryId,\n )?.posGroupVersion;\n posArticleGroup.logMessages = [];\n // copy the needed properties from the article to the root modules\n posArticleGroup.roots.forEach((posArticleRoot: any) => {\n posArticleRoot.libraryId = posArticle.libraryId;\n posArticleRoot.catalog = posArticle.catalog;\n posArticleRoot.logMessages = [];\n // Take over the name from the selected article, if the root was not generated\n if (!posArticleRoot.isGenerated) {\n posArticleRoot.articleName = posArticle.articleName;\n posArticleRoot.articleId = posArticle.articleId;\n posArticleRoot.desc = posArticle.desc;\n posArticleRoot.imageUrl = posArticle.imageUrl;\n posArticleRoot.category = posArticle.category;\n }\n });\n let newPosGroup: PosGroup;\n if (isSubarticle) {\n newPosGroup = this._calculateNewGroup(posArticleGroup, false);\n } else {\n const emulatorGroupItem = this._addNewGroup(posArticleGroup, false);\n newPosGroup = emulatorGroupItem.posDataJson;\n this._groupsModified(newPosGroup, [], []);\n }\n return newPosGroup;\n }\n\n public async newPosDataFromGroup(posDataJson: PosGroup): Promise<PosGroup> {\n const emulatorGroupItem = this._addNewGroup(posDataJson, false);\n this._groupsModified(emulatorGroupItem.posDataJson, [], []);\n return emulatorGroupItem.posDataJson;\n }\n\n public async selectGroup(groupId: string) {\n try {\n await this._designerRequests.selectGroup(groupId);\n } catch (error) {\n console.error(error);\n }\n }\n\n public async selectRoot(_groupId: any, rootId: string) {\n try {\n await this._designerRequests.selectRoot(rootId);\n } catch (error) {\n console.error(error);\n }\n }\n\n public async deleteRoot(_groupId: any, rootId: string) {\n try {\n await this._designerRequests.deleteRootModule(rootId);\n } catch (error) {\n console.error(error);\n }\n }\n\n public async selectSubModule(\n _groupId: any,\n rootId: string,\n moduleId: string,\n ) {\n try {\n await this._designerRequests.selectModule(rootId, moduleId);\n } catch (error) {\n console.error(error);\n }\n }\n\n public async openCloseGroup(groupId: string) {\n try {\n const emulatorGroupItem = this._getGroup(groupId);\n if (emulatorGroupItem) {\n const open = !emulatorGroupItem.opened;\n await this._designerRequests.openCloseGroup(groupId, null, open, false);\n emulatorGroupItem.opened = open;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public async deleteRootModule(\n remainingGroup: ExternalObjectGroup,\n rootModuleIdToDelete: string,\n splitOffGroups: ExternalObjectGroup[],\n ) {\n try {\n const originalGroupData = this._getGroup(remainingGroup.groupId);\n if (originalGroupData) {\n this._setGroupPosition(originalGroupData, remainingGroup);\n this._setGroupContour(originalGroupData, remainingGroup);\n this._setRootModulesPosition(originalGroupData, remainingGroup);\n const group = originalGroupData.posDataJson;\n group.roots = group.roots.filter(\n (root: { id: any }) => root.id !== rootModuleIdToDelete,\n );\n const newGroupsPosData = this._splitOffGroupsFromGroups(\n originalGroupData,\n splitOffGroups,\n );\n await this._calculateAndUpdateGroupMap(originalGroupData);\n this._loadPosData(originalGroupData, newGroupsPosData);\n this._groupsModified(\n newGroupsPosData.map((g) => g.posDataJson),\n originalGroupData.posDataJson,\n [],\n );\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public async duplicateGroup(duplicatedGroup: ExternalObjectGroup) {\n try {\n const originalGroupData = this._getGroup(duplicatedGroup?.groupId);\n if (originalGroupData) {\n const duplicatedPosDataJson = deepCopy(originalGroupData.posDataJson);\n duplicatedPosDataJson.roots = duplicatedPosDataJson.roots.filter(\n (root: { id: any }) =>\n duplicatedGroup.rootModules.find(\n (duplicatedRoot: ExternalObjectRootModule) =>\n duplicatedRoot.moduleId === root.id,\n ) !== undefined,\n );\n if (duplicatedPosDataJson.roots.length === 0) {\n return;\n }\n if (duplicatedPosDataJson.roots.length === 1) {\n // As only one root module is duplicated, the position and rotation of this module within the group should be set to zero.\n duplicatedPosDataJson.roots[0].articlePos = [0, 0, 0];\n duplicatedPosDataJson.roots[0].rotationY = 0;\n }\n const groupItem = this._addNewGroup(duplicatedPosDataJson, false);\n this._setGroupPosition(groupItem, duplicatedGroup);\n await this._designerRequests.loadPosGroups(groupItem.posDataJson, {\n findFreeSpaceInPlan: true,\n });\n this._groupsModified(groupItem.posDataJson, [], []);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public async mergeGroups(\n targetGroup: ExternalObjectGroup,\n idsOfGroupsMerged: string | string[],\n idOfTargetRootModule: string,\n ) {\n try {\n const sourceGroupIds = Array.isArray(idsOfGroupsMerged)\n ? idsOfGroupsMerged\n : [idsOfGroupsMerged];\n if (\n this._groupMap.has(targetGroup.groupId) &&\n sourceGroupIds.length > 0\n ) {\n const originalSourceGroupRoots = [];\n for (const sourceGroupId of sourceGroupIds) {\n const sourceGroupData = this._getGroup(sourceGroupId);\n if (sourceGroupData) {\n originalSourceGroupRoots.push(...sourceGroupData.posDataJson.roots);\n }\n }\n const nonGeneratedRoots = originalSourceGroupRoots.filter(\n (rootModule) => !rootModule.isGenerated,\n );\n const targetGroupData = this._getGroup(targetGroup.groupId);\n if (targetGroupData) {\n const existingRoot = targetGroupData.posDataJson.roots.find(\n (r: PosModuleRootData) => r.id === idOfTargetRootModule,\n );\n if (existingRoot) {\n this._applyImplicitRelevantAttributes(\n this._getLibraryIdForPosData(targetGroupData.posDataJson),\n existingRoot,\n nonGeneratedRoots,\n );\n }\n // We only must merge the non-generated roots, because the generated ones are already in the target group\n targetGroupData.posDataJson.roots.push(...nonGeneratedRoots);\n this._setGroupPosition(targetGroupData, targetGroup);\n this._setGroupContour(targetGroupData, targetGroup);\n this._setRootModulesPosition(targetGroupData, targetGroup);\n await this._calculateAndUpdateGroupMap(targetGroupData);\n this._designerRequests.loadPosGroups(targetGroupData.posDataJson, {\n mergedGroups: sourceGroupIds,\n });\n const deletedGroups: string[] = [];\n for (const groupId of sourceGroupIds) {\n if (this._groupMap.has(groupId)) {\n this._groupMap.delete(groupId);\n deletedGroups.push(groupId);\n }\n }\n this._groupsModified([], targetGroupData.posDataJson, deletedGroups);\n }\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n private _applyImplicitRelevantAttributes(\n libraryId: string,\n sourceRootModule: PosModuleRootData,\n rootsToDock: string | any[],\n ) {\n const masterData = this.getLibraryData(libraryId)?.masterData;\n if (!masterData || !sourceRootModule || rootsToDock.length === 0) {\n return;\n }\n const mdModule = masterData.modules.find(\n (m: { id: any }) => m.id === sourceRootModule.name,\n );\n const implicitRelevantAttributes =\n mdModule?.assignedAttributes.filter(\n (a: any) =>\n masterData.attributes.find((attr: { id: any }) => attr.id === a)\n ?.implicitRelevant === true,\n ) ?? [];\n\n for (const rootToDock of rootsToDock) {\n const masterDataModule = masterData.modules.find(\n (m: { id: any }) => m.id === rootToDock.name,\n );\n\n for (const attributeId of implicitRelevantAttributes) {\n const sourceRootAttribute = sourceRootModule.attributes?.find(\n (a: { id: any }) => a.id === attributeId,\n );\n const rootToDockAttribute = masterDataModule?.assignedAttributes.find(\n (a: any) => a === attributeId,\n );\n if (!rootToDockAttribute) {\n continue;\n }\n\n const moduleAttribute = rootToDock.attributes?.find(\n (a: { id: any }) => a.id === attributeId,\n );\n if (moduleAttribute) {\n moduleAttribute.isInput = sourceRootAttribute?.isInput ?? false;\n if (moduleAttribute.isInput === true) {\n moduleAttribute.value = sourceRootAttribute?.value;\n }\n } else {\n if (sourceRootAttribute?.isInput ?? false) {\n rootToDock.attributes?.push({\n id: attributeId,\n value: sourceRootAttribute?.value,\n isInput: true,\n });\n }\n }\n }\n }\n }\n\n public async splitRootModuleFromGroup(\n splitGroup: ExternalObjectGroup,\n newGroupedRootModules: ExternalObjectGroup[],\n ) {\n try {\n const originalGroupData = this._getGroup(splitGroup.groupId);\n if (originalGroupData) {\n this._setGroupPosition(originalGroupData, splitGroup);\n this._setGroupContour(originalGroupData, splitGroup);\n this._setRootModulesPosition(originalGroupData, splitGroup);\n const newGroups = Array.isArray(newGroupedRootModules)\n ? newGroupedRootModules\n : [newGroupedRootModules];\n const newGroupsPosData = this._splitOffGroupsFromGroups(\n originalGroupData,\n newGroups,\n );\n await this._calculateAndUpdateGroupMap(originalGroupData);\n this._loadPosData(originalGroupData, newGroupsPosData);\n this._groupsModified(\n newGroupsPosData.map((g) => g.posDataJson),\n originalGroupData.posDataJson,\n [],\n );\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public async arrangeRootModulesOfGroup(changedGroup: ExternalObjectGroup) {\n try {\n const originalGroupData = this._getGroup(changedGroup.groupId);\n if (originalGroupData) {\n for (const root of originalGroupData.posDataJson.roots) {\n changedGroup.rootModules\n .filter(\n (rootModule: { moduleId: any }) =>\n rootModule.moduleId === root.id,\n )\n .forEach((rootModule: ExternalObjectRootModule) => {\n root.articlePos = rootModule.pos;\n root.rotationY = rootModule.rotationY;\n });\n }\n const calculatedGroup =\n await this._calculateAndUpdateGroupMap(originalGroupData);\n this._designerRequests.loadPosGroups(calculatedGroup, {});\n this._groupsModified([], calculatedGroup, []);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public removedGroup(groupId: string) {\n try {\n if (this._groupMap.has(groupId)) {\n this._groupMap.delete(groupId);\n this._groupsModified([], [], groupId);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public changedGroupFromHistory(historyGroup: PosGroup, reloadGroup: boolean) {\n try {\n const updatedGroup = this._calculate(historyGroup);\n const groupId = updatedGroup.id;\n const emulatorGroupItem = this._getGroup(groupId);\n if (emulatorGroupItem) {\n emulatorGroupItem.posDataJson = updatedGroup;\n } else {\n this._addGroupToMap(groupId, updatedGroup);\n }\n if (reloadGroup) {\n this._designerRequests.loadPosGroups(historyGroup, {});\n }\n this._groupsModified(\n emulatorGroupItem ? [] : [updatedGroup],\n emulatorGroupItem ? [updatedGroup] : [],\n [],\n );\n } catch (error) {\n console.error(error);\n }\n }\n\n public async changedGroupPlanningSituation(\n changedGroup: ExternalObjectGroup,\n ) {\n try {\n const originalGroupData = this._getGroup(changedGroup.groupId);\n if (originalGroupData) {\n this._setGroupPosition(originalGroupData, changedGroup);\n this._setGroupContour(originalGroupData, changedGroup);\n const calculatedGroup =\n await this._calculateAndUpdateGroupMap(originalGroupData);\n this._designerRequests.loadPosGroups(calculatedGroup, {});\n this._groupsModified([], calculatedGroup, []);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public async loadedGroup(posDataJson: PosGroup) {\n const libraryId = this._getLibraryIdForPosData(posDataJson);\n if (!this._libraryData.has(libraryId)) {\n this._pendingGroupsToBeLoaded.push(posDataJson);\n return;\n }\n await this._loadedGroup(posDataJson);\n }\n\n private async _loadPendingGroup(libraryId: string) {\n const groupsToBeLoaded = this._pendingGroupsToBeLoaded.filter(\n (group) => this._getLibraryIdForPosData(group) === libraryId,\n );\n this._pendingGroupsToBeLoaded = this._pendingGroupsToBeLoaded.filter(\n (group) => this._getLibraryIdForPosData(group) !== libraryId,\n );\n for (const group of groupsToBeLoaded) {\n await this._loadedGroup(group);\n }\n if (this._pendingGroupsToBeLoaded.length === 0) {\n this._groupsCompletelyLoaded();\n }\n }\n\n private async _loadedGroup(posDataJson: PosGroup) {\n if (!this._posDataForLoading) {\n await this._recalculateLoadedGroup(posDataJson);\n return;\n }\n const posDataToBeLoaded = this._posDataForLoading.groups.find(\n (group) => group.id === posDataJson.id,\n );\n if (!posDataToBeLoaded) {\n this.removedGroup(posDataJson.id);\n this._designerRequests.deleteGroup(posDataJson.id);\n return;\n }\n const newPosData = deepCopy(posDataToBeLoaded);\n newPosData.ver = this.getLibraryData(posDataJson)?.posGroupVersion;\n if (posDataJson.pos !== undefined) {\n newPosData.pos = posDataJson.pos;\n }\n if (posDataJson.rotationY !== undefined) {\n newPosData.rotationY = posDataJson.rotationY;\n }\n await this._recalculateLoadedGroup(newPosData);\n }\n\n public async _recalculateLoadedGroup(posDataJson: PosGroup) {\n try {\n const groupId = posDataJson.id;\n const newGroupCreated = !this._groupMap.has(groupId);\n if (newGroupCreated) {\n this._addGroupToMap(groupId, posDataJson);\n }\n const groupData = this._getGroup(groupId);\n if (groupData) {\n const calculatedGroup =\n await this._calculateAndUpdateGroupMap(groupData);\n this._designerRequests.loadPosGroups(calculatedGroup, {\n respondWithPositionInPlan: true,\n });\n this._groupsModified(\n newGroupCreated ? calculatedGroup : [],\n newGroupCreated ? [] : calculatedGroup,\n [],\n );\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public groupsCompletelyLoaded(): void {\n this._planCompletelyLoaded = true;\n this._groupsCompletelyLoaded();\n }\n\n private _groupsCompletelyLoaded() {\n if (\n this._planCompletelyLoaded &&\n this._libraryData.size > 0 &&\n this._pendingGroupsToBeLoaded.length === 0\n ) {\n this._designerRequests.completelyLoaded();\n this._hiCallbacks?.onPosGroupsCompletelyLoaded();\n }\n }\n\n public async getGroupDataForOrder(roomlePlannerId?: string) {\n try {\n const posGroups = Array.from(this._groupMap.values()).map(\n (groupItem) => groupItem.posDataJson,\n );\n // TEST: Add additional data for each position\n let cnt = 1;\n posGroups.forEach((posGroup: { roots: any[] }) => {\n posGroup.roots.forEach((root: { additionalText: string }) => {\n root.additionalText = 'Additional Text ' + cnt++;\n });\n });\n\n const roomInformation = await this._designerRequests.getRoomInformation();\n const groupData = this.getLibraryData(roomlePlannerId)?.getOrderData(\n posGroups,\n roomlePlannerId,\n roomInformation?.rooms ?? [],\n ) as HiOrderData;\n if (!groupData) {\n return null;\n }\n return groupData;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n private _setGroupContour(\n emulatorGroupItem: GroupItem,\n changedGroupPosition: ExternalObjectGroup,\n ) {\n if (changedGroupPosition.contours) {\n emulatorGroupItem.posDataJson.contours =\n changedGroupPosition.contours as PosContour[];\n }\n }\n\n private _setGroupPosition(\n emulatorGroupItem: GroupItem,\n newGroupPosition: ExternalObjectGroupPosition,\n ) {\n const group = emulatorGroupItem.posDataJson;\n if (newGroupPosition.pos !== undefined) {\n group.pos = newGroupPosition.pos;\n }\n if (newGroupPosition.rotationY !== undefined) {\n group.rotationY = newGroupPosition.rotationY;\n }\n }\n\n private _setRootModulesPosition(\n emulatorGroupItem: GroupItem,\n rootModulePositions: ExternalObjectGroup,\n ) {\n for (const root of emulatorGroupItem.posDataJson.roots) {\n rootModulePositions.rootModules\n .filter(\n (rootModule: { moduleId: string }) => rootModule.moduleId === root.id,\n )\n .forEach((rootModule: ExternalObjectRootModule) => {\n root.articlePos = rootModule.pos;\n root.rotationY = rootModule.rotationY;\n });\n }\n }\n\n private _loadPosData(\n emulatorGroupItem: GroupItem,\n additionalGroupData: GroupItem[],\n ) {\n const loadPosData = deepCopy(emulatorGroupItem.posDataJson);\n const posDataCollection = Array.isArray(loadPosData)\n ? loadPosData\n : [loadPosData];\n for (const data of additionalGroupData ?? []) {\n posDataCollection.push(deepCopy(data.posDataJson));\n }\n this._designerRequests.loadPosGroups(posDataCollection, {});\n }\n\n private _splitOffGroupsFromGroups(\n originalGroupData: GroupItem | undefined,\n splitOffGroups: ExternalObjectGroup[],\n ): GroupItem[] {\n const newGroupsPosData: GroupItem[] = [];\n for (const newGroup of splitOffGroups ?? []) {\n const newGroupPosDataJson = this._splitOffRootModulesFromGroup(\n originalGroupData,\n newGroup,\n );\n const emulatorGroupItem = this._addNewGroup(newGroupPosDataJson, true);\n newGroupsPosData.push(emulatorGroupItem);\n }\n return newGroupsPosData;\n }\n\n private _splitOffRootModulesFromGroup(\n originalGroupData: GroupItem,\n newGroupedRootModules: ExternalObjectGroup,\n ): PosGroup {\n const splitOffRootModuleIds = newGroupedRootModules.rootModules.map(\n (root: { moduleId: any }) => root.moduleId,\n );\n const group = originalGroupData.posDataJson;\n const splitOffRootModules = group.roots.filter((root: { id: any }) =>\n splitOffRootModuleIds.includes(root.id),\n );\n group.roots = group.roots.filter(\n (root: { id: any }) => !splitOffRootModuleIds.includes(root.id),\n );\n for (const splitOffRootModule of splitOffRootModules) {\n newGroupedRootModules.rootModules\n .filter(\n (rootModule: { moduleId: any }) =>\n rootModule.moduleId === splitOffRootModule.id,\n )\n .forEach((rootModule: ExternalObjectRootModule) => {\n splitOffRootModule.articlePos = rootModule.pos;\n splitOffRootModule.rotationY = rootModule.rotationY;\n });\n }\n for (const remainingRoot of group.roots) {\n if (remainingRoot.isGenerated) {\n splitOffRootModules.push(deepCopy(remainingRoot));\n }\n }\n const newGroupPosDataJson: PosGroup = {\n id: undefined,\n libraryId: group.libraryId,\n pos: newGroupedRootModules.pos,\n rotationY: newGroupedRootModules.rotationY,\n roots: splitOffRootModules,\n ver: group.ver,\n logMessages: [],\n };\n return newGroupPosDataJson;\n }\n\n private _calculateNewGroup(posDataJson: PosGroup, keepRootModuleIDs: any) {\n this._replacesIDs(posDataJson, keepRootModuleIDs);\n return this._calculate(posDataJson);\n }\n\n private _getLibraryIdForPosData(posDataJson: PosGroup): string | undefined {\n if (posDataJson.libraryId) {\n return posDataJson.libraryId;\n }\n return posDataJson.roots.find((r: { libraryId: string }) => r.libraryId)\n ?.libraryId;\n }\n\n private _setSubmoduleImages(\n posDataModule: PosModuleData,\n masterData?: MasterData,\n ) {\n if (!masterData) {\n return;\n }\n if (!posDataModule.modules?.length) {\n return;\n }\n posDataModule.modules.forEach((subModule) => {\n const masterDataModule = masterData.modules.find(\n (m) => m.id === subModule.name,\n );\n if (masterDataModule) {\n subModule.imageUrl = masterDataModule.imageUrl;\n }\n this._setSubmoduleImages(subModule, masterData);\n });\n }\n\n private async _calculateAndUpdateGroupMap(groupData: GroupItem) {\n if (groupData.calculationInProgress) {\n console.error(\n 'Calculation already in progress for group:',\n groupData.posDataJson.id,\n );\n return groupData.posDataJson;\n }\n groupData.calculationInProgress = true;\n await wait(0);\n try {\n const recalculatedGroup = this._calculate(groupData.posDataJson);\n if (!recalculatedGroup) {\n return groupData.posDataJson;\n }\n groupData.posDataJson = recalculatedGroup;\n this._groupMap.set(groupData.posDataJson.id, groupData);\n return recalculatedGroup;\n } finally {\n groupData.calculationInProgress = false;\n }\n }\n\n private _addNewGroup(posDataJson: PosGroup, keepRootModuleIDs: boolean) {\n const calculatedPosDataJson = this._calculateNewGroup(\n posDataJson,\n keepRootModuleIDs,\n );\n return this._addGroupToMap(calculatedPosDataJson.id, calculatedPosDataJson);\n }\n\n private _addGroupToMap(groupId: string, posDataJson: any) {\n const emulatorGroupItem = {\n posDataJson,\n opened: false,\n calculationInProgress: false,\n };\n this._groupMap.set(groupId, emulatorGroupItem);\n return emulatorGroupItem;\n }\n\n public async updateAttribute(\n rootModuleId: string,\n moduleId: string | null,\n attributeId: string,\n attributeValue: string | boolean,\n ): Promise<void> {\n if (!rootModuleId) {\n return;\n }\n const emulatorGroup = Array.from(this._groupMap.entries()).find(\n ([, value]) => {\n return value.posDataJson.roots.some((root) => root.id === rootModuleId);\n },\n );\n if (!emulatorGroup) {\n throw new Error('PosGroup not found inside the calculated articles list');\n }\n const [, emulatorGroupItem] = emulatorGroup;\n if (emulatorGroupItem) {\n const modifiedGroups = await this._modifyAttributeOfModules(\n emulatorGroupItem,\n moduleId ?? rootModuleId,\n attributeId,\n attributeValue,\n );\n this._designerRequests.loadPosGroups(modifiedGroups, {\n correctArrangement: true,\n });\n this._groupsModified([], modifiedGroups, []);\n }\n }\n\n public async modifyAttribute(\n groupId: string,\n moduleIdObjects: ExternalModuleInformation[],\n attributeName: string,\n value: string,\n ) {\n const emulatorGroupItem = this._getGroup(groupId);\n if (emulatorGroupItem) {\n const moduleIds = moduleIdObjects.map(\n (obj) => obj.subModuleId ?? obj.rootModuleId,\n );\n const modifiedGroups = await this._modifyAttributeOfModules(\n emulatorGroupItem,\n moduleIds,\n attributeName,\n value,\n );\n this._designerRequests.loadPosGroups(modifiedGroups, {\n correctArrangement: true,\n });\n this._groupsModified([], modifiedGroups, []);\n }\n }\n\n public async getVerifiedAttributeOptions(\n moduleId: string,\n attributeIds?: string | string[],\n ): Promise<Record<string, CheckResult> | undefined> {\n const moduleInfo = this._findModuleInAllGroups(moduleId);\n if (!moduleInfo) {\n console.error('Module not found inside the calculated articles list');\n return undefined;\n }\n if (!moduleInfo.module.checkAttributes) {\n return undefined;\n }\n let attributeOptions: Record<string, CheckDropDownEntry[] | undefined>;\n try {\n attributeOptions = await this.getLibraryData(\n moduleInfo.group,\n )?.getAttributesDropDownValues(moduleInfo.module, attributeIds);\n } catch (error) {\n console.error(error);\n }\n if (!attributeOptions) {\n return undefined;\n }\n const checkResults: Record<string, CheckResult> = {};\n for (const [attributeId, options] of Object.entries(attributeOptions)) {\n if (options && options.length > 0) {\n checkResults[attributeId] = {\n calcResult: options.map((entry: CheckDropDownEntry) => ({\n value: entry.value,\n kind: entry.kind,\n })),\n };\n }\n }\n return checkResults;\n }\n\n public async getVerifiedGroupAttributeOptions(\n groupId: string,\n attributeIds?: string | string[],\n ): Promise<Record<string, CheckResult> | undefined> {\n const groupItem = this._getGroup(groupId);\n if (!groupItem) {\n console.error('Group not found');\n return undefined;\n }\n const libraryData = this.getLibraryData(groupItem.posDataJson);\n if (!libraryData || !libraryData.masterData) {\n return undefined;\n }\n\n const ids = attributeIds\n ? Array.isArray(attributeIds)\n ? attributeIds\n : [attributeIds]\n : [];\n\n const moduleToAttributes = this._groupAttributesByModule(\n groupItem,\n libraryData,\n ids,\n );\n\n if (moduleToAttributes.size === 0) {\n return undefined;\n }\n\n const allOptionsPerAttribute = await this._collectAllOptionsPerAttribute(\n moduleToAttributes,\n libraryData,\n );\n\n return this._calculateCombinedResults(allOptionsPerAttribute);\n }\n\n private _groupAttributesByModule(\n groupItem: GroupItem,\n libraryData: LibraryData,\n attributeIds: string[],\n ): Map<string, { module: PosModuleData; attributeIds: string[] }> {\n // Collect all modules and their relevant attribute IDs\n // Map: module.id -> { module, attributeIds[] }\n const moduleToAttributes = new Map<\n string,\n { module: PosModuleData; attributeIds: string[] }\n >();\n\n for (const attributeId of attributeIds) {\n const modules: PosModuleData[] = [];\n for (const root of groupItem.posDataJson.roots) {\n this._collectModulesWithAttribute(\n root,\n attributeId,\n libraryData.masterData,\n modules,\n );\n }\n for (const module of modules) {\n const existing = moduleToAttributes.get(module.id);\n if (existing) {\n existing.attributeIds.push(attributeId);\n } else {\n moduleToAttributes.set(module.id, {\n module,\n attributeIds: [attributeId],\n });\n }\n }\n }\n return moduleToAttributes;\n }\n\n private async _collectAllOptionsPerAttribute(\n moduleToAttributes: Map<\n string,\n { module: PosModuleData; attributeIds: string[] }\n >,\n libraryData: LibraryData,\n ): Promise<Map<string, AttributeOptionsMap>> {\n // Collect all options per attribute from all modules\n const allOptionsPerAttribute = new Map<string, AttributeOptionsMap>();\n\n // Call getAttributesDropDownValues once per module with all its relevant attribute IDs\n for (const { module, attributeIds } of moduleToAttributes.values()) {\n if (!module.checkAttributes) {\n continue;\n }\n try {\n const attributeOptions = await libraryData.getAttributesDropDownValues(\n module,\n attributeIds,\n );\n if (!attributeOptions) {\n continue;\n }\n for (const attributeId of attributeIds) {\n const options = attributeOptions[attributeId];\n if (options && options.length > 0) {\n let attrOptions = allOptionsPerAttribute.get(attributeId);\n if (!attrOptions) {\n attrOptions = new Map();\n allOptionsPerAttribute.set(attributeId, attrOptions);\n }\n for (const option of options) {\n const existing = attrOptions.get(option.value);\n if (existing) {\n attrOptions.set(\n option.value,\n this._getMoreRestrictedKind(existing, option.kind),\n );\n } else {\n attrOptions.set(option.value, option.kind);\n }\n }\n }\n }\n } catch (error) {\n console.error(error);\n }\n }\n return allOptionsPerAttribute;\n }\n\n private _calculateCombinedResults(\n allOptionsPerAttribute: Map<string, AttributeOptionsMap>,\n ): Record<string, CheckResult> | undefined {\n // Combine results: Invalid if any module says Invalid, Normal only if all say Normal\n const combinedResults: Record<string, CheckResult> = {};\n for (const [attributeId, allOptions] of allOptionsPerAttribute.entries()) {\n const calcResult: CheckDropDownEntry[] = [];\n for (const [value, kind] of allOptions.entries()) {\n calcResult.push({ value, kind });\n }\n\n calcResult.sort(\n (a, b) => this._getKindRank(a.kind) - this._getKindRank(b.kind),\n );\n\n if (calcResult.length > 0) {\n combinedResults[attributeId] = { calcResult };\n }\n }\n\n return Object.keys(combinedResults).length > 0\n ? combinedResults\n : undefined;\n }\n\n private _getKindRank(kind: CheckDropDownEntryKind): number {\n switch (kind) {\n case CheckDropDownEntryKind.Normal:\n return 0;\n case CheckDropDownEntryKind.Conflicting:\n return 1;\n case CheckDropDownEntryKind.Invalid:\n return 2;\n default:\n return 3;\n }\n }\n\n private _getMoreRestrictedKind(\n kind1: CheckDropDownEntryKind,\n kind2: CheckDropDownEntryKind,\n ): CheckDropDownEntryKind {\n return this._getKindRank(kind1) > this._getKindRank(kind2) ? kind1 : kind2;\n }\n\n private _collectModulesWithAttribute(\n module: PosModuleData,\n attributeId: string,\n masterData: MasterData,\n result: PosModuleData[],\n ): void {\n const mdModule = masterData.modules.find((m) => m.id === module.name);\n if (mdModule?.assignedAttributes.includes(attributeId)) {\n result.push(module);\n }\n if (module.modules) {\n for (const subModule of module.modules) {\n this._collectModulesWithAttribute(\n subModule,\n attributeId,\n masterData,\n result,\n );\n }\n }\n }\n\n public updateProperty(\n rootModuleId?: string,\n propertyName?: string,\n propertyValue?: string | number | boolean,\n ): void {\n if (!rootModuleId || !propertyName || propertyValue === undefined) {\n return;\n }\n const moduleInfo = this._findRootModuleInAllGroups(rootModuleId);\n if (!moduleInfo) {\n console.error(\n 'Root module not found inside the calculated articles list',\n );\n return;\n }\n (moduleInfo.rootModule as any)[propertyName] = propertyValue;\n this._designerRequests.loadPosGroups(moduleInfo.group, {});\n this._groupsModified([], moduleInfo.group, []);\n }\n\n public async swapRootModule(\n groupId: string,\n rootModuleId: string,\n articleId: string,\n ): Promise<void> {\n const emulatorGroupItem = this._getGroup(groupId);\n if (!emulatorGroupItem) {\n return;\n }\n const group = emulatorGroupItem.posDataJson;\n const rootModuleToBeReplaced = group.roots.find(\n (root: { id: string }) => root.id === rootModuleId,\n );\n if (!rootModuleToBeReplaced) {\n return;\n }\n const newPosDataJson = await this.newPosDataFromId(articleId);\n const notGeneratedRoots = newPosDataJson.roots.filter(\n (root: PosModuleRootData) => !root.isGenerated,\n );\n if (!newPosDataJson || notGeneratedRoots.length !== 1) {\n return;\n }\n const newRootModule = notGeneratedRoots[0];\n if (rootModuleToBeReplaced) {\n this._applyImplicitRelevantAttributes(\n this._getLibraryIdForPosData(group),\n rootModuleToBeReplaced,\n [newRootModule],\n );\n }\n newRootModule.articlePos = rootModuleToBeReplaced.articlePos;\n newRootModule.rotationY = rootModuleToBeReplaced.rotationY;\n group.roots = group.roots.filter(\n (root: { id: any }) => root.id !== rootModuleId,\n );\n group.roots.push(newRootModule);\n const modifiedGroup =\n await this._calculateAndUpdateGroupMap(emulatorGroupItem);\n const rootModuleMapping = {\n originalModuleId: rootModuleId,\n newModuleId: newRootModule.id,\n };\n this._designerRequests.loadPosGroups(modifiedGroup, {\n newAction: true,\n correctArrangement: true,\n moduleIdMap: [rootModuleMapping],\n });\n this._groupsModified([], modifiedGroup, []);\n }\n\n public async _modifyAttributeOfModules(\n emulatorGroupItem: GroupItem,\n moduleIds: string[] | string,\n attributeId: string,\n value: string | boolean,\n ): Promise<PosGroup> {\n const ids = Array.isArray(moduleIds) ? moduleIds : [moduleIds];\n const libraryData = this.getLibraryData(emulatorGroupItem.posDataJson);\n for (const moduleId of ids) {\n const module = this._findModule(\n emulatorGroupItem.posDataJson.roots,\n moduleId,\n );\n if (module && libraryData) {\n const conflictResults = libraryData.solveModuleAttributeConflict(\n module,\n attributeId,\n value,\n );\n this._setAttribute(module, attributeId, value);\n if (conflictResults && conflictResults.length > 0) {\n conflictResults.forEach((conflictResult) => {\n if (conflictResult.value !== undefined) {\n this._setAttribute(\n module,\n conflictResult.id,\n conflictResult.value,\n );\n }\n });\n }\n }\n }\n const res = await this._calculateAndUpdateGroupMap(emulatorGroupItem);\n return res;\n }\n\n private _setAttribute(\n module: PosModuleData,\n attributeId: string,\n value: string | number | boolean,\n ): void {\n if (module.attributes && module.attributes.length > 0) {\n const attribute = module.attributes.find((a) => a.id === attributeId);\n if (attribute) {\n attribute.value = value;\n attribute.isInput = true;\n return;\n }\n }\n\n const attributeData = {\n id: attributeId,\n value: value,\n isInput: true,\n } as PosModuleAttribute;\n if (module.attributes) {\n module.attributes.push(attributeData);\n } else {\n module.attributes = [attributeData];\n }\n }\n\n public findValidSubArticles(posGroupIds: string[] | string): PosArticle[] {\n this._validSubArticles = [];\n const ids = Array.isArray(posGroupIds) ? posGroupIds : [posGroupIds];\n for (const id of ids) {\n const groupItem = this._getGroup(id);\n if (!groupItem) {\n continue;\n }\n const posGroup = groupItem.posDataJson;\n const { libraryId, libraryData } = this._getLibrary(posGroup);\n if (!libraryData) {\n continue;\n }\n const possibleSubArticles: PosArticle[] = Array.from(\n this._posSubArticleMap.values(),\n ).filter((article) => article.libraryId === libraryId);\n try {\n const setOfArticles = libraryData.getValidSubArticles(\n posGroup,\n possibleSubArticles,\n libraryData.masterData,\n );\n this._validSubArticles.push(...Array.from(setOfArticles));\n } catch (error) {\n console.error(error);\n }\n }\n return this._validSubArticles;\n }\n\n private _getValidSubArticle(articleId: string): PosArticle | null {\n const article = this._validSubArticles.find(\n (article) => article.articleId === articleId,\n );\n return article ?? null;\n }\n\n public getValidContainerModulesForSubArticle(\n posGroupIds: string[] | string,\n subArticleId: string,\n ): ExternalObjectValidContainerModules[] {\n const subArticle = this._getValidSubArticle(subArticleId);\n if (!subArticle) {\n return [];\n }\n const ids = Array.isArray(posGroupIds) ? posGroupIds : [posGroupIds];\n const validContainers: ExternalObjectValidContainerModules[] = [];\n for (const id of ids) {\n const groupItem = this._getGroup(id);\n if (!groupItem) {\n continue;\n }\n const posGroup = groupItem.posDataJson;\n const { libraryData } = this._getLibrary(posGroup);\n if (!libraryData) {\n continue;\n }\n try {\n const setOfContainers =\n libraryData.getValidContainerModulesForSubArticle(\n posGroup,\n subArticle,\n libraryData.masterData,\n );\n validContainers.push(...Array.from(setOfContainers));\n } catch (error) {\n console.error(error);\n }\n }\n return validContainers;\n }\n\n public addSubArticle(\n articleId: string,\n rootModuleId: string,\n parentModuleId: string,\n ): Promise<void> {\n const article = this._getValidSubArticle(articleId);\n if (!article) {\n return;\n }\n const { group } = this._findRootModuleInAllGroups(rootModuleId);\n if (!group) {\n return;\n }\n const groupItem = this._getGroup(group.id);\n if (!groupItem) {\n return;\n }\n\n if (groupItem.calculationInProgress) {\n console.error('Calculation already in progress for group:', group.id);\n return;\n }\n groupItem.calculationInProgress = true;\n //await wait(0);\n let modifiedGroup;\n try {\n modifiedGroup = this._addSubArticle(\n group,\n article,\n rootModuleId,\n parentModuleId,\n );\n if (!modifiedGroup) {\n return;\n }\n } finally {\n groupItem.calculationInProgress = false;\n }\n this._designerRequests.loadPosGroups(modifiedGroup, {});\n this._groupsModified([], modifiedGroup, []);\n }\n\n public async deleteSubArticles(\n groupId: string,\n subModuleIds: string[] | string,\n ): Promise<void> {\n const emulatorGroupItem = this._getGroup(groupId);\n if (!emulatorGroupItem) {\n return;\n }\n const group = emulatorGroupItem.posDataJson;\n const arrayOfSubModuleIds = Array.isArray(subModuleIds)\n ? subModuleIds\n : [subModuleIds];\n let modifiedGroup = group;\n if (emulatorGroupItem.calculationInProgress) {\n console.error('Calculation already in progress for group:', group.id);\n return;\n }\n\n emulatorGroupItem.calculationInProgress = true;\n await wait(0);\n try {\n for (const moduleId of arrayOfSubModuleIds) {\n const subModuleInfo = this._findSubModule(\n modifiedGroup.roots,\n moduleId,\n );\n if (subModuleInfo) {\n modifiedGroup = this._deleteSubArticle(\n modifiedGroup,\n subModuleInfo.rootModule.id,\n subModuleInfo.module.id,\n );\n if (!modifiedGroup) {\n break;\n }\n }\n }\n if (!modifiedGroup) {\n return;\n }\n } finally {\n emulatorGroupItem.calculationInProgress = false;\n }\n this._designerRequests.loadPosGroups(modifiedGroup, {});\n this._groupsModified([], modifiedGroup, []);\n }\n\n private _findRootModuleInAllGroups(\n moduleId: string,\n ): { group: PosGroup; rootModule: PosModuleRootData } | undefined {\n for (const groupData of this._groupMap.values()) {\n const group = groupData.posDataJson;\n const rootModule = group.roots.find(\n (root: PosModuleRootData) => root.id === moduleId,\n );\n if (rootModule !== undefined) {\n return { group, rootModule };\n }\n }\n return undefined;\n }\n\n private _findModuleInAllGroups(\n moduleId: string,\n ): { group: PosGroup; module: PosModuleData } | undefined {\n for (const groupData of this._groupMap.values()) {\n const group = groupData.posDataJson;\n const module = this._findModule(group.roots, moduleId);\n if (module !== undefined) {\n return { group, module };\n }\n }\n return undefined;\n }\n\n private _findModule(\n modules: PosModuleData[],\n moduleId: string,\n ): PosModuleData | undefined {\n for (const module of modules) {\n if (module.id === moduleId) {\n return module;\n }\n if (module.modules && module.modules.length > 0) {\n const subMod = this._findModule(module.modules, moduleId);\n if (subMod !== undefined) {\n return subMod;\n }\n }\n }\n return undefined;\n }\n\n private _findSubModule(\n modules: PosModuleData[],\n moduleId: string,\n ): { rootModule: PosModuleData; module: PosModuleData } | undefined {\n for (const module of modules) {\n if (module.id === moduleId) {\n return { rootModule: module, module };\n }\n if (module.modules && module.modules.length > 0) {\n const subModule = this._findSubModule(module.modules, moduleId);\n if (subModule !== undefined) {\n return { rootModule: module, module: subModule.module };\n }\n }\n }\n return undefined;\n }\n\n private _replacesIDs(\n posGroup: { id: string; roots: any },\n keepRootModuleIDs: any,\n ) {\n posGroup.id = this._getNextID();\n if (!keepRootModuleIDs) {\n for (const root of posGroup.roots) {\n this._replacesModuleIDs(root);\n }\n }\n }\n\n private _replacesModuleIDs(module: { id: string; modules: any }) {\n module.id = this._getNextID();\n if (module.modules) {\n for (const subModule of module.modules) {\n this._replacesModuleIDs(subModule);\n }\n }\n }\n\n private _getNextID() {\n if ((window as any).uuidv4) {\n return (window as any).uuidv4();\n }\n let id = (this._nextPosDataId++).toString();\n if (id.length < 4) {\n id = '0'.repeat(4 - id.length) + id;\n }\n return 'id' + id;\n }\n\n private async _groupsModified(\n addedPosGroups: PosGroup[] | PosGroup,\n changedPosGroups: PosGroup[] | PosGroup,\n deletedPosGroupIds: string[] | string,\n ) {\n const addedGroupsArray = Array.isArray(addedPosGroups)\n ? addedPosGroups\n : [addedPosGroups];\n if (addedGroupsArray.length > 0) {\n await this._hiCallbacks?.onPosGroupAdded(addedGroupsArray);\n }\n const changedGroupsArray = Array.isArray(changedPosGroups)\n ? changedPosGroups\n : [changedPosGroups];\n if (changedGroupsArray.length > 0) {\n await this._hiCallbacks?.onPosGroupChanged(changedGroupsArray);\n }\n const deletedPosGroupIdsArray = Array.isArray(deletedPosGroupIds)\n ? deletedPosGroupIds\n : [deletedPosGroupIds];\n if (deletedPosGroupIdsArray.length > 0) {\n await this._hiCallbacks?.onPosGroupDeleted(deletedPosGroupIdsArray);\n }\n this._calculatePrice();\n }\n\n private _calculatePrice() {\n const posGroups = Array.from(this._groupMap.values()).map(\n (groupData) => groupData.posDataJson,\n );\n this._hiCallbacks?.onPriceCalc(posGroups);\n }\n\n private _calculate(originalPosDataJson: PosGroup) {\n const calculatedResult = this._updatePosData(\n originalPosDataJson,\n (posGroup, libraryData) => {\n try {\n return libraryData.calculateGroup(posGroup);\n } catch (error) {\n console.error('Error adding sub article to group:', error);\n }\n return posGroup;\n },\n );\n if (!calculatedResult) {\n return null;\n }\n return calculatedResult;\n }\n\n private _addSubArticle(\n originalPosDataJson: PosGroup,\n article: PosArticle,\n rootId: string,\n parentModuleId: string,\n ) {\n const calculatedResult = this._updatePosData(\n originalPosDataJson,\n (posGroup, libraryData) => {\n try {\n const resultGroup = libraryData.addSubArticle(\n posGroup,\n article,\n rootId,\n parentModuleId,\n );\n return libraryData.calculateGroup(resultGroup);\n } catch (error) {\n console.error('Error adding sub article to group:', error);\n }\n return posGroup;\n },\n );\n if (!calculatedResult) {\n return null;\n }\n this._addGroupToMap(calculatedResult.id, calculatedResult);\n return calculatedResult;\n }\n\n private _deleteSubArticle(\n originalPosDataJson: PosGroup,\n rootId: string,\n articleModuleId: string,\n ) {\n const calculatedResult = this._updatePosData(\n originalPosDataJson,\n (posGroup, libraryData) => {\n try {\n const resultGroup = libraryData.deleteSubArticle(\n posGroup,\n rootId,\n articleModuleId,\n );\n return libraryData.calculateGroup(resultGroup);\n } catch (error) {\n console.error('Error adding sub article to group:', error);\n }\n return posGroup;\n },\n );\n if (!calculatedResult) {\n return null;\n }\n this._addGroupToMap(calculatedResult.id, calculatedResult);\n return calculatedResult;\n }\n\n private _updatePosData(\n originalPosDataJson: PosGroup,\n updateGroup: (group: PosGroup, libraryData: LibraryData) => PosGroup,\n ) {\n const { libraryId, libraryData } = this._getLibrary(originalPosDataJson);\n if (!libraryData) {\n return null;\n }\n const posGroup = deepCopy(originalPosDataJson);\n posGroup.libraryId = libraryId;\n if (posGroup.logMessages) {\n posGroup.logMessages = [];\n }\n const calculatedResult = updateGroup(posGroup, libraryData);\n this._takeOverPropertiesFromOriginalGroup(\n libraryId,\n libraryData,\n originalPosDataJson,\n calculatedResult,\n );\n return calculatedResult;\n }\n\n private _getLibrary(posGroup: PosGroup): LibraryIdAndLibraryData {\n const libraryId = this._getLibraryIdForPosData(posGroup);\n const libraryData = this.getLibraryData(libraryId);\n return { libraryId, libraryData };\n }\n\n private _takeOverPropertiesFromOriginalGroup(\n libraryId: string,\n libraryData: LibraryData,\n originalArticleGroup: PosGroup,\n calculatedGroupData: PosGroup,\n ) {\n // take over thee position and rotation from the original data\n if (originalArticleGroup.pos !== undefined) {\n calculatedGroupData.pos = originalArticleGroup.pos;\n }\n if (originalArticleGroup.rotationY !== undefined) {\n calculatedGroupData.rotationY = originalArticleGroup.rotationY;\n }\n\n // take over the other properties from the original data\n const masterData = libraryData.masterData;\n calculatedGroupData.roots.forEach((root: PosModuleRootData) => {\n const posArticleGroupRoot = originalArticleGroup.roots.find(\n (r: { id: any }) => r.id === root.id,\n );\n const module = masterData?.modules.find((p) => p.id === root.name);\n\n root.libraryId = posArticleGroupRoot?.libraryId ?? libraryId;\n root.articleName =\n posArticleGroupRoot?.articleName ??\n posArticleGroupRoot?.articleId ??\n module?.name ??\n module?.id;\n root.articleId =\n posArticleGroupRoot?.articleId ??\n posArticleGroupRoot?.articleName ??\n module?.id ??\n module?.name;\n root.imageUrl = posArticleGroupRoot?.imageUrl ?? module?.imageUrl;\n root.desc = posArticleGroupRoot?.desc ?? module?.desc;\n root.category = posArticleGroupRoot?.category;\n root.additionalText = posArticleGroupRoot?.additionalText;\n if (root.canBeDeleted === undefined) {\n root.canBeDeleted = !root.isGenerated;\n }\n this._setSubmoduleImages(root, masterData);\n });\n }\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5naWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZ2lmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFNckMsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0FBRS9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7SUFNekQsT0FBTyxDQUNMLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixHQUFHO1FBQ0gsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRztRQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUM1QixDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQU8xQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEIsTUFBTSxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsZUFBZSxTQUFTLENBQUMifQ==","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm5nLWJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm5nLWJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsSUFBSSxlQUEwRCxDQUFDO0FBRS9ELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxPQUFPLFVBQVUsR0FBRztJQUV6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwwR0FBMEcsQ0FDM0csQ0FBQztRQUNKLENBQUM7UUFFRCxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUMifQ==","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLWJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlLWJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLEdBQ2QsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkYsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDIn0=","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdjQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJakQsU0FBUyxFQUFFLENBQUMsT0FBeUIsRUFBRSxHQUFnQixFQUFFLE1BQWU7SUFDdEUsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBRXhCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFHdEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBR2xDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDUixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDNUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxlQUFlLEVBQUUsQ0FBQyJ9","import type { GlueLogic } from './glue-logic';\nimport { type RoomlePlanner } from '../../planner-core/src/roomle-planner';\nimport type { BASE_CONTEXT } from '../../common-core/src/main';\nimport type { SELECTION_MODE } from '../../configurator-core/src/utils/selection-handler';\nimport type { CallbackObjectType } from '../../planner-core/src/utils/planner-scene-utils';\nimport type { SelectionPayload } from '../../planner-core/src/roomle-planner-ui-callback';\nimport { type PlanElementViewModel } from '../../common-core/src/view-model/plan-element-view-model';\nimport type { CancelSelectionReasons } from '../../typings/planner';\n\nexport const initCallbacks = (\n roomlePlanner: RoomlePlanner,\n gluLogic: GlueLogic,\n) => {\n roomlePlanner.callbacks.onCompletelyLoaded = () => {\n gluLogic.groupsCompletelyLoaded();\n };\n\n roomlePlanner.callbacks.onExternalObjectModuleSelected = (\n groupId: string,\n rootModuleId: string | null,\n subModuleId: string | null,\n ) => {\n gluLogic.hiObjectSelection.groupOrModuleSelected(\n groupId,\n rootModuleId,\n subModuleId,\n );\n };\n\n roomlePlanner.callbacks.onContextChanged = (context: BASE_CONTEXT): void => {\n gluLogic.hiObjectSelection.contextChanged(context);\n };\n\n roomlePlanner.callbacks.onSelectionChange = (\n selectionMode: SELECTION_MODE,\n objectType: CallbackObjectType,\n payload: SelectionPayload,\n payloadPromise: Promise<SelectionPayload>,\n planElementViewModel: PlanElementViewModel,\n ): void => {\n gluLogic.hiObjectSelection.selectionChanged(\n selectionMode,\n objectType,\n payload,\n payloadPromise,\n planElementViewModel,\n );\n };\n\n roomlePlanner.callbacks.onSelectionCancel = (\n reason: CancelSelectionReasons,\n ): void => {\n gluLogic.hiObjectSelection.selectionCancel(reason);\n };\n};\n","import { type RoomlePlanner } from '../../planner-core/src/roomle-planner';\nimport type { GlueLogic } from './glue-logic';\nimport type { KernelPlanObject } from '../../typings/kernel';\nimport type { ExternalObjectSnapshotSaveResult } from './external-object-api';\nimport type {\n HiOrder,\n HiOrderData,\n HiOrderHeader,\n} from '#/common/src/hi/hi-types';\n\nconst getISO8601Date = (date = new Date()) => {\n // Get the ISO string (in UTC)\n let isoString = date.toISOString();\n\n // Remove the 'Z' at the end which indicates UTC\n isoString = isoString.slice(0, -1);\n\n // Find the position of milliseconds\n const msPosition = isoString.lastIndexOf('.');\n\n // Get the base timestamp with 3 digits of milliseconds and extend with zeros\n let baseTimestamp = isoString;\n\n if (msPosition !== -1) {\n // Add 4 zeros to extend from 3 to 7 digits of precision\n baseTimestamp = isoString.substring(0, msPosition + 4) + '0000';\n }\n\n // Get timezone offset in minutes and convert to hours and minutes\n const offsetMinutes = date.getTimezoneOffset();\n const offsetHours = Math.abs(Math.floor(offsetMinutes / 60));\n const offsetMins = Math.abs(offsetMinutes % 60);\n\n // Format the offset as +HH:MM or -HH:MM\n const offsetSign = offsetMinutes <= 0 ? '+' : '-';\n const offsetString = `${offsetSign}${String(offsetHours).padStart(\n 2,\n '0',\n )}:${String(offsetMins).padStart(2, '0')}`;\n\n return baseTimestamp + offsetString;\n};\n\nexport const createEmptyOrder = (): HiOrder => {\n return {\n id: (window as any).uuidv4\n ? (window as any).uuidv4()\n : '00000000-0000-0000-0000-000000000000',\n state: 'New',\n orderNumber: '736362',\n orderName: 'Bedroom & bathroom 01',\n orderDescription: 'Lorem ipsum dolor sit amet...',\n project: 'Single family house Müller John',\n personInCharge: 'Joe',\n orderDate: getISO8601Date(),\n deliveryDatePlanned: getISO8601Date(\n new Date(Date.now() + 14 * 24 * 60 * 60 * 1000),\n ),\n addresses: [\n {\n type: 'Delivery, Billing',\n street: 'Musterstraße',\n houseNumber: '1',\n postalCode: '12345',\n city: 'Musterstadt',\n country: 'Deutschland',\n },\n ],\n customerName: 'Müller & Co.',\n customerNumber: '462642',\n createdAt: getISO8601Date(),\n changedAt: getISO8601Date(),\n changedBy: 'Selfish',\n items: [] as any[],\n };\n};\n\nconst _addMerchantPositions = async (\n roomlePlanner: RoomlePlanner,\n groupData: any,\n) => {\n const planOverview = await roomlePlanner.getPlanOverview();\n const count: Record<string, number> = {}; // key is id and value is count\n const itemIds = (\n planOverview.objects as unknown as KernelPlanObject[]\n ).reduce((acc: string[], item: any) => {\n if (item.catalogItemId) {\n if (!count[item.catalogItemId]) {\n count[item.catalogItemId] = 0;\n acc.push(item.catalogItemId);\n }\n count[item.catalogItemId]++;\n }\n return acc;\n }, []);\n const items =\n Array.isArray(itemIds) && itemIds.length > 0\n ? await roomlePlanner.getRapiAccess().getItems(itemIds)\n : [];\n const merchantItems = items.filter((item: any) => {\n if (item.manufacturerSKU !== undefined) {\n item.count = count[item.id];\n return true;\n }\n return false;\n });\n if (Array.isArray(merchantItems) && merchantItems.length > 0) {\n if (!groupData.items) {\n groupData.items = [];\n }\n let posNo = groupData.items.reduce((acc: number, item: any) => {\n if (item.items?.length) {\n return acc + item.items.length;\n }\n return acc;\n }, 0);\n merchantItems.forEach((item) => {\n const pos = {} as any;\n pos.type = 'Position';\n pos.name = (++posNo).toString();\n pos.articleNumber = item.manufacturerSKU;\n pos.articleName = item.label;\n pos.catalog = item.catalog;\n pos.quantity = item.count;\n pos.height = item.displayedHeight;\n pos.width = item.displayedWidth;\n pos.depth = item.displayedDepth;\n pos.color = item.basecolor;\n pos.procurementType = 'PTO';\n pos.additionalData = [];\n if (item.perspectiveImage) {\n pos.additionalData.push({\n category: 'ArticleImage',\n downloadUri: item.perspectiveImage,\n type: 'Image',\n });\n }\n groupData.items.push(pos);\n });\n }\n};\n\nexport default class Orders {\n private _roomlePlanner: RoomlePlanner;\n private _glueLogic: GlueLogic;\n\n constructor(roomlePlanner: RoomlePlanner, glueLogic: GlueLogic) {\n this._roomlePlanner = roomlePlanner;\n this._glueLogic = glueLogic;\n }\n\n public async fetchPrice(planId?: string, orderHeader?: HiOrderHeader) {\n let orderData = await this._glueLogic.getGroupDataForOrder(planId);\n return await this._fetchOrderDataWithPrice(orderData, orderHeader);\n }\n\n public async placeOrder(\n withPrice: boolean = true,\n orderHeader?: HiOrderHeader,\n ) {\n const planData = await this._roomlePlanner.saveExternalObjectSnapshot();\n if (!planData) {\n console.error('Could not save plan snapshot before placing order');\n return;\n }\n\n let priceData = withPrice\n ? await this._fetchOrderDataWithPrice(planData.orderData, orderHeader)\n : null;\n\n let order;\n if (priceData) {\n order = priceData.orderData;\n } else {\n order = this._createOrder(orderHeader);\n order.items.push(planData.orderData as never);\n await _addMerchantPositions(this._roomlePlanner, planData.orderData);\n }\n\n // The first item in the order is the one created from the HI objects in the plan\n this._addAdditionalDataToOrder(order.items[0], planData);\n\n await this._glueLogic.hiCallbacks?.onPlaceOrder(order);\n }\n\n private _addAdditionalDataToOrder(\n orderData: HiOrderData,\n planData: ExternalObjectSnapshotSaveResult,\n ) {\n if (!Array.isArray(orderData.additionalData)) {\n orderData.additionalData = [];\n }\n if (planData.perspectiveImageLink) {\n orderData.additionalData.push({\n type: 'Image',\n category: 'OverviewImage',\n downloadUri: planData.perspectiveImageLink,\n });\n }\n if (planData.topImageLink) {\n orderData.additionalData.push({\n type: 'Image',\n category: 'AboveImage',\n downloadUri: planData.topImageLink,\n });\n }\n if (planData.objectGlbLink) {\n orderData.additionalData.push({\n type: 'ThreeD',\n category: 'ThreeDModel',\n downloadUri: planData.objectGlbLink,\n });\n }\n }\n\n private async _fetchOrderDataWithPrice(\n orderData: HiOrderData,\n orderHeader?: HiOrderHeader,\n ): Promise<any> {\n let order = this._createOrder(orderHeader);\n order.items.push(orderData as never);\n return this._glueLogic.hiCallbacks?.onFetchPrice(order);\n }\n\n private _createOrder(orderHeader?: HiOrderHeader): HiOrder {\n return orderHeader\n ? {\n ...orderHeader,\n items: [],\n }\n : createEmptyOrder();\n }\n}\n","import type { HiCallbacks, HiOrderData } from '#/common/src/hi/hi-types';\nimport type {\n GlueLogic,\n LibraryData,\n RoomDesignerRequests,\n} from './glue-logic';\nimport type { ExternalObjectGroup } from 'roomle-core-hsc/src/embind/plannerCoreInterface';\nimport type { ExternalModuleInformation } from '../../typings/kernel';\nimport type {\n CheckResult,\n PosArticle,\n PosGroup,\n PosSaveData,\n} from './model/oc-scripts-domain.model';\nimport type { HiObjectSelectionApi } from './hi-object-selection';\nimport type {\n ExternalObjectSnapshotSaveResult,\n ExternalRoomInformation,\n LoadExternalObjectOptions,\n} from './external-object-api';\nimport type { ExternalObjectValidContainerModules } from './external-object-api-callbacks';\n\nexport class GlueLayerRequestDebugLogging implements GlueLogic {\n private _glueLogic: GlueLogic;\n private _hiCallbacks: HiCallbacks;\n\n constructor(glueLogic: GlueLogic, hiCallbacks: HiCallbacks) {\n this._glueLogic = glueLogic;\n this._hiCallbacks = hiCallbacks;\n }\n\n public get hiCallbacks(): HiCallbacks | null {\n return this._hiCallbacks;\n }\n\n public get hiObjectSelection(): HiObjectSelectionApi {\n return this._glueLogic.hiObjectSelection;\n }\n\n private _logRequest(message: string, ...args: Array<string | null>) {\n let messageAndArgs = message;\n if (args) {\n args.forEach((item) => {\n messageAndArgs += ' ' + item;\n });\n }\n this._hiCallbacks.onLogMessage?.('HI REQUEST', messageAndArgs);\n }\n\n public isLibraryLoaded(libraryId: string): boolean {\n return this._glueLogic.isLibraryLoaded(libraryId);\n }\n\n public getLibraryData(libraryId: string): LibraryData | null {\n return this._glueLogic.getLibraryData(libraryId);\n }\n\n public addLibrary(libraryData: LibraryData): Promise<void> {\n this._logRequest('addLibrary', libraryData.libraryId);\n return this._glueLogic.addLibrary(libraryData);\n }\n\n public setPosDataForLoading(posData: PosSaveData | null): Promise<void> {\n this._logRequest('setPosDataForLoading', posData ? 'set' : 'null');\n return this._glueLogic.setPosDataForLoading(posData);\n }\n\n public loadPosData(articleCatalogJson: any, libraryId: string): void {\n this._logRequest('loadPosData', libraryId);\n this._glueLogic.loadPosData(articleCatalogJson, libraryId);\n }\n\n public async mergeGroups(\n targetGroup: ExternalObjectGroup,\n idsOfGroupsMerged: string | string[],\n idOfTargetRootModule: string,\n ): Promise<void> {\n this._logRequest(\n 'mergeGroups',\n targetGroup.groupId,\n JSON.stringify(idsOfGroupsMerged),\n idOfTargetRootModule,\n );\n return this._glueLogic.mergeGroups(\n targetGroup,\n idsOfGroupsMerged,\n idOfTargetRootModule,\n );\n }\n\n public deleteRootModule(\n remainingGroup: ExternalObjectGroup,\n rootModuleIdToDelete: string,\n splitOffGroups: ExternalObjectGroup[],\n ): Promise<void> {\n this._logRequest(\n 'deleteRootModule',\n JSON.stringify(remainingGroup),\n rootModuleIdToDelete,\n JSON.stringify(splitOffGroups),\n );\n return this._glueLogic.deleteRootModule(\n remainingGroup,\n rootModuleIdToDelete,\n splitOffGroups,\n );\n }\n\n public splitRootModuleFromGroup(\n splitGroup: ExternalObjectGroup,\n newGroupedRootModules: ExternalObjectGroup[],\n ): Promise<void> {\n this._logRequest(\n 'splitRootModuleFromGroup',\n JSON.stringify(splitGroup),\n JSON.stringify(newGroupedRootModules),\n );\n return this._glueLogic.splitRootModuleFromGroup(\n splitGroup,\n newGroupedRootModules,\n );\n }\n\n public async duplicateGroup(\n duplicatedGroup: ExternalObjectGroup,\n ): Promise<void> {\n this._logRequest('duplicateGroup', duplicatedGroup.groupId);\n return this._glueLogic.duplicateGroup(duplicatedGroup);\n }\n\n public modifyAttribute(\n groupId: string,\n moduleIdObjects: ExternalModuleInformation[],\n attributeName: string,\n value: string,\n ): Promise<void> {\n this._logRequest(\n 'modifyAttribute',\n groupId,\n JSON.stringify(moduleIdObjects),\n attributeName,\n value,\n );\n return this._glueLogic.modifyAttribute(\n groupId,\n moduleIdObjects,\n attributeName,\n value,\n );\n }\n\n public updateAttribute(\n rootModuleId: string,\n moduleId: string | null,\n attributeId: string,\n attributeValue: string | boolean,\n ): Promise<void> {\n this._logRequest(\n 'updateAttribute',\n rootModuleId,\n moduleId,\n attributeId,\n attributeValue.toString(),\n );\n return this._glueLogic.updateAttribute(\n rootModuleId,\n moduleId,\n attributeId,\n attributeValue,\n );\n }\n\n public getVerifiedAttributeOptions(\n moduleId: string,\n attributeIds?: string | string[],\n ): Promise<Record<string, CheckResult> | undefined> {\n this._logRequest(\n 'getVerifiedAttributeOptions',\n moduleId,\n attributeIds ? JSON.stringify(attributeIds) : '[]',\n );\n return this._glueLogic.getVerifiedAttributeOptions(moduleId, attributeIds);\n }\n\n public getVerifiedGroupAttributeOptions(\n groupId: string,\n attributeIds?: string | string[],\n ): Promise<Record<string, CheckResult> | undefined> {\n this._logRequest(\n 'getVerifiedGroupAttributeOptions',\n groupId,\n attributeIds ? JSON.stringify(attributeIds) : '[]',\n );\n return this._glueLogic.getVerifiedGroupAttributeOptions(\n groupId,\n attributeIds,\n );\n }\n\n public updateProperty(\n rootModuleId?: string,\n propertyName?: string,\n propertyValue?: string | number | boolean,\n ): void {\n this._logRequest(\n 'updateProperty',\n rootModuleId ?? 'undefined',\n propertyName ?? 'undefined',\n propertyValue?.toString() ?? 'undefined',\n );\n this._glueLogic.updateProperty(rootModuleId, propertyName, propertyValue);\n }\n\n public findValidSubArticles(posGroupIds: string[] | string): PosArticle[] {\n this._logRequest(\n 'findValidSubArticles',\n Array.isArray(posGroupIds) ? JSON.stringify(posGroupIds) : posGroupIds,\n );\n return this._glueLogic.findValidSubArticles(posGroupIds);\n }\n\n public getValidContainerModulesForSubArticle(\n posGroupIds: string[] | string,\n subArticleId: string,\n ): ExternalObjectValidContainerModules[] {\n this._logRequest(\n 'getValidContainerModulesForSubArticle',\n Array.isArray(posGroupIds) ? JSON.stringify(posGroupIds) : posGroupIds,\n subArticleId,\n );\n return this._glueLogic.getValidContainerModulesForSubArticle(\n posGroupIds,\n subArticleId,\n );\n }\n\n public addSubArticle(\n articleId: string,\n rootModuleId: string,\n parentModuleId: string,\n ): void {\n this._logRequest('addSubArticle', articleId, rootModuleId, parentModuleId);\n return this._glueLogic.addSubArticle(\n articleId,\n rootModuleId,\n parentModuleId,\n );\n }\n\n public deleteSubArticles(\n groupId: string,\n subModuleIds: string[] | string,\n ): Promise<void> {\n this._logRequest(\n 'deleteSubArticles',\n groupId,\n Array.isArray(subModuleIds) ? JSON.stringify(subModuleIds) : subModuleIds,\n );\n return this._glueLogic.deleteSubArticles(groupId, subModuleIds);\n }\n\n public swapRootModule(\n groupId: string,\n rootModuleId: string,\n articleId: string,\n ): Promise<void> {\n this._logRequest('swapRootModule', groupId, rootModuleId, articleId);\n return this._glueLogic.swapRootModule(groupId, rootModuleId, articleId);\n }\n\n public arrangeRootModulesOfGroup(\n changedGroup: ExternalObjectGroup,\n ): Promise<void> {\n this._logRequest('arrangeRootModulesOfGroup', JSON.stringify(changedGroup));\n return this._glueLogic.arrangeRootModulesOfGroup(changedGroup);\n }\n\n public changedGroupPlanningSituation(\n changedGroup: ExternalObjectGroup,\n ): Promise<void> {\n this._logRequest('changedGroupPlanningSituation', changedGroup.groupId);\n return this._glueLogic.changedGroupPlanningSituation(changedGroup);\n }\n\n public changedGroupFromHistory(\n posDataJson: PosGroup,\n reloadGroup: boolean,\n ): void {\n this._logRequest(\n 'changedGroupFromHistory',\n posDataJson.id,\n reloadGroup.toString(),\n );\n this._glueLogic.changedGroupFromHistory(posDataJson, reloadGroup);\n }\n\n public loadedGroup(posDataJson: PosGroup): Promise<void> {\n this._logRequest('loadedGroup', posDataJson.id);\n return this._glueLogic.loadedGroup(posDataJson);\n }\n\n public groupsCompletelyLoaded(): void {\n this._logRequest('groupsCompletelyLoaded');\n this._glueLogic.groupsCompletelyLoaded();\n }\n\n public removedGroup(groupId: string): void {\n this._logRequest('removedGroup', groupId);\n this._glueLogic.removedGroup(groupId);\n }\n\n public openCloseGroup(groupId: string): void {\n this._logRequest('openCloseGroup', groupId);\n this._glueLogic.openCloseGroup(groupId);\n }\n\n public getSaveDataGroups(): Promise<PosGroup[] | null> {\n this._logRequest('getSaveDataGroups');\n return this._glueLogic.getSaveDataGroups();\n }\n\n public async newPosDataFromId(id: string): Promise<PosGroup> {\n this._logRequest('newPosDataFromId', id);\n return this._glueLogic.newPosDataFromId(id);\n }\n\n public async newPosDataFromGroup(posDataJson: PosGroup): Promise<PosGroup> {\n this._logRequest('newPosDataFromId', JSON.stringify(posDataJson));\n return this._glueLogic.newPosDataFromGroup(posDataJson);\n }\n\n public getGroupDataForOrder(roomlePlannerId?: string): Promise<HiOrderData> {\n this._logRequest('getGroupDataForOrder', roomlePlannerId);\n return this._glueLogic.getGroupDataForOrder(roomlePlannerId);\n }\n}\n\nexport class GlueLayerResponseDebugLogging implements RoomDesignerRequests {\n private _roomDesignerRequests: RoomDesignerRequests;\n private _hiCallbacks: HiCallbacks;\n\n constructor(\n roomDesignerRequests: RoomDesignerRequests,\n hiCallbacks: HiCallbacks,\n ) {\n this._roomDesignerRequests = roomDesignerRequests;\n this._hiCallbacks = hiCallbacks;\n }\n\n private _logResponse(message: string, ...args: Array<string | null>) {\n let messageAndArgs = message;\n if (args) {\n args.forEach((item) => {\n messageAndArgs += ' ' + item;\n });\n }\n this._hiCallbacks.onLogMessage?.('HI RESPONSE', messageAndArgs);\n }\n\n public loadMasterData(masterData: any): void {\n this._logResponse('loadMasterData');\n this._roomDesignerRequests.loadMasterData(masterData);\n }\n\n public async loadPosGroups(\n posDataJson: PosGroup | PosGroup[],\n options: LoadExternalObjectOptions,\n ): Promise<void> {\n const groupIds = Array.isArray(posDataJson)\n ? posDataJson.map((group) => group.id).join(',')\n : posDataJson.id;\n this._logResponse(\n 'loadPosGroups',\n groupIds,\n options.newAction?.toString() ?? 'false',\n options.findFreeSpaceInPlan?.toString() ?? 'false',\n options.correctArrangement?.toString() ?? 'false',\n options.moduleIdMap ? JSON.stringify(options.moduleIdMap) : '[]',\n options.mergedGroups ? JSON.stringify(options.mergedGroups) : '[]',\n options.respondWithPositionInPlan?.toString() ?? 'false',\n );\n return this._roomDesignerRequests.loadPosGroups(posDataJson, options);\n }\n\n public completelyLoaded(): void {\n this._logResponse('completelyLoaded');\n this._roomDesignerRequests.completelyLoaded();\n }\n\n public async selectGroup(groupId: string): Promise<void> {\n this._logResponse('selectGroup', groupId);\n return this._roomDesignerRequests.selectGroup(groupId);\n }\n\n public async selectRoot(rootModuleId: string): Promise<void> {\n this._logResponse('selectRoot', rootModuleId);\n return this._roomDesignerRequests.selectRoot(rootModuleId);\n }\n\n public async selectModule(\n rootModuleId: string,\n subModuleId: string,\n ): Promise<void> {\n this._logResponse('selectModule', rootModuleId, subModuleId);\n return this._roomDesignerRequests.selectModule(rootModuleId, subModuleId);\n }\n\n public openCloseGroup(\n groupOrRootModuleId: string,\n subModuleId: string | null,\n open: boolean,\n animate: boolean,\n ) {\n this._logResponse(\n 'openCloseGroup',\n groupOrRootModuleId,\n subModuleId,\n open.toString(),\n animate.toString(),\n );\n this._roomDesignerRequests.openCloseGroup(\n groupOrRootModuleId,\n subModuleId,\n open,\n animate,\n );\n return Promise.resolve();\n }\n\n public deleteGroup(groupId: string): void {\n this._logResponse('deleteGroup', groupId);\n return this._roomDesignerRequests.deleteGroup(groupId);\n }\n\n public deleteRootModule(rootModuleId: string): void {\n this._logResponse('deleteRootModule', rootModuleId);\n return this._roomDesignerRequests.deleteRootModule(rootModuleId);\n }\n\n public getPosDataOfAllGroups(): Promise<PosGroup[]> {\n this._logResponse('getPosDataOfAllGroups');\n return this._roomDesignerRequests.getPosDataOfAllGroups();\n }\n\n public getRoomInformation(): Promise<ExternalRoomInformation> {\n this._logResponse('getRoomInformation');\n return this._roomDesignerRequests.getRoomInformation();\n }\n\n public saveExternalObjectSnapshot(): Promise<ExternalObjectSnapshotSaveResult | null> {\n this._logResponse('saveExternalObjectSnapshot');\n return this._roomDesignerRequests.saveExternalObjectSnapshot();\n }\n}\n","import { RmlPlugin } from './rml-plugin';\nimport { RoomDesignerApi } from './api';\nimport type { GlueLogic } from './glue-logic';\nimport { GlueLogicImplementation, type LibraryData } from './glue-logic';\nimport { type HomagIntelligenceInitData } from './hi-api-types';\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n MasterData,\n PosArticle,\n PosContour,\n PosGroup,\n PosModuleAttribute,\n PosModuleData,\n} from './model/oc-scripts-domain.model';\nimport { initCallbacks } from './callbacks';\nimport { type RoomlePlanner } from '../../planner-core/src/roomle-planner';\nimport Orders from './orders';\nimport type {\n ExternalConfiguration,\n ExternalItem,\n} from '../../typings/external-objects';\nimport type { HiTagCatalogCallbacks } from './hi-tag-catalog-callbacks';\nimport type { HiCallbacks, HiOrderHeader } from '#/common/src/hi/hi-types';\nimport {\n GlueLayerRequestDebugLogging,\n GlueLayerResponseDebugLogging,\n} from './debug-logging';\nimport type { ExternalObjectValidContainerModules } from './external-object-api-callbacks';\n\ndeclare global {\n interface Window {\n uuidv4: () => string;\n }\n}\n\nconsole.warn('Homag Intelligence plugin is loaded.');\n\n// export const HOMAG_INTELLIGENCE_ENDPOINT = 'http://localhost:8080/proxy_request?url=';\n// export const HOMAG_INTELLIGENCE_ENDPOINT =\n// 'https://europe-west3-rml-showcases.cloudfunctions.net/proxy_request?url=';\n\nexport type ExternalObjects = Map<\n string,\n { id: string; label: string; items: any[] }\n>;\nexport type ExternalItems = Map<string, ExternalItem>;\nexport type ExternalConfigurations = Map<string, ExternalConfiguration>;\n\nexport class HomagIntelligence extends RmlPlugin {\n private _roomlePlanner: RoomlePlanner = null;\n private _api: RoomDesignerApi = null;\n private _glueLogic: GlueLogic = null;\n private _orders: Orders = null;\n\n constructor() {\n super();\n if (!window.uuidv4) {\n window.uuidv4 = uuidv4; // Ensure uuidv4 is available globally\n }\n }\n\n public async init(\n roomlePlanner: RoomlePlanner,\n hiOptions: HomagIntelligenceInitData,\n hiCallbacks: HiCallbacks,\n ): Promise<this> {\n this._roomlePlanner = roomlePlanner;\n this._roomlePlanner.setHomagIntelligence(this);\n this._api = new RoomDesignerApi(this._roomlePlanner);\n\n if (hiOptions?.debugLogging) {\n const api = new GlueLayerResponseDebugLogging(this._api, hiCallbacks);\n const glueLogic = new GlueLogicImplementation(api, hiCallbacks);\n this._glueLogic = new GlueLayerRequestDebugLogging(\n glueLogic,\n hiCallbacks,\n );\n } else {\n this._glueLogic = new GlueLogicImplementation(this._api, hiCallbacks);\n }\n initCallbacks(this._roomlePlanner, this._glueLogic);\n\n const savedPosGroupData =\n (await hiCallbacks.onGetSavedPosGroupData()) ?? null;\n await this._glueLogic.setPosDataForLoading(savedPosGroupData);\n this._orders = new Orders(roomlePlanner, this._glueLogic);\n return this;\n }\n\n public async loadLibrary(libraryId: string) {\n if (!this._glueLogic) {\n throw new Error('GlueLogic not initialized');\n }\n const libraryData = await this._loadLibraryData(libraryId);\n this._glueLogic.addLibrary(libraryData);\n }\n\n public async loadCatalog(\n libraryId: string,\n articles: any,\n catalogCallbacks: HiTagCatalogCallbacks,\n ) {\n if (!this._glueLogic) {\n throw new Error('GlueLogic not initialized');\n }\n catalogCallbacks?.setEmulator(this._glueLogic);\n this._glueLogic.loadPosData(await articles, libraryId);\n }\n\n private async _loadLibraryData(libraryId: string): Promise<LibraryData> {\n if (this._glueLogic.isLibraryLoaded(libraryId)) {\n return this._glueLogic.getLibraryData(libraryId);\n }\n const hiCallbacks = this._glueLogic.hiCallbacks;\n const { masterData, libraryExports } = await this._requestHiLibrary(\n libraryId,\n hiCallbacks,\n );\n this._loadMasterData(masterData);\n const libraryData: LibraryData = {\n libraryId,\n masterData,\n posGroupVersion: 1,\n calculateGroup: (groupData: PosGroup): PosGroup => {\n return libraryExports.calc(groupData);\n },\n getOrderData: (\n groupData: PosGroup[],\n roomlePlannerId?: string,\n rooms?: PosContour[],\n ): any => {\n return libraryExports.getOrderData(groupData, roomlePlannerId, rooms);\n },\n getAttributesDropDownValues: async (\n module: PosModuleData,\n attributeIds?: string | string[],\n ): Promise<Record<string, any[]>> => {\n const ids = attributeIds\n ? Array.isArray(attributeIds)\n ? attributeIds\n : [attributeIds]\n : module.attributes.map((attribute) => attribute.id);\n const attributeOptions: Record<string, any[]> = {};\n for (const attributeId of ids) {\n try {\n const options = libraryExports.getAttributesDropDownValues(\n module,\n attributeId,\n );\n attributeOptions[attributeId] = options;\n } catch (error) {\n console.error(error);\n attributeOptions[attributeId] = [];\n }\n }\n return attributeOptions;\n },\n solveModuleAttributeConflict: (\n module: PosModuleData,\n attributeName: string,\n value: string | number | boolean,\n ): PosModuleAttribute[] | undefined => {\n if (!libraryExports.solveModuleAttributeConflict) {\n return undefined;\n }\n const results = libraryExports.solveModuleAttributeConflict(\n module,\n attributeName,\n value,\n );\n return results;\n },\n getValidSubArticles(\n calculatedPosGroup: PosGroup,\n articles: PosArticle[],\n masterData: MasterData,\n ): PosArticle[] {\n if (!libraryExports.getValidSubArticles) {\n return [];\n }\n const results = libraryExports.getValidSubArticles(\n calculatedPosGroup,\n articles,\n masterData,\n );\n return results;\n },\n getValidContainerModulesForSubArticle(\n calculatedPosGroup: PosGroup,\n subArticle: PosArticle,\n masterData: MasterData,\n ): ExternalObjectValidContainerModules[] {\n if (!libraryExports.getValidContainerModulesForSubArticle) {\n return [];\n }\n const results = libraryExports.getValidContainerModulesForSubArticle(\n calculatedPosGroup,\n subArticle,\n masterData,\n );\n return results;\n },\n addSubArticle(\n targetPosGroup: PosGroup,\n article: PosArticle,\n rootId: string,\n parentModuleId: string,\n ): PosGroup {\n if (!libraryExports.addSubArticle) {\n return targetPosGroup;\n }\n const results = libraryExports.addSubArticle(\n targetPosGroup,\n article,\n rootId,\n parentModuleId,\n );\n return results;\n },\n deleteSubArticle(\n targetPosGroup: PosGroup,\n rootId: string,\n articleModuleId: string,\n ): PosGroup {\n if (!libraryExports.deleteSubArticle) {\n return targetPosGroup;\n }\n const results = libraryExports.deleteSubArticle(\n targetPosGroup,\n rootId,\n articleModuleId,\n );\n return results;\n },\n };\n return libraryData;\n }\n\n public async _requestHiLibrary(\n libraryId: string,\n hiCallbacks: HiCallbacks,\n ): Promise<{\n masterData: MasterData;\n libraryExports: any;\n }> {\n if (!this._glueLogic) {\n throw new Error('GlueLogic not initialized');\n }\n const [masterData, calcScriptString] = await Promise.all([\n hiCallbacks.onLoadMasterData(libraryId),\n hiCallbacks.onLoadJavascript(libraryId),\n ]);\n const libraryExports = await this._initCalcScript(calcScriptString);\n return {\n masterData,\n libraryExports,\n };\n }\n\n private _loadMasterData(masterData: MasterData): void {\n if (!this._api) {\n throw new Error('API not initialized');\n }\n return this._api.loadMasterData(masterData);\n }\n\n private async _initCalcScript(scriptText: string): Promise<any> {\n try {\n window.exports = {};\n const blob = new Blob([scriptText], { type: 'text/javascript' });\n const blobUrl = URL.createObjectURL(blob);\n await import(blobUrl);\n URL.revokeObjectURL(blobUrl); // dispose of it when done\n return window.exports;\n } catch (e) {\n console.error(e);\n throw new Error('Failed to load calc.js!');\n }\n }\n\n public getGlueLogic(): GlueLogic {\n return this._glueLogic;\n }\n\n public async placeOrder(\n withPrice: boolean = true,\n orderHeader?: HiOrderHeader,\n ) {\n await this._orders.placeOrder(withPrice, orderHeader);\n }\n\n public async fetchPrice(planId?: string, orderHeader?: HiOrderHeader) {\n return this._orders.fetchPrice(planId, orderHeader);\n }\n}\n"],"names":["RmlPlugin","HI_PANEL_ACTION","HI_SELECTION_TYPE","HI_SELECTION_MODE","HiObjectSelection","callbacks","BASE_CONTEXT","viewName","context","groupId","rootModuleId","subModuleId","reason","selectionMode","objectType","payload","_payloadPromise","_planElementViewModel","initiatingContext","mode","type","panelAction","showAttributes","GlueLogicImplementation","designerRequests","hiCallbacks","data","libraryId","libraryData","articleCatalogJson","posDataGroup","articleId","posArticle","deepCopy","posData","allPosGroups","groupItem","id","isExtObjId","removeExtObjIdPrefix","isSubarticle","posArticleGroup","posArticleRoot","newPosGroup","posDataJson","emulatorGroupItem","error","_groupId","rootId","moduleId","open","remainingGroup","rootModuleIdToDelete","splitOffGroups","originalGroupData","group","root","newGroupsPosData","g","duplicatedGroup","duplicatedPosDataJson","duplicatedRoot","targetGroup","idsOfGroupsMerged","idOfTargetRootModule","sourceGroupIds","originalSourceGroupRoots","sourceGroupId","sourceGroupData","nonGeneratedRoots","rootModule","targetGroupData","existingRoot","r","deletedGroups","sourceRootModule","rootsToDock","masterData","implicitRelevantAttributes","m","attr","rootToDock","masterDataModule","attributeId","sourceRootAttribute","a","moduleAttribute","splitGroup","newGroupedRootModules","newGroups","changedGroup","calculatedGroup","historyGroup","reloadGroup","updatedGroup","groupsToBeLoaded","posDataToBeLoaded","newPosData","newGroupCreated","groupData","roomlePlannerId","posGroups","cnt","posGroup","roomInformation","changedGroupPosition","newGroupPosition","rootModulePositions","additionalGroupData","loadPosData","posDataCollection","newGroup","newGroupPosDataJson","splitOffRootModuleIds","splitOffRootModules","splitOffRootModule","remainingRoot","keepRootModuleIDs","posDataModule","subModule","wait","recalculatedGroup","calculatedPosDataJson","attributeValue","emulatorGroup","value","modifiedGroups","moduleIdObjects","attributeName","moduleIds","obj","attributeIds","moduleInfo","attributeOptions","checkResults","options","entry","ids","moduleToAttributes","allOptionsPerAttribute","modules","module","existing","attrOptions","option","combinedResults","allOptions","calcResult","kind","b","CheckDropDownEntryKind","kind1","kind2","result","propertyName","propertyValue","rootModuleToBeReplaced","newPosDataJson","notGeneratedRoots","newRootModule","modifiedGroup","rootModuleMapping","conflictResults","conflictResult","attribute","attributeData","posGroupIds","possibleSubArticles","article","setOfArticles","subArticleId","subArticle","validContainers","setOfContainers","parentModuleId","subModuleIds","arrayOfSubModuleIds","subModuleInfo","subMod","addedPosGroups","changedPosGroups","deletedPosGroupIds","addedGroupsArray","changedGroupsArray","deletedPosGroupIdsArray","originalPosDataJson","calculatedResult","resultGroup","articleModuleId","updateGroup","originalArticleGroup","calculatedGroupData","posArticleGroupRoot","p","byteToHex","i","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","buf","rnds","initCallbacks","roomlePlanner","gluLogic","payloadPromise","planElementViewModel","getISO8601Date","date","isoString","msPosition","baseTimestamp","offsetMinutes","offsetHours","offsetMins","offsetString","createEmptyOrder","_addMerchantPositions","planOverview","count","itemIds","acc","item","merchantItems","posNo","pos","Orders","glueLogic","planId","orderHeader","orderData","withPrice","planData","priceData","order","GlueLayerRequestDebugLogging","message","args","messageAndArgs","GlueLayerResponseDebugLogging","roomDesignerRequests","groupIds","groupOrRootModuleId","animate","HomagIntelligence","uuidv4","hiOptions","RoomDesignerApi","api","savedPosGroupData","articles","catalogCallbacks","libraryExports","rooms","calculatedPosGroup","targetPosGroup","calcScriptString","scriptText","blob","blobUrl"],"mappings":"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","x_google_ignoreList":[4,5,6,7]}
|