@roomle/web-sdk 3.7.0-alpha.3 → 3.7.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-C696z6r3.mjs → BufferGeometry-BzmfTBQt.mjs} +1 -1
- package/lib/{BufferGeometry-C696z6r3.mjs.map → BufferGeometry-BzmfTBQt.mjs.map} +1 -1
- package/lib/ConfiguratorKernel.wasm +0 -0
- package/lib/{GLTFExporter-AfQIvZAD.mjs → GLTFExporter-CyhgWPq0.mjs} +2 -2
- package/lib/{GLTFExporter-AfQIvZAD.mjs.map → GLTFExporter-CyhgWPq0.mjs.map} +1 -1
- package/lib/{PointLightHelper-wVSmrAnD.mjs → PointLightHelper-DwIXACyT.mjs} +2 -2
- package/lib/{PointLightHelper-wVSmrAnD.mjs.map → PointLightHelper-DwIXACyT.mjs.map} +1 -1
- package/lib/RoomleCore.js +2 -2
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/{SpotLightHelper-C7J95t4f.mjs → SpotLightHelper-CfLHM7LU.mjs} +2 -2
- package/lib/{SpotLightHelper-C7J95t4f.mjs.map → SpotLightHelper-CfLHM7LU.mjs.map} +1 -1
- package/lib/{USDZExporter-BBk0APeK.mjs → USDZExporter-kmxcTvnQ.mjs} +2 -2
- package/lib/{USDZExporter-BBk0APeK.mjs.map → USDZExporter-kmxcTvnQ.mjs.map} +1 -1
- package/lib/{api-DgXsyN04.mjs → api-X1dDTDvL.mjs} +2 -2
- package/lib/{api-DgXsyN04.mjs.map → api-X1dDTDvL.mjs.map} +1 -1
- package/lib/asset-loader.worker-A7nEeQB4.mjs.map +1 -1
- package/lib/{banana-for-scale-D8t2dmc7.mjs → banana-for-scale-Bpf8RfLi.mjs} +4 -4
- package/lib/{banana-for-scale-D8t2dmc7.mjs.map → banana-for-scale-Bpf8RfLi.mjs.map} +1 -1
- package/lib/budgeteer.sw-CQWYbQSc.mjs.map +1 -1
- package/lib/budgeteer.sw.js +1 -1
- package/lib/{common-utils-qErzZAiR.mjs → common-utils-DMI8Yuhe.mjs} +5 -3
- package/lib/common-utils-DMI8Yuhe.mjs.map +1 -0
- package/lib/{component-dimensioning-DlB7-9Om.mjs → component-dimensioning-MtS9xiY-.mjs} +15 -15
- package/lib/{component-dimensioning-DlB7-9Om.mjs.map → component-dimensioning-MtS9xiY-.mjs.map} +1 -1
- package/lib/{component-raycast-helper-C6ptEb0K.mjs → component-raycast-helper-C1qWqpRH.mjs} +13 -9
- package/lib/component-raycast-helper-C1qWqpRH.mjs.map +1 -0
- package/lib/configurator-C5t3clCx.mjs +2 -0
- package/lib/{configurator-CmMBHkyd.mjs → configurator-Cg1a9XSL.mjs} +4 -4
- package/lib/{configurator-CmMBHkyd.mjs.map → configurator-Cg1a9XSL.mjs.map} +1 -1
- package/lib/{continuous-drawing-helper-BwulJHKj.mjs → continuous-drawing-helper-CQx5Sbns.mjs} +3 -3
- package/lib/{continuous-drawing-helper-BwulJHKj.mjs.map → continuous-drawing-helper-CQx5Sbns.mjs.map} +1 -1
- package/lib/{dat.gui.module-CZHqOVGq.mjs → dat.gui.module-CZ-DIWHM.mjs} +1 -1
- package/lib/{dat.gui.module-CZHqOVGq.mjs.map → dat.gui.module-CZ-DIWHM.mjs.map} +1 -1
- package/lib/{decorate-BAtqSPNS.mjs → decorate-Bck1_lG8.mjs} +1 -1
- package/lib/{decorate-BAtqSPNS.mjs.map → decorate-Bck1_lG8.mjs.map} +1 -1
- package/lib/dimensioning-helper-Bfe0fImX.mjs +2 -0
- package/lib/{dimensioning-helper--Y0Y-Wr1.mjs → dimensioning-helper-GPn7Z8GE.mjs} +7 -7
- package/lib/{dimensioning-helper--Y0Y-Wr1.mjs.map → dimensioning-helper-GPn7Z8GE.mjs.map} +1 -1
- package/lib/glb-viewer-DIEpkrvY.mjs +2 -0
- package/lib/{glb-viewer-Cs3i0yb8.mjs → glb-viewer-tgKOPCaI.mjs} +44 -45
- package/lib/glb-viewer-tgKOPCaI.mjs.map +1 -0
- package/lib/highlight-coordinator-DRHeEU-E.mjs +116 -0
- package/lib/highlight-coordinator-DRHeEU-E.mjs.map +1 -0
- package/lib/{homag-intelligence-CBZujG1I.mjs → homag-intelligence-D5mCTWgG.mjs} +19 -11
- package/lib/homag-intelligence-D5mCTWgG.mjs.map +1 -0
- package/lib/{imos-ix-poc-export-helper-CW7QZhhn.mjs → imos-ix-poc-export-helper-BKFs_Yhm.mjs} +5 -5
- package/lib/{imos-ix-poc-export-helper-CW7QZhhn.mjs.map → imos-ix-poc-export-helper-BKFs_Yhm.mjs.map} +1 -1
- package/lib/kernel-C7YDLxq8.mjs.map +1 -1
- package/lib/{kernel-utils-DCnHzW4n.mjs → kernel-utils-B80amC-l.mjs} +2 -2
- package/lib/{kernel-utils-DCnHzW4n.mjs.map → kernel-utils-B80amC-l.mjs.map} +1 -1
- package/lib/{layer-CFAr2mK_.mjs → layer-BfckfWZz.mjs} +1 -1
- package/lib/{layer-CFAr2mK_.mjs.map → layer-BfckfWZz.mjs.map} +1 -1
- package/lib/{main-_HtiLIhS.mjs → main-CJ5TNhBt.mjs} +2484 -2533
- package/lib/main-CJ5TNhBt.mjs.map +1 -0
- package/lib/{material-viewer-BCjg687R.mjs → material-viewer-DCqZzMZN.mjs} +40 -35
- package/lib/material-viewer-DCqZzMZN.mjs.map +1 -0
- package/lib/packages-DuOz6rk6.mjs +4 -0
- package/lib/{planner-OYwMFSWo.mjs → planner-CSboZram.mjs} +3 -3
- package/lib/{planner-OYwMFSWo.mjs.map → planner-CSboZram.mjs.map} +1 -1
- package/lib/planner-CWPqJktz.mjs +2 -0
- package/lib/{plugin-system-DInww4H_.mjs → plugin-system-DD0Z9Jvt.mjs} +3 -3
- package/lib/{plugin-system-DInww4H_.mjs.map → plugin-system-DD0Z9Jvt.mjs.map} +1 -1
- package/lib/{roomle-headless-setup-LoBO7UJe.mjs → roomle-headless-setup-nsoGENQV.mjs} +1 -1
- package/lib/{roomle-headless-setup-LoBO7UJe.mjs.map → roomle-headless-setup-nsoGENQV.mjs.map} +1 -1
- package/lib/roomle-headless.d.ts +185 -63
- package/lib/roomle-headless.js +9 -9
- package/lib/{roomle-renderer-DVlJsHYn.mjs → roomle-renderer-BEJNPCKx.mjs} +2 -2
- package/lib/roomle-renderer-BEJNPCKx.mjs.map +1 -0
- package/lib/roomle-sdk.d.ts +185 -63
- package/lib/roomle-sdk.js +6 -6
- package/lib/roomle-webgpu-renderer-D5flithq.mjs +1502 -0
- package/lib/roomle-webgpu-renderer-D5flithq.mjs.map +1 -0
- package/lib/{scene-renderer-BHZrQYAH.mjs → scene-renderer-Dm1kij1z.mjs} +26 -26
- package/lib/scene-renderer-Dm1kij1z.mjs.map +1 -0
- package/lib/{script-loader-X4I-gQl2.mjs → script-loader-DqaDm1FG.mjs} +3 -3
- package/lib/{script-loader-X4I-gQl2.mjs.map → script-loader-DqaDm1FG.mjs.map} +1 -1
- package/lib/static/packages/workers/generated/budgeteer.sw.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.d.ts +2 -2
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +18 -6
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js +15 -11
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.d.ts +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +21 -12
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.js +2 -2
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
- package/lib/{stats-helper-Cv5SoEWT.mjs → stats-helper-D7a7oxnj.mjs} +3 -3
- package/lib/{stats-helper-Cv5SoEWT.mjs.map → stats-helper-D7a7oxnj.mjs.map} +1 -1
- package/lib/{three.core-mM-jZdgg.mjs → three.core-BmQnspOL.mjs} +819 -816
- package/lib/{three.core-mM-jZdgg.mjs.map → three.core-BmQnspOL.mjs.map} +1 -1
- package/lib/{three.module-Bmy3sVQ-.mjs → three.module-DkrZwaid.mjs} +455 -455
- package/lib/{three.module-Bmy3sVQ-.mjs.map → three.module-DkrZwaid.mjs.map} +1 -1
- package/lib/{three.webgpu-BbVYfCDp.mjs → three.webgpu-DLZjhIYv.mjs} +1517 -1517
- package/lib/{three.webgpu-BbVYfCDp.mjs.map → three.webgpu-DLZjhIYv.mjs.map} +1 -1
- package/lib/three.webgpu-RkQxSIwG.mjs +3 -0
- package/lib/{threejs-utils-Bq4pVWBA.mjs → threejs-utils-CrK_gp1x.mjs} +67 -63
- package/lib/{threejs-utils-Bq4pVWBA.mjs.map → threejs-utils-CrK_gp1x.mjs.map} +1 -1
- package/lib/{tools-core-BRzDdhLJ.mjs → tools-core-CZWgXTFV.mjs} +3 -3
- package/lib/{tools-core-BRzDdhLJ.mjs.map → tools-core-CZWgXTFV.mjs.map} +1 -1
- package/package.json +1 -1
- package/lib/common-utils-qErzZAiR.mjs.map +0 -1
- package/lib/component-raycast-helper-C6ptEb0K.mjs.map +0 -1
- package/lib/component-raycast-helper-LrhRpeDD.mjs +0 -2
- package/lib/configurator-DtvX4JqP.mjs +0 -2
- package/lib/dimensioning-helper-BpUreWo2.mjs +0 -2
- package/lib/glb-viewer-Cs3i0yb8.mjs.map +0 -1
- package/lib/glb-viewer-Dcllu_oG.mjs +0 -2
- package/lib/homag-intelligence-CBZujG1I.mjs.map +0 -1
- package/lib/main-_HtiLIhS.mjs.map +0 -1
- package/lib/material-viewer-BCjg687R.mjs.map +0 -1
- package/lib/packages-BhrPUb9k.mjs +0 -4
- package/lib/planner-CDJtTG3g.mjs +0 -2
- package/lib/roomle-renderer-DVlJsHYn.mjs.map +0 -1
- package/lib/roomle-webgpu-renderer-CVxBRv6o.mjs +0 -217
- package/lib/roomle-webgpu-renderer-CVxBRv6o.mjs.map +0 -1
- package/lib/scene-renderer-BHZrQYAH.mjs.map +0 -1
- package/lib/three.webgpu-Bnp8Whu8.mjs +0 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as e, r as t, t as n, tt as r } from "./main-
|
|
2
|
-
import { t as i } from "./script-loader-
|
|
1
|
+
import { n as e, r as t, t as n, tt as r } from "./main-CJ5TNhBt.mjs";
|
|
2
|
+
import { t as i } from "./script-loader-DqaDm1FG.mjs";
|
|
3
3
|
//#region packages/tools-core/src/utils/injectables.ts
|
|
4
4
|
var a = [new r("script-loader", i)], o = class extends e {
|
|
5
5
|
setupGlobals() {}
|
|
@@ -27,4 +27,4 @@ var a = [new r("script-loader", i)], o = class extends e {
|
|
|
27
27
|
//#endregion
|
|
28
28
|
export { o as ToolsCore };
|
|
29
29
|
|
|
30
|
-
//# sourceMappingURL=tools-core-
|
|
30
|
+
//# sourceMappingURL=tools-core-CZWgXTFV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-core-
|
|
1
|
+
{"version":3,"file":"tools-core-CZWgXTFV.mjs","names":[],"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 | undefined;\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 if (this._tools === undefined) {\n throw new Error('ToolsCore not initialized. Call boot() first.');\n }\n return this._tools;\n }\n\n protected getContextName(): string {\n return BASE_CONTEXT.TOOLS_CORE;\n }\n}\n"],"mappings":";;;AAGA,IAAa,IAA+C,CAC1D,IAAI,EAA8B,iBAAiB,EAAa,CACjE,ECIY,IAAb,cAA+B,EAAK;CAGlC,eAA+B;CAI/B,oBAAoC;AAElC,EADA,EAA0B,MAAM,EAAY,EAC5C,KAAK,OAAe,UAAU,KAAK,SAAS;;CAG9C,iBAAiC;AAE/B,EADA,KAAK,SAAS,KAAA,GACV,OAAO,mBACT,OAAO,OAAO;;CAIlB,sBAAsC;EACpC,IAAM,IAAe,KAAK,OAAqB,gBAAgB;AAC/D,EAAI,KACF,EAAa,SAAS;;CAI1B,MAAgB,eAA8B;AAM5C,EALA,KAAK,SAAS,KAAK,OACjB,qBACA,KAAK,SACN,EAEI,OAAO,oBACV,OAAO,kBAAkB,KAAK;;CAIlC,SAAiC;AAC/B,MAAI,KAAK,WAAW,KAAA,EAClB,OAAU,MAAM,gDAAgD;AAElE,SAAO,KAAK;;CAGd,iBAAmC;AACjC,SAAO,EAAa"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common-utils-qErzZAiR.mjs","names":[],"sources":["../../packages/typings/rapi-types.ts","../../packages/common-core/src/utils/common-utils.ts"],"sourcesContent":["import type { Enumify } from '#/common/src/utils/types';\nimport type { InitDataDefinition } from '../common-core/src/utils/shims';\nimport type { UiPossibleChild } from './kernel';\n\nexport type RapiId = string;\nexport type AssetUrl = string;\nexport type ConfigurationString = string;\nexport type ConfigurationHash = string;\nexport type Base64String = string;\nexport type RapiServerUrlType = 'live' | 'test';\nexport type HexColorString = string; // #ffffff\nexport type HexColorNumber = number; // 0xffffff\nexport type PriceId = string;\nexport type ArticleNumber = string;\n\nexport interface LinksCollection {\n [key: string]: string;\n}\n\nexport interface RoomleSortable {\n sort?: number;\n}\n\nexport interface RapiJsonBox {\n meta?: RapiMeta;\n\n [key: string]: RapiMeta | RapiJson | RapiJson[] | undefined;\n}\n\nexport interface RapiMeta {\n serverTime: string;\n total: number;\n\n [key: string]: string | number;\n}\n\nexport interface RapiJson {\n id?: RapiId | number | null;\n isLocally?: boolean;\n __rapi_path__?: string;\n\n links?: LinksCollection;\n [key: string]: any;\n}\n\nexport interface RapiPackage extends RapiJson {\n components: RapiComponent[];\n materials: RapiMaterial[];\n textures: RapiTexture[];\n}\n\nexport interface RapiBaseColor {\n r: number;\n g: number;\n b: number;\n\n [key: string]: number;\n}\n\nexport interface RapiMesh extends RapiJson {\n catalog: RapiId;\n id: RapiId;\n}\n\nexport interface RapiMeshData {\n format: string;\n quality: number;\n url: string;\n created: string;\n changed: string;\n meshId: RapiId;\n\n [key: string]: number | string | RapiId;\n}\n\nexport interface RapiMaterialShading {\n version?: string;\n alpha: number;\n metallic: number;\n specularity?: number;\n basecolor: RapiBaseColor;\n roughness: number;\n doubleSided: boolean;\n alphaCutoff?: number;\n occlusion?: number;\n transmission?: number;\n reflectivity?: number;\n transmissionIOR?: number;\n emissiveColor?: RapiBaseColor;\n emissiveIntensity?: number;\n clearcoatIntensity?: number;\n clearcoatRoughness?: number;\n clearcoatNormalScale?: number;\n sheenColor?: RapiBaseColor;\n sheenIntensity?: number;\n sheenRoughness?: number;\n specularColor?: RapiBaseColor;\n thicknessFactor?: number;\n attenuationColor?: RapiBaseColor;\n attenuationDistance?: number;\n embeddedTextures?: RapiTexture[];\n\n [key: string]:\n | number\n | boolean\n | string\n | RapiBaseColor\n | RapiTexture[]\n | undefined;\n}\n\nexport interface RapiMaterial extends RapiJson {\n id: RapiId;\n name: string;\n externalIdentifier: string;\n group: string;\n groupLabel: string;\n color: string;\n thumbnail: AssetUrl;\n label: string;\n textures: number[];\n shading: RapiMaterialShading;\n tags: RapiId[];\n active: boolean;\n additionalInfos?: AdditionalInfo[];\n properties?: Record<string, string>;\n sort?: number;\n\n [key: string]:\n | string\n | RapiMaterialShading\n | AssetUrl\n | RapiId\n | number[]\n | AdditionalInfo[]\n | boolean\n | number\n | LinksCollection\n | RapiId[]\n | Record<string, string>\n | undefined;\n}\n\nexport interface RapiMaterialGroup extends RapiJson {\n id: RapiId | null;\n label?: string | null;\n materials: RapiMaterial[];\n legacyId?: RapiId;\n sort?: number;\n\n [key: string]:\n | string\n | RapiMaterial[]\n | RapiId\n | boolean\n | LinksCollection\n | number\n | null\n | undefined;\n}\n\nexport const enum RAPI_TEXTURE_TYPE {\n RGB = 'RGB', // diffuse color texture\n RGBA = 'RGBA', // Diffuse color texture and opacity map\n XYZ = 'XYZ', // normal vectors encoded in the 3 color channels\n ORM = 'ORM', // ambient Occlusion, roughness and metalness stored in the red, green and blue channels of the texture (in this order)\n EMRGB = 'EMRGB', // emissive color texture\n CCRG = 'CCRG', // clear coat intensity and clear coat roughness stored in the red and green channels of the texture (in this order)\n CCXYZ = 'CCXYZ', // separate normal vectors for the clear coat effect\n SHRGBA = 'SHRGBA', // sheen effect color texture and sheen roughness, the color is stored in the RGB channels and the roughness is stored in the alpha channel\n SPRGBA = 'SPRGBA', // specular color texture and specular intensity, the color is stored in the RGB channels and the intensity is stored in the alpha channel\n TTRG = 'TTRG', // transmission degree and thickness stored in the red and green channels of the texture (in this order)\n}\n\nexport interface RapiTexture extends RapiJson {\n mapping: RAPI_TEXTURE_TYPE;\n url: AssetUrl;\n image: AssetUrl;\n height: number;\n width: number;\n mmHeight: number;\n mmWidth: number;\n tileable: boolean;\n material: RapiId;\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | LinksCollection\n | null\n | undefined;\n}\n\nexport interface RapiCatalog extends RapiJson {\n id: RapiId;\n name: string;\n featuredImage: string;\n externalIdentifier: string;\n cover: string;\n brandIcon: string;\n description: string;\n free: boolean;\n public: boolean;\n featured: boolean;\n sort: number;\n created: string;\n updated: string;\n hidden: boolean;\n hiddenByUser: boolean;\n hiddenByTenant: boolean;\n tenantIsOwner: boolean;\n orderable: boolean;\n active: boolean;\n purchased: boolean;\n branded: boolean;\n\n tenant: RapiTenant;\n items: RapiItem[];\n allItems: RapiItem[];\n components: RapiComponent[];\n materials: RapiMaterial[];\n tags: RapiId[];\n allTags: RapiTag[];\n rootTags: RapiTag[];\n retailers: RapiRetailer[];\n\n [key: string]:\n | string\n | number\n | boolean\n | RapiRetailer[]\n | RapiTag[]\n | RapiMaterial[]\n | RapiComponent[]\n | RapiItem[]\n | RapiId[]\n | RapiTenant\n | LinksCollection\n | undefined;\n}\n\nexport interface RapiTenant extends RapiJson {\n name: string;\n label: string;\n defaultLanguage: string;\n active: boolean;\n showLanguageSwitch: boolean;\n branded: boolean;\n authenticationRequired: boolean;\n configuration: string;\n privacyUrl: string;\n\n catalogs: RapiCatalog[];\n users: RapiUser[];\n roles: RapiRole[];\n skin: RapiSkin[];\n plans: RapiPlan[];\n}\n\nexport interface RapiUser extends RapiJson {\n username: string;\n salutationCode: number;\n firstname: string;\n lastname: string;\n email: string;\n street: string;\n zipcode: string;\n city: string;\n countryCode: string;\n birthdate: string;\n phone: string;\n locale: string;\n registerDate: string;\n password: string;\n lastLogin: string;\n active: boolean;\n newsletter: boolean;\n emailValidated: string;\n termsChanged: boolean;\n providedConsentInTenant: boolean;\n priceLists: any;\n\n // Relationships\n tenants: RapiTenant[];\n roles: RapiRole[];\n catalogs: RapiCatalog[];\n plans: RapiPlan[];\n favorites: RapiFavorite[];\n setting: RapiUserSetting;\n}\n\nexport const enum RapiFavoriteType {\n ITEM = 1,\n CONFIG = 2,\n AFFILIATE = 3,\n}\n\nexport interface RapiFavorite extends RapiJson {\n objectId: string;\n type: RapiFavoriteType;\n created: string;\n user: RapiUser;\n}\n\nexport interface RapiUserSetting extends RapiJson {\n metric: boolean;\n measurements: boolean;\n area: boolean;\n furnitureSnap: boolean;\n\n user: RapiUser;\n}\n\nexport interface RapiRole extends RapiJson {\n // Data\n role: number;\n\n allowedModules: any;\n\n // Relationships\n tenantId: RapiTenant;\n userId: RapiUser;\n}\n\nexport interface RapiSkin extends RapiJson {\n accentColor: string;\n appIcon: string;\n backgroundImage: string;\n btnColorDark: string;\n btnColorLight: string;\n ciColor: string;\n dashboardBackground: string;\n loginBackground: string;\n dashboardLogo: string;\n fontColor: string;\n headerBackgroundColor: string;\n headerForegroundColor: string;\n logo: string;\n mailBackgroundColor: string;\n mailHeaderImage: string;\n planBackground: string;\n planLogo: string;\n splashScreenImage: string;\n tenantUrl: string;\n watermarkImage: string;\n brandedCatalogsIcon: string;\n planNote: string;\n inquiryImage: string;\n inquiryLink: string;\n hideMadeByRoomle: boolean;\n hidePressLink: boolean;\n hideShareButton: boolean;\n translationPath: string;\n hideFeedbackButton: boolean;\n referralUrl: string;\n hideCatalogOverview: boolean;\n // Relationships\n tenant: RapiTenant;\n catalogEntryTags: RapiTag;\n}\n\nexport interface RapiPlan extends RapiJson {\n name: string;\n description: string;\n changeDate: string;\n created: string;\n draftId: number | null; // THIS IS NOT USED BY THE BACKEND! USE DRAFT INSTEAD!!!!\n thumbnail: string;\n planObjects: string | null;\n active: boolean;\n right?: number;\n draft?: number;\n open: number;\n planDirectory: number;\n changed: number;\n version: number;\n floorLevel: number;\n //assets: array;\n visibility: number;\n\n // Relationships\n user: RapiUser | RapiId | null;\n tenant: RapiTenant | RapiId | null;\n assets: RapiPlanAsset[];\n parent: RapiPlan | RapiId | null;\n setting: RapiPlanSetting | null;\n}\n\nexport interface RapiPlanAsset extends RapiJson {\n image: string;\n}\n\nexport interface RapiPlanSetting extends RapiJson {\n metric: boolean;\n measurements: boolean;\n area: boolean;\n furnitureSnap: boolean;\n\n plan: RapiPlan;\n}\n\nexport type RapiPlanSnapshotId = `ps_${string}`;\nexport interface RapiPlanSnapshotPostData extends RapiJson {\n parentId: RapiId | null;\n planObjects: Array<{\n combinedId: RapiId;\n position: string;\n }>;\n plan: string;\n}\n\nexport interface RapiPlanSnapshotGetData extends RapiPlanSnapshotPostData {\n combinedIds: RapiId[];\n embedId: RapiId;\n perspectiveImage: string;\n topImage: string;\n}\n\n/* eslint-disable */\nexport interface RapiRetailer extends RapiJson {\n // NO ATTRS --> ask KUEGI how table looks\n}\n\n/* eslint:enable */\n\nexport interface RapiConfiguration extends RapiJson {\n id: RapiId;\n created: string;\n lastAccess: string;\n configuration: ConfigurationString;\n configurationHash: string;\n parts: string;\n perspectiveImage?: AssetUrl | null;\n topImage?: AssetUrl | null;\n rootComponentId: RapiId;\n orderable?: boolean;\n requestable?: boolean;\n width: number;\n height: number;\n depth: number;\n catalog?: RapiId;\n assets?: AssetItem;\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | LinksCollection\n | AssetItem\n | null\n | undefined;\n}\n\nexport interface RapiConfigurationEnhanced extends RapiConfiguration {\n label: string;\n}\n\nexport interface Element {\n id: string;\n label: string;\n perspectiveImage: AssetUrl;\n}\n\nexport interface RapiElement extends RapiJson, RoomleSortable, Element {\n id: RapiId;\n configuration?: ConfigurationString;\n externalIdentifier: string;\n tags: RapiId[];\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | RapiId[]\n | LinksCollection\n | AdditionalInfo[]\n | UiPossibleChild[]\n | AssetItem\n | undefined;\n}\nexport const CATALOG_INFOS_TYPES = {\n PARAMETER: 'parameter',\n PARAMETER_VALUE: 'paramValue',\n MATERIAL: 'material',\n COMPONENT: 'component',\n ITEM: 'item',\n} as const;\nexport interface AdditionalInfo {\n type: Enumify<typeof CATALOG_INFOS_TYPES>;\n key: string;\n parentIdFilter: string;\n catalog: string;\n tooltip: {\n [key: string]: string;\n };\n fullInfo: {\n type: string;\n url: {\n [key: string]: string;\n };\n };\n}\nexport interface RapiComponent extends RapiElement {\n active: boolean;\n additionalInfos: AdditionalInfo[];\n}\n\nexport interface Asset {\n format: string;\n url: string;\n}\n\nexport interface AssetItem {\n [key: string]: Asset;\n}\n\nexport interface RapiItem extends RapiElement {\n width: number;\n height: number;\n depth: number;\n basecolor: number;\n displayedWidth: number;\n displayedHeight: number;\n displayedDepth: number;\n perspectiveImageHD: AssetUrl;\n topImage: AssetUrl;\n threeDimensionalAssetWeb: AssetUrl;\n threeDimensionalAssetIOS: AssetUrl;\n threeDimensionalAsset: AssetUrl;\n flipable: boolean;\n scaleable: boolean;\n meta: string;\n hidden: boolean;\n link?: string;\n colorable: boolean;\n layer: number;\n language: string;\n type: string;\n detailType: string;\n currencySymbol?: string;\n customerPrice?: number;\n sort: number;\n orderable: boolean;\n requestable: boolean;\n catalog: RapiId;\n assets?: AssetItem;\n rootComponentId?: string;\n}\n\nexport const enum RAPI_ADDITIONAL_CONTENTS {\n UNKNOWN,\n LINK,\n TEXT,\n VIDEO,\n DOWNLOAD,\n IMAGE,\n SKETCH,\n}\n\nexport interface RapiAdditionalContent extends RapiJson {\n changed: string;\n content: string;\n created: string;\n itemId: RapiId;\n label: string;\n language: string;\n type: RAPI_ADDITIONAL_CONTENTS;\n}\n\nexport interface RapiTagGeneric extends RapiJson {\n label?: string;\n externalIdentifier: string;\n pngIcon?: AssetUrl;\n svgIcon?: AssetUrl;\n inspirationImage?: AssetUrl;\n global: boolean;\n sort?: number;\n created: string;\n updated: string;\n language: string;\n description?: string;\n\n // Relationships\n catalog: RapiId;\n tags: RapiId[];\n parents: RapiId[];\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | RapiId[]\n | RapiElement[]\n | RapiMaterial[]\n | LinksCollection\n | null\n | undefined;\n}\n\nexport interface RapiTag extends RapiTagGeneric {\n id: RapiId;\n items: RapiId[];\n materials: RapiId[];\n}\n\nexport interface RapiTagForUi extends RapiTagGeneric {\n materials: RapiMaterial[];\n items: RapiItem[];\n}\n\nexport interface RapiShortId {\n shortId: string;\n referencedId: string;\n url: string;\n type: number;\n created: string;\n lastAccess: string;\n\n [key: string]: string | number;\n}\n\nexport interface RapiPrice {\n priceId: PriceId;\n price: number;\n currencySymbol: string;\n}\n\nexport interface RapiConfiguratorSettings {\n id: string;\n tenant: number;\n allowedHosts: string;\n settings: InitDataDefinition;\n}\n\nexport interface UserAction {\n module: number;\n action: number;\n planId: RapiId;\n actionId: RapiId;\n actionValue: number;\n actionLabel: number;\n}\n\nexport const enum MAIL_TYPE {\n STANDARD = 1,\n AUGMENTED_REALITY = 2,\n SAVE_DRAFT = 3,\n PLANNER_SHARE = 13,\n}\n\nexport interface RapiAuth {\n token: string;\n lastActionDate: string;\n loginDate: string;\n userId: RapiId;\n}\n","import '../../../typings/global-definitions';\nimport type {\n RapiId,\n RapiItem,\n RapiJson,\n RapiMaterial,\n RapiTexture,\n} from '../../../typings/rapi-types';\nimport { RAPI_TEXTURE_TYPE } from '../../../typings/rapi-types';\nimport type {\n KernelFloorMaterial,\n KernelWallMaterial,\n} from '../../../typings/planner';\nimport type { BatchPaintMaterial } from '../../../planner-core/src/roomle-planner';\nimport { Color } from 'three';\nimport type { CameraParameter } from '../cameracontrol/camera-control';\n\nexport const enum CURSOR_STYLE {\n HOVER = 'pointer',\n DEFAULT = 'default',\n MOVE = 'move',\n DRAGGING = 'grabbing',\n ROTATE = 'ew-resize',\n NODE_HOVER = 'crosshair',\n // eslint-disable-next-line @typescript-eslint/quotes\n DRAW = \"url('https://res.cloudinary.com/roomle/image/upload/v1664957371/pencil_j5vkhm.svg') 3 20, auto\",\n // eslint-disable-next-line @typescript-eslint/quotes\n DRAW_FALLBACK = \"url('https://res.cloudinary.com/roomle/image/upload/v1664957371/pencil_j5vkhm.svg') 0 15, auto\",\n}\n\n/**\n * Colors can be set as hex value, eg 0x00ff00 or as official HTML color name: https://www.w3schools.com/colors/colors_names.asp\n */\nexport const ROOMLE_COLORS = {\n PRIMARY: 0xdb0000,\n ON_PRIMARY: 0xffffff,\n DEFAULT_BACKGROUND: 0xf7f7f7,\n SELECTION: 0xffffff,\n PREVIEW_DOCKING_COLOR: 0xfdddddd,\n} as const;\n\nexport const ROOMLE_HIGHLIGHTNG = {\n SMART: 'smart',\n OFF: 'off',\n ALWAYS: 'always',\n};\n\nexport const setCursor = (style: CURSOR_STYLE) => {\n // refactor into dom helper to be save in SDK\n document.body.style.cursor = style;\n};\n\nexport const handleJsonResponse = (response: Response): Promise<any> => {\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json();\n }\n throw new TypeError('No JSON returned');\n};\n\nexport const uuid = (a: string | null = null): string => {\n return a\n ? (\n parseInt(a, 10) ^\n ((Math.random() * 16) >> (parseInt(a, 10) / 4))\n ).toString(16)\n : ((1e7).toString() + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid);\n};\n\nexport const setEnumerable = (\n target: any,\n property: string,\n isEnumerable: boolean,\n) => {\n setDescriptor(target, property, { enumerable: isEnumerable });\n};\n\nexport const setWriteable = (\n target: any,\n property: string,\n isWritable: boolean,\n) => {\n setDescriptor(target, property, { writable: isWritable });\n};\n\nexport const setDescriptor = (\n target: any,\n property: string,\n options: PropertyDescriptor,\n) => {\n const descriptor = Object.getOwnPropertyDescriptor(target, property);\n if (!descriptor) {\n throw new Error(`Property \"${property}\" not found on target`);\n }\n for (const prop in options) {\n if (options.hasOwnProperty(prop)) {\n (descriptor as any)[prop] = (options as any)[prop]; // as any because there are no signature types defined in std.lib\n }\n }\n Object.defineProperty(target, property, descriptor);\n};\n\nexport const setPropertiesFromOptions = (\n target: any,\n options: any,\n writeable?: true,\n) => {\n if (!options) {\n return;\n }\n Object.keys(options).forEach((key) => {\n Object.defineProperty(target, key, {\n value: options[key],\n writable: writeable,\n });\n });\n};\n\nexport const createBenchmarkMaterial = (materialId: string): RapiMaterial => {\n const color = new Color(0.5, 0.5, 0.5);\n const hexColor = color.getHexString();\n const material: RapiMaterial = {\n id: materialId,\n name: materialId,\n externalIdentifier: 'test-identifier',\n group: 'test-group',\n groupLabel: 'test-group-label',\n color: '#' + hexColor,\n thumbnail: createBenchmarkUrl(materialId, 15),\n label: 'test-label',\n textures: [1, 2, 3],\n shading: {\n alpha: 1,\n metallic: 0.5,\n basecolor: {\n r: 0.5,\n g: 0.5,\n b: 0.5,\n },\n roughness: 0.5,\n doubleSided: false,\n alphaCutoff: 0.5,\n },\n active: true,\n tags: [],\n };\n\n return material;\n};\n\nexport const createBenchmarkTexture = (materialId: string): RapiTexture => {\n const parts = materialId.split('_');\n const size = parseInt(parts[1], 10);\n const texture = {\n mapping: RAPI_TEXTURE_TYPE.RGB,\n id: materialId,\n material: materialId,\n image: createBenchmarkUrl(materialId),\n url: createBenchmarkUrl(materialId),\n height: size,\n width: size,\n mmHeight: 1,\n mmWidth: 1,\n tileable: true,\n };\n\n return texture;\n};\n\nexport const createBenchmarkUrl = (\n materialId: string,\n size?: number,\n): string => {\n const parts = materialId.split('_');\n if (!size) {\n size = parseInt(parts[1], 10);\n }\n const uniqueId = Math.abs(parseFloat(parts[2]));\n const dummyUrl =\n 'https://loremflickr.com/' + size + '/' + size + '?lock=' + uniqueId;\n return dummyUrl;\n};\n\nexport const isString = (value: unknown): boolean => {\n return typeof value === 'string' || value instanceof String;\n};\n\nexport const objectArrayToMap = <K extends V[keyof V], V extends object>(\n arr: V[],\n key: keyof V,\n): Map<K, V> => {\n return arr.reduce((acc, data) => {\n if (typeof data !== 'object') {\n console.warn('objectArrayToMap only works for arrays of objects');\n return acc;\n }\n const mapKey = data[key];\n if (!mapKey) {\n console.warn(\n 'Object has no key \"' +\n key.toString() +\n '\" therefore we do not know where to put it',\n );\n return acc;\n }\n if (!acc.has(mapKey)) {\n acc.set(mapKey, data);\n }\n return acc;\n }, new Map());\n};\n\nexport const throttle = <T extends (...args: any[]) => any>(\n func: T,\n delay: number = 16,\n): ((...funcArgs: Parameters<T>) => void) => {\n let time: number;\n let called = false;\n let skippedCalls = 0;\n let trailingCall: NodeJS.Timeout | null = null;\n return function (this: T, ..._args: Parameters<T>): void {\n if (!time) {\n time = Date.now();\n }\n if (!called || time + delay - Date.now() < 0) {\n func.apply(this, [...arguments]);\n time = Date.now();\n called = true;\n } else {\n skippedCalls++;\n }\n if (!trailingCall) {\n trailingCall = setInterval(() => {\n if (skippedCalls) {\n func.apply(this, [...arguments]);\n }\n skippedCalls = 0;\n if (trailingCall !== null) {\n clearInterval(trailingCall);\n }\n trailingCall = null;\n }, delay);\n }\n };\n};\n\n/**\n * Calls the function only if there has been no call for x (param after) milliseconds\n * @param func\n * @param after\n */\nexport const callAgainAfter = <T extends (...args: any[]) => any>(\n func: T,\n after: number = 16,\n): ((...funcArgs: Parameters<T>) => void) => {\n let lastCall: number;\n let called = false;\n return function (this: T, ..._args: Parameters<T>): void {\n if (!called || lastCall + after - Date.now() < 0) {\n lastCall = Date.now();\n func.apply(this, [...arguments]);\n called = true;\n } else {\n lastCall = Date.now();\n }\n };\n};\n\nexport const debounce = <Params extends any[]>(\n func: (...args: Params) => any,\n timeout: number,\n): ((...args: Params) => void) => {\n let timer: NodeJS.Timeout;\n return (...args: Params) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func(...args);\n }, timeout);\n };\n};\n\n/**\n * A generic type for a function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `delay`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked with the same key. The debounced function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them.\n *\n * T The type of the function to debounce.\n * @param {T} func The function to debounce.\n * @param {number} delay The number of milliseconds to delay.\n * @param {(...args: Parameters<T>) => unknown} [keyResolver]\n * Optional. A function to resolve the key from the arguments.\n * Defaults to using the first argument as the key.\n * @returns {((...args: Parameters<T>) => void)} The new debounced function.\n */\nexport const debounceByKey = <T extends AnyFunction>(\n func: T,\n delay: number,\n keyResolver?: (...args: Parameters<T>) => unknown,\n) => {\n // 1. Use a Map to store timers, keyed by your object or resolved key.\n // The key can be of any type, and the value is the timer ID from setTimeout.\n const timers = new Map<unknown, ReturnType<typeof setTimeout>>();\n\n // 2. The default resolver just uses the first argument as the key.\n const resolver = keyResolver || ((...args: Parameters<T>) => args[0]);\n\n // 3. Return the new debounced function.\n // It accepts the same parameters as the original function.\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): void {\n // 4. Capture the 'this' context from the call.\n const context = this;\n\n // 5. Get the unique key for this specific call (e.g., the object itself).\n const key = resolver.apply(context, args);\n\n // 6. Check for an existing timer *for this specific key*.\n const existingTimer = timers.get(key);\n\n // 7. If a timer already exists for this key, clear it.\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // 8. Set a new timer.\n const newTimer = setTimeout(() => {\n // 9. When the timer finally fires, call the original function\n // with the saved context and arguments from the *last* call.\n func.apply(context, args);\n\n // 10. Clean up the map to prevent memory leaks for this key.\n timers.delete(key);\n }, delay);\n\n // 11. Store the new timer ID, associated with its key.\n timers.set(key, newTimer);\n };\n};\n\n/**\n * Interface for storing a single promise's resolve and reject handlers.\n */\ninterface PromiseHandlers<T extends AnyFunction> {\n resolve: (value: ReturnType<T> | PromiseLike<ReturnType<T>>) => void;\n reject: (reason?: any) => void;\n}\n\n/**\n * Interface for storing timer details along with promise handlers for a given key.\n */\ninterface TimerDetails<T extends AnyFunction> {\n timer: ReturnType<typeof setTimeout>;\n handlers: Array<PromiseHandlers<T>>;\n}\n\n/**\n * Creates a debounced function that delays invoking `func` until after `delay`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked with the same key. All calls made with the same key during the\n * delay period will have their returned promises resolved with the result\n * of the single final invocation.\n *\n * T The type of the function to debounce.\n * @param {T} func The function to debounce. This function can be synchronous or asynchronous.\n * @param {number} delay The number of milliseconds to delay.\n * @param {(...args: Parameters<T>) => unknown} [keyResolver]\n * Optional. A function to resolve the key from the arguments.\n * Defaults to using the first argument as the key.\n * @returns {((...args: Parameters<T>) => Promise<ReturnType<T>>)} The new debounced function.\n */\nexport const debounceByKeyAsync = <T extends AnyFunction>(\n func: T,\n delay: number,\n keyResolver?: (...args: Parameters<T>) => unknown,\n) => {\n // 1. Use a Map to store timers and promise handlers, keyed by the resolved key.\n const timers = new Map<unknown, TimerDetails<T>>();\n\n // 2. The default resolver uses the first argument as the key.\n const resolver = keyResolver || ((...args: Parameters<T>) => args[0]);\n\n // 3. Return the new promise-based debounced function.\n return function (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n ): Promise<ReturnType<T>> {\n const context = this;\n const key = resolver.apply(context, args);\n\n return new Promise((resolve, reject) => {\n // 4. Check for existing timer details for this specific key.\n const existingTimerDetails = timers.get(key);\n\n // 5. If a timer already exists, clear it.\n if (existingTimerDetails) {\n clearTimeout(existingTimerDetails.timer);\n }\n\n // 6. Get the list of promise handlers, or create a new one.\n const handlers = existingTimerDetails?.handlers || [];\n handlers.push({ resolve, reject }); // Add the current promise's handlers.\n\n // 7. Set a new timer.\n const newTimer = setTimeout(() => {\n // When the timer fires, execute the original function.\n // Using Promise.resolve().then() correctly handles both sync and async functions.\n Promise.resolve(func.apply(context, args))\n .then((result) => {\n // On success, resolve ALL promises for this key with the same result.\n handlers.forEach((handler) => handler.resolve(result));\n })\n .catch((error) => {\n // On failure, reject ALL promises for this key with the same error.\n handlers.forEach((handler) => handler.reject(error));\n })\n .finally(() => {\n // 9. Clean up the map to prevent memory leaks for this key.\n timers.delete(key);\n });\n }, delay);\n\n // 10. Store the new timer and the (potentially updated) list of handlers.\n timers.set(key, { timer: newTimer, handlers });\n });\n };\n};\n\nexport const wait = async (delay: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, delay));\n\nexport const nextTick = async (): Promise<void> => wait(0);\n\nexport const roundWithPrecision = (float: number, precision: number) => {\n if (precision === -1) {\n return float;\n }\n const factor = Math.pow(10, precision);\n return Math.round(float * factor) / factor;\n};\n\nconst LEGACY_ASSET_URL_REG_EX = new RegExp(/\\/3d\\/[0-9]+\\//);\n\nexport const getGlbUrl = (item: RapiItem): string | null => {\n // use glb asset without ktx textures as default\n // glb2 used ktx textures\n if (item.assets?.glb?.url) {\n return item.assets.glb.url;\n }\n if (item.threeDimensionalAsset) {\n return item.threeDimensionalAsset;\n }\n const assetUrl = item.threeDimensionalAssetWeb;\n if (!assetUrl || typeof assetUrl !== 'string') {\n // Maybe we should introduce Nullable so we can turn on\n // strict null checks for SDK? But that's probably\n // a separate user story\n return null;\n }\n return !assetUrl.match(LEGACY_ASSET_URL_REG_EX)\n ? assetUrl\n : assetUrl\n .replace(LEGACY_ASSET_URL_REG_EX, '/3d/glb/')\n .replace('.flash.u3d', '.glb');\n};\n\n/**\n * Recursively merge properties of two objects.\n * If a property exists in both, property of obj2 is used\n * @param obj1\n * @param obj2\n */\nexport const deepMerge = (obj1: any, obj2: any): any => {\n for (const p in obj2) {\n try {\n // Property in destination object set; update its value.\n if (obj2[p].constructor === Object) {\n obj1[p] = deepMerge(obj1[p], obj2[p]);\n } else {\n obj1[p] = obj2[p];\n }\n } catch (_e) {\n // Property in destination object not set; create it and set its value.\n obj1[p] = obj2[p];\n }\n }\n return obj1;\n};\n\nexport const getValue = (value: any, defaultValue: any): any => {\n if (value === undefined) {\n return defaultValue;\n }\n return value;\n};\n\nexport const removeItem = (arr: any[], element: any) => {\n const index = arr.indexOf(element);\n if (index > -1) {\n arr.splice(index, 1);\n }\n};\n\nexport type ValuesFromObject<T> = T[keyof T];\n\nexport type MaybePromise<T> = (() => T) | (() => Promise<T>);\n\nexport const copy = <T>(object: T): T => {\n if (!object) {\n return object;\n }\n return JSON.parse(JSON.stringify(object));\n};\n\nexport const isWebGl2 = (): boolean => {\n const canvas = document.createElement('canvas');\n if (\n !canvas ||\n !canvas.getContext ||\n typeof canvas.getContext !== 'function'\n ) {\n return false;\n }\n try {\n return canvas ? !!canvas.getContext('webgl2') : false;\n } catch (_e) {\n return false;\n }\n};\n\n/**\n * Creates a proxy around that class that logs all calls to it\n * @param obj the class to trace\n * @param name the tag under which it will be logged\n */\nexport const traceMethodCalls = (obj: object, name: string) => {\n const handler = {\n get(target: any, propKey: any, receiver: any) {\n const targetValue = Reflect.get(target, propKey, receiver);\n if (typeof targetValue === 'function') {\n return function (...args: any) {\n console.trace(name, propKey, args);\n // @ts-ignore -- helper for better debugging, TS does not know what we are doing\n return targetValue.apply(this, args); // (A)\n };\n } else {\n return targetValue;\n }\n },\n };\n return new Proxy(obj, handler);\n};\n\n/**\n * Creates a proxy around that class that can be used to track property access\n * @param obj the class to track\n * @param name the tag under which it will be logged\n */\nexport const trackPropertyAccess = (obj: object, _name: string) => {\n const handler = {\n get(target: any, propKey: any, _receiver: any) {\n return target[propKey];\n },\n set(target: any, propKey: any, value: any, _receiver: any) {\n target[propKey] = value;\n return true;\n },\n };\n return new Proxy(obj, handler);\n};\n\nexport const getColor = (value: string | number | Color): Color => {\n if (isThreeJsColor(value)) {\n return value;\n }\n if (typeof value === 'string' && (isHex(value) || isOnlyNumbers(value))) {\n return new Color(Number(value));\n } else {\n return new Color(value);\n }\n};\n\nexport const isThreeJsColor = (value: any): value is Color => {\n return value instanceof Color;\n};\n\nexport const isHex = (num: string) => {\n return Boolean(num.match(/^0x[0-9a-f]+$/i));\n};\n\nexport const isOnlyNumbers = (num: string) => {\n return Boolean(num.match(/^[0-9]+$/i));\n};\n\nexport const parseColorToHexDecimal = (color: string) =>\n !color ? -1 : Number('0x' + color.substring(1));\n\n/**\n * Copies the properties of an incoming material to a kernel material, used mainly\n * to avoid copying core data when applying a material to a planObject\n * @param materialPtr Kernel material pointer to apply properties to\n * @param material material to copy color properties from\n */\nexport const applyMaterialToKernelMaterial = (\n materialPtr: KernelWallMaterial | KernelFloorMaterial,\n material: BatchPaintMaterial,\n): KernelWallMaterial | KernelFloorMaterial => {\n if (material.materialId) {\n materialPtr.materialId = material.materialId;\n } else if (material.color) {\n // Material is a hex string, so we convert it to a rgb value.\n materialPtr.rgbValue = parseColorToHexDecimal(material.color);\n } else if (material.rgbValue) {\n materialPtr.rgbValue = material.rgbValue;\n } else if (material.catalogItemId !== undefined) {\n materialPtr.catalogItemId = material.catalogItemId;\n } else if (material.id) {\n materialPtr.materialId = material.id;\n } else {\n console.warn(\n 'Can not set material because neither a texture nor a RGB value was found',\n );\n }\n return materialPtr;\n};\n\nexport const download = (filename: string, content: string): void => {\n const element = document.createElement('a');\n element.setAttribute('href', content);\n element.setAttribute('download', filename);\n\n element.style.display = 'none';\n document.body.appendChild(element);\n\n element.click();\n\n document.body.removeChild(element);\n};\n\nexport const areCameraParametersEqual = (\n start: CameraParameter,\n end: CameraParameter,\n): boolean => {\n if (!start || !end) {\n return false;\n }\n if (\n start.targetX === undefined ||\n end.targetX === undefined ||\n Math.abs(start.targetX - end.targetX) > 0.01\n ) {\n return false;\n }\n if (\n start.targetY === undefined ||\n end.targetY === undefined ||\n Math.abs(start.targetY - end.targetY) > 0.01\n ) {\n return false;\n }\n if (\n start.targetZ === undefined ||\n end.targetZ === undefined ||\n Math.abs(start.targetZ - end.targetZ) > 0.01\n ) {\n return false;\n }\n if (\n start.yaw === undefined ||\n end.yaw === undefined ||\n Math.abs(start.yaw - end.yaw) > 0.01\n ) {\n return false;\n }\n if (\n start.distance === undefined ||\n end.distance === undefined ||\n Math.abs(start.distance - end.distance) > 0.01\n ) {\n return false;\n }\n return true;\n};\n\n/**\n * transforms a value from one range (oldMin, oldMax) to a new range (newMin, newMax)\n * @param value the value to transform\n * @param oldMin\n * @param oldMax\n * @param newMin\n * @param newMax\n * @returns the transformed value\n */\nexport const transformRange = (\n value: number,\n oldMin: number,\n oldMax: number,\n newMin: number,\n newMax: number,\n): number => {\n return ((value - oldMin) * (newMax - newMin)) / (oldMax - oldMin) + newMin;\n};\n\nexport const hashCode = (value: string): number => {\n let hash = 0;\n if (value.length === 0) {\n return hash;\n }\n for (let i = 0; i < value.length; i++) {\n const chr = value.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n};\n\nexport const rearrangeArrayByIdOrder = <T extends RapiJson>(\n idsInOrder: RapiId[],\n rapiJson: T[],\n idKey: string = 'id',\n): T[] => {\n const indexMap = new Map<RapiId, number>();\n const length = idsInOrder.length;\n for (let i = 0; i < length; i++) {\n indexMap.set(idsInOrder[i], i);\n }\n\n const sortedResult = new Array<T>(length);\n\n // Place each element from the result array at its corresponding index in sortedResult\n const rapiJsonLength = rapiJson.length;\n for (let j = 0; j < rapiJsonLength; j++) {\n const entry = rapiJson[j];\n const id = entry[idKey];\n const index = indexMap.get(id as RapiId);\n if (index !== undefined) {\n sortedResult[index] = entry;\n } else {\n sortedResult.push(entry);\n }\n }\n\n return sortedResult.filter((element) => element !== undefined);\n};\n\nexport const promiseWithResolvers = <T>() => {\n let resolve!: (value: T) => void;\n let reject!: (reason?: any) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n};\n\nexport const clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value));\n};\n\nexport const randomString = (length: number = 8): string => {\n return [...Array(length)]\n .map(() => Math.random().toString(36).charAt(2))\n .join('');\n};\n\nexport const deepCopy = <T>(obj: T): T => {\n return JSON.parse(JSON.stringify(obj));\n};\n\nexport const isRecord = (value: any): value is Record<string, any> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\nexport const getIdQueryParam = (urlString: string): string | null => {\n try {\n const url = new URL(urlString);\n const params = new URLSearchParams(url.search);\n return params.get('id');\n } catch (_error) {\n return null; // Return null if URL is invalid or 'id' param is not found\n }\n};\n\nexport const isCtrlOrCmd = (event: KeyboardEvent) =>\n event.key === 'Meta' || event.key === 'Control';\n\nexport const ctrlOrCmd = (\n event: KeyboardEvent,\n checkIfItIsTheOnlyKey: boolean = false,\n) => {\n const isMultiSelectKey =\n checkIfItIsTheOnlyKey === false\n ? checkIfItIsTheOnlyKey\n : isCtrlOrCmd(event);\n return event.key && (event.metaKey || event.ctrlKey || isMultiSelectKey);\n};\n\nexport const runIfNotEmpty = <T extends any[]>(\n ids: string[],\n executor: () => Promise<T>,\n): Promise<T> => {\n if (!ids || ids.length === 0) {\n return Promise.resolve([] as unknown as T);\n }\n return executor();\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"component-raycast-helper-C6ptEb0K.mjs","names":[],"sources":["../../packages/configurator-core/src/utils/component-raycast-helper.ts"],"sourcesContent":["import { type RoomleComponent } from '../../../common-core/src/webgl/roomle-component-factory';\nimport type ConfiguratorSceneEventHandler from '../webgl/configurator-scene-event-handler';\nimport type ConfiguratorViewModel from '../../../common-core/src/view-model/configurator-view-model';\nimport { throttle } from '../../../common-core/src/utils/common-utils';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport { transitionTransparencyOfMaterial } from '../../../common-core/src/utils/threejs-utils';\nimport type { Object3D, PerspectiveCamera } from 'three';\nimport {\n Box3,\n Frustum,\n Matrix4,\n Mesh,\n MeshStandardMaterial,\n Raycaster,\n Vector3,\n} from 'three';\n\nexport default class ComponentRaycastHelper {\n private _object: Object3D;\n private _camera: PerspectiveCamera;\n private _raycaster: Raycaster;\n\n private _nonTransparentComponent: RoomleComponent | null = null;\n\n constructor() {\n this._raycaster = new Raycaster();\n this._raycaster.near = 0.1;\n this._raycaster.layers.enable(LAYER.OBJECT);\n this._raycaster.layers.enable(LAYER.COMPONENT);\n this._raycaster.layers.enable(LAYER.PREVIEW);\n this._raycaster.layers.enable(LAYER.UI);\n }\n\n public init(object: Object3D, camera: PerspectiveCamera) {\n this._object = object;\n this._camera = camera;\n\n this.checkComponentVisibility = throttle(\n this.checkComponentVisibility,\n 100,\n ).bind(this);\n this.checkPreviewVisibility = throttle(\n this.checkPreviewVisibility,\n 100,\n ).bind(this);\n }\n\n public setCamera(camera: PerspectiveCamera) {\n this._camera = camera;\n }\n\n public setObject(object: Object3D) {\n this._object = object;\n }\n\n public changeMaterialsOnSelect(\n object: Object3D,\n component: RoomleComponent | null,\n selected: boolean = false,\n callback?: () => void,\n ) {\n if (component === this._nonTransparentComponent) {\n return;\n }\n this._nonTransparentComponent = component;\n this._changeMaterialsOnSelect(object, component, selected, callback);\n }\n\n private _changeMaterialsOnSelect(\n object: Object3D,\n component: RoomleComponent | null,\n selected: boolean = false,\n callback?: () => void,\n ) {\n if (object.children.length > 0) {\n for (const child of object.children) {\n const selectChild =\n (component && object.id === component.id) || selected;\n const isComponent = !(child instanceof Mesh);\n if (!child.userData.ignoreComponentRaycast) {\n this._changeMaterialsOnSelect(\n child,\n component,\n selectChild && isComponent ? false : selectChild,\n callback,\n );\n }\n }\n }\n if (component) {\n if (\n object instanceof Mesh &&\n object.material instanceof MeshStandardMaterial &&\n !object.userData.oldMaterial\n ) {\n object.userData.oldMaterial = object.material;\n object.material = object.material.clone();\n if (!selected) {\n transitionTransparencyOfMaterial(object, {\n opacity: 0.2,\n transparent: true,\n }).then(() => {\n callback?.();\n });\n }\n }\n } else if (object.userData.oldMaterial) {\n if (\n object instanceof Mesh &&\n object.material instanceof MeshStandardMaterial\n ) {\n const { opacity, transparent } = object.userData.oldMaterial;\n transitionTransparencyOfMaterial(object, { opacity, transparent }).then(\n () => callback?.(),\n );\n object.userData.oldMaterial = undefined;\n }\n }\n }\n\n public isComponentVisible(component: RoomleComponent): boolean {\n const uuids: string[] = [];\n component.traverse((object) => uuids.push(object.uuid));\n const position = new Box3()\n .setFromObject(component)\n .getCenter(new Vector3());\n const direction = new Vector3()\n .subVectors(position, this._camera.position)\n .normalize();\n this._raycaster.set(this._camera.position, direction);\n this._raycaster.far = this._camera.position.distanceTo(position);\n const visibleIntersections = this._raycaster\n .intersectObjects(this._object.children, true)\n .filter((i) => {\n // do not include invisible materials\n if (!(i.object as any).material.visible) {\n return false;\n }\n // do not include the object itself\n if (uuids.includes(i.object.uuid)) {\n return false;\n }\n // do not include objects which explicitly have the ignoreComponentRaycast flag\n if ((i.object as any).userData.ignoreComponentRaycast) {\n return false;\n }\n return true;\n });\n return visibleIntersections.length === 0;\n }\n\n public checkComponentAndPreviewVisibility(\n sceneEventHandler: ConfiguratorSceneEventHandler,\n configuratorViewModel: ConfiguratorViewModel,\n ) {\n if (sceneEventHandler.hasSelection()) {\n this.checkComponentVisibility(sceneEventHandler, configuratorViewModel);\n } else if (configuratorViewModel.hasPreviews()) {\n this.checkPreviewVisibility(configuratorViewModel);\n } else {\n this.changeMaterialsOnSelect(this._object, null);\n }\n }\n\n public checkComponentVisibility(\n sceneEventHandler: ConfiguratorSceneEventHandler,\n configuratorViewModel: ConfiguratorViewModel,\n ) {\n if (!sceneEventHandler.hasSelection()) {\n return;\n }\n const selectedComponents = configuratorViewModel.getComponentsForIds(\n sceneEventHandler.getSelectedRuntimeComponentIds(),\n );\n if (selectedComponents.length > 1) {\n return;\n }\n const selectedComponent = selectedComponents[0];\n if (this.isComponentVisible(selectedComponent)) {\n this.changeMaterialsOnSelect(this._object, null);\n } else {\n this.changeMaterialsOnSelect(this._object, selectedComponent);\n }\n }\n\n public areAllPreviewsVisible(\n configuratorViewModel: ConfiguratorViewModel,\n ): boolean {\n if (!configuratorViewModel.hasPreviews()) {\n return true;\n }\n const previews = configuratorViewModel.getPreviews();\n if (previews.length === 0) {\n return true;\n }\n return previews\n .map((preview) => this.isComponentVisible(preview))\n .reduce(\n (arePreviewsVisible, isPreviewVisible) =>\n arePreviewsVisible && isPreviewVisible,\n );\n }\n\n public areAllComponentsInFrustum(previews: RoomleComponent[]): boolean {\n if (previews.length === 0) {\n return true;\n }\n const frustum = new Frustum();\n const matrix = new Matrix4().multiplyMatrices(\n this._camera.projectionMatrix,\n this._camera.matrixWorldInverse,\n );\n const box3 = new Box3();\n frustum.setFromProjectionMatrix(matrix);\n const isComponentInFrustum = (component: RoomleComponent) => {\n const position = box3.setFromObject(component).getCenter(new Vector3());\n return frustum.containsPoint(position);\n };\n return previews\n .map((preview) => isComponentInFrustum(preview))\n .reduce(\n (arePreviewsVisible, isPreviewVisible) =>\n arePreviewsVisible && isPreviewVisible,\n );\n }\n\n public checkPreviewVisibility(configuratorViewModel: ConfiguratorViewModel) {\n if (configuratorViewModel.hasPreviewLines()) {\n return;\n }\n const allPreviewsVisible = this.areAllPreviewsVisible(\n configuratorViewModel,\n );\n if (!allPreviewsVisible) {\n this.changeMaterialsOnSelect(this._object, { id: -1 } as RoomleComponent);\n } else {\n this.changeMaterialsOnSelect(this._object, null);\n }\n }\n\n public isComponentMeasurementLabelOccluded(\n labelWorldPos: Vector3,\n component: RoomleComponent,\n ): boolean {\n const direction = new Vector3()\n .subVectors(labelWorldPos, this._camera.position)\n .normalize();\n const distance = this._camera.position.distanceTo(labelWorldPos);\n\n this._raycaster.set(this._camera.position, direction);\n this._raycaster.far = distance - 0.01;\n\n const intersections = this._raycaster.intersectObject(component, true);\n\n const occludingIntersections = intersections.filter((intersection) => {\n const obj = intersection.object as any;\n\n if (\n obj.type !== 'Mesh' ||\n obj.userData.ignoreComponentRaycast ||\n (obj.material && !obj.material.visible)\n ) {\n return false;\n }\n\n return true;\n });\n\n return occludingIntersections.length > 0;\n }\n\n public checkMultipleLabelOcclusion(\n labelPositions: Array<{ id: string; worldPos: Vector3 }>,\n component: RoomleComponent,\n ): Set<string> {\n const occludedLabelIds = new Set<string>();\n\n labelPositions.forEach(({ id, worldPos }) => {\n if (this.isComponentMeasurementLabelOccluded(worldPos, component)) {\n occludedLabelIds.add(id);\n }\n });\n\n return occludedLabelIds;\n }\n}\n"],"mappings":";;;;;AAiBA,IAAqB,IAArB,MAA4C;CAO1C,cAAc;AAMZ,kCARyD,MAGzD,KAAK,aAAa,IAAI,GAAW,EACjC,KAAK,WAAW,OAAO,IACvB,KAAK,WAAW,OAAO,OAAO,EAAM,OAAO,EAC3C,KAAK,WAAW,OAAO,OAAO,EAAM,UAAU,EAC9C,KAAK,WAAW,OAAO,OAAO,EAAM,QAAQ,EAC5C,KAAK,WAAW,OAAO,OAAO,EAAM,GAAG;;CAGzC,KAAY,GAAkB,GAA2B;AAQvD,EAPA,KAAK,UAAU,GACf,KAAK,UAAU,GAEf,KAAK,2BAA2B,EAC9B,KAAK,0BACL,IACD,CAAC,KAAK,KAAK,EACZ,KAAK,yBAAyB,EAC5B,KAAK,wBACL,IACD,CAAC,KAAK,KAAK;;CAGd,UAAiB,GAA2B;AAC1C,OAAK,UAAU;;CAGjB,UAAiB,GAAkB;AACjC,OAAK,UAAU;;CAGjB,wBACE,GACA,GACA,IAAoB,IACpB,GACA;AACI,QAAc,KAAK,6BAGvB,KAAK,2BAA2B,GAChC,KAAK,yBAAyB,GAAQ,GAAW,GAAU,EAAS;;CAGtE,yBACE,GACA,GACA,IAAoB,IACpB,GACA;AACA,MAAI,EAAO,SAAS,SAAS,EAC3B,MAAK,IAAM,KAAS,EAAO,UAAU;GACnC,IAAM,IACH,KAAa,EAAO,OAAO,EAAU,MAAO,GACzC,IAAc,EAAE,aAAiB;AACvC,GAAK,EAAM,SAAS,0BAClB,KAAK,yBACH,GACA,GACA,KAAe,IAAc,KAAQ,GACrC,EACD;;AAIP,MAAI,GAEA,aAAkB,KAClB,EAAO,oBAAoB,KAC3B,CAAC,EAAO,SAAS,gBAEjB,EAAO,SAAS,cAAc,EAAO,UACrC,EAAO,WAAW,EAAO,SAAS,OAAO,EACpC,KACH,EAAiC,GAAQ;GACvC,SAAS;GACT,aAAa;GACd,CAAC,CAAC,WAAW;AACZ,QAAY;IACZ;WAGG,EAAO,SAAS,eAEvB,aAAkB,KAClB,EAAO,oBAAoB,GAC3B;GACA,IAAM,EAAE,YAAS,mBAAgB,EAAO,SAAS;AAIjD,GAHA,EAAiC,GAAQ;IAAE;IAAS;IAAa,CAAC,CAAC,WAC3D,KAAY,CACnB,EACD,EAAO,SAAS,cAAc,KAAA;;;CAKpC,mBAA0B,GAAqC;EAC7D,IAAM,IAAkB,EAAE;AAC1B,IAAU,UAAU,MAAW,EAAM,KAAK,EAAO,KAAK,CAAC;EACvD,IAAM,IAAW,IAAI,GAAM,CACxB,cAAc,EAAU,CACxB,UAAU,IAAI,GAAS,CAAC,EACrB,IAAY,IAAI,GAAS,CAC5B,WAAW,GAAU,KAAK,QAAQ,SAAS,CAC3C,WAAW;AAoBd,SAnBA,KAAK,WAAW,IAAI,KAAK,QAAQ,UAAU,EAAU,EACrD,KAAK,WAAW,MAAM,KAAK,QAAQ,SAAS,WAAW,EAAS,EACnC,KAAK,WAC/B,iBAAiB,KAAK,QAAQ,UAAU,GAAK,CAC7C,QAAQ,MAUP,EARI,CAAE,EAAE,OAAe,SAAS,WAI5B,EAAM,SAAS,EAAE,OAAO,KAAK,IAI5B,EAAE,OAAe,SAAS,wBAI/B,CACwB,WAAW;;CAGzC,mCACE,GACA,GACA;AACA,EAAI,EAAkB,cAAc,GAClC,KAAK,yBAAyB,GAAmB,EAAsB,GAC9D,EAAsB,aAAa,GAC5C,KAAK,uBAAuB,EAAsB,GAElD,KAAK,wBAAwB,KAAK,SAAS,KAAK;;CAIpD,yBACE,GACA,GACA;AACA,MAAI,CAAC,EAAkB,cAAc,CACnC;EAEF,IAAM,IAAqB,EAAsB,oBAC/C,EAAkB,gCAAgC,CACnD;AACD,MAAI,EAAmB,SAAS,EAC9B;EAEF,IAAM,IAAoB,EAAmB;AAC7C,EAAI,KAAK,mBAAmB,EAAkB,GAC5C,KAAK,wBAAwB,KAAK,SAAS,KAAK,GAEhD,KAAK,wBAAwB,KAAK,SAAS,EAAkB;;CAIjE,sBACE,GACS;AACT,MAAI,CAAC,EAAsB,aAAa,CACtC,QAAO;EAET,IAAM,IAAW,EAAsB,aAAa;AAIpD,SAHI,EAAS,WAAW,IACf,KAEF,EACJ,KAAK,MAAY,KAAK,mBAAmB,EAAQ,CAAC,CAClD,QACE,GAAoB,MACnB,KAAsB,EACzB;;CAGL,0BAAiC,GAAsC;AACrE,MAAI,EAAS,WAAW,EACtB,QAAO;EAET,IAAM,IAAU,IAAI,GAAS,EACvB,IAAS,IAAI,GAAS,CAAC,iBAC3B,KAAK,QAAQ,kBACb,KAAK,QAAQ,mBACd,EACK,IAAO,IAAI,GAAM;AACvB,IAAQ,wBAAwB,EAAO;EACvC,IAAM,KAAwB,MAA+B;GAC3D,IAAM,IAAW,EAAK,cAAc,EAAU,CAAC,UAAU,IAAI,GAAS,CAAC;AACvE,UAAO,EAAQ,cAAc,EAAS;;AAExC,SAAO,EACJ,KAAK,MAAY,EAAqB,EAAQ,CAAC,CAC/C,QACE,GAAoB,MACnB,KAAsB,EACzB;;CAGL,uBAA8B,GAA8C;AACtE,IAAsB,iBAAiB,KAGhB,KAAK,sBAC9B,EACD,GAIC,KAAK,wBAAwB,KAAK,SAAS,KAAK,GAFhD,KAAK,wBAAwB,KAAK,SAAS,EAAE,IAAI,IAAI,CAAoB;;CAM7E,oCACE,GACA,GACS;EACT,IAAM,IAAY,IAAI,GAAS,CAC5B,WAAW,GAAe,KAAK,QAAQ,SAAS,CAChD,WAAW,EACR,IAAW,KAAK,QAAQ,SAAS,WAAW,EAAc;AAqBhE,SAnBA,KAAK,WAAW,IAAI,KAAK,QAAQ,UAAU,EAAU,EACrD,KAAK,WAAW,MAAM,IAAW,KAEX,KAAK,WAAW,gBAAgB,GAAW,GAAK,CAEzB,QAAQ,MAAiB;GACpE,IAAM,IAAM,EAAa;AAUzB,UARA,EACE,EAAI,SAAS,UACb,EAAI,SAAS,0BACZ,EAAI,YAAY,CAAC,EAAI,SAAS;IAMjC,CAE4B,SAAS;;CAGzC,4BACE,GACA,GACa;EACb,IAAM,oBAAmB,IAAI,KAAa;AAQ1C,SANA,EAAe,SAAS,EAAE,OAAI,kBAAe;AAC3C,GAAI,KAAK,oCAAoC,GAAU,EAAU,IAC/D,EAAiB,IAAI,EAAG;IAE1B,EAEK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glb-viewer-Cs3i0yb8.mjs","names":[],"sources":["../../packages/glb-viewer-core/src/camera-control/adjustable-camera-control-3d.ts","../../packages/glb-viewer-core/src/webgl/glb-viewer-light-setting.ts","../../packages/glb-viewer-core/src/webgl/glb-viewer-scene-manager.ts","../../packages/glb-viewer-core/src/services/glb-render-worker.ts","../../../../node_modules/jszip/dist/jszip.min.js?no-inline?url","../../packages/glb-viewer-core/src/roomle-glb-viewer.ts","../../packages/glb-viewer-core/src/input/glb-input-manager.ts","../../packages/glb-viewer-core/src/utils/injectables.ts","../../packages/glb-viewer-core/src/glb-viewer.ts"],"sourcesContent":["import CameraControl3D from '../../../common-core/src/cameracontrol/camera-control-3d';\nimport { Box3, Euler, Quaternion, Vector3 } from 'three';\n\nexport default class AdjustableCameraControl3D extends CameraControl3D {\n public shouldIgnoreStandardBehavior = false;\n\n public adjust(\n bounds: Vector3,\n position: Vector3,\n\n yaw: number,\n pitch: number,\n _fov: number,\n ) {\n let minVector: Vector3 = new Vector3(-bounds.x / 2, 0, -bounds.z / 2);\n let maxVector: Vector3 = new Vector3(bounds.x / 2, bounds.y, bounds.z / 2);\n this._boundingBox = new Box3(minVector, maxVector);\n\n // before applying attis pitch value with have to rotate down, because we assume that attis rotation is upwards\n let euler = new Euler(-Math.PI / 2 + pitch, yaw, 0, 'ZYX');\n let quaternion = new Quaternion().setFromEuler(euler);\n\n this._camera.updateProjectionMatrix();\n\n this._camera.quaternion.copy(quaternion);\n this._camera.position.copy(position);\n }\n\n protected _update(overrideTarget?: Vector3) {\n if (!this.shouldIgnoreStandardBehavior) {\n super._update(overrideTarget);\n } else {\n this._saveYawAndPitch();\n }\n }\n\n public animateCamera(delta: number): boolean {\n if (!this.shouldIgnoreStandardBehavior) {\n return super.animateCamera(delta);\n } else {\n return true;\n }\n }\n}\n","import LightSetting from '../../../common-core/src/lightsetting/light-setting';\nimport { getGUI } from '../../../common-core/src/utils/threejs-utils';\nimport type { ColorRepresentation, Scene } from 'three';\nimport { AmbientLight, Color } from 'three';\n\nexport default class GLBViewerLightSetting extends LightSetting {\n private _ambientLight: AmbientLight;\n\n private _params = {\n ambientLight: {\n color: '#ffffff',\n },\n };\n\n constructor(scene: Scene, oldLightSetting?: LightSetting) {\n super(scene, oldLightSetting);\n\n this._ambientLight = new AmbientLight(\n new Color(this._params.ambientLight.color as ColorRepresentation),\n 0.5,\n );\n\n this.addToScene();\n }\n\n public addToScene(): void {\n this._scene.add(this._ambientLight);\n }\n\n public removeFromScene(): void {\n this._scene.remove(this._ambientLight);\n }\n\n public reload(): void {\n this.removeFromScene();\n this.addToScene();\n }\n\n public showGUI(): void {\n let gui = getGUI();\n if (!gui) {\n return;\n }\n if (this._ambientLight) {\n let ambiLight = gui.addFolder('Ambient Light');\n ambiLight.add<any>(this._ambientLight, 'visible');\n ambiLight\n .add<any>(this._ambientLight, 'intensity')\n .min(0)\n .max(5)\n .step(0.1);\n ambiLight\n .addColor(this._params.ambientLight, 'color')\n .onChange((color: string) => {\n this._ambientLight.color = new Color(color as ColorRepresentation);\n });\n }\n }\n}\n","import SceneManager from '../../../common-core/src/webgl/scene-manager';\nimport type {\n Base64Image,\n CanvasOffset,\n} from '../../../common-core/src/common-interfaces';\nimport AdjustableCameraControl3D from '../camera-control/adjustable-camera-control-3d';\nimport type { GLBRenderWorkerListener } from '../services/glb-render-worker';\nimport type InputManager from '../../../common-core/src/input/input-manager';\nimport inject from '../../../common-core/src/di/inject';\nimport type GlbInputManager from '../input/glb-input-manager';\n\nimport DefaultLightSetting from '../../../configurator-core/src/webgl/lightsetting/default-light-setting';\nimport { CAMERA_TYPE } from '../../../common-core/src/cameracontrol/camera-type';\nimport { dispose } from '../../../common-core/src/utils/threejs-utils';\nimport { type RapiAccess } from '../../../common-core/src/rapi-access';\nimport { getGlbUrl } from '../../../common-core/src/utils/common-utils';\nimport { CANVAS_ID } from '../../../common-core/src/utils/dom-helper';\nimport type { Enumify } from '#/common/src/utils/types';\nimport {\n BasicShadowMap,\n Box3,\n type Color,\n type Object3D,\n PerspectiveCamera,\n SRGBColorSpace,\n Vector3,\n WebGLRenderer,\n} from 'three';\nimport DynamicLightSettingLoader, {\n PREDEFINED_LIGHTSETTING,\n} from '../../../common-core/src/lightsetting/dynamic-light-setting-loader';\nimport GLBViewerLightSetting from './glb-viewer-light-setting';\nimport GlbViewerCameraBehaviour from '../../../common-core/src/cameracontrol/glb-viewer-camera-behaviour';\nimport {\n CAMERA_EVENT,\n type CameraParameter,\n} from '../../../common-core/src/cameracontrol/camera-control';\n\nexport default class GLBViewerSceneManager\n extends SceneManager\n implements GLBRenderWorkerListener\n{\n @inject\n private _glbInputManager: GlbInputManager;\n\n @inject\n private _rapiAccess: RapiAccess;\n\n private _currentGLB: Object3D | null;\n private _standardSceneBackgroundColor: Color;\n\n private _itemsCount = 0;\n\n constructor(creator: string, offset: CanvasOffset) {\n super(creator, offset, CANVAS_ID.GLB, CAMERA_TYPE.CAMERA_3D);\n this._standardSceneBackgroundColor = this._scene.background as Color;\n if (this._initData.legacyLight && this._renderer instanceof WebGLRenderer) {\n if (this._renderer.capabilities.maxTextures > 8) {\n const lightSource =\n DynamicLightSettingLoader.createDynamicLightSettingSource(\n null,\n PREDEFINED_LIGHTSETTING.CAMERA,\n );\n if (lightSource) {\n this.loadDynamicLightSetting(lightSource);\n }\n } else {\n console.warn(\n 'this device has a maximum of 8 texture units thus we are using a simpler light setting',\n );\n this._lightSetting = new GLBViewerLightSetting(this._scene);\n }\n }\n }\n\n protected createCameraControl(\n _mode: Enumify<typeof CAMERA_TYPE>,\n _offset: CanvasOffset,\n ) {\n this._changeCameraBehaviour(\n new GlbViewerCameraBehaviour(\n new AdjustableCameraControl3D(\n this._creator_,\n this._getInputManager(),\n undefined,\n ),\n this._cameraBehaviourState,\n ),\n );\n }\n\n protected _getInputManager(): InputManager {\n return this._glbInputManager;\n }\n\n public async loadStaticItem(\n id: string,\n callback?: (percent: number) => void,\n ): Promise<void> {\n const rapiItem = await this._rapiAccess.getItem(id);\n if (rapiItem.configuration) {\n return Promise.reject();\n }\n const glbUrl = getGlbUrl(rapiItem);\n if (!glbUrl) {\n return Promise.reject(new Error('GLB Url not detected'));\n }\n return this.loadGLB(glbUrl, true, undefined, callback);\n }\n\n public loadGLB(\n url: string,\n automaticallyAdjustCamera: boolean = true,\n scaling: Vector3 = new Vector3(1, 1, 1),\n callback?: (percent: number) => void,\n ): Promise<void> {\n this.clearScene();\n return new Promise<void>((resolve, reject) => {\n this._loadGLB(\n url,\n new Vector3(0, 0, 0),\n 0,\n undefined,\n scaling,\n undefined,\n undefined,\n callback,\n ).then((glb) => {\n this._currentGLB = glb;\n this._scene.add(this._currentGLB);\n\n let boundingBox = new Box3().setFromObject(this._currentGLB);\n if (automaticallyAdjustCamera) {\n if (\n this.cameraBehaviour.cameraControl instanceof\n AdjustableCameraControl3D\n ) {\n this.glbViewerCameraBehaviour.updateCameraOnItemLoaded(boundingBox);\n }\n }\n this._updateBounds(boundingBox, undefined, true);\n this._readyForRender();\n resolve();\n }, reject);\n });\n }\n\n public preparePerspectiveImage(\n renderer?: WebGLRenderer,\n width: number = 1000,\n height: number = 1000,\n ): Promise<Base64Image> {\n return new Promise<Base64Image>((resolve, reject) => {\n if (!renderer) {\n renderer = new WebGLRenderer({ antialias: true });\n renderer.setSize(width, height);\n renderer.outputColorSpace = SRGBColorSpace;\n renderer.autoClear = false;\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = BasicShadowMap;\n }\n\n let camera = this.cameraBehaviour.cameraControl.getCamera().clone();\n if (camera instanceof PerspectiveCamera) {\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n }\n\n this._lightSetting?.removeFromScene();\n let defaultLightSetting = new DefaultLightSetting(this._scene);\n\n renderer.render(this._scene, camera);\n let image = renderer.domElement.toDataURL();\n renderer.domElement.toBlob((blob) => {\n if (blob === null) {\n reject(new Error('Failed to create blob from canvas'));\n return;\n }\n resolve({ image, width, height, blob });\n }, 'image/png');\n\n defaultLightSetting.removeFromScene();\n this._lightSetting?.addToScene();\n });\n }\n\n public adjustCamera(\n position: Vector3,\n yaw: number,\n pitch: number,\n fov: number,\n ) {\n if (\n this.cameraBehaviour.cameraControl instanceof AdjustableCameraControl3D\n ) {\n let boundingBox = new Box3().setFromObject(this._scene);\n let bounds = boundingBox.getSize(new Vector3());\n (this.cameraBehaviour.cameraControl as AdjustableCameraControl3D).adjust(\n bounds,\n position,\n yaw,\n pitch,\n fov,\n );\n this._requestRender();\n }\n }\n\n public onStart(count: number) {\n this._itemsCount = count;\n this._scene.background = null;\n if (\n this.cameraBehaviour.cameraControl instanceof AdjustableCameraControl3D\n ) {\n (\n this.cameraBehaviour.cameraControl as AdjustableCameraControl3D\n ).shouldIgnoreStandardBehavior = true;\n }\n console.log('start processing ' + count + ' items');\n }\n\n public onElementFinished(itemsFinished: number) {\n console.log(\n 'processed ' +\n itemsFinished +\n ' of ' +\n this._itemsCount +\n ' items (' +\n Math.round((100 / this._itemsCount) * itemsFinished) +\n '%)',\n );\n }\n\n public onFinished(_zip: any) {\n this._scene.background = this._standardSceneBackgroundColor;\n if (\n this.cameraBehaviour.cameraControl instanceof AdjustableCameraControl3D\n ) {\n (\n this.cameraBehaviour.cameraControl as AdjustableCameraControl3D\n ).shouldIgnoreStandardBehavior = false;\n }\n }\n\n public clearScene() {\n if (this._currentGLB) {\n this._scene.remove(this._currentGLB);\n dispose(this._currentGLB);\n this._currentGLB = null;\n }\n super.clearScene();\n }\n\n public enableHD() {\n super.enableHD();\n }\n\n public sceneChanged(): void {\n //override when needed\n }\n\n getBounds(): Box3 | null {\n if (!this._currentGLB) {\n return null;\n }\n return new Box3().setFromObject(this._currentGLB);\n }\n\n protected get glbViewerCameraBehaviour(): GlbViewerCameraBehaviour {\n return this.cameraBehaviour as GlbViewerCameraBehaviour;\n }\n\n getGeometryBounds(): Box3 | null {\n return null;\n }\n\n cameraBehaviourChanged(updateDistance: boolean = true) {\n super.cameraBehaviourChanged(updateDistance);\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_IN,\n () => {\n this._requestRender();\n },\n this,\n );\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_OUT,\n () => {\n this._requestRender();\n },\n this,\n );\n }\n\n public async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n return this.glbViewerCameraBehaviour.externalApiMoveCamera(cameraParameter);\n }\n\n // info when scene is ready to render, used for testing\n protected _readyForRender() {\n console.log('ready_for_render');\n this._globalCallback.onReadyForRender();\n }\n}\n","import type { Base64Image } from '../../../common-core/src/common-interfaces';\nimport type GLBViewerSceneManager from '../webgl/glb-viewer-scene-manager';\nimport type { RenderEntry } from '../roomle-glb-viewer';\nimport { SRGBColorSpace, Vector3, WebGLRenderer } from 'three';\n\ninterface GLBRenderEntry {\n name: string;\n url: string;\n position: Vector3;\n fov: number;\n yaw: number;\n pitch: number;\n}\n\nexport interface GLBRenderWorkerListener {\n onStart(count: number): void;\n\n onElementFinished(finishedElements: number): void;\n\n onFinished(zip: any): void;\n}\n\nexport default class GLBRenderWorker {\n private _sceneManager: GLBViewerSceneManager;\n private _entries: GLBRenderEntry[];\n\n private _resolve: (zip: any) => void;\n\n private _prefix = 'https://furniture.roomle.com/3d/glb/';\n\n private _renderer: WebGLRenderer;\n private _width: number;\n private _height: number;\n\n private _listeners: Set<GLBRenderWorkerListener> =\n new Set<GLBRenderWorkerListener>();\n private _finishedItems: number = 0;\n\n private _zip: any;\n\n constructor(\n sceneManager: GLBViewerSceneManager,\n width: number,\n height: number,\n ) {\n this._sceneManager = sceneManager;\n\n this._renderer = new WebGLRenderer({ antialias: true, alpha: true });\n this._width = width;\n this._height = height;\n this._renderer.setSize(width, height);\n this._renderer.setClearColor(0xffffff, 0);\n this._renderer.outputColorSpace = SRGBColorSpace;\n }\n\n public addListener(listener: GLBRenderWorkerListener) {\n this._listeners.add(listener);\n }\n\n public removeListener(listener: GLBRenderWorkerListener) {\n this._listeners.delete(listener);\n }\n\n public start(entries: RenderEntry[]): Promise<any> {\n this._entries = [];\n entries.forEach((entry) => {\n this._entries.push(this._transform(entry)); // {name: url.replace('.glb', '.png'), url: this._prefix + url}\n });\n this._finishedItems = 0;\n this._listeners.forEach((listener) =>\n listener.onStart(this._entries.length),\n );\n this._zip = new (window as any).JSZip();\n this._doNextEntry();\n return new Promise<any>((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private _transform(entry: RenderEntry): GLBRenderEntry {\n return {\n name: entry.path.replace('.glb', '.png'),\n url: this._prefix + entry.path,\n position: new Vector3(\n entry.camera.position.x,\n entry.camera.position.z,\n -entry.camera.position.y,\n ),\n fov: entry.camera.fieldOfView * 2, // * 2 because Atti suggested it after all images were cut on all sides\n yaw: entry.camera.rotation.z,\n pitch: entry.camera.rotation.x,\n };\n }\n\n private _doNextEntry() {\n if (this._entries.length === 0) {\n this._listeners.forEach((listener) => listener.onFinished(this._zip));\n this._resolve(this._zip);\n } else {\n this._processEntry(this._entries[0]);\n }\n }\n\n private _processEntry(entry: GLBRenderEntry) {\n this._sceneManager.loadGLB(entry.url, false, undefined).then(() => {\n this._sceneManager.adjustCamera(\n entry.position,\n entry.yaw,\n entry.pitch,\n entry.fov,\n );\n this._sceneManager\n .preparePerspectiveImage(this._renderer, this._width, this._height)\n .then((base64Image) => {\n this._entryFinished(entry, base64Image);\n });\n });\n }\n\n private _entryFinished(entry: GLBRenderEntry, base64Image: Base64Image) {\n let index = this._entries.indexOf(entry);\n if (index > -1) {\n this._entries.splice(index, 1);\n }\n this._finishedItems++;\n this._listeners.forEach((listener) =>\n listener.onElementFinished(this._finishedItems),\n );\n this._zip.file(entry.name, base64Image.blob);\n this._doNextEntry();\n }\n}\n","export default \"__VITE_ASSET__VRAku6fjghkApIISiBWPzg__\"","import type ScriptLoader from '../../common-core/src/script-loader';\nimport type DomHelper from '../../common-core/src/utils/dom-helper';\nimport inject from '../../common-core/src/di/inject';\nimport GLBViewerSceneManager from './webgl/glb-viewer-scene-manager';\nimport type {\n Base64Image,\n CanvasOffset,\n Position3,\n} from '../../common-core/src/common-interfaces';\nimport GLBRenderWorker from './services/glb-render-worker';\nimport type { ExternalEmbeddable, GlobalAPI } from '../../common-core/src/main';\nimport type { Main } from '../../common-core/src/main';\nimport type { Context } from '../../common-core/src/di/context';\nimport type { LifeCycleManager } from '../../common-core/src/life-cycle-manager';\nimport type { SceneSettings } from '../../common-core/src/scene-settings-loader';\nimport { JS_ZIP_FILE_NAME } from '../../common-core/src/static-files/libs';\nimport type InitData from '../../common-core/src/utils/init-data';\nimport type {\n GlobalInitDataDefinition,\n InitDataDefinition,\n} from '../../common-core/src/utils/shims';\nimport type GlobalInitData from '../../common-core/src/utils/global-init-data';\nimport { type RapiAccess } from '../../common-core/src/rapi-access';\nimport type UnitFormatter from '../../configurator-core/src/services/unit-formatter';\nimport { download } from '../../common-core/src/utils/common-utils';\nimport type { Scene } from 'three';\nimport { Vector3 } from 'three';\nimport { type IdbManager } from '../../common-core/src/services/idb-manager';\nimport type { CameraParameter } from '../../common-core/src/cameracontrol/camera-control';\nimport type { GlobalCallback } from '../../common-core/src/services/global-callback';\n\ninterface RenderCameraInformation {\n fieldOfView: number;\n rotation: Position3;\n position: Position3;\n}\n\nexport declare interface RenderEntry {\n path: string;\n camera: RenderCameraInformation;\n}\n\nexport class GlbViewerUiCallbacks {}\n\nexport class RoomleGLBViewer\n implements GlobalAPI, Context, ExternalEmbeddable<GlbViewerUiCallbacks>\n{\n public _creator_: string;\n\n @inject\n private _rapiAccess: RapiAccess;\n\n @inject\n private _domHelper: DomHelper;\n\n @inject\n private _scriptLoader: ScriptLoader;\n\n @inject\n private _lifeCycleManager: LifeCycleManager;\n\n @inject\n private _initData: InitData;\n\n @inject\n private _globalInitData: GlobalInitData;\n\n @inject\n private _globalCallback: GlobalCallback;\n\n @inject\n private _unitFormatter: UnitFormatter;\n\n @inject\n protected _idbManager: IdbManager;\n\n private _sceneManager: GLBViewerSceneManager;\n\n private _currentIdOrUrl: string | null = null;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public setCameraOffset(offset: CanvasOffset): void {\n this._sceneManager.setCameraOffset(offset);\n }\n\n public getCameraOffset(): CanvasOffset {\n return this._sceneManager.getCameraOffset();\n }\n\n public init(\n element: HTMLElement,\n initData?: InitDataDefinition,\n ): Promise<void> {\n this.setOverrides(initData);\n this._domHelper.setDomElement(element);\n\n if (this._sceneManager) {\n this._lifeCycleManager.resume();\n return Promise.resolve();\n }\n\n return new Promise<void>(this._initPromiseCallback.bind(this));\n }\n\n private _initPromiseCallback(resolve: () => void, _reject: () => void) {\n this._sceneManager = new GLBViewerSceneManager(this._creator_, {\n left: 0,\n top: 1,\n right: 1,\n bottom: 0,\n });\n // this.loadGLB('https://furniture.roomle.com/3d/glb/furniture/vitra/41206600/41206600.glb');\n this._sceneManager.enableHD();\n resolve();\n }\n\n /**\n * Remove the current glb from the scene if it exists\n */\n public clearScene() {\n this._sceneManager.clearScene();\n }\n\n /**\n * Loads the GLB from the given URL Param\n * @param url\n * @param scaling defaults to 1\n * @param callback loading percent between 0 and 1\n */\n public loadGLB(\n url: string,\n scaling = 1,\n callback?: (percent: number) => void,\n ): Promise<void> {\n this._currentIdOrUrl = url;\n this._rapiAccess.trackView(url);\n return this._sceneManager.loadGLB(\n url,\n true,\n new Vector3(scaling, scaling, scaling),\n callback,\n );\n }\n\n /**\n * Loads the glb asset from the static item\n * @param staticItemId\n * @param callback loading percent between 0 and 1\n */\n public loadStaticItem(\n staticItemId: string,\n callback?: (percent: number) => void,\n ): Promise<void> {\n this._currentIdOrUrl = staticItemId;\n this._rapiAccess.trackView(staticItemId);\n return this._sceneManager.loadStaticItem(staticItemId, callback);\n }\n\n /**\n * Returns the current item id or url of the loaded object\n */\n public getCurrentId(): string | null {\n return this._currentIdOrUrl;\n }\n\n /**\n * Loads a SceneSettings object, currently it can can contain a light setting definition\n * (see {@link @roomle/web-sdk/configurator-core/src/roomle-configurator#RoomleConfigurator.loadDynamicLightSetting}) and an environment definition (see {@link @roomle/web-sdk/configurator-core/src/environment/dynamic-environment-setting-loaderEnvironmentSetting}).\n * @param sceneSettings\n */\n public loadSceneSetting(sceneSettings: SceneSettings): Promise<void> {\n return this._sceneManager.loadSceneSettings(sceneSettings);\n }\n\n public preparePerspectiveImage(): Promise<Base64Image> {\n return this._sceneManager.preparePerspectiveImage();\n }\n\n public processRenderList(\n jsonString: string,\n width: number = 320,\n height: number = 320,\n ) {\n const object = JSON.parse(jsonString);\n this._scriptLoader.fetch(JS_ZIP_FILE_NAME, { id: 'jszip-js' }).then(() => {\n const worker = new GLBRenderWorker(this._sceneManager, width, height);\n worker.addListener(this._sceneManager);\n worker.start(object.items).then((zip: any) => {\n zip.generateAsync({ type: 'blob' }).then((content: File) => {\n download('content.zip', URL.createObjectURL(content));\n worker.removeListener(this._sceneManager);\n });\n });\n });\n }\n\n public setOverrides(\n initData:\n | Partial<InitDataDefinition & GlobalInitDataDefinition>\n | InitData\n | undefined,\n ): void {\n if (!initData) {\n return;\n }\n this._initData.setOverrides(initData);\n this._globalInitData.setOverrides(initData);\n }\n\n public updateSize(): void {\n this._sceneManager.updateCamera();\n }\n\n /**\n * Return the main class which has access to lifecycle events and RapiAccess.\n * Hidden because it's only useful for embedding API.\n * Has to be overridden by main class.\n * @hidden\n */\n public getMain(): Main | undefined {\n return undefined;\n }\n\n public resumeTest(element: HTMLElement) {\n this._domHelper.setDomElement(element);\n this._lifeCycleManager.resume();\n }\n\n public pauseTest() {\n this._lifeCycleManager.pause();\n }\n\n public showGUI() {\n this._sceneManager.showGUI();\n }\n\n public get callbacks() {\n return {};\n }\n\n public getScene(): Scene {\n return this._sceneManager.getScene();\n }\n\n public updateScene(): void {\n this._sceneManager.updateScene();\n }\n\n /**\n * returns unit formatter for formatting input und output values in scene\n */\n public getUnitFormatter(): UnitFormatter {\n return this._unitFormatter;\n }\n\n /**\n * returns manager class to interface with indexedDB storage\n */\n public getStorage(): IdbManager {\n return this._idbManager;\n }\n\n public setEnvironmentMap(params: {\n url?: string;\n intensity?: number;\n rotation?: number;\n maxLightSources?: number;\n }): void {\n const { url, intensity, rotation, maxLightSources } = params;\n this._sceneManager.setEnvironmentMap(\n url,\n intensity,\n rotation,\n maxLightSources,\n );\n }\n\n public exportCanvasScreenshot(quality?: number): Promise<string> {\n return this._sceneManager.exportCanvasScreenshot(quality);\n }\n\n public async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n return this._sceneManager.moveCamera(cameraParameter);\n }\n\n /**\n * @internal\n * Use this callbacks to hook in your functionality\n */\n public get globalCallbacks(): GlobalCallback {\n return this._globalCallback;\n }\n}\n","import InputManager from '../../../common-core/src/input/input-manager';\n\nexport default class GlbInputManager extends InputManager {\n //move on, nothing to see here\n}\n","import Logger from '../../../common-core/src/logger';\nimport ScriptLoader from '../../../common-core/src/script-loader';\nimport {\n DependencyInjectionAssignment,\n DI_TYPE,\n} from '../../../common-core/src/di/container';\nimport GlbInputManager from '../input/glb-input-manager';\nimport { RapiAccess } from '../../../common-core/src/rapi-access';\n\nexport const INJECTABLES: DependencyInjectionAssignment[] = [\n new DependencyInjectionAssignment('script-loader', ScriptLoader),\n new DependencyInjectionAssignment(\n 'glb-input-manager',\n GlbInputManager,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment('logger', Logger),\n new DependencyInjectionAssignment('rapi-access', RapiAccess),\n];\n","import './utils/global-definitions';\nimport { Main, BASE_CONTEXT } from '../../common-core/src/main';\nimport type Logger from '../../common-core/src/logger';\nimport { INJECTABLES } from './utils/injectables';\nimport RoomleDependencyInjection from '../../common-core/src/di/roomle-dependency-injection';\nimport { RoomleGLBViewer } from './roomle-glb-viewer';\n\nexport class GlbViewer extends Main {\n private _viewer: RoomleGLBViewer;\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 throw new Error('Method not implemented.');\n }\n\n protected cleanUpDependencies(): void {\n throw new Error('Method not implemented.');\n }\n\n protected async bootFinished(): Promise<void> {\n this._viewer = new RoomleGLBViewer(this._context);\n\n if (!window.RoomleGLBViewer) {\n window.RoomleGLBViewer = this._viewer;\n }\n }\n\n public getApi(): RoomleGLBViewer {\n return this._viewer;\n }\n\n protected getContextName(): string {\n return BASE_CONTEXT.GLB_VIEWER;\n }\n}\n"],"x_google_ignoreList":[4],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"homag-intelligence-CBZujG1I.mjs","names":["native"],"sources":["../../../../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":["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 if (!orderData) {\n return null;\n }\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) ?? null;\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 CheckDropDownResult,\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(\n message: string,\n ...args: Array<string | null | undefined>\n ) {\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 mergedWithDragging: boolean,\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 mergedWithDragging,\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, CheckDropDownResult> | 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, CheckDropDownResult> | 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 objectPositionChanged: boolean,\n ): Promise<void> {\n this._logRequest(\n 'changedGroupPlanningSituation',\n changedGroup.groupId,\n objectPositionChanged.toString(),\n );\n return this._glueLogic.changedGroupPlanningSituation(\n changedGroup,\n objectPositionChanged,\n );\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 getSubArticleId(id: string): string | undefined {\n this._logRequest('getSubArticleId', id);\n return this._glueLogic.getSubArticleId(id);\n }\n\n public async newPosDataFromId(id: string): Promise<PosGroup | undefined> {\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(\n roomlePlannerId?: string,\n ): Promise<HiOrderData | null> {\n this._logRequest('getGroupDataForOrder', roomlePlannerId);\n return this._glueLogic.getGroupDataForOrder(roomlePlannerId);\n }\n\n public getMaterialUrl(\n materialId: string,\n groupOrModuleId?: string,\n ): string | null {\n this._logRequest('getMaterialUrl', materialId, groupOrModuleId);\n return this._glueLogic.getMaterialUrl(materialId, groupOrModuleId);\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.reason ?? 'undefined',\n options.findFreeSpaceInPlan?.toString() ?? 'false',\n options.moduleIdMap ? JSON.stringify(options.moduleIdMap) : '[]',\n options.mergedGroups ? JSON.stringify(options.mergedGroups) : '[]',\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 { RoomDesignerApi } from './api';\nimport type { GlueLogic, HiAttributeOptionsResult } 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 {\n private _roomlePlanner: RoomlePlanner;\n private _api: RoomDesignerApi;\n private _glueLogic: GlueLogic;\n private _orders: Orders;\n private _hiCallbacks: HiCallbacks;\n\n constructor(\n roomlePlanner: RoomlePlanner,\n hiOptions: HomagIntelligenceInitData,\n hiCallbacks: HiCallbacks,\n ) {\n if (!window.uuidv4) {\n window.uuidv4 = uuidv4; // Ensure uuidv4 is available globally\n }\n\n this._roomlePlanner = roomlePlanner;\n this._roomlePlanner.setHomagIntelligence(this);\n this._hiCallbacks = hiCallbacks;\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 this._orders = new Orders(roomlePlanner, this._glueLogic);\n }\n\n /**\n * Loads previously saved PosGroup data via hiCallbacks.\n * Must be called after construction to restore saved state.\n */\n public async loadSavedPosData(): Promise<void> {\n const savedPosGroupData =\n (await this._hiCallbacks.onGetSavedPosGroupData?.()) ?? null;\n await this._glueLogic.setPosDataForLoading(savedPosGroupData);\n }\n\n public async loadLibrary(libraryId: string) {\n const libraryData = await this._loadLibraryData(libraryId);\n await this._glueLogic.addLibrary(libraryData);\n }\n\n public async loadCatalog(\n libraryId: string,\n articles: any,\n catalogCallbacks: HiTagCatalogCallbacks,\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 const data = this._glueLogic.getLibraryData(libraryId);\n if (data !== null) {\n return data;\n }\n }\n const hiCallbacks = this._glueLogic.hiCallbacks;\n if (hiCallbacks === null) {\n throw new Error('HiCallbacks not initialized');\n }\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, HiAttributeOptionsResult>> => {\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 attributeDropDownApi =\n libraryExports.getAttributesDropDownValuesV2 ??\n libraryExports.getAttributesDropDownValues;\n const options = await attributeDropDownApi(module, attributeId);\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 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 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"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}
|