@crystaldesign/diva-web-planner-react 26.11.0-beta.3 → 26.11.0-beta.31
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/build/esm/{Planner2DGrid-be22bf89.js → Planner2DGrid-2b75d076.js} +196 -49
- package/build/esm/{Planner3DImage-8f21be56.js → Planner3DImage-1227ae4d.js} +1 -1
- package/build/esm/{UnlockCard-3fb76e70.js → UnlockCard-d453caf5.js} +1 -1
- package/build/esm/{index-94eb5a0b.js → index-02bf80c2.js} +19 -19
- package/build/esm/{index-854179de.js → index-0333c640.js} +1 -1
- package/build/esm/{index-624149c8.js → index-03f331f1.js} +2 -2
- package/build/esm/{index-345aba6b.js → index-0853f3bb.js} +65 -65
- package/build/esm/{index-e7790e24.js → index-0c2e994b.js} +5 -5
- package/build/esm/index-0db38456.js +965 -0
- package/build/esm/{index-3c925a9c.js → index-1072cce1.js} +2 -2
- package/build/esm/{index-a01e0683.js → index-10c55954.js} +1 -1
- package/build/esm/{index-61b4ebd3.js → index-10c77efd.js} +1 -1
- package/build/esm/{index-882e9781.js → index-10eb429e.js} +1 -1
- package/build/esm/{index-2b748074.js → index-16180e43.js} +1 -1
- package/build/esm/{index-180189d9.js → index-18691afe.js} +70 -70
- package/build/esm/{index-e484cb4b.js → index-194db4dd.js} +3 -3
- package/build/esm/{index-369fda13.js → index-19924394.js} +2 -2
- package/build/esm/{index-031864a2.js → index-1a1d9d49.js} +1 -1
- package/build/esm/{index-57f6aec3.js → index-1b0f4452.js} +1 -1
- package/build/esm/{index-aecb9e6f.js → index-1c06aee7.js} +6 -6
- package/build/esm/{index-e660d80c.js → index-1cda158b.js} +1 -1
- package/build/esm/{index-c5945db2.js → index-206543ad.js} +2 -4
- package/build/esm/{index-765505ab.js → index-2404c1a5.js} +3 -3
- package/build/esm/{index-e6d39b9d.js → index-2464d448.js} +18 -18
- package/build/esm/{index-23cd98ff.js → index-2487bbcd.js} +4 -4
- package/build/esm/{index-fbd3287b.js → index-271b050d.js} +5 -5
- package/build/esm/{index-9a249b74.js → index-272fbc41.js} +1 -1
- package/build/esm/{index-1e8d1616.js → index-27d63749.js} +66 -66
- package/build/esm/{index-84f83c67.js → index-28e8c543.js} +1 -1
- package/build/esm/{index-c7d3af7e.js → index-29152556.js} +73 -73
- package/build/esm/{index-fdf86798.js → index-299dd1d7.js} +91 -91
- package/build/esm/{index-24df5db1.js → index-2b222904.js} +3 -3
- package/build/esm/{index-fcb72e7d.js → index-2b311736.js} +89 -87
- package/build/esm/{index-83d6bb83.js → index-2b816cbb.js} +1 -1
- package/build/esm/{index-dc3778bc.js → index-2cae4848.js} +1 -1
- package/build/esm/{index-1e23c982.js → index-2cf7b7c7.js} +1 -1
- package/build/esm/{index-69650205.js → index-2e37ec62.js} +5 -5
- package/build/esm/{index-8b0a3174.js → index-2ed702ed.js} +1 -1
- package/build/esm/{index-a52f90e6.js → index-2f6a6006.js} +2 -2
- package/build/esm/{index-6092fed5.js → index-2f9f8710.js} +8 -8
- package/build/esm/{index-4a1aeedd.js → index-3258f83f.js} +20 -20
- package/build/esm/{index-73c75e94.js → index-32ce6566.js} +4 -4
- package/build/esm/{index-45ae8ca7.js → index-3320c27f.js} +1 -1
- package/build/esm/{index-34149b78.js → index-338ca5e6.js} +5 -5
- package/build/esm/{index-b48334cf.js → index-33eb7ce7.js} +10 -1
- package/build/esm/{index-7c7b6fc7.js → index-358782f0.js} +1 -1
- package/build/esm/{index-f3c7eafa.js → index-379178ce.js} +1 -1
- package/build/esm/{index-89fd7133.js → index-37992051.js} +1 -1
- package/build/esm/{index-0b387613.js → index-3850649b.js} +90 -90
- package/build/esm/{index-8839bff1.js → index-391a1ec3.js} +6 -6
- package/build/esm/{index-938c8c26.js → index-3a045c84.js} +2 -2
- package/build/esm/{index-7e78bbac.js → index-3c161268.js} +76 -76
- package/build/esm/{index-1ddf1648.js → index-3c381642.js} +1 -1
- package/build/esm/{index-0e80abeb.js → index-3dc757b3.js} +1 -1
- package/build/esm/{index-10cd9e60.js → index-3f715701.js} +7 -7
- package/build/esm/{index-1010faf1.js → index-3f7ecb08.js} +3 -3
- package/build/esm/{index-6c6b3de5.js → index-3fdc60c5.js} +13 -13
- package/build/esm/{index-52eb8599.js → index-3fe0571a.js} +1 -1
- package/build/esm/{index-00e54c23.js → index-400d2ad9.js} +1 -1
- package/build/esm/{index-7176a968.js → index-40a7066f.js} +3 -3
- package/build/esm/{index-959f5aa0.js → index-40ca64b7.js} +22 -22
- package/build/esm/{index-15d52408.js → index-414bc9db.js} +1 -1
- package/build/esm/{index-0908ac1e.js → index-422b59cb.js} +3 -3
- package/build/esm/{index-8b6d1b2c.js → index-45153c84.js} +4 -4
- package/build/esm/{index-4d855034.js → index-48709d20.js} +6 -4
- package/build/esm/{index-37df8f9a.js → index-4a8a4ca9.js} +1 -1
- package/build/esm/index-4bb61877.js +99 -0
- package/build/esm/{index-661042a0.js → index-4cbc4390.js} +2 -2
- package/build/esm/{index-bb42994c.js → index-5008e5b3.js} +89 -89
- package/build/esm/{index-f1c2ec32.js → index-5119923c.js} +1 -1
- package/build/esm/{index-42b71e75.js → index-52b3d317.js} +101 -101
- package/build/esm/{index-ef5f8f90.js → index-547fbb34.js} +1 -1
- package/build/esm/{index-33722dfd.js → index-55098080.js} +1 -1
- package/build/esm/{index-e8eb5116.js → index-556e0a0d.js} +2 -2
- package/build/esm/{index-2e12b9e1.js → index-57eef9cd.js} +1 -1
- package/build/esm/{index-415fbe83.js → index-59ab02a8.js} +1 -1
- package/build/esm/{index-b6397dbb.js → index-5bad73d3.js} +1 -1
- package/build/esm/{index-45b6610c.js → index-5e2f0c6a.js} +69 -69
- package/build/esm/{index-dca10eb4.js → index-5f7f6732.js} +1 -1
- package/build/esm/{index-1ff0dfac.js → index-6039a611.js} +17 -17
- package/build/esm/{index-b85db3a5.js → index-616c60b0.js} +2 -2
- package/build/esm/{index-84657f6d.js → index-641d330b.js} +1 -1
- package/build/esm/{index-5ad09ef7.js → index-6451eefd.js} +1 -1
- package/build/esm/{index-46e9d390.js → index-64c00abe.js} +2 -2
- package/build/esm/{index-bc988fdf.js → index-662eb542.js} +1 -1
- package/build/esm/{index-9663c0f2.js → index-669f8a5e.js} +1 -1
- package/build/esm/{index-9562a9d8.js → index-67dafeb1.js} +1 -1
- package/build/esm/{index-985d0ac1.js → index-67fd43fc.js} +1 -1
- package/build/esm/{index-b9739a43.js → index-68aac09d.js} +85 -85
- package/build/esm/{index-d6856cc5.js → index-690d4a89.js} +2 -2
- package/build/esm/{index-d8f30b62.js → index-694817c3.js} +1 -1
- package/build/esm/{index-ff020436.js → index-6a7c9333.js} +1 -1
- package/build/esm/{index-47939b53.js → index-6a8751d6.js} +1 -1
- package/build/esm/{index-69436c25.js → index-6b77bd94.js} +3 -3
- package/build/esm/{index-181ff2a0.js → index-6c60ca58.js} +2 -2
- package/build/esm/{index-a0e22978.js → index-6d2016bc.js} +1 -1
- package/build/esm/{index-e56bf428.js → index-6e47a0c6.js} +1 -1
- package/build/esm/{index-0c7b8562.js → index-6f763a0d.js} +1 -1
- package/build/esm/{index-efa06494.js → index-7073f1d4.js} +3 -3
- package/build/esm/{index-01e167be.js → index-7236a7cb.js} +1 -1
- package/build/esm/{index-315a6526.js → index-75224a75.js} +7 -3
- package/build/esm/{index-bd8d0479.js → index-77d97795.js} +5 -5
- package/build/esm/{index-8a26a858.js → index-7847734a.js} +141 -76
- package/build/esm/{index-08d97746.js → index-79f86b9d.js} +25 -25
- package/build/esm/{index-f74add7e.js → index-7acb06b8.js} +5 -5
- package/build/esm/{index-f45ab225.js → index-7af6bd59.js} +1 -1
- package/build/esm/{index-1f095fe3.js → index-7b297c46.js} +1 -1
- package/build/esm/{index-869d65ec.js → index-7b53cb6f.js} +8 -8
- package/build/esm/{index-102ef56e.js → index-7c6580b8.js} +1 -1
- package/build/esm/{index-f930afa0.js → index-7e9f924b.js} +6 -6
- package/build/esm/{index-606a110b.js → index-7fe3a425.js} +1 -1
- package/build/esm/{index-9eccf0e1.js → index-8060c2a2.js} +71 -71
- package/build/esm/{index-17bcc39b.js → index-8061e6bf.js} +14 -3
- package/build/esm/{index-5665b09a.js → index-83047454.js} +1 -1
- package/build/esm/{index-c87402ba.js → index-8331fe6e.js} +2 -2
- package/build/esm/{index-74d46a1a.js → index-833cefe9.js} +1 -1
- package/build/esm/{index-555b281e.js → index-8463c6a5.js} +3 -3
- package/build/esm/{index-892ffe4d.js → index-8499494f.js} +1 -1
- package/build/esm/{index-e46ca62c.js → index-85481862.js} +4 -4
- package/build/esm/{index-40ca5eeb.js → index-887c29b3.js} +1 -1
- package/build/esm/{index-0895f2f3.js → index-8b6c72e9.js} +3 -3
- package/build/esm/{index-9e661597.js → index-8d0b4891.js} +1 -1
- package/build/esm/{index-eee225cf.js → index-8d4146a2.js} +2 -2
- package/build/esm/{index-b692e521.js → index-8d7257ee.js} +1 -1
- package/build/esm/{index-1d481484.js → index-8e185186.js} +90 -90
- package/build/esm/{index-8ce6adb9.js → index-8f5fa9b4.js} +2 -2
- package/build/esm/{index-8f8d141b.js → index-908bce4f.js} +3 -3
- package/build/esm/{index-048552f0.js → index-9165b357.js} +1 -1
- package/build/esm/{index-bf19aa67.js → index-91ad05f6.js} +1 -1
- package/build/esm/{index-3e454946.js → index-92417bd8.js} +68 -68
- package/build/esm/{index-2a46675e.js → index-93f74e2c.js} +66 -66
- package/build/esm/{index-347c80d9.js → index-946da47d.js} +1 -1
- package/build/esm/{index-f8660916.js → index-94d86bd9.js} +1 -1
- package/build/esm/{index-d4be771b.js → index-9575339b.js} +1 -1
- package/build/esm/{index-6b55f02e.js → index-96514191.js} +1 -1
- package/build/esm/{index-fdd2f2b6.js → index-98e4cdc7.js} +3 -3
- package/build/esm/{index-b9ea263d.js → index-9a895999.js} +1 -1
- package/build/esm/{index-0e05b6b9.js → index-9b6a85c0.js} +1 -1
- package/build/esm/{index-e2678bc3.js → index-9c36655a.js} +1 -1
- package/build/esm/{index-149ee0c3.js → index-9d20e056.js} +1 -1
- package/build/esm/{index-cdb372f1.js → index-9f13b7ff.js} +2 -2
- package/build/esm/{index-9e2ca930.js → index-9f80fe18.js} +18 -18
- package/build/esm/{index-87345a21.js → index-a271c87b.js} +2 -2
- package/build/esm/{index-5c1c1b31.js → index-a3ee4fb5.js} +2 -2
- package/build/esm/{index-2ad23b0d.js → index-a52784b9.js} +1 -1
- package/build/esm/{index-337b35af.js → index-a7227654.js} +2 -2
- package/build/esm/{index-8d2f95c8.js → index-a89b343c.js} +1 -1
- package/build/esm/{index-3ee68248.js → index-a8c57af9.js} +2 -2
- package/build/esm/{index-b011252f.js → index-a9073adb.js} +7 -7
- package/build/esm/{index-17ba7b38.js → index-aaa125d1.js} +5 -5
- package/build/esm/{index-ff3db23f.js → index-ab54b2e5.js} +5 -5
- package/build/esm/{index-56d95f56.js → index-ab8dc8e0.js} +21 -21
- package/build/esm/{index-85269def.js → index-ac1c2f4d.js} +8 -8
- package/build/esm/{index-07075961.js → index-aea56c2a.js} +1 -1
- package/build/esm/{index-5d29eff3.js → index-b39ee00c.js} +4 -4
- package/build/esm/{index-da2a2a8b.js → index-b3b30d08.js} +18 -18
- package/build/esm/{index-5dce3fc8.js → index-b3de81d6.js} +1 -1
- package/build/esm/{index-5b795c7b.js → index-b83c7ccf.js} +1 -1
- package/build/esm/{index-c45f18fe.js → index-b8763b90.js} +1 -1
- package/build/esm/{index-bdf5827b.js → index-b9802779.js} +5 -5
- package/build/esm/{index-eb30bc4d.js → index-b9c5ddd0.js} +1 -1
- package/build/esm/{index-0ec473cc.js → index-ba7e105d.js} +1 -1
- package/build/esm/{index-e5e0e394.js → index-be32a2e2.js} +5 -5
- package/build/esm/{index-f3bca3be.js → index-c0027e7d.js} +1 -1
- package/build/esm/{index-c1bf3a44.js → index-c0eee176.js} +1 -1
- package/build/esm/{index-af4148a4.js → index-c176f45a.js} +2 -2
- package/build/esm/{index-03a0fdc9.js → index-c4c5a8a3.js} +1 -1
- package/build/esm/{index-be4baeb9.js → index-c703f557.js} +2 -2
- package/build/esm/{index-16fe405b.js → index-c73d78e9.js} +3 -3
- package/build/esm/{index-4be1fee3.js → index-c79424f1.js} +2 -2
- package/build/esm/{index-8d52e836.js → index-c883c4df.js} +3 -3
- package/build/esm/{index-70bf7fb6.js → index-c8b29988.js} +2 -2
- package/build/esm/{index-36c018f3.js → index-c8cae97b.js} +99 -9
- package/build/esm/{index-0029288b.js → index-c9846514.js} +1 -1
- package/build/esm/{index-0db57583.js → index-caa3b342.js} +1 -1
- package/build/esm/{index-899b8922.js → index-cb3f6a27.js} +1122 -664
- package/build/esm/{index-26dda831.js → index-cb9081ef.js} +65 -65
- package/build/esm/{index-5ec0c2dc.js → index-cbd560c7.js} +1 -1
- package/build/esm/{index-fedccb21.js → index-cd273297.js} +100 -100
- package/build/esm/{index-c46b6740.js → index-cdeee431.js} +1 -1
- package/build/esm/{index-5db7e072.js → index-ce0d2469.js} +5 -5
- package/build/esm/{index-1d2d7fb6.js → index-cf02d8ed.js} +1 -1
- package/build/esm/{index-1487d493.js → index-cf1ece86.js} +2 -2
- package/build/esm/{index-5ad9fa64.js → index-cf2be7df.js} +1 -1
- package/build/esm/{index-b6aaff5c.js → index-cf741bb6.js} +3 -3
- package/build/esm/{index-5ec31db5.js → index-d1328d1a.js} +2 -2
- package/build/esm/{index-e260a81a.js → index-d1f0b856.js} +2 -2
- package/build/esm/{index-6fe3ff14.js → index-d40b4ce1.js} +1 -1
- package/build/esm/{index-06656766.js → index-d4eab021.js} +1 -1
- package/build/esm/{index-93284a2c.js → index-d4ec5318.js} +3 -3
- package/build/esm/{index-618fdc08.js → index-d52c9f36.js} +39 -21
- package/build/esm/{index-faafc31d.js → index-d75c35b5.js} +2 -2
- package/build/esm/{index-08994c71.js → index-d9da042a.js} +1 -1
- package/build/esm/{index-7488e2e2.js → index-dc237063.js} +84 -84
- package/build/esm/{index-afe33b8f.js → index-dc8c8574.js} +1 -1
- package/build/esm/{index-74d5ee8b.js → index-dcd6a0ea.js} +1 -1
- package/build/esm/{index-73463d9f.js → index-dd8ec79f.js} +1 -1
- package/build/esm/{index-bc8576ec.js → index-ddda70a5.js} +1 -1
- package/build/esm/{index-a7de9a70.js → index-df8e375c.js} +3 -3
- package/build/esm/{index-82a28d6e.js → index-dff2807c.js} +1 -1
- package/build/esm/{index-8cef9ec1.js → index-e07e8f93.js} +68 -68
- package/build/esm/{index-5abf6852.js → index-e18c00bd.js} +15 -15
- package/build/esm/{index-4daa80c5.js → index-e1c75dfc.js} +1 -1
- package/build/esm/{index-43d382c8.js → index-e2aeaa39.js} +3 -3
- package/build/esm/{index-895e928a.js → index-e2e6dcb6.js} +1 -1
- package/build/esm/{index-c8de3993.js → index-eaf1a6ef.js} +1 -1
- package/build/esm/{index-a1680ef5.js → index-ebf38440.js} +2 -2
- package/build/esm/{index-ada3c152.js → index-ed1206ec.js} +1 -1
- package/build/esm/{index-ac5a2704.js → index-ed7bf98f.js} +3 -3
- package/build/esm/{index-a784e48f.js → index-f07c90dd.js} +1 -1
- package/build/esm/{index-34a1419b.js → index-f330506c.js} +1 -1
- package/build/esm/{index-581409b8.js → index-f450f41e.js} +2 -2
- package/build/esm/{index-e0900a31.js → index-f716563e.js} +1 -1
- package/build/esm/{index-a01842a6.js → index-f717b58f.js} +1 -1
- package/build/esm/{index-4e4215ad.js → index-f755ce67.js} +1 -1
- package/build/esm/{index-e424ab5b.js → index-f89aa898.js} +2 -2
- package/build/esm/{index-5bd398a7.js → index-f8c8fae6.js} +1 -1
- package/build/esm/{index-99c94447.js → index-f8d7c164.js} +3 -3
- package/build/esm/{index-cfc0389d.js → index-fcd58621.js} +70 -70
- package/build/esm/{index-7ae6b393.js → index-fd1c9763.js} +67 -67
- package/build/esm/{index-71c05fb2.js → index-fe3494ee.js} +1 -1
- package/build/esm/{index-ead3c18e.js → index-ff1065a1.js} +2 -2
- package/build/esm/{index-a366d35e.js → index-ff268b26.js} +1 -1
- package/build/esm/index.js +1 -1
- package/build/esm/{index.module-ce9cbd44.js → index.module-1cc8ad31.js} +1 -1
- package/build/esm/{index.module-efce36dc.js → index.module-3f8bfc0b.js} +1 -1
- package/build/esm/{index.module-d13df9cf.js → index.module-4cc34c00.js} +1 -1
- package/build/esm/{index.module-41cf846f.js → index.module-4ecae8d9.js} +1 -1
- package/build/esm/{index.module-15c22604.js → index.module-78232b3d.js} +1 -1
- package/build/esm/{index.module-76c17bd6.js → index.module-b5b7f250.js} +1 -1
- package/build/esm/{index.module-25cdca01.js → index.module-e90b0636.js} +1 -1
- package/build/esm/{index.module-5bcecdc6.js → index.module-ffca26b5.js} +1 -1
- package/build/esm/{useCustomDimensions-f2bb4edd.js → useCustomDimensions-9be96ee7.js} +1 -1
- package/build/esm/{ussIsSticky-6dac519b.js → ussIsSticky-e203c3a2.js} +1 -1
- package/build/types/web-planner-react/src/analyzerComponents.d.ts +5 -1
- package/build/types/web-planner-react/src/analyzerComponents.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/ToolContainer/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/types.d.ts +1 -1
- package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/types.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Product/Product/catalog/Sidebar/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Product/Product/catalog/index.d.ts +1 -1
- package/build/types/web-planner-react/src/components/Product/Product/catalog/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerMsgContainer/PlannerMsgItem/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/accessoryPlacementMode.d.ts +8 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/accessoryPlacementMode.d.ts.map +1 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/index.d.ts +6 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/index.d.ts.map +1 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/poolDimensionConfigs.d.ts +18 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/poolDimensionConfigs.d.ts.map +1 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/useCreateImageShot.d.ts +15 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/useCreateImageShot.d.ts.map +1 -0
- package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerUI/Items/PosNr/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Product/ProductCenter/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Settings/SettingsHeaderContainer/SettingsItemHeader/SettingsPosNrContainer/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Settings/SettingsScroller/SettingsItem/ItemPalette/ShelfPlanner/ShelfAccessoires/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/components/Settings/SettingsScroller/SettingsItem/ItemPalette/ShelfPlanner/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/index.d.ts +9 -1
- package/build/types/web-planner-react/src/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/DivaViewHandler.d.ts +10 -1
- package/build/types/web-planner-react/src/model/DivaViewHandler.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/Palette/PaletteViewHandler.d.ts +7 -3
- package/build/types/web-planner-react/src/model/Palette/PaletteViewHandler.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/Planner/ViewPlannerHandler.d.ts +11 -1
- package/build/types/web-planner-react/src/model/Planner/ViewPlannerHandler.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/Planner/Viewer/Interface/IViewPlanner2DGrid.d.ts +1 -1
- package/build/types/web-planner-react/src/model/Planner/Viewer/Interface/IViewPlanner2DGrid.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/Planner/Viewer/Planner2DGrid.d.ts +14 -1
- package/build/types/web-planner-react/src/model/Planner/Viewer/Planner2DGrid.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/States/ConfigState/index.d.ts +7 -1
- package/build/types/web-planner-react/src/model/States/ConfigState/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/States/UIState/Product/index.d.ts +26 -0
- package/build/types/web-planner-react/src/model/States/UIState/Product/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/States/UIState/Settings/index.d.ts +7 -0
- package/build/types/web-planner-react/src/model/States/UIState/Settings/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/TabGroup/ConfiguratorStructureHandler.d.ts.map +1 -1
- package/build/types/web-planner-react/src/model/index.d.ts.map +1 -1
- package/build/types/web-planner-react/src/tests/planner/articleGeometryFabricParity.test.d.ts +3 -0
- package/build/types/web-planner-react/src/tests/planner/articleGeometryFabricParity.test.d.ts.map +1 -0
- package/build/types/web-planner-react/src/tests/planner/legacy/legacyStretchEngine.d.ts +9 -0
- package/build/types/web-planner-react/src/tests/planner/legacy/legacyStretchEngine.d.ts.map +1 -0
- package/build/types/web-planner-react/src/tests/planner/minBorderFabricParity.test.d.ts +3 -0
- package/build/types/web-planner-react/src/tests/planner/minBorderFabricParity.test.d.ts.map +1 -0
- package/build/types/web-planner-react/src/tests/planner/stretchFabricParity.test.d.ts +3 -0
- package/build/types/web-planner-react/src/tests/planner/stretchFabricParity.test.d.ts.map +1 -0
- package/build/types/web-planner-react/src/utils/rtvNext.d.ts +21 -0
- package/build/types/web-planner-react/src/utils/rtvNext.d.ts.map +1 -0
- package/build/umd/1219.diva-web-planner-react.umd.min.js +2 -0
- package/build/umd/1219.diva-web-planner-react.umd.min.js.LICENSE.txt +1 -0
- package/build/umd/1316.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/1492.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/1902.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/1932.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/1936.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/2568.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/2794.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/282.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/2939.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/2994.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/3596.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/4529.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/7020.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/7118.diva-web-planner-react.umd.min.js +2 -0
- package/build/umd/7118.diva-web-planner-react.umd.min.js.LICENSE.txt +1 -0
- package/build/umd/7442.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/7909.diva-web-planner-react.umd.min.js +2 -0
- package/build/umd/7909.diva-web-planner-react.umd.min.js.LICENSE.txt +1 -0
- package/build/umd/8445.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/8616.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/8701.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/8759.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/9054.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/9339.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/9446.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/9583.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/9679.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/9715.diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/diva-web-planner-react.umd.min.js +1 -1
- package/build/umd/report.html +1 -1
- package/package.json +16 -10
- package/build/esm/index-05e1fe0a.js +0 -99
- package/build/umd/8332.diva-web-planner-react.umd.min.js +0 -2
- package/build/umd/8332.diva-web-planner-react.umd.min.js.LICENSE.txt +0 -1
- package/build/umd/8757.diva-web-planner-react.umd.min.js +0 -2
- package/build/umd/8757.diva-web-planner-react.umd.min.js.LICENSE.txt +0 -1
|
@@ -0,0 +1,965 @@
|
|
|
1
|
+
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
3
|
+
import { u as useViewHandler, g as useRTVAnalyzerComponentsFromPlanner, h as registerRtvNextViewer } from './index-cb3f6a27.js';
|
|
4
|
+
import { useRef, useEffect, useMemo } from 'react';
|
|
5
|
+
import { observer } from 'mobx-react-lite';
|
|
6
|
+
import { getLogger, useDivaCore } from '@crystaldesign/diva-core';
|
|
7
|
+
import RealTimeRendererNext, { emitConfig, ENVIRONMENT_CONFIG, useRTVStore, WHITE_ROOM_PRESET } from '@crystaldesign/real-time-viewer-next';
|
|
8
|
+
import { bootMark } from '@crystaldesign/web-planner-logic';
|
|
9
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
10
|
+
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
11
|
+
import _regeneratorRuntime from '@babel/runtime/regenerator';
|
|
12
|
+
import { jsx } from 'react/jsx-runtime';
|
|
13
|
+
import 'react-dynamic-multi-render';
|
|
14
|
+
import '@babel/runtime/helpers/objectWithoutProperties';
|
|
15
|
+
import '@babel/runtime/helpers/classCallCheck';
|
|
16
|
+
import '@babel/runtime/helpers/createClass';
|
|
17
|
+
import '@crystaldesign/diva-utils';
|
|
18
|
+
import 'mobx';
|
|
19
|
+
import 'classnames';
|
|
20
|
+
import 'qrcode.react';
|
|
21
|
+
import '@babel/runtime/helpers/typeof';
|
|
22
|
+
import 'flat';
|
|
23
|
+
import 'react-switch';
|
|
24
|
+
import 'react-countup';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Host-side accessory placement mode for the rtv-next planner. Single source of truth shared by the
|
|
28
|
+
* viewer host (passed into `uiConfig.accessoryPlacement`) and the accessory palette (which collapses
|
|
29
|
+
* variant families to one entry only in `autoPlaceDrag`). Flip to `'cellBoxes'` for the legacy
|
|
30
|
+
* click-to-place behavior.
|
|
31
|
+
*/
|
|
32
|
+
var ACCESSORY_PLACEMENT_MODE = 'autoPlaceDrag';
|
|
33
|
+
|
|
34
|
+
function _createForOfIteratorHelper$1(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$1(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
35
|
+
function _unsupportedIterableToArray$1(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$1(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$1(r, a) : void 0; } }
|
|
36
|
+
function _arrayLikeToArray$1(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
37
|
+
function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
38
|
+
function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
39
|
+
var LOG = getLogger('Planner', 'CreateImageShot');
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Fallback defaults for {@link CreateImageConfig} — overridden field-wise by the active RTV
|
|
43
|
+
* preset's `createImage` section, which in turn is overridden by the host's `createImageConfig`
|
|
44
|
+
* component parameter.
|
|
45
|
+
*/
|
|
46
|
+
var DEFAULTS = {
|
|
47
|
+
/** 4K at the 16:9 proportions of the host's capture stage — supersampled output. */
|
|
48
|
+
width: 3840,
|
|
49
|
+
height: 2160,
|
|
50
|
+
formats: ['png'],
|
|
51
|
+
jpegQuality: 0.92,
|
|
52
|
+
/** Extra render frames before the shutter, covering async label-font and SVG-texture loads. */
|
|
53
|
+
settleFrames: 60,
|
|
54
|
+
/**
|
|
55
|
+
* How long the 2D scene must stay unchanged before it counts as settled — an init with
|
|
56
|
+
* custom measures re-sizes/re-docks elements shortly after the first elements appear.
|
|
57
|
+
*/
|
|
58
|
+
stableMs: 800,
|
|
59
|
+
/** Tight plan framing; the margin leaves room for dimension labels outside the element bounds. */
|
|
60
|
+
cameraPadding: 1.25
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* `initMode: 'CREATE_IMAGE'` — once the 2D plan has settled after planner init, captures it
|
|
64
|
+
* via the rtv-next capture engine and emits a `planImageCreated` event to the host
|
|
65
|
+
* (data: `{ images: PlanImage[] }`, one image per requested format). Fires once per mount.
|
|
66
|
+
*/
|
|
67
|
+
function useCreateImageShot(viewHandler, scene2d, preset) {
|
|
68
|
+
var enabled = viewHandler.configState.initMode === 'CREATE_IMAGE';
|
|
69
|
+
var firedRef = useRef(false);
|
|
70
|
+
|
|
71
|
+
// scene2d is rebuilt every render, so its identity is useless as a settle signal — track content.
|
|
72
|
+
var signature = enabled && scene2d ? scene2d.elements.map(function (e) {
|
|
73
|
+
return "".concat(e.elementId, ":").concat(e.width, "x").concat(e.depth, "@").concat(e.position[0], ",").concat(e.position[1]);
|
|
74
|
+
}).join('|') : '';
|
|
75
|
+
useEffect(function () {
|
|
76
|
+
if (!enabled || !signature || firedRef.current) return;
|
|
77
|
+
var cfg = _objectSpread$1(_objectSpread$1(_objectSpread$1({}, DEFAULTS), preset.createImage), viewHandler.configState.createImageConfig);
|
|
78
|
+
var timer = window.setTimeout(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
79
|
+
var _viewHandler$actions, shot, _yield$useRTVStore$ge, _yield$useRTVStore$ge2, result, images, _iterator, _step, format, dataUrl, _viewHandler$actions2;
|
|
80
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
81
|
+
while (1) switch (_context.prev = _context.next) {
|
|
82
|
+
case 0:
|
|
83
|
+
if (!firedRef.current) {
|
|
84
|
+
_context.next = 2;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
return _context.abrupt("return");
|
|
88
|
+
case 2:
|
|
89
|
+
firedRef.current = true;
|
|
90
|
+
_context.prev = 3;
|
|
91
|
+
shot = {
|
|
92
|
+
id: 'plan-2d',
|
|
93
|
+
viewMode: '2d',
|
|
94
|
+
showGrid: false,
|
|
95
|
+
showDimensionLines: true,
|
|
96
|
+
showPosNr: false,
|
|
97
|
+
environment: _objectSpread$1(_objectSpread$1(_objectSpread$1(_objectSpread$1({}, emitConfig(ENVIRONMENT_CONFIG, useRTVStore.getState().resolvedEnvironment)), cfg.dimensionLineUnit ? {
|
|
98
|
+
dimensionLineUnit: cfg.dimensionLineUnit
|
|
99
|
+
} : {}), cfg.dimensionLineHideUnit !== undefined ? {
|
|
100
|
+
dimensionLineHideUnit: cfg.dimensionLineHideUnit
|
|
101
|
+
} : {}), cfg.dimensionLineColor ? {
|
|
102
|
+
dimensionLineColor: cfg.dimensionLineColor
|
|
103
|
+
} : {}),
|
|
104
|
+
resolution: {
|
|
105
|
+
width: cfg.width,
|
|
106
|
+
height: cfg.height
|
|
107
|
+
},
|
|
108
|
+
camera: {
|
|
109
|
+
padding: cfg.cameraPadding
|
|
110
|
+
},
|
|
111
|
+
// Always capture a lossless PNG master; JPEG variants are re-encoded from it below.
|
|
112
|
+
format: 'png',
|
|
113
|
+
settleFrames: cfg.settleFrames
|
|
114
|
+
};
|
|
115
|
+
_context.next = 7;
|
|
116
|
+
return useRTVStore.getState().captureShots({
|
|
117
|
+
shots: [shot]
|
|
118
|
+
});
|
|
119
|
+
case 7:
|
|
120
|
+
_yield$useRTVStore$ge = _context.sent;
|
|
121
|
+
_yield$useRTVStore$ge2 = _slicedToArray(_yield$useRTVStore$ge, 1);
|
|
122
|
+
result = _yield$useRTVStore$ge2[0];
|
|
123
|
+
if (result) {
|
|
124
|
+
_context.next = 12;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
throw new Error('captureShots returned no result');
|
|
128
|
+
case 12:
|
|
129
|
+
images = [];
|
|
130
|
+
_iterator = _createForOfIteratorHelper$1(cfg.formats);
|
|
131
|
+
_context.prev = 14;
|
|
132
|
+
_iterator.s();
|
|
133
|
+
case 16:
|
|
134
|
+
if ((_step = _iterator.n()).done) {
|
|
135
|
+
_context.next = 31;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
format = _step.value;
|
|
139
|
+
if (!(format === 'jpeg')) {
|
|
140
|
+
_context.next = 24;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
_context.next = 21;
|
|
144
|
+
return reencodeJpeg(result.blob, cfg.jpegQuality);
|
|
145
|
+
case 21:
|
|
146
|
+
_context.t0 = _context.sent;
|
|
147
|
+
_context.next = 27;
|
|
148
|
+
break;
|
|
149
|
+
case 24:
|
|
150
|
+
_context.next = 26;
|
|
151
|
+
return blobToDataUrl(result.blob);
|
|
152
|
+
case 26:
|
|
153
|
+
_context.t0 = _context.sent;
|
|
154
|
+
case 27:
|
|
155
|
+
dataUrl = _context.t0;
|
|
156
|
+
images.push({
|
|
157
|
+
format: format,
|
|
158
|
+
dataUrl: dataUrl,
|
|
159
|
+
width: result.width,
|
|
160
|
+
height: result.height
|
|
161
|
+
});
|
|
162
|
+
case 29:
|
|
163
|
+
_context.next = 16;
|
|
164
|
+
break;
|
|
165
|
+
case 31:
|
|
166
|
+
_context.next = 36;
|
|
167
|
+
break;
|
|
168
|
+
case 33:
|
|
169
|
+
_context.prev = 33;
|
|
170
|
+
_context.t1 = _context["catch"](14);
|
|
171
|
+
_iterator.e(_context.t1);
|
|
172
|
+
case 36:
|
|
173
|
+
_context.prev = 36;
|
|
174
|
+
_iterator.f();
|
|
175
|
+
return _context.finish(36);
|
|
176
|
+
case 39:
|
|
177
|
+
(_viewHandler$actions = viewHandler.actions) === null || _viewHandler$actions === void 0 || _viewHandler$actions.onEvent({
|
|
178
|
+
type: 'planImageCreated',
|
|
179
|
+
data: {
|
|
180
|
+
images: images
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
_context.next = 47;
|
|
184
|
+
break;
|
|
185
|
+
case 42:
|
|
186
|
+
_context.prev = 42;
|
|
187
|
+
_context.t2 = _context["catch"](3);
|
|
188
|
+
LOG.warn('CREATE_IMAGE capture failed', _context.t2);
|
|
189
|
+
// Never leave the host waiting for a `planImageCreated` that can no longer come: report the
|
|
190
|
+
// failure and re-arm, so a later scene change gets another attempt.
|
|
191
|
+
firedRef.current = false;
|
|
192
|
+
(_viewHandler$actions2 = viewHandler.actions) === null || _viewHandler$actions2 === void 0 || _viewHandler$actions2.onEvent({
|
|
193
|
+
type: 'planImageFailed',
|
|
194
|
+
data: {
|
|
195
|
+
message: _context.t2 instanceof Error ? _context.t2.message : String(_context.t2)
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
case 47:
|
|
199
|
+
case "end":
|
|
200
|
+
return _context.stop();
|
|
201
|
+
}
|
|
202
|
+
}, _callee, null, [[3, 42], [14, 33, 36, 39]]);
|
|
203
|
+
})), cfg.stableMs);
|
|
204
|
+
return function () {
|
|
205
|
+
return window.clearTimeout(timer);
|
|
206
|
+
};
|
|
207
|
+
}, [enabled, signature, viewHandler, preset]);
|
|
208
|
+
}
|
|
209
|
+
function blobToDataUrl(blob) {
|
|
210
|
+
return new Promise(function (resolve, reject) {
|
|
211
|
+
var reader = new FileReader();
|
|
212
|
+
reader.onload = function () {
|
|
213
|
+
return resolve(reader.result);
|
|
214
|
+
};
|
|
215
|
+
reader.onerror = function () {
|
|
216
|
+
var _reader$error;
|
|
217
|
+
return reject((_reader$error = reader.error) !== null && _reader$error !== void 0 ? _reader$error : new Error('Failed to read image blob'));
|
|
218
|
+
};
|
|
219
|
+
reader.readAsDataURL(blob);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* JPEG has no alpha channel and a direct JPEG read of the (transparent) WebGL canvas would
|
|
225
|
+
* composite onto black — re-encode the PNG master onto a white background instead.
|
|
226
|
+
*/
|
|
227
|
+
function reencodeJpeg(_x, _x2) {
|
|
228
|
+
return _reencodeJpeg.apply(this, arguments);
|
|
229
|
+
}
|
|
230
|
+
function _reencodeJpeg() {
|
|
231
|
+
_reencodeJpeg = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(pngBlob, quality) {
|
|
232
|
+
var bitmap, canvas, ctx;
|
|
233
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
234
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
235
|
+
case 0:
|
|
236
|
+
_context2.next = 2;
|
|
237
|
+
return createImageBitmap(pngBlob);
|
|
238
|
+
case 2:
|
|
239
|
+
bitmap = _context2.sent;
|
|
240
|
+
canvas = document.createElement('canvas');
|
|
241
|
+
canvas.width = bitmap.width;
|
|
242
|
+
canvas.height = bitmap.height;
|
|
243
|
+
ctx = canvas.getContext('2d');
|
|
244
|
+
if (ctx) {
|
|
245
|
+
_context2.next = 9;
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
throw new Error('2D canvas context unavailable for JPEG encoding');
|
|
249
|
+
case 9:
|
|
250
|
+
ctx.fillStyle = '#ffffff';
|
|
251
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
252
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
253
|
+
bitmap.close();
|
|
254
|
+
return _context2.abrupt("return", canvas.toDataURL('image/jpeg', quality));
|
|
255
|
+
case 14:
|
|
256
|
+
case "end":
|
|
257
|
+
return _context2.stop();
|
|
258
|
+
}
|
|
259
|
+
}, _callee2);
|
|
260
|
+
}));
|
|
261
|
+
return _reencodeJpeg.apply(this, arguments);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
265
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
266
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
267
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
268
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
269
|
+
var PLANNER_TAB_GROUP_TYPES = new Set(['PLANNER', 'ACC_PLANNER', 'PLANNER_2.0']);
|
|
270
|
+
|
|
271
|
+
// Accessory docking-point types rendered as attach/remove buttons in the 2D viewer (old planner's
|
|
272
|
+
// `addDPUI` ACC branch — AVL/AVR are the side-copy buttons, handled separately).
|
|
273
|
+
var ACC_DP_TYPES = new Set(['AVO', 'AVU', 'AVC', 'AVN', 'AVS']);
|
|
274
|
+
|
|
275
|
+
// Environment config (lighting / HDRI / dome / post-processing / selection look) comes from ONE
|
|
276
|
+
// channel: the preset — catalog RTV_PRESET meta tag when present, else WHITE_ROOM_PRESET — passed
|
|
277
|
+
// via `config.profiles` below. With ?rtv-debug mounted, the analyzer preset channel overrides it.
|
|
278
|
+
|
|
279
|
+
// Shelf-accessory placement UX. `cellBoxes` = current click-a-box-to-place. `autoPlaceDrag` =
|
|
280
|
+
/** No catalog config → the viewer draws its default dimensions, no annotations. */
|
|
281
|
+
var EMPTY_DIMENSION_CONFIGS = {};
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Per-article 2D dimension/annotation config: the catalog-level DIMENSION_CONFIG meta tag
|
|
285
|
+
* (ONE dictionary keyed by articleCodex, JSON). Absent → no per-article overrides. Entries are consumed structurally — the tag's JSON mirrors
|
|
286
|
+
* {@link ArticleDimensionMeta}.
|
|
287
|
+
*/
|
|
288
|
+
function getDimensionConfigs(viewHandler) {
|
|
289
|
+
var _viewHandler$divaWebP, _ref;
|
|
290
|
+
var fromCatalog = (_viewHandler$divaWebP = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP === void 0 ? void 0 : _viewHandler$divaWebP.dimensionConfig2D;
|
|
291
|
+
return (_ref = fromCatalog) !== null && _ref !== void 0 ? _ref : EMPTY_DIMENSION_CONFIGS;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Resolves `{...}` placeholders in a dimension-config label via the article template engine
|
|
296
|
+
* (`convertTemplateToCodex`, same syntax as supplierOrderCodex templates) — e.g.
|
|
297
|
+
* `widthPrefix: '{2300.vCodex}x'` → "6x".
|
|
298
|
+
*/
|
|
299
|
+
function resolveOptionPlaceholders(viewHandler, basketId, text) {
|
|
300
|
+
var _viewHandler$divaWebP2;
|
|
301
|
+
if (!text || !text.includes('{')) return text;
|
|
302
|
+
return (_viewHandler$divaWebP2 = viewHandler.divaWebPlanner.convertTemplateToCodex(basketId, text)) !== null && _viewHandler$divaWebP2 !== void 0 ? _viewHandler$divaWebP2 : text;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Translates the planner's `plannedElementsDict` into the viewer's 2D scene. `isPoolPlanning` is
|
|
307
|
+
* reported alongside it because it falls out of the same per-element dimension-config lookup: a
|
|
308
|
+
* planning whose articles carry a dimension config is a static drawing (pool plan).
|
|
309
|
+
*/
|
|
310
|
+
function buildScene2D(viewHandler) {
|
|
311
|
+
var _viewHandler$divaWebP3;
|
|
312
|
+
var fontUrl = (_viewHandler$divaWebP3 = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP3 === void 0 ? void 0 : _viewHandler$divaWebP3.plan2DFontUrl;
|
|
313
|
+
var dict = viewHandler.viewPlannerHandler.plannedElementsDict;
|
|
314
|
+
if (!dict || dict.size === 0) return {
|
|
315
|
+
isPoolPlanning: false
|
|
316
|
+
};
|
|
317
|
+
var dimConfigs = getDimensionConfigs(viewHandler);
|
|
318
|
+
var isPoolPlanning = false;
|
|
319
|
+
var elements = [];
|
|
320
|
+
var minX = Infinity,
|
|
321
|
+
minZ = Infinity,
|
|
322
|
+
maxX = -Infinity,
|
|
323
|
+
maxZ = -Infinity;
|
|
324
|
+
dict.forEach(function (plannerElements, setId) {
|
|
325
|
+
var _iterator = _createForOfIteratorHelper(plannerElements),
|
|
326
|
+
_step;
|
|
327
|
+
try {
|
|
328
|
+
var _loop = function _loop() {
|
|
329
|
+
var _pe$getGlobalWidth, _pe$getGlobalDepth, _dimMeta$annotations, _dimMeta$zLayer;
|
|
330
|
+
var pe = _step.value;
|
|
331
|
+
var center = pe.getWorldPosCenter();
|
|
332
|
+
// getSVGData() is the full OLF SVG and getGlobalWidth()/Depth() (ignoreOLF=false) are the OLF
|
|
333
|
+
// footprint size, so the plane is OLF-sized. getWorldPosCenter() is the OLF centre (see
|
|
334
|
+
// PlannerElementData.getWorldPosCornerOLF), so the plane sits on `position` directly — no pivot
|
|
335
|
+
// offset. Using the OLT size here (oltW/2 - w/2) mis-placed elements whose OLF differs from their
|
|
336
|
+
// OLT (e.g. a sofa's leg extension). The old real-time-viewer likewise centred the OLF shape on
|
|
337
|
+
// worldPosCenter with no OLT offset (Planner2DGrid.updatePlannerView).
|
|
338
|
+
var w = (_pe$getGlobalWidth = pe.getGlobalWidth()) !== null && _pe$getGlobalWidth !== void 0 ? _pe$getGlobalWidth : 0;
|
|
339
|
+
var d = (_pe$getGlobalDepth = pe.getGlobalDepth()) !== null && _pe$getGlobalDepth !== void 0 ? _pe$getGlobalDepth : 0;
|
|
340
|
+
var svgRaw = pe.getSVGData();
|
|
341
|
+
var h = pe.getHeightOLT();
|
|
342
|
+
|
|
343
|
+
// Accessory docking-point buttons. `LocalWorldPos` is OLF-corner-relative (cm) and the corner
|
|
344
|
+
// sits at the element centre + (-w/2, -d/2) in the unrotated frame, so the offset from the centre
|
|
345
|
+
// is `LocalWorldPos - (w/2, d/2)`. The viewer rotates it with the element. Skip a docked point on
|
|
346
|
+
// an element that is itself a docked accessory (mirrors Planner2DGrid.addDPUI).
|
|
347
|
+
var isDockedAcc = pe.getIsDockedAccessoire();
|
|
348
|
+
var dockingButtons = [];
|
|
349
|
+
var dockingPointsDebug = [];
|
|
350
|
+
var _iterator2 = _createForOfIteratorHelper(pe.getAllDockingPoints()),
|
|
351
|
+
_step2;
|
|
352
|
+
try {
|
|
353
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
354
|
+
var dp = _step2.value;
|
|
355
|
+
dockingPointsDebug.push({
|
|
356
|
+
dpId: dp.DpId,
|
|
357
|
+
type: dp.Type,
|
|
358
|
+
localOffset: [dp.LocalWorldPos.x - w / 2, dp.LocalWorldPos.z - d / 2],
|
|
359
|
+
rotDeg: dp.RotDeg,
|
|
360
|
+
isDocking: dp.IsDocking,
|
|
361
|
+
onElementId: dp.OnElementId,
|
|
362
|
+
number: dp.HasNumber ? dp.Number : undefined
|
|
363
|
+
});
|
|
364
|
+
if (!ACC_DP_TYPES.has(dp.Type)) continue;
|
|
365
|
+
if (dp.IsDocking && isDockedAcc) continue;
|
|
366
|
+
dockingButtons.push({
|
|
367
|
+
dpId: dp.DpId,
|
|
368
|
+
localOffset: [dp.LocalWorldPos.x - w / 2, dp.LocalWorldPos.z - d / 2],
|
|
369
|
+
iconRotDeg: dp.RotDeg,
|
|
370
|
+
isDocking: dp.IsDocking,
|
|
371
|
+
onElementId: dp.OnElementId
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// OLT/OLF outlines for the analyzer's "Analyze OLT/OLF" overlay: the planner's world-space
|
|
376
|
+
// polygons (the exact geometry collision/placement uses) mapped back into the element-local
|
|
377
|
+
// unrotated frame around `center` — the inverse of Vector2.rotateOrigin(+RotDeg) + corner offset.
|
|
378
|
+
} catch (err) {
|
|
379
|
+
_iterator2.e(err);
|
|
380
|
+
} finally {
|
|
381
|
+
_iterator2.f();
|
|
382
|
+
}
|
|
383
|
+
var rotRad = pe.getRotDeg() * Math.PI / 180;
|
|
384
|
+
var rotCos = Math.cos(rotRad);
|
|
385
|
+
var rotSin = Math.sin(rotRad);
|
|
386
|
+
var toLocalOutline = function toLocalOutline(poly) {
|
|
387
|
+
return poly.map(function (p) {
|
|
388
|
+
var dx = p.x - center.x;
|
|
389
|
+
var dz = p.y - center.z;
|
|
390
|
+
return [dx * rotCos + dz * rotSin, -dx * rotSin + dz * rotCos];
|
|
391
|
+
});
|
|
392
|
+
};
|
|
393
|
+
var oltWorld = pe.getOLTPolygonWorldPos();
|
|
394
|
+
var olfWorld = pe.getOLFPolygonWorldPos();
|
|
395
|
+
var outlinesDebug = oltWorld.length > 0 || olfWorld.length > 0 ? _objectSpread(_objectSpread({}, oltWorld.length > 0 ? {
|
|
396
|
+
olt: toLocalOutline(oltWorld)
|
|
397
|
+
} : {}), olfWorld.length > 0 ? {
|
|
398
|
+
olf: toLocalOutline(olfWorld)
|
|
399
|
+
} : {}) : undefined;
|
|
400
|
+
var dimMeta = dimConfigs[pe.ArticleCodex];
|
|
401
|
+
if (dimMeta != null) isPoolPlanning = true;
|
|
402
|
+
|
|
403
|
+
// Option-driven label texts: `{optionCodex}` placeholders in prefixes/postfixes and
|
|
404
|
+
// annotation texts resolve against the element's article options.
|
|
405
|
+
var resolveText = function resolveText(t) {
|
|
406
|
+
return resolveOptionPlaceholders(viewHandler, pe.getBasketId(), t);
|
|
407
|
+
};
|
|
408
|
+
var rawCfg = dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.dimensionConfig;
|
|
409
|
+
var dimensionConfig = rawCfg && [rawCfg.widthPrefix, rawCfg.widthPostfix, rawCfg.depthPrefix, rawCfg.depthPostfix].some(function (t) {
|
|
410
|
+
return t === null || t === void 0 ? void 0 : t.includes('{');
|
|
411
|
+
}) ? _objectSpread(_objectSpread({}, rawCfg), {}, {
|
|
412
|
+
widthPrefix: resolveText(rawCfg.widthPrefix),
|
|
413
|
+
widthPostfix: resolveText(rawCfg.widthPostfix),
|
|
414
|
+
depthPrefix: resolveText(rawCfg.depthPrefix),
|
|
415
|
+
depthPostfix: resolveText(rawCfg.depthPostfix)
|
|
416
|
+
}) : rawCfg;
|
|
417
|
+
var annotations = dimMeta !== null && dimMeta !== void 0 && (_dimMeta$annotations = dimMeta.annotations) !== null && _dimMeta$annotations !== void 0 && _dimMeta$annotations.some(function (a) {
|
|
418
|
+
return a.text.includes('{');
|
|
419
|
+
}) ? dimMeta.annotations.map(function (a) {
|
|
420
|
+
var _resolveText;
|
|
421
|
+
return _objectSpread(_objectSpread({}, a), {}, {
|
|
422
|
+
text: (_resolveText = resolveText(a.text)) !== null && _resolveText !== void 0 ? _resolveText : a.text
|
|
423
|
+
});
|
|
424
|
+
}) : dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.annotations;
|
|
425
|
+
elements.push({
|
|
426
|
+
name: "Element".concat(pe.getElementId()),
|
|
427
|
+
setId: setId,
|
|
428
|
+
elementId: pe.getElementId(),
|
|
429
|
+
position: [center.x, center.z],
|
|
430
|
+
pivotOffset: [0, 0],
|
|
431
|
+
rotation: pe.getRotDeg(),
|
|
432
|
+
width: w,
|
|
433
|
+
depth: d,
|
|
434
|
+
svgDataUrl: svgRaw ? "data:image/svg+xml;base64,".concat(btoa(unescape(encodeURIComponent(svgRaw)))) : undefined,
|
|
435
|
+
height: h > 0 ? h : undefined,
|
|
436
|
+
dockingButtons: dockingButtons.length > 0 ? dockingButtons : undefined,
|
|
437
|
+
dockingPointsDebug: dockingPointsDebug.length > 0 ? dockingPointsDebug : undefined,
|
|
438
|
+
outlinesDebug: outlinesDebug,
|
|
439
|
+
zLayer: (_dimMeta$zLayer = dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.zLayer) !== null && _dimMeta$zLayer !== void 0 ? _dimMeta$zLayer : pe.getLayer(),
|
|
440
|
+
opacity: dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.opacity,
|
|
441
|
+
dimensionConfig: dimensionConfig,
|
|
442
|
+
annotations: annotations
|
|
443
|
+
});
|
|
444
|
+
var halfW = w / 2;
|
|
445
|
+
var halfD = d / 2;
|
|
446
|
+
minX = Math.min(minX, center.x - halfW);
|
|
447
|
+
maxX = Math.max(maxX, center.x + halfW);
|
|
448
|
+
minZ = Math.min(minZ, center.z - halfD);
|
|
449
|
+
maxZ = Math.max(maxZ, center.z + halfD);
|
|
450
|
+
};
|
|
451
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
452
|
+
_loop();
|
|
453
|
+
}
|
|
454
|
+
} catch (err) {
|
|
455
|
+
_iterator.e(err);
|
|
456
|
+
} finally {
|
|
457
|
+
_iterator.f();
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
if (elements.length === 0) return {
|
|
461
|
+
isPoolPlanning: isPoolPlanning
|
|
462
|
+
};
|
|
463
|
+
var dockingGroups = buildDockingGroups(dict);
|
|
464
|
+
return {
|
|
465
|
+
scene2d: _objectSpread(_objectSpread({
|
|
466
|
+
elements: elements,
|
|
467
|
+
boundingBox: {
|
|
468
|
+
x: (minX + maxX) / 2,
|
|
469
|
+
z: (minZ + maxZ) / 2,
|
|
470
|
+
width: maxX - minX,
|
|
471
|
+
depth: maxZ - minZ
|
|
472
|
+
}
|
|
473
|
+
}, fontUrl ? {
|
|
474
|
+
fontUrl: fontUrl
|
|
475
|
+
} : {}), dockingGroups.length > 0 ? {
|
|
476
|
+
dockingGroups: dockingGroups
|
|
477
|
+
} : {}),
|
|
478
|
+
isPoolPlanning: isPoolPlanning
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/** Union-find on docking points to discover connected element groups. */
|
|
483
|
+
function buildDockingGroups(dict) {
|
|
484
|
+
var parent = new Map();
|
|
485
|
+
function find(x) {
|
|
486
|
+
var root = x;
|
|
487
|
+
while (parent.get(root) !== root) root = parent.get(root);
|
|
488
|
+
var cur = x;
|
|
489
|
+
while (cur !== root) {
|
|
490
|
+
var next = parent.get(cur);
|
|
491
|
+
parent.set(cur, root);
|
|
492
|
+
cur = next;
|
|
493
|
+
}
|
|
494
|
+
return root;
|
|
495
|
+
}
|
|
496
|
+
function union(a, b) {
|
|
497
|
+
var ra = find(a);
|
|
498
|
+
var rb = find(b);
|
|
499
|
+
if (ra !== rb) parent.set(ra, rb);
|
|
500
|
+
}
|
|
501
|
+
dict.forEach(function (plannerElements) {
|
|
502
|
+
var _iterator3 = _createForOfIteratorHelper(plannerElements),
|
|
503
|
+
_step3;
|
|
504
|
+
try {
|
|
505
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
506
|
+
var pe = _step3.value;
|
|
507
|
+
var elId = pe.getElementId();
|
|
508
|
+
if (!parent.has(elId)) parent.set(elId, elId);
|
|
509
|
+
var _iterator4 = _createForOfIteratorHelper(pe.getDockingPoints()),
|
|
510
|
+
_step4;
|
|
511
|
+
try {
|
|
512
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
513
|
+
var dp = _step4.value;
|
|
514
|
+
if (dp.IsDocking && dp.OnElementId != null) {
|
|
515
|
+
var targetId = dp.OnElementId;
|
|
516
|
+
if (!parent.has(targetId)) parent.set(targetId, targetId);
|
|
517
|
+
union(elId, targetId);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
} catch (err) {
|
|
521
|
+
_iterator4.e(err);
|
|
522
|
+
} finally {
|
|
523
|
+
_iterator4.f();
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
} catch (err) {
|
|
527
|
+
_iterator3.e(err);
|
|
528
|
+
} finally {
|
|
529
|
+
_iterator3.f();
|
|
530
|
+
}
|
|
531
|
+
});
|
|
532
|
+
var groups = new Map();
|
|
533
|
+
var _iterator5 = _createForOfIteratorHelper(parent.keys()),
|
|
534
|
+
_step5;
|
|
535
|
+
try {
|
|
536
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
537
|
+
var id = _step5.value;
|
|
538
|
+
var root = find(id);
|
|
539
|
+
var group = groups.get(root);
|
|
540
|
+
if (!group) {
|
|
541
|
+
group = [];
|
|
542
|
+
groups.set(root, group);
|
|
543
|
+
}
|
|
544
|
+
group.push(id);
|
|
545
|
+
}
|
|
546
|
+
} catch (err) {
|
|
547
|
+
_iterator5.e(err);
|
|
548
|
+
} finally {
|
|
549
|
+
_iterator5.f();
|
|
550
|
+
}
|
|
551
|
+
return _toConsumableArray(groups.values()).filter(function (g) {
|
|
552
|
+
return g.length > 1;
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Phase 6 plumbing: build per-element overlay info from `plannedElementsDict`
|
|
558
|
+
* + `articleInfos`. The "selected" overlay state is sourced from
|
|
559
|
+
* `productState.rtvSelectedElementId` (planner truth) — `articleInfos.isActive`
|
|
560
|
+
* is only consulted for `posNr` / `canDelete` metadata so that a configurator
|
|
561
|
+
* lag after canvas deselect does not paint a deselected element as selected.
|
|
562
|
+
*/
|
|
563
|
+
function buildElementsInfoFromArticles(viewHandler) {
|
|
564
|
+
var _viewHandler$tabGroup, _viewHandler$divaWebP4, _viewHandler$tabGroup3;
|
|
565
|
+
// Keyed by the composite element key (`shelfElementId`): `"2"` for mains, `"2.0.6"` for
|
|
566
|
+
// accessories — matches what rtv-next parses from the 3D node name.
|
|
567
|
+
var map = new Map();
|
|
568
|
+
var articleInfos = viewHandler.settingsState.articleInfos;
|
|
569
|
+
var dict = viewHandler.viewPlannerHandler.plannedElementsDict;
|
|
570
|
+
var selectedElementId = viewHandler.productState.rtvSelectedElementId;
|
|
571
|
+
// In the shelf-planner step planning targets ALL corpora, so no main article is pickable (the
|
|
572
|
+
// corpus is navigated context → `active`: no hover, click is a no-op) and the shelf accessories
|
|
573
|
+
// are the only selectable things. Outside the step a shelf accessory is only pickable when the
|
|
574
|
+
// current configStep makes it configurable (`article.isActive`); otherwise it's inert and clicks/
|
|
575
|
+
// hover fall through to the parent corpus (`unselectable` → walk-to-ancestor in rtv-next).
|
|
576
|
+
var isShelfStep = ((_viewHandler$tabGroup = viewHandler.tabGroupState.curTabGroup) === null || _viewHandler$tabGroup === void 0 ? void 0 : _viewHandler$tabGroup.type) === 'SHELFPLANNER';
|
|
577
|
+
|
|
578
|
+
// AVL/AVR element copy (catalog property ELEMENT_COPY_AVLR): copy buttons on the selected
|
|
579
|
+
// standard-planner element that plan a copy docked at its free AVL/AVR docking point. `true`
|
|
580
|
+
// enables them in planner steps; a list of option codexes additionally enables them while one
|
|
581
|
+
// of those option steps is visited (the configurator-selected element is the copy source).
|
|
582
|
+
var inPlannerStep = function (_viewHandler$tabGroup2) {
|
|
583
|
+
var t = (_viewHandler$tabGroup2 = viewHandler.tabGroupState.curTabGroup) === null || _viewHandler$tabGroup2 === void 0 ? void 0 : _viewHandler$tabGroup2.type;
|
|
584
|
+
return t != null && PLANNER_TAB_GROUP_TYPES.has(t);
|
|
585
|
+
}();
|
|
586
|
+
var copyAVLRCfg = (_viewHandler$divaWebP4 = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP4 === void 0 ? void 0 : _viewHandler$divaWebP4.elementCopyAVLR;
|
|
587
|
+
var curOptionCodex = (_viewHandler$tabGroup3 = viewHandler.tabGroupState.curOption) === null || _viewHandler$tabGroup3 === void 0 ? void 0 : _viewHandler$tabGroup3.codex;
|
|
588
|
+
var avlrCopyEnabled = copyAVLRCfg != null && (inPlannerStep || Array.isArray(copyAVLRCfg) && curOptionCodex != null && copyAVLRCfg.includes(curOptionCodex));
|
|
589
|
+
|
|
590
|
+
// State for a single article entry, applying the step-aware accessory/corpus gating above.
|
|
591
|
+
// Accessory selection is NOT tracked by the numeric `selectedElementId` (rtv-next drives the
|
|
592
|
+
// accessory outline locally + via `selectedAccessoryKey`), so only mains resolve to `selected`.
|
|
593
|
+
var resolveState = function resolveState(elementId, isActive, isShelfAccessoire) {
|
|
594
|
+
if (isShelfAccessoire) {
|
|
595
|
+
if (isShelfStep) return 'selectable';
|
|
596
|
+
return isActive ? 'selectable' : 'unselectable';
|
|
597
|
+
}
|
|
598
|
+
// Main / corpus: never hover- or select-able while planning all corpora in the shelf step.
|
|
599
|
+
if (isShelfStep) return 'active';
|
|
600
|
+
if (elementId !== undefined && selectedElementId === elementId) return 'selected';
|
|
601
|
+
return isActive ? 'active' : 'selectable';
|
|
602
|
+
};
|
|
603
|
+
var articleByElementId = new Map();
|
|
604
|
+
for (var _i = 0, _Object$keys = Object.keys(articleInfos); _i < _Object$keys.length; _i++) {
|
|
605
|
+
var key = _Object$keys[_i];
|
|
606
|
+
var a = articleInfos[key];
|
|
607
|
+
if (a.elementId !== undefined) {
|
|
608
|
+
articleByElementId.set(a.elementId, {
|
|
609
|
+
setId: a.setId,
|
|
610
|
+
posNr: String(a.posNr),
|
|
611
|
+
isActive: a.isActive,
|
|
612
|
+
canDelete: a.isActive,
|
|
613
|
+
isShelfAccessoire: !!a.isShelfAccessoire,
|
|
614
|
+
shelfElementId: a.shelfElementId
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
if (dict) {
|
|
619
|
+
dict.forEach(function (plannerElements, setId) {
|
|
620
|
+
var _iterator6 = _createForOfIteratorHelper(plannerElements),
|
|
621
|
+
_step6;
|
|
622
|
+
try {
|
|
623
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
624
|
+
var _article$shelfElement, _article$setId, _article$canDelete;
|
|
625
|
+
var pe = _step6.value;
|
|
626
|
+
var elementId = pe.getElementId();
|
|
627
|
+
var parentElementId = pe.getParentElementId();
|
|
628
|
+
var article = articleByElementId.get(elementId);
|
|
629
|
+
var isBox = pe.getPlannerType() === 'BOX';
|
|
630
|
+
var canCopyLeft = void 0;
|
|
631
|
+
var canCopyRight = void 0;
|
|
632
|
+
var canCopyTop = void 0;
|
|
633
|
+
var copyAlwaysVisible = void 0;
|
|
634
|
+
if (isBox) {
|
|
635
|
+
// Not step-gated: box catalogs hide the planner step entirely, so box planning happens via
|
|
636
|
+
// these buttons during option steps. The viewer shows them on the selected element only.
|
|
637
|
+
canCopyLeft = true;
|
|
638
|
+
canCopyRight = true;
|
|
639
|
+
var avoDP = pe.getFreeDockingPointByTypeAndNumber('AVO', 1);
|
|
640
|
+
canCopyTop = avoDP != null && !avoDP.IsDisabled;
|
|
641
|
+
} else if (avlrCopyEnabled && parentElementId == null && !(article !== null && article !== void 0 && article.isShelfAccessoire)) {
|
|
642
|
+
canCopyLeft = pe.getFreeDockingPointsByType('AVL').some(function (dp) {
|
|
643
|
+
return !dp.IsDisabled;
|
|
644
|
+
});
|
|
645
|
+
canCopyRight = pe.getFreeDockingPointsByType('AVR').some(function (dp) {
|
|
646
|
+
return !dp.IsDisabled;
|
|
647
|
+
});
|
|
648
|
+
copyAlwaysVisible = true;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
// `isActive` is computed per-context by the logic layer (loadPaletteInfos) and is exactly
|
|
652
|
+
// what drives the planner header's active badges: planner mode → none active (all selectable);
|
|
653
|
+
// shelf mode → the navigated main group is active; configStep → the current choice is active,
|
|
654
|
+
// alternatives are selectable. `resolveState` layers the step-aware accessory/corpus gating
|
|
655
|
+
// on top (see its definition above).
|
|
656
|
+
var state = !article ? 'unselectable' : resolveState(elementId, article.isActive, !!article.isShelfAccessoire);
|
|
657
|
+
|
|
658
|
+
// Element-type taxonomy. `isShelfAccessoire` comes from articleInfos (logic layer); box/
|
|
659
|
+
// accessoire are detectable from the planner element.
|
|
660
|
+
var type = article !== null && article !== void 0 && article.isShelfAccessoire ? 'shelfAccessoire' : isBox ? 'boxElement' : parentElementId != null ? 'accessoire' : 'planned';
|
|
661
|
+
map.set((_article$shelfElement = article === null || article === void 0 ? void 0 : article.shelfElementId) !== null && _article$shelfElement !== void 0 ? _article$shelfElement : String(elementId), {
|
|
662
|
+
setId: (_article$setId = article === null || article === void 0 ? void 0 : article.setId) !== null && _article$setId !== void 0 ? _article$setId : setId,
|
|
663
|
+
posNr: article === null || article === void 0 ? void 0 : article.posNr,
|
|
664
|
+
state: state,
|
|
665
|
+
type: type,
|
|
666
|
+
articleCodex: pe.ArticleCodex,
|
|
667
|
+
// Shelf accessories are deletable; an AVL/AVR-copy element (ELEMENT_COPY_AVLR) is a planned
|
|
668
|
+
// main you can copy right there, so it's deletable too. All other mains keep the
|
|
669
|
+
// active/selectable canDelete signal.
|
|
670
|
+
canDelete: article !== null && article !== void 0 && article.isShelfAccessoire || copyAlwaysVisible ? true : (_article$canDelete = article === null || article === void 0 ? void 0 : article.canDelete) !== null && _article$canDelete !== void 0 ? _article$canDelete : false,
|
|
671
|
+
parentElementId: parentElementId,
|
|
672
|
+
canCopyLeft: canCopyLeft,
|
|
673
|
+
canCopyRight: canCopyRight,
|
|
674
|
+
canCopyTop: canCopyTop,
|
|
675
|
+
copyAlwaysVisible: copyAlwaysVisible
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
} catch (err) {
|
|
679
|
+
_iterator6.e(err);
|
|
680
|
+
} finally {
|
|
681
|
+
_iterator6.f();
|
|
682
|
+
}
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// Shelf accessories that aren't planner elements (absent from plannedElementsDict) still need an
|
|
687
|
+
// overlay entry — add them straight from articleInfos, keyed by their composite `shelfElementId`
|
|
688
|
+
// (e.g. "2.0.6"), which is what rtv-next parses from the accessory's node name. Their selectability
|
|
689
|
+
// is step-gated identically to the dict path (`resolveState`).
|
|
690
|
+
for (var _i2 = 0, _Object$keys2 = Object.keys(articleInfos); _i2 < _Object$keys2.length; _i2++) {
|
|
691
|
+
var _key = _Object$keys2[_i2];
|
|
692
|
+
var _a = articleInfos[_key];
|
|
693
|
+
if (!_a.isShelfAccessoire || !_a.shelfElementId || map.has(_a.shelfElementId)) continue;
|
|
694
|
+
map.set(_a.shelfElementId, {
|
|
695
|
+
setId: _a.setId,
|
|
696
|
+
posNr: String(_a.posNr),
|
|
697
|
+
state: resolveState(_a.elementId, _a.isActive, true),
|
|
698
|
+
type: 'shelfAccessoire',
|
|
699
|
+
canDelete: true
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
return map;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/**
|
|
706
|
+
* Resolve an accessory's composite ref (parent/grid/cell, recursion-safe) to the basket ids the
|
|
707
|
+
* paletteViewHandler needs: the parent shelf basket (for delete) and the accessory's own basket +
|
|
708
|
+
* codex (for select). Looks up `plannedPlacesOnGrids` by the parent element key + grid idx + cell.
|
|
709
|
+
*/
|
|
710
|
+
function resolveAccessoryTargets(viewHandler, ref) {
|
|
711
|
+
var _viewHandler$settings;
|
|
712
|
+
// `plannedPlacesOnGrids[].elementId` is the `E`-prefixed form ("E1"); the composite key from
|
|
713
|
+
// `shelfElementId`/`parseElementKey` is the bare form ("1"). Strip the leading `E` to match.
|
|
714
|
+
var parent = (_viewHandler$settings = viewHandler.settingsState.plannedPlacesOnGrids) === null || _viewHandler$settings === void 0 ? void 0 : _viewHandler$settings.find(function (p) {
|
|
715
|
+
var _p$elementId;
|
|
716
|
+
return ((_p$elementId = p.elementId) !== null && _p$elementId !== void 0 ? _p$elementId : '').replace(/^E/, '') === ref.parentElementKey;
|
|
717
|
+
});
|
|
718
|
+
if (!parent) return null;
|
|
719
|
+
var accBasketId;
|
|
720
|
+
var accCodex;
|
|
721
|
+
var gridName;
|
|
722
|
+
for (var _i3 = 0, _Object$keys3 = Object.keys(parent.grids); _i3 < _Object$keys3.length; _i3++) {
|
|
723
|
+
var name = _Object$keys3[_i3];
|
|
724
|
+
var g = parent.grids[name];
|
|
725
|
+
if (g.idx !== ref.gridId) continue;
|
|
726
|
+
gridName = name;
|
|
727
|
+
var acc = g.accessories.find(function (a) {
|
|
728
|
+
return a.index === ref.cellIdx;
|
|
729
|
+
});
|
|
730
|
+
if (acc) {
|
|
731
|
+
accBasketId = acc.basketId;
|
|
732
|
+
accCodex = acc.articleCodex;
|
|
733
|
+
break;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
return {
|
|
737
|
+
parentBasketId: parent.basketId,
|
|
738
|
+
accBasketId: accBasketId,
|
|
739
|
+
accCodex: accCodex,
|
|
740
|
+
gridName: gridName
|
|
741
|
+
};
|
|
742
|
+
}
|
|
743
|
+
var PlannerRTVNext = function PlannerRTVNext() {
|
|
744
|
+
var _scene$isPoolPlanning, _ref2, _viewHandler$divaWebP5, _viewHandler$tabGroup4, _Object$values$find$s, _Object$values$find, _elementsInfo$get;
|
|
745
|
+
var viewHandler = useViewHandler();
|
|
746
|
+
var rtvAnalyzerComponents = useRTVAnalyzerComponentsFromPlanner();
|
|
747
|
+
var _useDivaCore = useDivaCore(),
|
|
748
|
+
_useDivaCore$state = _useDivaCore.state,
|
|
749
|
+
apiConfig = _useDivaCore$state.apiConfig,
|
|
750
|
+
jwt = _useDivaCore$state.jwt,
|
|
751
|
+
actions = _useDivaCore.actions;
|
|
752
|
+
|
|
753
|
+
// Mount effect, not the render body: this is the first moment the viewer component exists in the
|
|
754
|
+
// tree, which is what the boot report needs — the props it reads are re-derived on every render.
|
|
755
|
+
useEffect(function () {
|
|
756
|
+
bootMark('rtv: PlannerRTVNext mounted');
|
|
757
|
+
}, []);
|
|
758
|
+
|
|
759
|
+
// A new render script means the viewer is about to rebuild its scene — show the loading state
|
|
760
|
+
// until `onSceneReady` reports the rebuilt scene as live.
|
|
761
|
+
var prevHQRenderScript = useRef(viewHandler.hqRenderScript);
|
|
762
|
+
useEffect(function () {
|
|
763
|
+
if (viewHandler.hqRenderScript !== prevHQRenderScript.current) {
|
|
764
|
+
prevHQRenderScript.current = viewHandler.hqRenderScript;
|
|
765
|
+
if (viewHandler.hqRenderScript) {
|
|
766
|
+
actions.toggleLoading('RTV_Assembling', false, true);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}, [viewHandler.hqRenderScript, actions]);
|
|
770
|
+
var callbacks = useMemo(function () {
|
|
771
|
+
return {
|
|
772
|
+
onElementSelected: function onElementSelected(setId, elementId) {
|
|
773
|
+
viewHandler.viewPlannerHandler.onElementSelected(setId, elementId);
|
|
774
|
+
},
|
|
775
|
+
onElementDeselected: function onElementDeselected() {
|
|
776
|
+
viewHandler.viewPlannerHandler.onClearElementSelection();
|
|
777
|
+
},
|
|
778
|
+
updatePlannerTrans: function updatePlannerTrans(setId, plannerElementID, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint) {
|
|
779
|
+
viewHandler.divaWebPlanner.updatePlannerTrans(setId, plannerElementID, {
|
|
780
|
+
x: deltaMove.x,
|
|
781
|
+
y: deltaMove.y,
|
|
782
|
+
z: deltaMove.z
|
|
783
|
+
}, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint);
|
|
784
|
+
},
|
|
785
|
+
getDockSnapPreview: function getDockSnapPreview(setId, plannerElementID, autoDockingDistance, excludeElementIds) {
|
|
786
|
+
return viewHandler.divaWebPlanner.getDockSnapPreview(plannerElementID, autoDockingDistance, excludeElementIds);
|
|
787
|
+
},
|
|
788
|
+
onElementDeleted: function onElementDeleted(setId, elementId) {
|
|
789
|
+
viewHandler.viewPlannerHandler.onElementDeleted(setId, elementId);
|
|
790
|
+
},
|
|
791
|
+
onElementCopy: function onElementCopy(setId, elementId, copyIndex) {
|
|
792
|
+
return viewHandler.viewPlannerHandler.onElementCopy(setId, elementId, copyIndex);
|
|
793
|
+
},
|
|
794
|
+
onDockingPointInteraction: function onDockingPointInteraction(setId, elementId, dpId, isSelected, onElementId) {
|
|
795
|
+
return viewHandler.viewPlannerHandler.onDockingPointInteraction(setId, elementId, dpId, isSelected, onElementId);
|
|
796
|
+
},
|
|
797
|
+
onAccessoryPlace: function onAccessoryPlace(gridIdx, cellIdx, parentBasketId, articleCodex) {
|
|
798
|
+
viewHandler.paletteViewHandler.addAccessorieOnShelfPlannerView(gridIdx, cellIdx, parentBasketId, articleCodex);
|
|
799
|
+
},
|
|
800
|
+
onAccessoryDragOver: function onAccessoryDragOver(hasTarget) {
|
|
801
|
+
viewHandler.settingsState.setDraggedAccessoryHasTarget(hasTarget);
|
|
802
|
+
},
|
|
803
|
+
onAccessorySelect: function onAccessorySelect(ref) {
|
|
804
|
+
var t = resolveAccessoryTargets(viewHandler, ref);
|
|
805
|
+
if (!t) return;
|
|
806
|
+
viewHandler.paletteViewHandler.selectShelfAccessorie(t.accCodex, t.accBasketId);
|
|
807
|
+
},
|
|
808
|
+
onAccessoryDeselect: function onAccessoryDeselect() {
|
|
809
|
+
viewHandler.paletteViewHandler.selectShelfAccessorie(undefined);
|
|
810
|
+
},
|
|
811
|
+
onAccessoryDelete: function onAccessoryDelete(ref) {
|
|
812
|
+
var t = resolveAccessoryTargets(viewHandler, ref);
|
|
813
|
+
if (!t) return;
|
|
814
|
+
viewHandler.paletteViewHandler.deleteAccessorieOnShelfPlannerView(ref.gridId, ref.cellIdx, t.parentBasketId);
|
|
815
|
+
},
|
|
816
|
+
onAccessoryMoveStart: function onAccessoryMoveStart(ref) {
|
|
817
|
+
// The accessory's free-to-move target cells (old RTV's getMoveGrids) — own cells PLUS its
|
|
818
|
+
// variant-family siblings' cells (`includeFamily`), so the viewer can offer differently-sized
|
|
819
|
+
// drop targets and switch the article on release. Async (family variants are instantiated).
|
|
820
|
+
var t = resolveAccessoryTargets(viewHandler, ref);
|
|
821
|
+
if (!t || !t.accBasketId || !t.gridName) return undefined;
|
|
822
|
+
return viewHandler.divaWebPlanner.getFreeToMovePlacesOnGrids(t.gridName, t.accBasketId, true);
|
|
823
|
+
},
|
|
824
|
+
onAccessoryMove: function onAccessoryMove(ref, target) {
|
|
825
|
+
// `target` carries the DESTINATION element's basket + grid + cell (may differ from the source
|
|
826
|
+
// element — cross-element move), so we only need the accessory's own basket from the ref.
|
|
827
|
+
var t = resolveAccessoryTargets(viewHandler, ref);
|
|
828
|
+
if (!t || !t.accBasketId) return;
|
|
829
|
+
// If the target cell expects a different variant-family member, switch the article on move.
|
|
830
|
+
var switchTo = target.articleCodex && target.articleCodex !== t.accCodex ? target.articleCodex : undefined;
|
|
831
|
+
viewHandler.divaWebPlanner.moveShelfItemToGrid(t.accBasketId, target.parentBasketId, target.gridName, target.cellIdx, switchTo);
|
|
832
|
+
},
|
|
833
|
+
onSceneReady: function onSceneReady() {
|
|
834
|
+
bootMark('rtv: onSceneReady');
|
|
835
|
+
actions.toggleLoading('RTV_Assembling', false, false);
|
|
836
|
+
}
|
|
837
|
+
};
|
|
838
|
+
}, [viewHandler.viewPlannerHandler, viewHandler.divaWebPlanner, viewHandler, actions]);
|
|
839
|
+
|
|
840
|
+
// Planner-side single source of truth for canvas selection. Tracks
|
|
841
|
+
// `selectedElementsDict` in ViewPlannerHandler — kept in sync at all 3
|
|
842
|
+
// selection entry points (canvas-side `onElementSelected` /
|
|
843
|
+
// `onClearElementSelection`, and configurator-driven
|
|
844
|
+
// `updateElementSelectionConfig` / `updateElementSelectionPlanner`).
|
|
845
|
+
// Previously derived from `articleInfos.isActive`, which lagged after a
|
|
846
|
+
// canvas deselect and caused `setSelectedElementFromProp` to re-select
|
|
847
|
+
// the just-deselected element on the next render.
|
|
848
|
+
var selectedElementId = viewHandler.productState.rtvSelectedElementId;
|
|
849
|
+
var isVisible = viewHandler.isParentViewVisible;
|
|
850
|
+
// Announce the live rtv-next viewer page-wide: hidden sibling planner instances defer their
|
|
851
|
+
// whole boot while one is registered (see `ViewHandlerProvider`).
|
|
852
|
+
useEffect(function () {
|
|
853
|
+
if (!isVisible) return;
|
|
854
|
+
return registerRtvNextViewer();
|
|
855
|
+
}, [isVisible]);
|
|
856
|
+
var showRTV = viewHandler.productState.doShowRTV;
|
|
857
|
+
var show3DComb = viewHandler.productState.doShow3DComb;
|
|
858
|
+
var showGrid = viewHandler.productState.doShowGrid;
|
|
859
|
+
// Nothing is rendered in either case, so the planner→viewer translation is skipped: a hidden
|
|
860
|
+
// planner still re-renders on every MobX planner change and would otherwise walk the whole
|
|
861
|
+
// planned-elements dict and re-encode every element SVG for a viewer that is not mounted.
|
|
862
|
+
// CREATE_IMAGE never goes through the footer, so none of the view flags is ever set for it — the
|
|
863
|
+
// viewer must still mount, it *is* the capture source (see useCreateImageShot below).
|
|
864
|
+
var isCreateImage = viewHandler.configState.initMode === 'CREATE_IMAGE';
|
|
865
|
+
var isHidden = !isVisible || !showRTV && !show3DComb && !showGrid && !isCreateImage;
|
|
866
|
+
|
|
867
|
+
// `isPoolPlanning`: a planning whose articles carry a dimension config is a static drawing (pool
|
|
868
|
+
// plan) — hide all on-canvas buttons (posNr/move/rotate/trash chrome and docking-point buttons,
|
|
869
|
+
// both gated on `hideUiIcons` inside rtv-next) and force the dimension lines on.
|
|
870
|
+
var scene = isHidden ? undefined : buildScene2D(viewHandler);
|
|
871
|
+
var scene2d = scene === null || scene === void 0 ? void 0 : scene.scene2d;
|
|
872
|
+
var isPoolPlanning = (_scene$isPoolPlanning = scene === null || scene === void 0 ? void 0 : scene.isPoolPlanning) !== null && _scene$isPoolPlanning !== void 0 ? _scene$isPoolPlanning : false;
|
|
873
|
+
|
|
874
|
+
// Environment preset: the catalog-level RTV_PRESET meta tag when present (a DB source
|
|
875
|
+
// later), else the white-room default. Both are parse-once/module objects, so the
|
|
876
|
+
// identity is stable across renders. NOTE: with ?rtv-debug the analyzer preset channel
|
|
877
|
+
// applies AFTER this on mount and wins (use ?preset=<id> there to pick explicitly).
|
|
878
|
+
var rtvPreset = (_ref2 = (_viewHandler$divaWebP5 = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP5 === void 0 ? void 0 : _viewHandler$divaWebP5.rtvPreset) !== null && _ref2 !== void 0 ? _ref2 : WHITE_ROOM_PRESET;
|
|
879
|
+
|
|
880
|
+
// initMode CREATE_IMAGE: auto-capture the settled 2D plan and emit it to the host. A hook, so it
|
|
881
|
+
// has to stay above the guard below — it is inert without a scene, and while the planner renders
|
|
882
|
+
// nothing there is no mounted viewer to capture from anyway.
|
|
883
|
+
useCreateImageShot(viewHandler, scene2d, rtvPreset);
|
|
884
|
+
if (isHidden) return null;
|
|
885
|
+
var viewMode = showGrid || isCreateImage ? '2d' : '3d';
|
|
886
|
+
var curTabGroupType = (_viewHandler$tabGroup4 = viewHandler.tabGroupState.curTabGroup) === null || _viewHandler$tabGroup4 === void 0 ? void 0 : _viewHandler$tabGroup4.type;
|
|
887
|
+
var plannerMode = curTabGroupType != null && PLANNER_TAB_GROUP_TYPES.has(curTabGroupType);
|
|
888
|
+
var focusElementId = viewHandler.productState.rtvFocusElementId;
|
|
889
|
+
// Pool plannings are static drawings: dimension lines are always on (the UI toggle that
|
|
890
|
+
// would enable them is hidden along with the other buttons — see isPoolPlanning above).
|
|
891
|
+
var showDimensionLines = isPoolPlanning || viewHandler.productState.doShow3DDimensionLines;
|
|
892
|
+
var elementsInfo = buildElementsInfoFromArticles(viewHandler);
|
|
893
|
+
|
|
894
|
+
// Controlled accessory selection: map the host's selected shelf accessory (a basketId) to its
|
|
895
|
+
// composite 3D key ("2.0.6") so the canvas re-selects it after a place/move. `null` clears it.
|
|
896
|
+
var selectedAccessoryBasketId = viewHandler.settingsState.selectedShelfAccessoire;
|
|
897
|
+
var resolvedAccessoryKey = selectedAccessoryBasketId ? (_Object$values$find$s = (_Object$values$find = Object.values(viewHandler.settingsState.articleInfos).find(function (a) {
|
|
898
|
+
return a.basketId === selectedAccessoryBasketId;
|
|
899
|
+
})) === null || _Object$values$find === void 0 ? void 0 : _Object$values$find.shelfElementId) !== null && _Object$values$find$s !== void 0 ? _Object$values$find$s : null : null;
|
|
900
|
+
// `selectedShelfAccessoire` survives step navigation and config changes (it's only cleared by an
|
|
901
|
+
// explicit deselect), and rtv-next re-applies `selectedAccessoryKey` after every re-assembly — so
|
|
902
|
+
// a config change in a step where the accessory is not selectable would re-select it in the
|
|
903
|
+
// canvas. Gate the prop on the same step-aware overlay state that already gates clicks/hover.
|
|
904
|
+
var accessoryState = resolvedAccessoryKey ? (_elementsInfo$get = elementsInfo.get(resolvedAccessoryKey)) === null || _elementsInfo$get === void 0 ? void 0 : _elementsInfo$get.state : undefined;
|
|
905
|
+
var selectedAccessoryKey = resolvedAccessoryKey != null && accessoryState != null && accessoryState !== 'unselectable' ? resolvedAccessoryKey : null;
|
|
906
|
+
|
|
907
|
+
// In pure 2D / grid mode the viewer only needs scene2d — skip the 3D inputs so it never tries
|
|
908
|
+
// to fetch GLBs or accessory grid geometry for a view that shows neither.
|
|
909
|
+
var needs3D = viewMode !== '2d';
|
|
910
|
+
// The shelf-accessory grid geometry is fetched per catalog; the viewer falls back to this
|
|
911
|
+
// identity while nothing is placed yet to read it off (`plannedPlacesOnGrids` empty).
|
|
912
|
+
var catalogData = viewHandler.divaWebPlanner.getCatalogData();
|
|
913
|
+
var catalogInfo = catalogData !== null && catalogData !== void 0 && catalogData.catalogCodex ? {
|
|
914
|
+
catalogCodex: catalogData.catalogCodex,
|
|
915
|
+
iln: catalogData.supplierILN
|
|
916
|
+
} : undefined;
|
|
917
|
+
return /*#__PURE__*/jsx(RealTimeRendererNext, {
|
|
918
|
+
catalogInfo: needs3D ? catalogInfo : undefined,
|
|
919
|
+
hqRenderScript: needs3D ? viewHandler.hqRenderScript : undefined,
|
|
920
|
+
scene2d: scene2d,
|
|
921
|
+
viewMode: viewMode,
|
|
922
|
+
stopRender: !isVisible,
|
|
923
|
+
config: {
|
|
924
|
+
// Strip a trailing slash so downstream URL building (material blob paths, geo/texture URLs)
|
|
925
|
+
// doesn't emit `…/diva3darchiv//…` double slashes that the archive host may mis-route.
|
|
926
|
+
archiveBaseUrl: apiConfig.diva3darchive.endsWith('/') ? apiConfig.diva3darchive.slice(0, -1) : apiConfig.diva3darchive,
|
|
927
|
+
constructorServiceUrl: apiConfig.constructorService,
|
|
928
|
+
jwt: jwt,
|
|
929
|
+
// COBI-class planner: 3D is always available. The store default is
|
|
930
|
+
// already `{ supports3d: true }` but we pass it explicitly to make
|
|
931
|
+
// the contract obvious — flip to `false` to skip the geo preload and
|
|
932
|
+
// (once the lazy capsule lands) the entire 3D code chunk for a
|
|
933
|
+
// pure-2D catalog.
|
|
934
|
+
capabilities: {
|
|
935
|
+
supports3d: true
|
|
936
|
+
},
|
|
937
|
+
// Environment preset: catalog RTV_PRESET meta tag » white-room default (see
|
|
938
|
+
// `rtvPreset` above). With ?rtv-debug the analyzer preset channel overrides this.
|
|
939
|
+
profiles: rtvPreset.profiles,
|
|
940
|
+
profileMode: rtvPreset.profileMode,
|
|
941
|
+
camera: rtvPreset.camera,
|
|
942
|
+
uiConfig: _objectSpread({
|
|
943
|
+
plannerMode: viewHandler.productState.isBoxPlanner ? 'BoxPlanner' : '3DCOMB',
|
|
944
|
+
accessoryPlacement: ACCESSORY_PLACEMENT_MODE
|
|
945
|
+
}, isPoolPlanning ? {
|
|
946
|
+
hideUiIcons: true
|
|
947
|
+
} : {})
|
|
948
|
+
},
|
|
949
|
+
plannerMode: plannerMode,
|
|
950
|
+
freePlacesOnGrids: viewHandler.settingsState.freePlacesOnGrids,
|
|
951
|
+
plannedPlacesOnGrids: viewHandler.settingsState.plannedPlacesOnGrids,
|
|
952
|
+
armedAccessoryCodex: viewHandler.settingsState.armedAccessoryToken,
|
|
953
|
+
draggedAccessoryCodex: viewHandler.settingsState.draggedAccessoryCodex,
|
|
954
|
+
callbacks: callbacks,
|
|
955
|
+
analyzerComponents: rtvAnalyzerComponents,
|
|
956
|
+
focusElementId: focusElementId,
|
|
957
|
+
elementsInfo: elementsInfo,
|
|
958
|
+
selectedElementId: selectedElementId,
|
|
959
|
+
selectedAccessoryKey: selectedAccessoryKey,
|
|
960
|
+
showDimensionLines: showDimensionLines
|
|
961
|
+
});
|
|
962
|
+
};
|
|
963
|
+
var index = observer(PlannerRTVNext);
|
|
964
|
+
|
|
965
|
+
export { index as default };
|