@3cr/viewer-browser 0.0.200 → 0.0.246

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.
Files changed (383) hide show
  1. package/.circleci/config.yml +46 -22
  2. package/.prettierrc +6 -0
  3. package/components.d.ts +27 -10
  4. package/dist/Viewer3CR.js +36 -45
  5. package/dist/Viewer3CR.mjs +26893 -21667
  6. package/dist/Viewer3CR.umd.js +36 -45
  7. package/dist/android-chrome-192x192.png +0 -0
  8. package/dist/android-chrome-512x512.png +0 -0
  9. package/dist/apple-touch-icon.png +0 -0
  10. package/dist/browserconfig.xml +9 -0
  11. package/dist/favicon-16x16.png +0 -0
  12. package/dist/favicon-32x32.png +0 -0
  13. package/dist/favicon.ico +0 -0
  14. package/dist/mstile-144x144.png +0 -0
  15. package/dist/mstile-150x150.png +0 -0
  16. package/dist/mstile-310x150.png +0 -0
  17. package/dist/mstile-310x310.png +0 -0
  18. package/dist/mstile-70x70.png +0 -0
  19. package/dist/safari-pinned-tab.svg +50 -0
  20. package/dist/site.webmanifest +19 -0
  21. package/index.html +34 -41
  22. package/package.json +24 -20
  23. package/playground/android-chrome-192x192.png +0 -0
  24. package/playground/android-chrome-512x512.png +0 -0
  25. package/playground/apple-touch-icon.png +0 -0
  26. package/playground/browserconfig.xml +9 -0
  27. package/playground/favicon-16x16.png +0 -0
  28. package/playground/favicon-32x32.png +0 -0
  29. package/playground/favicon.ico +0 -0
  30. package/playground/index.html +30 -41
  31. package/playground/mstile-144x144.png +0 -0
  32. package/playground/mstile-150x150.png +0 -0
  33. package/playground/mstile-310x150.png +0 -0
  34. package/playground/mstile-310x310.png +0 -0
  35. package/playground/mstile-70x70.png +0 -0
  36. package/playground/safari-pinned-tab.svg +50 -0
  37. package/playground/site.webmanifest +19 -0
  38. package/playground/sw.js +15 -1
  39. package/public/android-chrome-192x192.png +0 -0
  40. package/public/android-chrome-512x512.png +0 -0
  41. package/public/apple-touch-icon.png +0 -0
  42. package/public/browserconfig.xml +9 -0
  43. package/public/favicon-16x16.png +0 -0
  44. package/public/favicon-32x32.png +0 -0
  45. package/public/favicon.ico +0 -0
  46. package/public/mstile-144x144.png +0 -0
  47. package/public/mstile-150x150.png +0 -0
  48. package/public/mstile-310x150.png +0 -0
  49. package/public/mstile-310x310.png +0 -0
  50. package/public/mstile-70x70.png +0 -0
  51. package/public/safari-pinned-tab.svg +50 -0
  52. package/public/site.webmanifest +19 -0
  53. package/src/App.vue +55 -50
  54. package/src/__tests__/app.spec.ts +7 -8
  55. package/{__tests__/index.spec.ts → src/__tests__/main.spec.ts} +5 -6
  56. package/src/assets/logos/3dicom/white-mini.svg +20 -0
  57. package/src/assets/logos/3dicom/white.svg +30 -0
  58. package/src/assets/styles.scss +18 -4
  59. package/src/components/demo/DemoPatientModal.vue +12 -22
  60. package/src/components/demo/__tests__/DemoModal.spec.ts +9 -8
  61. package/src/components/demo/__tests__/DemoPatientModal.spec.ts +11 -10
  62. package/src/components/demo/__tests__/options.spec.ts +1 -1
  63. package/src/components/demo/licence/DemoLicenceInfoModal.vue +11 -29
  64. package/src/components/demo/licence/__tests__/DemoLicenceEnableCloudStorageModal.spec.ts +11 -10
  65. package/src/components/demo/licence/__tests__/DemoLicenceInfoModal.spec.ts +21 -11
  66. package/src/components/demo/licence/__tests__/DemoLicenceSendToPartyModal.spec.ts +10 -10
  67. package/src/components/demo/licence/__tests__/DemoLicenceShareToMobileModal.spec.ts +14 -13
  68. package/src/components/demo/options.ts +74 -76
  69. package/src/components/demo/patient/DemoPatientInfoModal.vue +11 -29
  70. package/src/components/demo/patient/__tests__/DemoPatientEnableCloudStorageModal.spec.ts +11 -10
  71. package/src/components/demo/patient/__tests__/DemoPatientInfoModal.spec.ts +12 -11
  72. package/src/components/demo/patient/__tests__/DemoPatientSendToPartyModal.spec.ts +10 -10
  73. package/src/components/demo/patient/__tests__/DemoPatientShareToMobileModal.spec.ts +14 -13
  74. package/src/components/modal/ActionRail.vue +7 -11
  75. package/src/components/modal/AskAI.vue +35 -50
  76. package/src/components/modal/CloseViewerModal.vue +22 -57
  77. package/src/components/modal/MftpWebGL3DRModal.vue +230 -635
  78. package/src/components/modal/ViewerActionRail.vue +44 -39
  79. package/src/components/modal/ViewerNavigationDrawer.vue +10 -8
  80. package/src/components/modal/ViewerNavigationDrawerContent.vue +91 -49
  81. package/src/components/modal/ViewerNavigationDrawerFooter.vue +83 -63
  82. package/src/components/modal/ViewerNavigationDrawerHeader.vue +14 -44
  83. package/src/components/modal/ViewerScanView.vue +114 -0
  84. package/src/components/modal/WebGL3DR.vue +91 -0
  85. package/src/components/modal/__tests__/ActionRail.spec.ts +10 -0
  86. package/src/components/modal/__tests__/AskAI.spec.ts +33 -0
  87. package/src/components/modal/__tests__/CloseViewerModal.spec.ts +24 -14
  88. package/src/components/modal/__tests__/MftpWebGL3DRModal.spec.ts +147 -176
  89. package/src/components/modal/__tests__/ViewerActionRail.spec.ts +11 -0
  90. package/src/components/modal/__tests__/ViewerNavigationDrawer.spec.ts +10 -12
  91. package/src/components/modal/__tests__/ViewerNavigationDrawerContent.spec.ts +4 -22
  92. package/src/components/modal/__tests__/ViewerNavigationDrawerFooter.spec.ts +35 -32
  93. package/src/components/modal/__tests__/ViewerNavigationDrawerHeader.spec.ts +14 -11
  94. package/src/components/modal/__tests__/ViewerScanView.spec.ts +60 -0
  95. package/src/components/modal/__tests__/WebGL3DR.spec.ts +57 -0
  96. package/src/components/modal/actions/Flip3dAction.vue +1 -1
  97. package/src/components/modal/actions/FlipHorizontalAction.vue +5 -10
  98. package/src/components/modal/actions/FlipVerticalAction.vue +5 -10
  99. package/src/components/modal/actions/FullscreenAction.vue +6 -11
  100. package/src/components/modal/actions/NavigationCubeAction.vue +7 -14
  101. package/src/components/modal/actions/PanAction.vue +4 -4
  102. package/src/components/modal/actions/ResetViewAction.vue +1 -1
  103. package/src/components/modal/actions/Rotate2dAction.vue +8 -20
  104. package/src/components/modal/actions/Slice3dAction.vue +10 -32
  105. package/src/components/modal/actions/ZoomAction.vue +1 -1
  106. package/src/components/modal/actions/__tests__/Action.spec.ts +8 -9
  107. package/src/components/modal/actions/__tests__/Flip3dAction.spec.ts +6 -8
  108. package/src/components/modal/actions/__tests__/FlipHorizontalAction.spec.ts +6 -7
  109. package/src/components/modal/actions/__tests__/FlipVerticalAction.spec.ts +6 -7
  110. package/src/components/modal/actions/__tests__/FullscreenAction.spec.ts +9 -10
  111. package/src/components/modal/actions/__tests__/NavigationCubeAction.spec.ts +11 -11
  112. package/src/components/modal/actions/__tests__/PanAction.spec.ts +9 -10
  113. package/src/components/modal/actions/__tests__/ResetViewAction.spec.ts +7 -7
  114. package/src/components/modal/actions/__tests__/Rotate2dAction.spec.ts +6 -8
  115. package/src/components/modal/actions/__tests__/Slice3dAction.spec.ts +23 -5
  116. package/src/components/modal/actions/__tests__/ZoomAction.spec.ts +8 -10
  117. package/src/components/modal/buttons/AutoAnnotateBtn.vue +197 -0
  118. package/src/components/modal/buttons/__tests__/AutoAnnotateBtn.spec.ts +28 -0
  119. package/src/components/modal/menus/FileMenu.vue +73 -0
  120. package/src/components/modal/menus/SettingsMenu.vue +106 -0
  121. package/src/components/modal/menus/__tests__/FileMenu.spec.ts +110 -0
  122. package/src/components/modal/menus/__tests__/SettingsMenu.spec.ts +71 -0
  123. package/src/components/navigation/mcad/McadGlobalActions.vue +20 -0
  124. package/src/components/navigation/mcad/McadGlobalOpacitySlider.vue +103 -0
  125. package/src/components/navigation/mcad/McadGlobalScanViewBtn.vue +28 -0
  126. package/src/components/navigation/mcad/McadGlobalVisibilityBtn.vue +38 -0
  127. package/src/components/shared/DoubleSliderSelector.vue +142 -0
  128. package/src/components/{loading → shared}/LoadingSpinner.vue +27 -36
  129. package/src/components/shared/UpdateSnackbar.vue +72 -0
  130. package/src/components/{selectors → shared}/ValueSelector.vue +9 -12
  131. package/src/components/shared/__tests__/DoubleSliderSelector.spec.ts +83 -0
  132. package/src/components/shared/__tests__/LoadingSpinner.spec.ts +9 -0
  133. package/src/components/shared/__tests__/UpdateSnackbar.spec.ts +116 -0
  134. package/src/components/shared/__tests__/ValueSelector.spec.ts +39 -0
  135. package/src/components/shared/__tests__/VerticalSliderSelector.spec.ts +50 -0
  136. package/src/components/views/AnnotationTreeView.vue +236 -0
  137. package/src/components/{modal/ViewerDisplaySettings.vue → views/DisplaySettings.vue} +7 -15
  138. package/src/components/views/MarkupTreeView.vue +201 -0
  139. package/src/components/views/McadObjectTreeView.vue +129 -0
  140. package/src/components/views/__tests__/AnnotationTreeView.spec.ts +62 -0
  141. package/src/components/{modal/__tests__/ViewerDisplaySettings.spec.ts → views/__tests__/DisplaySettings.spec.ts} +24 -20
  142. package/src/components/views/__tests__/MarkupTreeView.spec.ts +41 -0
  143. package/src/components/views/__tests__/McadObjectTreeView.spec.ts +47 -0
  144. package/src/components/views/modals/DataOverlayGeneralModal.vue +71 -0
  145. package/src/components/views/modals/DataOverlayMarkupModal.vue +60 -0
  146. package/src/components/views/modals/DataOverlayModal.vue +88 -0
  147. package/src/components/views/shared/MaskIcon.vue +44 -0
  148. package/src/components/views/shared/ObjectColor.vue +31 -0
  149. package/src/components/views/shared/ObjectLabel.vue +30 -0
  150. package/src/components/views/shared/Opacity.vue +65 -0
  151. package/src/components/views/shared/VisibilityBtn.vue +25 -0
  152. package/src/components/views/shared/__tests__/MaskIcon.spec.ts +10 -0
  153. package/src/components/views/shared/__tests__/ObjectColor.spec.ts +10 -0
  154. package/src/components/views/shared/__tests__/ObjectLabel.spec.ts +10 -0
  155. package/src/components/views/shared/__tests__/Opacity.spec.ts +24 -0
  156. package/src/components/views/shared/__tests__/VisibilityBtn.spec.ts +11 -0
  157. package/src/components/views/types/annotation-tree-view-item-child-action.ts +6 -0
  158. package/src/components/views/types/annotation-tree-view-item-child.ts +9 -0
  159. package/src/components/views/types/annotation-tree-view-item.ts +13 -0
  160. package/src/components/views/types/markup-tree-view-item-child.ts +6 -0
  161. package/src/components/views/types/markup-tree-view-item.ts +14 -0
  162. package/src/components/views/types/mcad-object-tree-view-item.ts +13 -0
  163. package/src/composables/__tests__/useAnnotations.spec.ts +35 -0
  164. package/src/composables/__tests__/useEventListener.spec.ts +32 -0
  165. package/src/composables/__tests__/useIntroJs.spec.ts +51 -0
  166. package/src/composables/__tests__/useMarkups.spec.ts +39 -0
  167. package/src/composables/__tests__/useMcadObjects.spec.ts +36 -0
  168. package/src/composables/__tests__/useMouse.spec.ts +20 -0
  169. package/src/{components/modal/composables → composables}/__tests__/useNavigationCubeObserver.spec.ts +17 -12
  170. package/src/{dataLayer → composables}/__tests__/useViewer3cr.spec.ts +1 -2
  171. package/src/composables/useAnnotations.ts +37 -0
  172. package/src/composables/useDebounce.ts +11 -0
  173. package/src/composables/useEventListener.ts +25 -0
  174. package/src/composables/useIntroJs.ts +142 -0
  175. package/src/composables/useMarkups.ts +41 -0
  176. package/src/composables/useMcadObjects.ts +32 -0
  177. package/src/composables/useMouse.ts +14 -0
  178. package/src/{components/modal/composables → composables}/useNavigationCubeObserver.ts +35 -25
  179. package/src/composables/useScanMovement.ts +25 -0
  180. package/src/composables/useScanSliders.ts +36 -0
  181. package/src/composables/useVersion3cr.ts +7 -0
  182. package/src/composables/useViewer3cr.ts +7 -0
  183. package/src/composables/useViewerOptions.ts +36 -0
  184. package/src/{dataLayer → functions}/__tests__/clamp.spec.ts +1 -2
  185. package/src/functions/__tests__/layoutOverlayStyle.spec.ts +325 -0
  186. package/src/{helpers/__tests__/model-helper.spec.ts → functions/__tests__/modelHelper.spec.ts} +77 -40
  187. package/src/{notifications → functions}/__tests__/notification.spec.ts +19 -29
  188. package/src/functions/__tests__/parseAction.spec.ts +9 -0
  189. package/src/functions/__tests__/parseCallToAction.spec.ts +11 -0
  190. package/src/functions/__tests__/parseDataOverlay.spec.ts +15 -0
  191. package/src/functions/__tests__/parseDataOverlayData.spec.ts +9 -0
  192. package/src/functions/__tests__/parseDataOverlayEvent.spec.ts +10 -0
  193. package/src/functions/__tests__/parseMcadEvent.spec.ts +10 -0
  194. package/src/functions/guards/isDataOverlayAngle.ts +6 -0
  195. package/src/functions/guards/isDataOverlayLength.ts +6 -0
  196. package/src/functions/guards/isDataOverlayPolygon.ts +6 -0
  197. package/src/functions/layoutOverlayStyle.ts +84 -0
  198. package/src/{helpers → functions}/modelHelper.ts +81 -18
  199. package/src/functions/notification.ts +82 -0
  200. package/src/functions/parseAction.ts +9 -0
  201. package/src/functions/parseCallToAction.ts +9 -0
  202. package/src/functions/parseDataOverlay.ts +10 -0
  203. package/src/functions/parseDataOverlayData.ts +10 -0
  204. package/src/functions/parseDataOverlayEvent.ts +17 -0
  205. package/src/functions/parseMcadEvent.ts +10 -0
  206. package/src/functions/rgbaToCss.ts +13 -0
  207. package/src/main.ts +57 -9
  208. package/src/{dataLayer → models}/__tests__/eventHandlers.spec.ts +2 -3
  209. package/src/models/__tests__/loadViewerOptions.spec.ts +72 -0
  210. package/src/models/__tests__/loadViewerPayload.spec.ts +10 -0
  211. package/src/models/__tests__/scanState.spec.ts +190 -0
  212. package/src/models/callbacks.ts +4 -0
  213. package/src/models/loadViewerOptions.ts +79 -0
  214. package/src/models/loadViewerPayload.ts +17 -0
  215. package/src/{dataLayer → models}/scanState.ts +63 -74
  216. package/src/plugins/__tests__/usePlugins.spec.ts +12 -0
  217. package/src/plugins/__tests__/vuetify.spec.ts +3 -4
  218. package/src/plugins/usePlugins.ts +8 -0
  219. package/src/plugins/vuetify.ts +31 -65
  220. package/src/services/{gpt/__tests__ → __tests__}/gpt.service.spec.ts +2 -2
  221. package/src/services/__tests__/service-worker.service.spec.ts +32 -0
  222. package/src/{dataLayer/__tests__/viewer3cr.spec.ts → services/__tests__/viewer-3cr.service.spec.ts} +97 -36
  223. package/src/services/gpt.service.ts +17 -0
  224. package/src/services/service-worker.service.ts +16 -0
  225. package/src/{dataLayer/viewer3cr.ts → services/viewer-3cr.service.ts} +281 -150
  226. package/src/tools/data-overlay.tool.ts +71 -0
  227. package/src/types/action.ts +13 -0
  228. package/src/types/call-to-action.ts +9 -0
  229. package/src/types/colour.ts +6 -0
  230. package/src/types/data-overlay-angle.ts +16 -0
  231. package/src/types/data-overlay-annotation.ts +18 -0
  232. package/src/types/data-overlay-data.ts +15 -0
  233. package/src/types/data-overlay-event.ts +5 -0
  234. package/src/types/data-overlay-info.ts +18 -0
  235. package/src/types/data-overlay-interaction.ts +15 -0
  236. package/src/types/data-overlay-length.ts +16 -0
  237. package/src/types/data-overlay-markup.ts +7 -0
  238. package/src/types/data-overlay-mcad.ts +20 -0
  239. package/src/types/data-overlay-polygon.ts +18 -0
  240. package/src/types/data-overlay.ts +16 -0
  241. package/src/types/demo-type.ts +4 -0
  242. package/src/types/gpt-question.ts +4 -0
  243. package/src/types/gpt-response-payload.ts +6 -0
  244. package/src/types/mcad-object-interaction.ts +15 -0
  245. package/src/types/segment-angle.ts +5 -0
  246. package/src/types/vector2.ts +4 -0
  247. package/src/types/vector3.ts +5 -0
  248. package/test/fakers/action-data.faker.ts +11 -0
  249. package/test/fakers/action.faker.ts +19 -0
  250. package/test/fakers/call-to-action.faker.ts +17 -0
  251. package/test/fakers/colour.faker.ts +17 -0
  252. package/test/fakers/data-overlay-angle.faker.ts +37 -0
  253. package/test/fakers/data-overlay-annotation.faker.ts +41 -0
  254. package/test/fakers/data-overlay-data.faker.ts +97 -0
  255. package/test/fakers/data-overlay-info.faker.ts +29 -0
  256. package/test/fakers/data-overlay-interaction.faker.ts +62 -0
  257. package/test/fakers/data-overlay-length.faker.ts +37 -0
  258. package/test/fakers/data-overlay-mcad.faker.ts +40 -0
  259. package/test/fakers/data-overlay-polygon.faker.ts +39 -0
  260. package/test/fakers/gpt-question.faker.ts +11 -0
  261. package/test/fakers/gpt-response.faker.ts +12 -0
  262. package/test/fakers/invert-transform.faker.ts +16 -0
  263. package/test/fakers/mcad-object-interaction.faker.ts +22 -0
  264. package/test/fakers/orientation.faker.ts +17 -0
  265. package/test/fakers/segment-angle.faker.ts +12 -0
  266. package/test/fakers/vector2.faker.ts +12 -0
  267. package/test/fakers/vector3.faker.ts +16 -0
  268. package/test/plugins/findByTestId.ts +25 -0
  269. package/test/plugins/vuetify.ts +16 -0
  270. package/test/setup.ts +16 -5
  271. package/tsconfig.json +4 -15
  272. package/vite.config.mts +20 -46
  273. package/vitest.config.mts +24 -43
  274. package/index.ts +0 -72
  275. package/src/assets/images/dark/3DICOM.png +0 -0
  276. package/src/assets/images/dark/3dicom-logo.svg +0 -1
  277. package/src/assets/images/light/3DICOM.png +0 -0
  278. package/src/assets/images/light/3dicom-logo.svg +0 -1
  279. package/src/assets/logo.png +0 -0
  280. package/src/assets/logo.svg +0 -6
  281. package/src/components/WebGL3DR.vue +0 -102
  282. package/src/components/__tests__/webgl3dr.spec.ts +0 -37
  283. package/src/components/icons/liver.vue +0 -21
  284. package/src/components/loading/__tests__/loading-spinner.spec.ts +0 -11
  285. package/src/components/modal/ViewerAnnotationModal.vue +0 -111
  286. package/src/components/modal/ViewerAnnotations.vue +0 -289
  287. package/src/components/modal/__tests__/ViewerAnnotationModal.spec.ts +0 -79
  288. package/src/components/modal/composables/useEventListener.ts +0 -22
  289. package/src/components/selectors/__tests__/value-selector.spec.ts +0 -53
  290. package/src/components/sliders/DoubleSliderSelector.vue +0 -141
  291. package/src/components/sliders/__tests__/double-slider-selector.spec.ts +0 -104
  292. package/src/components/sliders/__tests__/vertical-slider-selector.spec.ts +0 -61
  293. package/src/dataLayer/__tests__/getIconForPreset.spec.ts +0 -40
  294. package/src/dataLayer/__tests__/patchDataOverlay.spec.ts +0 -88
  295. package/src/dataLayer/__tests__/scanState.spec.ts +0 -93
  296. package/src/dataLayer/getIconForPreset.ts +0 -11
  297. package/src/dataLayer/patchDataOverlay.ts +0 -101
  298. package/src/dataLayer/useViewer3cr.ts +0 -7
  299. package/src/helpers/__tests__/layout-overlay-style.spec.ts +0 -290
  300. package/src/helpers/__tests__/utils.spec.ts +0 -70
  301. package/src/helpers/layoutOverlayStyle.ts +0 -96
  302. package/src/helpers/utils.ts +0 -16
  303. package/src/models/Callbacks.ts +0 -2
  304. package/src/models/LoadViewerOptions.ts +0 -31
  305. package/src/models/LoadViewerPayload.ts +0 -9
  306. package/src/models/__tests__/load-viewer-options.spec.ts +0 -22
  307. package/src/notifications/notification.ts +0 -50
  308. package/src/plugins/__tests__/index.spec.ts +0 -19
  309. package/src/plugins/index.ts +0 -17
  310. package/src/services/gpt/gpt.service.ts +0 -35
  311. package/static/3cr-types-browser/index.ts +0 -74
  312. package/static/3cr-types-browser/types/Action.ts +0 -6
  313. package/static/3cr-types-browser/types/AlphaKeys.ts +0 -5
  314. package/static/3cr-types-browser/types/AnchorPoint.ts +0 -12
  315. package/static/3cr-types-browser/types/CallToAction.ts +0 -5
  316. package/static/3cr-types-browser/types/ColourData.ts +0 -7
  317. package/static/3cr-types-browser/types/ColourPresetData.ts +0 -9
  318. package/static/3cr-types-browser/types/CurrentDataOverlayState.ts +0 -6
  319. package/static/3cr-types-browser/types/CurrentScanState.ts +0 -22
  320. package/static/3cr-types-browser/types/DataOverlay.ts +0 -22
  321. package/static/3cr-types-browser/types/DataOverlayActions.ts +0 -14
  322. package/static/3cr-types-browser/types/DataOverlayData.ts +0 -8
  323. package/static/3cr-types-browser/types/DataOverlayEvent.ts +0 -8
  324. package/static/3cr-types-browser/types/DecryptionKey.ts +0 -4
  325. package/static/3cr-types-browser/types/DisplaySettings.ts +0 -10
  326. package/static/3cr-types-browser/types/EmptyPayload.ts +0 -3
  327. package/static/3cr-types-browser/types/EnumPayload.ts +0 -4
  328. package/static/3cr-types-browser/types/FileManagementActions.ts +0 -11
  329. package/static/3cr-types-browser/types/FlipValue.ts +0 -7
  330. package/static/3cr-types-browser/types/FrontEndInterfaces.ts +0 -14
  331. package/static/3cr-types-browser/types/GradientKeys.ts +0 -7
  332. package/static/3cr-types-browser/types/GreyscalePresetData.ts +0 -6
  333. package/static/3cr-types-browser/types/InitialDataOverlayState.ts +0 -6
  334. package/static/3cr-types-browser/types/InitialScanState.ts +0 -19
  335. package/static/3cr-types-browser/types/InteractionType.ts +0 -8
  336. package/static/3cr-types-browser/types/InteractivityActions.ts +0 -6
  337. package/static/3cr-types-browser/types/InteractivityState.ts +0 -4
  338. package/static/3cr-types-browser/types/InvertTransformData.ts +0 -6
  339. package/static/3cr-types-browser/types/LayoutActions.ts +0 -6
  340. package/static/3cr-types-browser/types/LayoutData.ts +0 -7
  341. package/static/3cr-types-browser/types/LoadDataSet.ts +0 -6
  342. package/static/3cr-types-browser/types/LoadSessionState.ts +0 -4
  343. package/static/3cr-types-browser/types/LocalLoadDataset.ts +0 -3
  344. package/static/3cr-types-browser/types/MovementData.ts +0 -7
  345. package/static/3cr-types-browser/types/NavigationCubeActions.ts +0 -8
  346. package/static/3cr-types-browser/types/NavigationCubeData.ts +0 -12
  347. package/static/3cr-types-browser/types/NavigationCubeTransform.ts +0 -9
  348. package/static/3cr-types-browser/types/NotificationPayload.ts +0 -7
  349. package/static/3cr-types-browser/types/NotificationsActions.ts +0 -6
  350. package/static/3cr-types-browser/types/Object.ts +0 -1
  351. package/static/3cr-types-browser/types/ObjectColour.ts +0 -7
  352. package/static/3cr-types-browser/types/ObjectIcon.ts +0 -5
  353. package/static/3cr-types-browser/types/ObjectInvert.ts +0 -7
  354. package/static/3cr-types-browser/types/ObjectSize.ts +0 -7
  355. package/static/3cr-types-browser/types/ObjectSize2D.ts +0 -7
  356. package/static/3cr-types-browser/types/ObjectVisible.ts +0 -5
  357. package/static/3cr-types-browser/types/PositionData.ts +0 -14
  358. package/static/3cr-types-browser/types/PresetsActions.ts +0 -4
  359. package/static/3cr-types-browser/types/RotationValue.ts +0 -7
  360. package/static/3cr-types-browser/types/ScanMovementActions.ts +0 -27
  361. package/static/3cr-types-browser/types/ScanMovementData.ts +0 -3
  362. package/static/3cr-types-browser/types/ScanOrientationActions.ts +0 -6
  363. package/static/3cr-types-browser/types/ScanStateActions.ts +0 -4
  364. package/static/3cr-types-browser/types/ScanView.ts +0 -6
  365. package/static/3cr-types-browser/types/SettingsData.ts +0 -12
  366. package/static/3cr-types-browser/types/SlicerData.ts +0 -9
  367. package/static/3cr-types-browser/types/SliderValue.ts +0 -4
  368. package/static/3cr-types-browser/types/SlidersActions.ts +0 -18
  369. package/static/3cr-types-browser/types/Vector2Data.ts +0 -5
  370. package/static/3cr-types-browser/types/Vector3Data.ts +0 -6
  371. package/static/3cr-types-browser/types/VectorMovementData.ts +0 -8
  372. package/static/3cr-types-browser/types/ViewInteractiveMode.ts +0 -5
  373. package/static/3cr-types-browser/types/ViewOrientation.ts +0 -8
  374. package/static/3cr-types-browser/types/ViewOrientations.ts +0 -10
  375. package/static/3cr-types-browser/types/ViewSelectionActions.ts +0 -9
  376. package/static/3cr-types-browser/types/ViewToggleData.ts +0 -7
  377. package/static/3cr-types-browser/types/VolumeOrientation.ts +0 -7
  378. package/test/helper.ts +0 -44
  379. /package/src/components/{sliders → shared}/VerticalSliderSelector.vue +0 -0
  380. /package/{config.ts → src/config.ts} +0 -0
  381. /package/src/{dataLayer → functions}/clamp.ts +0 -0
  382. /package/src/{dataLayer → models}/eventHandlers.ts +0 -0
  383. /package/{static/3cr-types-browser/types/ActionData.ts → src/types/action-data.ts} +0 -0
