@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
@@ -2,15 +2,16 @@
2
2
  <ActionRail
3
3
  :actions="viewActions"
4
4
  :menu-props="menuProps"
5
+ :menu-on="menuOn"
5
6
  :menu-activator-props="menuActivatorProps"
6
- @menu-active="onActionModal($event, view)">
7
+ >
7
8
  <template #visible="{ action }">
8
9
  <Component
9
10
  :is="action.component"
10
11
  :view="view"
11
12
  :element="element"
12
13
  variant="button"
13
- @update:modal="onActionModal($event, view)"
14
+ @update:modal="onActionModal"
14
15
  />
15
16
  </template>
16
17
  <template #hidden="{ action }">
@@ -19,48 +20,38 @@
19
20
  :view="view"
20
21
  :element="element"
21
22
  variant="menu-item"
22
- @update:modal="onActionModal($event, view)"
23
+ @update:modal="onActionModal"
23
24
  />
24
25
  </template>
25
26
  </ActionRail>
26
27
  </template>
27
28
 
28
29
  <script setup lang="ts">
29
- import { computed, shallowRef } from "vue";
30
- import { ScanView } from "@3cr/types-ts";
31
- import FlipVerticalAction from "@/components/modal/actions/FlipVerticalAction.vue";
32
- import FlipHorizontalAction from "@/components/modal/actions/FlipHorizontalAction.vue";
33
- import FullscreenAction from "@/components/modal/actions/FullscreenAction.vue";
34
- import PanAction from "@/components/modal/actions/PanAction.vue";
35
- import ResetViewAction from "@/components/modal/actions/ResetViewAction.vue";
36
- import Rotate2dAction from "@/components/modal/actions/Rotate2dAction.vue";
37
- import Slice3dAction from "@/components/modal/actions/Slice3dAction.vue";
38
- import ZoomAction from "@/components/modal/actions/ZoomAction.vue";
39
- import { useViewer3cr } from "@/dataLayer/useViewer3cr";
30
+ import { computed } from 'vue';
31
+ import { ScanView } from '@3cr/types-ts';
32
+ import FlipVerticalAction from '@/components/modal/actions/FlipVerticalAction.vue';
33
+ import FlipHorizontalAction from '@/components/modal/actions/FlipHorizontalAction.vue';
34
+ import FullscreenAction from '@/components/modal/actions/FullscreenAction.vue';
35
+ import PanAction from '@/components/modal/actions/PanAction.vue';
36
+ import ResetViewAction from '@/components/modal/actions/ResetViewAction.vue';
37
+ import Rotate2dAction from '@/components/modal/actions/Rotate2dAction.vue';
38
+ import Slice3dAction from '@/components/modal/actions/Slice3dAction.vue';
39
+ import ZoomAction from '@/components/modal/actions/ZoomAction.vue';
40
+ import { useViewer3cr } from '@/composables/useViewer3cr';
40
41
 
41
42
  interface Props {
42
43
  view: ScanView;
43
- element: any;
44
+ element: EventTarget;
44
45
  }
45
46
 
46
47
  type Emits = {
47
- modal: [boolean, number];
48
+ modal: [boolean];
48
49
  };
49
50
 
50
51
  type ActionItem = {
51
52
  component: any;
52
53
  width: number;
53
- condition: () => boolean;
54
- }
55
-
56
- const menuProps = {
57
- closeOnContentClick: false
58
- };
59
-
60
- const menuActivatorProps = {
61
- icon: 'more_vert',
62
- variant: 'text',
63
- color: 'white'
54
+ condition: boolean;
64
55
  };
65
56
 
66
57
  const props = defineProps<Props>();
@@ -69,55 +60,69 @@ const emit = defineEmits<Emits>();
69
60
 
70
61
  const viewer3cr = useViewer3cr();
71
62
 
63
+ const menuProps = computed(() => ({
64
+ closeOnContentClick: false
65
+ }));
66
+
67
+ const menuOn = computed(() => ({
68
+ 'update:modelValue': onActionModal
69
+ }));
70
+
71
+ const menuActivatorProps = computed(() => ({
72
+ icon: 'more_vert',
73
+ variant: 'text',
74
+ color: 'white'
75
+ }));
76
+
72
77
  const viewActions = computed(() => {
73
- return actions.value.filter(action => action.condition());
78
+ return actions.value.filter((action) => action.condition);
74
79
  });
75
80
 
76
- const actions = shallowRef<ActionItem[]>([
81
+ const actions = computed<ActionItem[]>(() => [
77
82
  {
78
83
  component: FullscreenAction,
79
84
  width: 48,
80
- condition: () => true,
85
+ condition: true
81
86
  },
82
87
  {
83
88
  component: ResetViewAction,
84
89
  width: 48,
85
- condition: () => true,
90
+ condition: true
86
91
  },
87
92
  {
88
93
  component: PanAction,
89
94
  width: 48,
90
- condition: () => true,
95
+ condition: true
91
96
  },
92
97
  {
93
98
  component: ZoomAction,
94
99
  width: 48,
95
- condition: () => true,
100
+ condition: true
96
101
  },
97
102
  {
98
103
  component: Slice3dAction,
99
104
  width: 48,
100
- condition: () => props.view === ScanView.Volume,
105
+ condition: props.view === ScanView.Volume
101
106
  },
102
107
  {
103
108
  component: Rotate2dAction,
104
109
  width: 48,
105
- condition: () => props.view !== ScanView.Volume,
110
+ condition: props.view !== ScanView.Volume
106
111
  },
107
112
  {
108
113
  component: FlipHorizontalAction,
109
114
  width: 48,
110
- condition: () => props.view !== ScanView.Volume,
115
+ condition: props.view !== ScanView.Volume
111
116
  },
112
117
  {
113
118
  component: FlipVerticalAction,
114
119
  width: 48,
115
- condition: () => props.view !== ScanView.Volume,
120
+ condition: props.view !== ScanView.Volume
116
121
  }
117
122
  ]);
118
123
 
119
- async function onActionModal(value: boolean, view: ScanView): Promise<void> {
124
+ async function onActionModal(value: boolean): Promise<void> {
120
125
  await viewer3cr.hoverOverCanvas(!value); // disable unity inputs when interacting with modals
121
- emit('modal', value, view);
126
+ emit('modal', value);
122
127
  }
123
128
  </script>
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <v-navigation-drawer
3
3
  class="motif-background"
4
+ theme="dark"
4
5
  :model-value="true"
5
6
  :rail="!drawer"
6
7
  rail-width="72"
@@ -12,11 +13,11 @@
12
13
  <ViewerNavigationDrawerHeader :drawer="drawer" />
13
14
  </template>
14
15
  <template #default>
15
- <ViewerNavigationDrawerContent v-model:drawer="drawer" :options="options" @update:expanded="emit('update:expanded', $event)" />
16
+ <ViewerNavigationDrawerContent v-model:drawer="drawer" @update:expanded="emit('update:expanded', $event)" />
16
17
  </template>
17
18
  <template #append>
18
19
  <v-divider />
19
- <ViewerNavigationDrawerFooter :drawer="drawer" :options="options" />
20
+ <ViewerNavigationDrawerFooter :drawer="drawer" />
20
21
  </template>
21
22
  </v-navigation-drawer>
22
23
  <v-btn
@@ -31,17 +32,15 @@
31
32
  @click="drawer = !drawer"
32
33
  >
33
34
  <v-icon color="black">
34
- {{ !drawer ? "chevron_right" : "chevron_left" }}
35
+ {{ !drawer ? 'chevron_right' : 'chevron_left' }}
35
36
  </v-icon>
36
37
  </v-btn>
37
38
  </template>
38
39
 
39
40
  <script setup lang="ts">
40
41
  import { computed, ref, watch } from 'vue';
41
- import { LoadViewerOptions } from "@/models/LoadViewerOptions";
42
42
 
43
43
  interface Props {
44
- options: LoadViewerOptions;
45
44
  drawer?: boolean;
46
45
  }
47
46
 
@@ -68,9 +67,12 @@ const drawer = computed({
68
67
  }
69
68
  });
70
69
 
71
- watch(() => props.drawer, (value: boolean) => {
72
- drawer.value = value;
73
- });
70
+ watch(
71
+ () => props.drawer,
72
+ (value: boolean) => {
73
+ drawer.value = value;
74
+ }
75
+ );
74
76
 
75
77
  defineExpose({ drawer });
76
78
  </script>
@@ -7,8 +7,8 @@
7
7
  tile
8
8
  @update:model-value="onUpdate"
9
9
  >
10
- <template v-for="(item, index) in items" :key="item">
11
- <v-expansion-panel v-if="item.visible()" :data-testid="`panel-${index}`" class="bg-transparent text-white px-0">
10
+ <template v-for="(item, index) in items" :key="index">
11
+ <v-expansion-panel v-if="item.visible" :data-testid="`panel-${index}`" class="bg-transparent text-white px-0">
12
12
  <v-expansion-panel-title :hide-actions="!drawer" class="font-weight-bold">
13
13
  <v-icon :start="drawer" :icon="item.icon" />
14
14
  <span v-show="drawer">{{ item.text }}</span>
@@ -25,15 +25,18 @@
25
25
  </template>
26
26
 
27
27
  <script setup lang="ts">
28
- import { ComponentInstance, computed, ref, shallowRef, watch } from "vue";
29
- import { LoadViewerOptions } from "@/models/LoadViewerOptions";
30
- import { isSessionLoaded } from "@/dataLayer/scanState";
31
- import ViewerDisplaySettings from "@/components/modal/ViewerDisplaySettings.vue";
32
- import ViewerAnnotations from "@/components/modal/ViewerAnnotations.vue";
28
+ import { ComponentInstance, computed, ref, watch } from 'vue';
29
+ import ViewerDisplaySettings from '@/components/views/DisplaySettings.vue';
30
+ import AnnotationTreeView from '@/components/views/AnnotationTreeView.vue';
31
+ import McadObjects from '@/components/views/McadObjectTreeView.vue';
32
+ import Markups from '@/components/views/MarkupTreeView.vue';
33
+ import { useViewerOptions } from '@/composables/useViewerOptions';
34
+ import { useAnnotations } from '@/composables/useAnnotations';
35
+ import { useMarkups } from '@/composables/useMarkups';
36
+ import { useMcadObjects } from '@/composables/useMcadObjects';
33
37
 
34
38
  interface Props {
35
39
  drawer?: boolean;
36
- options: LoadViewerOptions
37
40
  }
38
41
 
39
42
  type Emits = {
@@ -46,7 +49,7 @@ interface SettingsItem {
46
49
  text: string;
47
50
  tooltip: string;
48
51
  component: ComponentInstance<any>;
49
- visible: () => boolean;
52
+ visible: boolean;
50
53
  props: Record<string, any>;
51
54
  }
52
55
 
@@ -56,42 +59,91 @@ const props = withDefaults(defineProps<Props>(), {
56
59
 
57
60
  const emit = defineEmits<Emits>();
58
61
 
62
+ const options = useViewerOptions();
63
+ const { annotations, hasAnnotations } = useAnnotations();
64
+ const { markups, hasMarkups } = useMarkups();
65
+ const { mcadObjects, hasMcadObjects } = useMcadObjects();
59
66
  const previous = ref<number | undefined>(0);
60
67
  const expanded = ref<number | undefined>(0);
61
68
 
62
- const items = shallowRef<SettingsItem[]>([
69
+ const items = computed<SettingsItem[]>(() => [
63
70
  {
64
- icon: "display_settings",
65
- text: "Display Settings",
66
- tooltip: "Change the range of visible anatomy in the scan by only showing areas with certain density of tissue",
71
+ icon: options.value.DisplaySettings?.Icon ?? 'display_settings',
72
+ text: options.value.DisplaySettings?.Title ?? 'Display Settings',
73
+ tooltip:
74
+ options.value.DisplaySettings?.Tooltip ??
75
+ 'Change the range of visible anatomy in the scan by only showing areas with certain density of tissue',
67
76
  component: ViewerDisplaySettings,
68
- visible: () => true,
69
- props: {}
77
+ visible: showDisplaySettings.value,
78
+ props: {
79
+ class: 'pa-4'
80
+ }
70
81
  },
71
82
  {
72
- icon: "draw",
73
- text: "Annotations",
74
- tooltip: "Display annotations on your scans",
75
- component: ViewerAnnotations,
76
- visible: () => !!showAnnotations.value,
77
- props: {}
83
+ icon: options.value.Annotations?.Icon ?? 'draw',
84
+ text: options.value.Annotations?.Title ?? 'Annotations',
85
+ tooltip: options.value.Annotations?.Tooltip ?? 'Display annotations on your scans',
86
+ component: AnnotationTreeView,
87
+ visible: !!showAnnotations.value,
88
+ props: {
89
+ items: annotations.value
90
+ }
78
91
  },
92
+ {
93
+ icon: options.value.Markups?.Icon ?? 'design_services',
94
+ text: options.value.Markups?.Title ?? 'Markups',
95
+ tooltip: options.value.Markups?.Tooltip ?? 'Display markups on your scans',
96
+ component: Markups,
97
+ visible: !!showMarkups.value,
98
+ props: {
99
+ items: markups.value
100
+ }
101
+ },
102
+ {
103
+ icon: options.value.Mcad?.Icon ?? 'deployed_code',
104
+ text: options.value.Mcad?.Title ?? 'MCAD',
105
+ tooltip: options.value.Mcad?.Tooltip ?? 'Display MCAD objects on your scans',
106
+ component: McadObjects,
107
+ visible: !!showMcadObjects.value,
108
+ props: {
109
+ items: mcadObjects.value
110
+ }
111
+ }
79
112
  ]);
80
113
 
114
+ const showDisplaySettings = computed(() => {
115
+ return options.value.DisplaySettings?.Show !== false;
116
+ });
117
+
81
118
  const showAnnotations = computed(() => {
82
- return props.options.OnLoadSavedSession && isSessionLoaded.value;
119
+ const opts = options.value;
120
+ return opts.Annotations?.Show !== false && opts.OnLoadSavedSession && hasAnnotations.value;
83
121
  });
84
122
 
85
- watch(() => props.drawer, (value: boolean) => {
86
- if (value) {
87
- expanded.value = previous.value;
88
- emit('update:expanded', expanded.value);
89
- } else {
90
- previous.value = expanded.value;
91
- expanded.value = undefined;
92
- emit('update:expanded', expanded.value);
93
- }
94
- }, { immediate: true });
123
+ const showMarkups = computed(() => {
124
+ const opts = options.value;
125
+ return opts.Markups?.Show !== false && opts.OnLoadSavedSession && hasMarkups.value;
126
+ });
127
+
128
+ const showMcadObjects = computed(() => {
129
+ const opts = options.value;
130
+ return opts.Mcad?.Show !== false && opts.OnLoadSavedSession && hasMcadObjects.value;
131
+ });
132
+
133
+ watch(
134
+ () => props.drawer,
135
+ (value: boolean) => {
136
+ if (value) {
137
+ expanded.value = previous.value;
138
+ emit('update:expanded', expanded.value);
139
+ } else {
140
+ previous.value = expanded.value;
141
+ expanded.value = undefined;
142
+ emit('update:expanded', expanded.value);
143
+ }
144
+ },
145
+ { immediate: true }
146
+ );
95
147
 
96
148
  function onUpdate(event: unknown): void {
97
149
  const value = event as number | undefined;
@@ -99,28 +151,18 @@ function onUpdate(event: unknown): void {
99
151
  expanded.value = value;
100
152
  emit('update:expanded', expanded.value);
101
153
  if (!props.drawer && value !== undefined) {
102
- emit('update:drawer', true)
154
+ emit('update:drawer', true);
103
155
  }
104
156
  }
105
157
  </script>
106
158
 
107
- <style scoped>
108
- .v-expansion-panel-content__wrap {
109
- padding: 0 8px 4px;
110
- flex: 1 1 auto;
111
- max-width: 100%;
112
- }
113
-
114
- .v-expansion-panel--active > .v-expansion-panel-header {
115
- min-height: 48px;
116
- }
117
-
118
- .v-expansion-panel--active:not(:first-child),
119
- .v-expansion-panel--active + .v-expansion-panel {
120
- margin-top: 0;
159
+ <style scoped lang="css">
160
+ :deep(.v-expansion-panel-title) {
161
+ padding: 12px 16px;
162
+ justify-content: center;
121
163
  }
122
164
 
123
- .v-expansion-panel-text__wrapper {
124
- padding: 8px 8px 16px;
165
+ :deep(.v-expansion-panel-text__wrapper) {
166
+ padding: 0;
125
167
  }
126
168
  </style>
@@ -1,111 +1,131 @@
1
1
  <template>
2
- <v-list>
3
- <template v-for="(item, index) of footerItems" :key="item">
4
- <v-tooltip location="right">
5
- <template #activator="{ props }">
6
- <v-list-item
7
- v-if="item.visible()"
8
- v-bind="props"
9
- :data-testid="`footer-${index}`"
10
- class="px-6"
11
- target="_blank"
12
- :disabled="disabled"
13
- @click="item.click()"
14
- >
15
- <template v-slot:prepend>
16
- <v-icon v-bind="item.iconProps" />
2
+ <div>
3
+ <div class="pa-1 d-flex flex-wrap justify-space-between" :class="drawer ? 'flex-row' : 'flex-col'">
4
+ <template v-for="(item, index) of footerItems" :key="index">
5
+ <div v-if="item.visible" class="ma-auto" :data-testid="`footer-${index}`">
6
+ <v-tooltip :location="drawer ? 'top' : 'right'">
7
+ <template #activator="{ props }">
8
+ <v-btn v-bind="props" variant="text" size="36" :icon="true" :disabled="disabled" @click="item.click()">
9
+ <v-icon size="24" v-bind="item.iconProps" />
10
+ </v-btn>
17
11
  </template>
18
- <v-list-item-title v-if="drawer" class="text-white">
19
- <span>{{ item.text }}</span>
20
- </v-list-item-title>
21
- </v-list-item>
22
- </template>
23
- <span>{{ item.tooltip }}</span>
24
- </v-tooltip>
25
- </template>
26
- </v-list>
12
+ <span>{{ item.text }}</span>
13
+ </v-tooltip>
14
+ </div>
15
+ </template>
16
+ </div>
17
+ <v-divider />
18
+ <div class="d-flex justify-center">
19
+ <span class="version px-2 py-1" data-testid="version">{{ drawer ? 'Version' : '' }} {{ version3cr }}</span>
20
+ </div>
21
+ </div>
27
22
  </template>
28
23
 
29
24
  <script setup lang="ts">
30
- import { ref } from "vue";
31
- import { currentColourPreset, initialScanState } from "@/dataLayer/scanState";
32
- import { ViewSelectionActions } from "@3cr/types-ts";
33
- import { LoadViewerOptions } from "@/models/LoadViewerOptions";
34
- import { useViewer3cr } from "@/dataLayer/useViewer3cr";
25
+ import { computed } from 'vue';
26
+ import { currentColourPreset, initialScanState } from '@/models/scanState';
27
+ import { ViewSelectionActions } from '@3cr/types-ts';
28
+ import { useViewer3cr } from '@/composables/useViewer3cr';
29
+ import { useViewerOptions } from '@/composables/useViewerOptions';
30
+ import { useVersion3cr } from '@/composables/useVersion3cr';
35
31
 
36
32
  interface Props {
37
- options: LoadViewerOptions;
38
33
  drawer?: boolean;
39
34
  disabled?: boolean;
40
35
  }
41
36
 
42
37
  interface FooterItem {
43
38
  text: string;
44
- tooltip: string;
45
39
  iconProps: Record<string, any>;
46
- visible: () => boolean;
40
+ visible: boolean;
47
41
  click: () => void | Promise<void>;
48
42
  }
49
43
 
50
- const props = withDefaults(defineProps<Props>(), {
44
+ withDefaults(defineProps<Props>(), {
51
45
  drawer: false,
52
46
  disabled: false
53
47
  });
54
48
 
55
49
  const viewer3cr = useViewer3cr();
56
- const footerItems = ref<FooterItem[]>([
50
+ const version3cr = useVersion3cr();
51
+ const options = useViewerOptions();
52
+
53
+ const showReset = computed(() => options.value.ShowResetScan !== false);
54
+
55
+ const showEnableCloudStorage = computed(() => {
56
+ const opts = options.value;
57
+ return opts.ShowEnableCloudStorage !== false && !!opts.OnEnableCloudStorage;
58
+ });
59
+
60
+ const showSendTo3rdParty = computed(() => {
61
+ const opts = options.value;
62
+ return opts.ShowSendTo3rdParty !== false && !!opts.OnSendTo3rdParty;
63
+ });
64
+
65
+ const showShareToMobile = computed(() => {
66
+ const opts = options.value;
67
+ return opts.ShowShareToMobile !== false && !!opts.OnShareToMobile;
68
+ });
69
+
70
+ const showScreenshot = computed(() => {
71
+ const opts = options.value;
72
+ return opts.ShowScreenshot !== false && !!opts.OnScreenshot;
73
+ });
74
+
75
+ const footerItems = computed<FooterItem[]>(() => [
57
76
  {
58
- text: "Reset Scan",
59
- tooltip: "Resets your scan to original position and settings in all views",
60
- iconProps: { icon: "refresh", color: "red" },
61
- visible: () => true,
77
+ text: 'Reset Scan',
78
+ iconProps: { icon: 'refresh', color: 'red' },
79
+ visible: showReset.value,
62
80
  click: async () => {
63
81
  currentColourPreset.value = initialScanState.value.ColourPresets[0];
64
82
  await viewer3cr.viewSelection(ViewSelectionActions.vs05);
65
83
  await viewer3cr.viewSelection(ViewSelectionActions.vs06);
66
- },
84
+ }
67
85
  },
68
86
  {
69
- text: "Enable Cloud Storage",
70
- tooltip: "Securely store your medical records in the cloud",
71
- iconProps: { icon: "cloud", color: "blue" },
72
- visible: () => !!props.options.OnEnableCloudStorage,
87
+ text: 'Enable Cloud Storage',
88
+ iconProps: { icon: 'cloud', color: 'blue' },
89
+ visible: showEnableCloudStorage.value,
73
90
  click: async () => {
74
- await props.options.OnEnableCloudStorage!();
91
+ await options.value.OnEnableCloudStorage!();
75
92
  }
76
93
  },
77
94
  {
78
- text: "Send to 3rd Party",
79
- tooltip: "Securely share your loaded scan with 3rd parties via email with option to anonymise",
80
- iconProps: { icon: "send", color: "green" },
81
- visible: () => !!props.options.OnSendTo3rdParty,
95
+ text: 'Send to 3rd Party',
96
+ iconProps: { icon: 'send', color: 'green' },
97
+ visible: showSendTo3rdParty.value,
82
98
  click: async () => {
83
- await props.options.OnSendTo3rdParty!();
99
+ await options.value.OnSendTo3rdParty!();
84
100
  }
85
101
  },
86
102
  {
87
- text: "Share to Mobile / VR",
88
- tooltip: "Share your loaded scan with the 3Dicom Mobile and VR applications to download within 7 days",
89
- iconProps: { icon: "share", color: "yellow" },
90
- visible: () => !!props.options.OnShareToMobile,
103
+ text: 'Share to Mobile / VR',
104
+ iconProps: { icon: 'share', color: 'yellow' },
105
+ visible: showShareToMobile.value,
91
106
  click: async () => {
92
- await props.options.OnShareToMobile!();
107
+ await options.value.OnShareToMobile!();
93
108
  }
94
109
  },
95
110
  {
96
- text: "Screenshot View",
97
- tooltip: 'Take a screenshot',
98
- iconProps: { icon: "screenshot_region", color: "green" },
99
- visible: () => !!props.options.OnScreenshot,
111
+ text: 'Screenshot View',
112
+ iconProps: { icon: 'screenshot_region', color: 'green' },
113
+ visible: showScreenshot.value,
100
114
  click: async () => {
101
- await props.options.OnScreenshot!();
115
+ await options.value.OnScreenshot!();
102
116
  }
103
- },
117
+ }
104
118
  ]);
105
119
  </script>
106
120
 
107
- <style scoped>
108
- .v-icon {
109
- opacity: 1;
121
+ <style scoped lang="css">
122
+ .version {
123
+ font-size: 9px;
124
+ font-weight: 300;
125
+ letter-spacing: 0.1666666667em;
126
+ text-transform: uppercase;
127
+ text-overflow: ellipsis;
128
+ overflow: hidden;
129
+ white-space: nowrap;
110
130
  }
111
131
  </style>