@@ -1,26 +1,25 @@
1
- import { describe, expect, it } from "vitest";
2
- import { mountVuetify, openAllModals } from "~/helper";
3
- import { VTextField } from "vuetify/components";
4
- import DemoPatientSendToPartyModal from "@/components/demo/patient/DemoPatientSendToPartyModal.vue";
1
+ import { mount } from '@vue/test-utils';
2
+ import { VDialog, VTextField } from 'vuetify/components';
3
+ import DemoPatientSendToPartyModal from '@/components/demo/patient/DemoPatientSendToPartyModal.vue';
5
4
 
6
5
  describe('DemoPatientSendToPartyModal tests', () => {
7
6
  it('should mount', () => {
8
7
  const props = { modal: true };
9
- const wrapper = mountVuetify(DemoPatientSendToPartyModal, props);
8
+ const wrapper = mount(DemoPatientSendToPartyModal, { props });
10
9
  expect(wrapper).toBeTruthy();
11
10
  });
12
11
 
13
12
  it('should close modal', async () => {
14
13
  const props = { modal: true };
15
- const wrapper = mountVuetify(DemoPatientSendToPartyModal, props);
14
+ const wrapper = mount(DemoPatientSendToPartyModal, { props });
16
15
  const close = wrapper.findComponent('[data-testid="close"]');
17
16
  await close.trigger('click');
18
- expect(wrapper.emitted()['update:modal']).toBeTruthy();
17
+ expect(wrapper.emitted('update:modal')).toBeTruthy();
19
18
  });
20
19
 
21
20
  it('should enter email', async () => {
22
21
  const props = { modal: true };
23
- const wrapper = mountVuetify(DemoPatientSendToPartyModal, props);
22
+ const wrapper = mount(DemoPatientSendToPartyModal, { props });
24
23
  const input = wrapper.getComponent(VTextField);
25
24
  await input.setValue('example@singular.health');
26
25
  await input.trigger('keyup.enter');
@@ -30,7 +29,8 @@ describe('DemoPatientSendToPartyModal tests', () => {
30
29
 
31
30
  it('should open via input', async () => {
32
31
  const props = { modal: false };
33
- const wrapper = mountVuetify(DemoPatientSendToPartyModal, props);
34
- await openAllModals(wrapper);
32
+ const wrapper = mount(DemoPatientSendToPartyModal, { props });
33
+ const dialog = wrapper.findComponent(VDialog);
34
+ await dialog.setValue(true);
35
35
  });
36
36
  });
@@ -1,31 +1,31 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { mountVuetify, openAllModals } from "~/helper";
3
- import DemoPatientShareToMobileModal from "@/components/demo/patient/DemoPatientShareToMobileModal.vue";
4
- import { PRICING_URL } from "../../options";
1
+ import { PRICING_URL } from '../../options';
2
+ import { mount } from '@vue/test-utils';
3
+ import { VDialog } from 'vuetify/components';
4
+ import DemoPatientShareToMobileModal from '@/components/demo/patient/DemoPatientShareToMobileModal.vue';
5
5
 
6
6
  describe('DemoPatientShareToMobileModal tests', () => {
7
7
  it('should mount', () => {
8
8
  const props = { modal: true };
9
- const wrapper = mountVuetify(DemoPatientShareToMobileModal, props);
9
+ const wrapper = mount(DemoPatientShareToMobileModal, { props });
10
10
  expect(wrapper).toBeTruthy();
11
11
  });
12
12
 
13
13
  it('should close modal', async () => {
14
14
  const props = { modal: true };
15
- const wrapper = mountVuetify(DemoPatientShareToMobileModal, props);
15
+ const wrapper = mount(DemoPatientShareToMobileModal, { props });
16
16
  const close = wrapper.findComponent('[data-testid="close-1"]');
17
17
  await close.trigger('click');
18
- expect(wrapper.emitted()['update:modal']).toBeTruthy();
18
+ expect(wrapper.emitted('update:modal')).toBeTruthy();
19
19
  });
20
20
 
21
21
  it('should go to next step and open url', async () => {
22
22
  vi.stubGlobal('open', vi.fn());
23
23
  const spy = vi.spyOn(window, 'open');
24
24
  const props = { modal: true };
25
- const wrapper = mountVuetify(DemoPatientShareToMobileModal, props);
25
+ const wrapper = mount(DemoPatientShareToMobileModal, { props });
26
26
  const confirm1 = wrapper.findComponent('[data-testid="confirm-1"]');
27
27
  await confirm1.trigger('click');
28
- expect(wrapper.emitted()['update:modal']).toBeTruthy();
28
+ expect(wrapper.emitted('update:modal')).toBeTruthy();
29
29
  const confirm2 = wrapper.findComponent('[data-testid="confirm-2"]');
30
30
  await confirm2.trigger('click');
31
31
  expect(spy).toHaveBeenCalledWith(PRICING_URL, '_self');
@@ -34,10 +34,10 @@ describe('DemoPatientShareToMobileModal tests', () => {
34
34
 
35
35
  it('should go to next step and close', async () => {
36
36
  const props = { modal: true };
37
- const wrapper = mountVuetify(DemoPatientShareToMobileModal, props);
37
+ const wrapper = mount(DemoPatientShareToMobileModal, { props });
38
38
  const confirm1 = wrapper.findComponent('[data-testid="confirm-1"]');
39
39
  await confirm1.trigger('click');
40
- expect(wrapper.emitted()['update:modal']).toBeTruthy();
40
+ expect(wrapper.emitted('update:modal')).toBeTruthy();
41
41
  const close2 = wrapper.findComponent('[data-testid="close-2"]');
42
42
  await close2.trigger('click');
43
43
  expect(wrapper.text()).toBe('');
@@ -45,7 +45,8 @@ describe('DemoPatientShareToMobileModal tests', () => {
45
45
 
46
46
  it('should open via input', async () => {
47
47
  const props = { modal: false };
48
- const wrapper = mountVuetify(DemoPatientShareToMobileModal, props);
49
- await openAllModals(wrapper);
48
+ const wrapper = mount(DemoPatientShareToMobileModal, { props });
49
+ const dialog = wrapper.findComponent(VDialog);
50
+ await dialog.setValue(true);
50
51
  });
51
52
  });
@@ -5,12 +5,12 @@
5
5
  <slot name="visible" :action="action" :index="index"></slot>
6
6
  </div>
7
7
  </template>
8
- <v-menu v-if="showMenu" v-bind="menuProps" @update:model-value="emit('menuActive', $event)">
8
+ <v-menu v-if="showMenu" v-bind="menuProps" v-on="menuOn">
9
9
  <template #activator="{ props }">
10
10
  <v-btn v-bind="mergeProps(props, menuActivatorProps)" />
11
11
  </template>
12
12
  <v-list>
13
- <template v-for="(action, index) of hidden" >
13
+ <template v-for="(action, index) of hidden">
14
14
  <div class="hidden-item">
15
15
  <slot name="hidden" :action="action" :index="index"></slot>
16
16
  </div>
@@ -24,31 +24,27 @@
24
24
  import { computed, mergeProps, onBeforeUnmount, onMounted, ref } from 'vue';
25
25
 
26
26
  type Action<T = Record<string, unknown>> = {
27
- width: number
27
+ width: number;
28
28
  } & T;
29
29
 
30
30
  interface Props {
31
31
  actions?: Action[];
32
32
  menuProps?: Record<string, unknown>;
33
+ menuOn?: Record<string, unknown>;
33
34
  menuActivatorProps?: Record<string, unknown>;
34
35
  }
35
36
 
36
- type Emits = {
37
- menuActive: [boolean];
38
- };
39
-
40
37
  const props = withDefaults(defineProps<Props>(), {
41
38
  actions: () => [],
42
39
  menuProps: () => ({}),
40
+ menuOn: () => ({}),
43
41
  menuActivatorProps: () => ({})
44
42
  });
45
43
 
46
- const emit = defineEmits<Emits>();
47
-
48
44
  const rail = ref<HTMLDivElement>();
49
45
  const splitIndex = ref<number>(0);
50
46
 
51
- const observer = new ResizeObserver(entries => {
47
+ const observer = new ResizeObserver((entries) => {
52
48
  if (entries.length > 0) {
53
49
  const railWidth = entries[0].contentRect.width;
54
50
  calculateSplitIndex(railWidth);
@@ -78,7 +74,7 @@ onBeforeUnmount(() => {
78
74
  });
79
75
 
80
76
  function calculateSplitIndex(railWidth: number): void {
81
- const widths = props.actions.map(action => action.width);
77
+ const widths = props.actions.map((action) => action.width);
82
78
  let sum = 48;
83
79
  for (const [idx, width] of widths.entries()) {
84
80
  if (sum + width < railWidth) {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-dialog v-model:model-value="modalState" max-width="800" theme="light">
2
+ <v-dialog v-model="modalState" max-width="800" theme="light">
3
3
  <v-card class="prompt-box pa-2 py-4" rounded="xl">
4
4
  <v-card-title class="text-body-1 d-flex align-center text-wrap mx-3 mb-4">
5
5
  <span>{{ questionText }}</span>
@@ -8,16 +8,8 @@
8
8
  <div class="bordered-gradient-box" v-if="smartResponses">
9
9
  <div class="prompt" style="font-size: 28px">
10
10
  <!-- &#129668;-->
11
- <v-img
12
- src="@/assets/magic_wand.svg"
13
- class="animated"
14
- max-width="42"
15
- />
16
- &nbsp;&nbsp;&nbsp;<span
17
- style="font-size: 18px"
18
- v-html="smartResponses?.GptResponse"
19
- >
20
- </span>
11
+ <v-img src="@/assets/magic_wand.svg" class="animated" max-width="42" />
12
+ &nbsp;&nbsp;&nbsp;<span style="font-size: 18px" v-html="smartResponses?.GptResponse"> </span>
21
13
  </div>
22
14
  </div>
23
15
 
@@ -26,19 +18,13 @@
26
18
  <div class="loading"></div>
27
19
  </div>
28
20
  <v-card-text class="py-0">
29
- <span
30
- class="text-caption"
31
- style="font-size: 10px !important; line-height: 10px !important"
32
- >* 3Dicom's Annotiva AI is powered by AI Large Language Models (LLMs)
33
- which generate general health information for improved patient
34
- comprehension. <br />It is NOT for diagnostic usage.
21
+ <span class="text-caption" style="font-size: 10px !important; line-height: 10px !important"
22
+ >* 3Dicom's Annotiva AI is powered by AI Large Language Models (LLMs) which generate general health
23
+ information for improved patient comprehension. <br />It is NOT for diagnostic usage.
35
24
  </span>
36
25
  </v-card-text>
37
26
 
38
- <v-card-title
39
- v-if="smartResponses"
40
- class="text-body-1 d-flex align-center text-wrap mx-3 mt-6 mb-0"
41
- >
27
+ <v-card-title v-if="smartResponses" class="text-body-1 d-flex align-center text-wrap mx-3 mt-6 mb-0">
42
28
  Still Curious?
43
29
  </v-card-title>
44
30
  <v-card-text class="py-0">
@@ -49,11 +35,7 @@
49
35
  text-wrap: wrap;
50
36
  word-wrap: break-word;
51
37
  min-height: 36px;
52
- background: linear-gradient(
53
- to right,
54
- rgba(38, 55, 245, 0.85),
55
- rgba(145, 78, 245, 0.85)
56
- );
38
+ background: linear-gradient(to right, rgba(38, 55, 245, 0.85), rgba(145, 78, 245, 0.85));
57
39
  "
58
40
  class="text-wrap mb-1 px-4 v-chip--selected text-white"
59
41
  @click="askFollowUpQuestion(action)"
@@ -67,13 +49,11 @@
67
49
  </template>
68
50
 
69
51
  <script setup lang="ts">
70
- import { computed, ref, watch } from "vue";
71
- import {
72
- GptQuestion,
73
- GptResponsePayload,
74
- GptService,
75
- } from "@/services/gpt/gpt.service";
76
- const smartResponses = ref<GptResponsePayload | null>(null);
52
+ import { computed, ref, watch } from 'vue';
53
+ import { GptService } from '@/services/gpt.service';
54
+ import { GptQuestion } from '@/types/gpt-question';
55
+ import { GptResponsePayload } from '@/types/gpt-response-payload';
56
+
77
57
  interface Props {
78
58
  modal?: boolean;
79
59
  questionText: string;
@@ -82,7 +62,7 @@ interface Props {
82
62
  }
83
63
 
84
64
  type Emits = {
85
- "update:modal": [value: boolean];
65
+ 'update:modal': [value: boolean];
86
66
  askFollowup: [value: GptQuestion];
87
67
  };
88
68
 
@@ -90,21 +70,23 @@ const props = defineProps<Props>();
90
70
 
91
71
  const emit = defineEmits<Emits>();
92
72
 
93
- const item = ref();
73
+ const item = ref<number>();
74
+
75
+ const smartResponses = ref<GptResponsePayload>();
76
+
94
77
  const modalState = computed({
95
78
  get(): boolean {
96
79
  return props.modal;
97
80
  },
98
81
  set(value: boolean): void {
99
- emit("update:modal", value);
100
- },
82
+ emit('update:modal', value);
83
+ }
101
84
  });
102
85
 
103
86
  watch(
104
87
  modalState,
105
88
  async (val: boolean) => {
106
89
  if (val) {
107
- smartResponses.value = null;
108
90
  await getSmartResponses();
109
91
  }
110
92
  },
@@ -120,23 +102,25 @@ async function getSmartResponses(): Promise<void> {
120
102
  );
121
103
  }
122
104
 
123
- async function askFollowUpQuestion(question: GptQuestion): Promise<void> {
124
- emit("askFollowup", question);
105
+ function askFollowUpQuestion(question: GptQuestion): void {
106
+ emit('askFollowup', question);
125
107
  }
126
108
  </script>
109
+
127
110
  <style>
128
111
  .loading {
129
112
  font-size: 30px;
130
113
  }
114
+
131
115
  .loading:after {
132
116
  overflow: hidden;
133
117
  display: inline-block;
134
118
  vertical-align: bottom;
135
119
  -webkit-animation: ellipsis steps(4, end) 900ms infinite;
136
120
  animation: ellipsis steps(4, end) 900ms infinite;
137
- content: "\2026";
121
+ content: '\2026';
138
122
  /* ascii code for the ellipsis character */
139
- width: 0px;
123
+ width: 0;
140
124
  }
141
125
 
142
126
  @keyframes ellipsis {
@@ -171,14 +155,16 @@ async function askFollowUpQuestion(question: GptQuestion): Promise<void> {
171
155
  }
172
156
 
173
157
  .prompt::before {
174
- content: "";
158
+ content: '';
175
159
  position: absolute;
176
160
  inset: 0;
177
161
  border-radius: 16px;
178
162
  padding: 3px;
179
163
  background: linear-gradient(to right, #6fb3f2, #4e51f5);
180
164
 
181
- -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
165
+ -webkit-mask:
166
+ linear-gradient(#fff 0 0) content-box,
167
+ linear-gradient(#fff 0 0);
182
168
  -webkit-mask-composite: xor;
183
169
  mask-composite: exclude;
184
170
  }
@@ -212,10 +198,12 @@ async function askFollowUpQuestion(question: GptQuestion): Promise<void> {
212
198
  .record-button:active {
213
199
  background: #3b3edf;
214
200
  }
201
+
215
202
  .animated {
216
203
  animation: pulse 2s infinite;
217
204
  transition: all 2s ease-in-out;
218
205
  }
206
+
219
207
  @keyframes pulse {
220
208
  0% {
221
209
  transform: scale(1);
@@ -224,13 +212,9 @@ async function askFollowUpQuestion(question: GptQuestion): Promise<void> {
224
212
  transform: scale(1.2);
225
213
  }
226
214
  }
215
+
227
216
  .btn-grad {
228
- background-image: linear-gradient(
229
- to right,
230
- #2b5876 0%,
231
- #4e4376 51%,
232
- #2b5876 100%
233
- );
217
+ background-image: linear-gradient(to right, #2b5876 0%, #4e4376 51%, #2b5876 100%);
234
218
  margin: 10px;
235
219
  padding: 15px 45px;
236
220
  text-align: center;
@@ -242,6 +226,7 @@ async function askFollowUpQuestion(question: GptQuestion): Promise<void> {
242
226
  border-radius: 10px;
243
227
  display: block;
244
228
  }
229
+
245
230
  .btn-grad:hover {
246
231
  background-position: right center; /* change the direction of the change here */
247
232
  color: #fff;
@@ -1,66 +1,35 @@
1
1
  <template>
2
- <v-dialog data-testid="dialog" v-model:model-value="modalState">
3
- <v-card
4
- class="pa-1 ma-auto position-relative motif-background"
5
- width="600"
6
- theme="dark"
7
- >
2
+ <v-dialog data-testid="dialog" v-model="modalState">
3
+ <v-card class="pa-1 ma-auto position-relative motif-background" width="600" theme="dark">
8
4
  <v-card-title class="text-center">Close Viewer?</v-card-title>
9
- <v-card-text class="text-center mb-2">
10
- Are you sure you want to close the Online Viewer?
11
- </v-card-text>
5
+ <v-card-text class="text-center mb-2"> Are you sure you want to close the Online Viewer? </v-card-text>
12
6
  <v-card-actions>
13
- <v-btn
14
- variant="flat"
15
- color="secondary"
16
- @click="modalState = false"
17
- >
18
- Cancel
19
- </v-btn>
7
+ <v-btn data-testid="cancel" variant="text" @click="modalState = false"> Cancel </v-btn>
20
8
  <v-spacer />
21
- <v-btn
22
- data-testid="close"
23
- color="red"
24
- variant="flat"
25
- @click="closeModal"
26
- v-if="showOption('OnSaveSession')"
27
- >
9
+ <v-btn v-if="options?.OnSaveSession" data-testid="close" color="red" variant="flat" @click="closeModal">
28
10
  Close without saving
29
11
  </v-btn>
30
- <v-btn
31
- data-testid="save"
32
- color="primary"
33
- variant="flat"
34
- @click="closeModalSave"
35
- v-if="showOption('OnSaveSession')"
36
- >
12
+ <v-btn v-if="options?.OnSaveSession" data-testid="save" color="primary" variant="flat" @click="closeModalSave">
37
13
  Save Session
38
14
  </v-btn>
39
- <v-btn
40
- data-testid="close"
41
- color="flat"
42
- variant="tonal"
43
- @click="closeModal" v-else>
44
- Close Viewer
45
- </v-btn>
15
+ <v-btn data-testid="close" color="flat" variant="tonal" @click="closeModal" v-else> Close Viewer </v-btn>
46
16
  </v-card-actions>
47
17
  </v-card>
48
18
  </v-dialog>
49
19
  </template>
50
20
 
51
21
  <script setup lang="ts">
52
- import {computed} from "vue";
53
- import {LoadViewerOptions} from "@/models/LoadViewerOptions";
54
- import {dataOverlayState, scanState} from "@/dataLayer/scanState";
22
+ import { computed } from 'vue';
23
+ import { dataOverlayState, mcadObjectState, scanState } from '@/models/scanState';
24
+ import { useViewerOptions } from '@/composables/useViewerOptions';
55
25
 
56
26
  interface Props {
57
- options: LoadViewerOptions,
58
27
  modal?: boolean;
59
28
  }
60
29
 
61
30
  type Emits = {
62
31
  'update:modal': [boolean];
63
- 'close': [void];
32
+ close: [void];
64
33
  };
65
34
 
66
35
  const props = withDefaults(defineProps<Props>(), {
@@ -69,6 +38,8 @@ const props = withDefaults(defineProps<Props>(), {
69
38
 
70
39
  const emit = defineEmits<Emits>();
71
40
 
41
+ const options = useViewerOptions();
42
+
72
43
  const modalState = computed({
73
44
  get(): boolean {
74
45
  return props.modal;
@@ -79,26 +50,20 @@ const modalState = computed({
79
50
  });
80
51
 
81
52
  async function closeModal(): Promise<void> {
82
- await executeOption('OnExitViewer');
53
+ if (options.value.OnExitViewer) {
54
+ await options.value.OnExitViewer();
55
+ }
83
56
  modalState.value = false;
84
57
  emit('close');
85
58
  }
86
59
 
87
60
  async function closeModalSave(): Promise<void> {
88
- const scnState = scanState.value;
89
- const dtaOverlayState = dataOverlayState.value.DataOverlay;
90
- await executeOption('OnSaveSession', scnState, dtaOverlayState, null);
91
- await closeModal();
92
- }
93
-
94
- function showOption(key: keyof LoadViewerOptions): boolean {
95
- return props.options[key] !== undefined;
96
- }
97
-
98
- async function executeOption(key: keyof LoadViewerOptions, ...args: any[]): Promise<void> {
99
- const functionToExecute = props.options[key];
100
- if (functionToExecute !== undefined) {
101
- await functionToExecute(...args);
61
+ if (options.value.OnSaveSession) {
62
+ const scan = scanState.value;
63
+ const dataOverlay = dataOverlayState.value.DataOverlay;
64
+ const mcad = mcadObjectState.value.Models;
65
+ options.value.OnSaveSession(scan, dataOverlay, mcad);
102
66
  }
67
+ await closeModal();
103
68
  }
104
69
  </script>