@3cr/viewer-browser 0.0.248 → 0.0.292

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 (520) hide show
  1. package/.circleci/config.yml +53 -0
  2. package/README.md +79 -74
  3. package/components.d.ts +94 -36
  4. package/dist/Viewer3CR.js +663 -47
  5. package/dist/Viewer3CR.mjs +108286 -37159
  6. package/dist/Viewer3CR.umd.js +663 -47
  7. package/index.html +35 -33
  8. package/package.json +27 -8
  9. package/playground/img.png +0 -0
  10. package/playground/index.html +6 -2
  11. package/src/App.vue +41 -97
  12. package/src/__tests__/app.spec.ts +2 -1
  13. package/src/__tests__/main.spec.ts +14 -14
  14. package/src/assets/_palette.scss +112 -0
  15. package/src/assets/_settings.scss +64 -0
  16. package/src/assets/_typography.scss +187 -0
  17. package/src/assets/images/cloud-storage.svg +22 -0
  18. package/src/assets/images/courtney.png +0 -0
  19. package/src/assets/images/dark/magic-wand.svg +32 -0
  20. package/src/assets/images/dark-theme.svg +33 -0
  21. package/src/assets/images/dot.svg +5 -0
  22. package/src/assets/images/dr-miles.png +0 -0
  23. package/src/assets/images/illustration.svg +118 -0
  24. package/src/assets/images/intro.svg +30 -0
  25. package/src/assets/{magic_wand.svg → images/light/magic-wand.svg} +22 -14
  26. package/src/assets/images/light-theme.svg +33 -0
  27. package/src/assets/images/system-theme.svg +51 -0
  28. package/src/assets/images/totalSegmentator.png +0 -0
  29. package/src/assets/logos/3dicom/black/black.svg +30 -0
  30. package/src/assets/logos/3dicom/colour/colour.svg +18 -0
  31. package/src/assets/logos/3dicom/colour/colour_single.svg +18 -0
  32. package/src/assets/logos/3dicom/wordmark/patients/patients.svg +29 -0
  33. package/src/assets/logos/3dicom/wordmark/powered-by/powered-by.svg +41 -0
  34. package/src/assets/logos/3dicom/wordmark/practitioners/practitioner.svg +34 -0
  35. package/src/assets/logos/3dicom/wordmark/research/research.svg +29 -0
  36. package/src/assets/logos/license/black/black.svg +22 -0
  37. package/src/assets/logos/license/white/white.svg +22 -0
  38. package/src/assets/styles.scss +435 -12
  39. package/src/components/ShFlatIconBtn.vue +36 -0
  40. package/src/components/ShPlainIconBtn.vue +42 -0
  41. package/src/components/ShSelect.vue +48 -0
  42. package/src/components/ShTextField.vue +39 -0
  43. package/src/components/ShTextarea.vue +39 -0
  44. package/src/components/__tests__/ShFlatIconBtn.spec.ts +32 -0
  45. package/src/components/__tests__/ShPlainIconBtn.spec.ts +37 -0
  46. package/src/components/__tests__/ShSelect.spec.ts +30 -0
  47. package/src/components/__tests__/ShTextField.spec.ts +30 -0
  48. package/src/components/__tests__/ShTextarea.spec.ts +30 -0
  49. package/src/components/demo/CloudDropZone.vue +105 -0
  50. package/src/components/demo/DemoAvatarDropdownMenu.vue +343 -0
  51. package/src/components/demo/DemoInfoModal.vue +60 -0
  52. package/src/components/demo/DemoNotificationNavigationDrawer.vue +118 -0
  53. package/src/components/demo/DemoPurchaseCreditsModal.vue +141 -0
  54. package/src/components/demo/DemoUpgradeCloudStorageModal.vue +74 -0
  55. package/src/components/demo/DemoUpgradePlanModal.vue +17 -0
  56. package/src/components/demo/UploadDicomToCloudModal.vue +225 -0
  57. package/src/components/demo/__tests__/CloudDropZone.spec.ts +132 -0
  58. package/src/components/demo/__tests__/DemoAvatarDropdownMenu.spec.ts +16 -0
  59. package/src/components/demo/{licence/__tests__/DemoLicenceEnableCloudStorageModal.spec.ts → __tests__/DemoEnableCloudStorageModal.spec.ts} +11 -11
  60. package/src/components/demo/{licence/__tests__/DemoLicenceInfoModal.spec.ts → __tests__/DemoInfoModal.spec.ts} +11 -8
  61. package/src/components/demo/__tests__/DemoNotificationNavigationDrawer.spec.ts +56 -0
  62. package/src/components/demo/__tests__/UploadDicomToCloudModal.spec.ts +320 -0
  63. package/src/components/demo/__tests__/demo-payload.spec.ts +10 -0
  64. package/src/components/demo/demo-notifications.ts +45 -0
  65. package/src/components/demo/demo-payload.ts +9 -0
  66. package/src/components/demo/fileReader.ts +47 -0
  67. package/src/{composables/useViewerOptions.ts → components/demo/mockDemoViewerStlDecimator.ts} +8 -12
  68. package/src/components/intro/ViewerIntro.vue +56 -0
  69. package/src/components/intro/ViewerTour.vue +53 -0
  70. package/src/components/intro/tour/Tour.vue +205 -0
  71. package/src/components/intro/tour/step.ts +6 -0
  72. package/src/components/modal/ActionRail.vue +4 -0
  73. package/src/components/modal/Viewer3cr.vue +224 -0
  74. package/src/components/modal/Viewer3crWebGL.vue +65 -0
  75. package/src/components/modal/ViewerActionRail.vue +10 -27
  76. package/src/components/modal/ViewerMain.vue +83 -0
  77. package/src/components/modal/ViewerNavigationDrawer.vue +269 -68
  78. package/src/components/modal/ViewerScanView.vue +223 -67
  79. package/src/components/modal/__tests__/{MftpWebGL3DRModal.spec.ts → Viewer3cr.spec.ts} +154 -53
  80. package/src/components/modal/__tests__/{WebGL3DR.spec.ts → Viewer3crWebGL.spec.ts} +11 -11
  81. package/src/components/modal/__tests__/ViewerNavigationDrawer.spec.ts +271 -11
  82. package/src/components/modal/__tests__/ViewerScanView.spec.ts +15 -7
  83. package/src/components/modal/actions/Action.vue +3 -8
  84. package/src/components/modal/actions/Flip3dAction.vue +31 -16
  85. package/src/components/modal/actions/FlipHorizontalAction.vue +14 -5
  86. package/src/components/modal/actions/FlipVerticalAction.vue +14 -5
  87. package/src/components/modal/actions/FullscreenAction.vue +9 -5
  88. package/src/components/modal/actions/PanAction.vue +11 -51
  89. package/src/components/modal/actions/ResetViewAction.vue +10 -8
  90. package/src/components/modal/actions/Rotate2dAction.vue +25 -15
  91. package/src/components/modal/actions/Slice3dAction.vue +22 -10
  92. package/src/components/modal/actions/ZoomAction.vue +21 -13
  93. package/src/components/modal/actions/__tests__/Action.spec.ts +2 -2
  94. package/src/components/modal/actions/__tests__/Flip3dAction.spec.ts +58 -14
  95. package/src/components/modal/actions/__tests__/FlipHorizontalAction.spec.ts +15 -5
  96. package/src/components/modal/actions/__tests__/FlipVerticalAction.spec.ts +15 -5
  97. package/src/components/modal/actions/__tests__/FullscreenAction.spec.ts +7 -5
  98. package/src/components/modal/actions/__tests__/PanAction.spec.ts +13 -32
  99. package/src/components/modal/actions/__tests__/ResetViewAction.spec.ts +5 -3
  100. package/src/components/modal/actions/__tests__/Rotate2dAction.spec.ts +13 -6
  101. package/src/components/modal/actions/__tests__/Slice3dAction.spec.ts +1 -1
  102. package/src/components/modal/actions/__tests__/ZoomAction.spec.ts +25 -11
  103. package/src/components/modal/app-bars/ViewerActionBar.vue +224 -0
  104. package/src/components/modal/app-bars/ViewerAppBar.vue +126 -0
  105. package/src/components/modal/app-bars/__tests__/ViewerActionBar.spec.ts +176 -0
  106. package/src/components/modal/app-bars/__tests__/ViewerAppBar.spec.ts +99 -0
  107. package/src/components/modal/layouts/Layout1x3ClipPath.vue +35 -0
  108. package/src/components/modal/layouts/Layout2x2ClipPath.vue +35 -0
  109. package/src/components/modal/layouts/LayoutFullscreenClipPath.vue +29 -0
  110. package/src/components/modal/layouts/__tests__/Layout1x3ClipPath.spec.ts +15 -0
  111. package/src/components/modal/layouts/__tests__/Layout2x2ClipPath.spec.ts +15 -0
  112. package/src/components/modal/layouts/__tests__/LayoutFullscreenClipPath.spec.ts +15 -0
  113. package/src/components/modal/layouts/composables/__tests__/useLayout1x3.spec.ts +40 -0
  114. package/src/components/modal/layouts/composables/__tests__/useLayout2x2.spec.ts +40 -0
  115. package/src/components/modal/layouts/composables/__tests__/useLayoutFullscreen.spec.ts +40 -0
  116. package/src/components/modal/layouts/composables/useLayout1x3.ts +46 -0
  117. package/src/components/modal/layouts/composables/useLayout2x2.ts +46 -0
  118. package/src/components/modal/layouts/composables/useLayoutFullscreen.ts +24 -0
  119. package/src/components/modal/menus/AutoAnnotateMenu.vue +67 -0
  120. package/src/components/modal/menus/AvatarDropdownMenu.vue +66 -0
  121. package/src/components/modal/menus/HelpMenu.vue +47 -0
  122. package/src/components/modal/menus/SettingsMenu.vue +242 -92
  123. package/src/components/modal/menus/ShareMenu.vue +58 -0
  124. package/src/components/modal/menus/__tests__/AutoAnnotateMenu.spec.ts +80 -0
  125. package/src/components/modal/menus/__tests__/AvatarDropdownMenu.spec.ts +49 -0
  126. package/src/components/modal/menus/__tests__/HelpMenu.spec.ts +12 -0
  127. package/src/components/modal/menus/__tests__/SettingsMenu.spec.ts +163 -57
  128. package/src/components/modal/modal/AboutModal.vue +61 -0
  129. package/src/components/modal/modal/AiModelList.vue +70 -0
  130. package/src/components/modal/{AskAI.vue → modal/AskAiModal.vue} +26 -34
  131. package/src/components/modal/modal/AutoAnnotateModal.vue +136 -0
  132. package/src/components/modal/modal/CloseViewerModal.vue +108 -0
  133. package/src/components/modal/modal/DataOverlayGeneralModal.vue +122 -0
  134. package/src/components/modal/modal/DataOverlayMeasurementModal.vue +59 -0
  135. package/src/components/modal/modal/DataOverlayModal.vue +121 -0
  136. package/src/components/modal/modal/ShareModal.vue +201 -0
  137. package/src/components/modal/modal/UploadsDrawer.vue +165 -0
  138. package/src/components/modal/modal/WhatsNewModal.vue +45 -0
  139. package/src/components/modal/modal/__tests__/AboutModal.spec.ts +60 -0
  140. package/src/components/modal/modal/__tests__/AiModelList.spec.ts +50 -0
  141. package/src/components/modal/{__tests__ → modal/__tests__}/AskAI.spec.ts +8 -7
  142. package/src/components/modal/modal/__tests__/AutoAnnotateModal.spec.ts +29 -0
  143. package/src/components/modal/modal/__tests__/CloseViewerModal.spec.ts +60 -0
  144. package/src/components/modal/modal/__tests__/DataOverlayGeneralModal.spec.ts +55 -0
  145. package/src/components/modal/modal/__tests__/DataOverlayMeasurementModal.spec.ts +82 -0
  146. package/src/components/modal/modal/__tests__/DataOverlayModal.spec.ts +94 -0
  147. package/src/components/modal/modal/__tests__/ShareModal.spec.ts +262 -0
  148. package/src/components/modal/modal/__tests__/UploadsDrawer.spec.ts +174 -0
  149. package/src/components/modal/modal/__tests__/WhatsNewModal.spec.ts +29 -0
  150. package/src/components/modal/snackbars/AnnotationGeneratedSnackbar.vue +34 -0
  151. package/src/components/modal/snackbars/ImagesSharedSnackbar.vue +26 -0
  152. package/src/components/modal/snackbars/LinkCopiedSnackbar.vue +26 -0
  153. package/src/components/modal/snackbars/__tests__/AnnotationGeneratedSnackbar.spec.ts +43 -0
  154. package/src/components/modal/snackbars/__tests__/ImagesSharedSnackbar.spec.ts +22 -0
  155. package/src/components/modal/snackbars/__tests__/LinkCopiedSnackbar.spec.ts +21 -0
  156. package/src/components/navigation/annotation/AnnotationCreateModal.vue +114 -0
  157. package/src/components/navigation/annotation/AnnotationCreateSnackbar.vue +20 -0
  158. package/src/components/navigation/annotation/AnnotationDataTable.vue +157 -0
  159. package/src/components/navigation/annotation/AnnotationDeleteModal.vue +48 -0
  160. package/src/components/navigation/annotation/AnnotationDeleteSnackbar.vue +25 -0
  161. package/src/components/navigation/annotation/AnnotationForm.vue +277 -0
  162. package/src/components/navigation/annotation/AnnotationIcon.vue +45 -0
  163. package/src/components/navigation/annotation/AnnotationInfo.vue +141 -0
  164. package/src/components/navigation/annotation/AnnotationMenu.vue +99 -0
  165. package/src/components/navigation/annotation/AnnotationPanel.vue +30 -0
  166. package/src/components/navigation/annotation/AnnotationTools.vue +104 -0
  167. package/src/components/navigation/annotation/AnnotationUpdateModal.vue +78 -0
  168. package/src/components/navigation/annotation/AnnotationVisibilityBtn.vue +52 -0
  169. package/src/components/navigation/annotation/DrawerTitle.vue +25 -0
  170. package/src/components/navigation/annotation/__tests__/AnnotationCreateModal.spec.ts +178 -0
  171. package/src/components/navigation/annotation/__tests__/AnnotationCreateSnackbar.spec.ts +31 -0
  172. package/src/components/navigation/annotation/__tests__/AnnotationDataTable.spec.ts +79 -0
  173. package/src/components/navigation/annotation/__tests__/AnnotationDeleteSnackbar.spec.ts +66 -0
  174. package/src/components/navigation/annotation/__tests__/AnnotationForm.spec.ts +261 -0
  175. package/src/components/navigation/annotation/__tests__/AnnotationIcon.spec.ts +13 -0
  176. package/src/components/navigation/annotation/__tests__/AnnotationTools.spec.ts +116 -0
  177. package/src/components/navigation/display/DisplayPanel.vue +156 -0
  178. package/src/components/{views/__tests__/DisplaySettings.spec.ts → navigation/display/__tests__/DisplayPanel.spec.ts} +14 -3
  179. package/src/components/navigation/history/HistoryModal.vue +140 -0
  180. package/src/components/navigation/mcad/McadAddObjectBtn.vue +41 -0
  181. package/src/components/navigation/mcad/McadDataTable.vue +78 -0
  182. package/src/components/navigation/mcad/McadDataTableItems.vue +382 -0
  183. package/src/components/navigation/mcad/McadDeleteModal.vue +44 -0
  184. package/src/components/navigation/mcad/McadDropZone.vue +148 -0
  185. package/src/components/navigation/mcad/McadFloating.vue +193 -0
  186. package/src/components/navigation/mcad/McadIcon.vue +34 -0
  187. package/src/components/navigation/mcad/McadInvert.vue +91 -0
  188. package/src/components/navigation/mcad/McadLockBtn.vue +62 -0
  189. package/src/components/navigation/mcad/McadMenu.vue +248 -0
  190. package/src/components/navigation/mcad/McadOpacity.vue +79 -0
  191. package/src/components/navigation/mcad/McadPanel.vue +31 -0
  192. package/src/components/navigation/mcad/McadToggleSortBtn.vue +18 -0
  193. package/src/components/navigation/mcad/McadToggleVisibilityBtn.vue +46 -0
  194. package/src/components/navigation/mcad/McadUpdateModal.vue +108 -0
  195. package/src/components/navigation/mcad/McadVisibilityBtn.vue +46 -0
  196. package/src/components/navigation/mcad/__tests__/McadAddObjectBtn.spec.ts +73 -0
  197. package/src/components/navigation/mcad/__tests__/McadDataTable.spec.ts +27 -0
  198. package/src/components/navigation/mcad/__tests__/McadDataTableItems.spec.ts +621 -0
  199. package/src/components/navigation/mcad/__tests__/McadDeleteModal.spec.ts +67 -0
  200. package/src/components/navigation/mcad/__tests__/McadDropZone.spec.ts +109 -0
  201. package/src/components/navigation/mcad/__tests__/McadIcon.spec.ts +13 -0
  202. package/src/components/navigation/mcad/__tests__/McadInvert.spec.ts +45 -0
  203. package/src/components/navigation/mcad/__tests__/McadLockBtn.spec.ts +38 -0
  204. package/src/components/navigation/mcad/__tests__/McadMenu.spec.ts +258 -0
  205. package/src/components/navigation/mcad/__tests__/McadOpacity.spec.ts +68 -0
  206. package/src/components/navigation/mcad/__tests__/McadToggleSortBtn.spec.ts +36 -0
  207. package/src/components/navigation/mcad/__tests__/McadToggleVisibilityBtn.spec.ts +53 -0
  208. package/src/components/navigation/mcad/__tests__/McadUpdateModal.spec.ts +122 -0
  209. package/src/components/navigation/mcad/__tests__/McadVisibilityBtn.spec.ts +45 -0
  210. package/src/components/navigation/measurement/MeasurementAngleSnackbar.vue +18 -0
  211. package/src/components/navigation/measurement/MeasurementDataTable.vue +162 -0
  212. package/src/components/navigation/measurement/MeasurementDeleteModal.vue +49 -0
  213. package/src/components/navigation/measurement/MeasurementDeleteSnackbar.vue +40 -0
  214. package/src/components/navigation/measurement/MeasurementIcon.vue +41 -0
  215. package/src/components/navigation/measurement/MeasurementInfo.vue +25 -0
  216. package/src/components/navigation/measurement/MeasurementInfoAngle.vue +36 -0
  217. package/src/components/navigation/measurement/MeasurementInfoLength.vue +37 -0
  218. package/src/components/navigation/measurement/MeasurementInfoPolygon.vue +58 -0
  219. package/src/components/navigation/measurement/MeasurementLengthSnackbar.vue +18 -0
  220. package/src/components/navigation/measurement/MeasurementMenu.vue +97 -0
  221. package/src/components/navigation/measurement/MeasurementPanel.vue +30 -0
  222. package/src/components/navigation/measurement/MeasurementPolygonSnackbar.vue +18 -0
  223. package/src/components/navigation/measurement/MeasurementTools.vue +101 -0
  224. package/src/components/navigation/measurement/MeasurementVisibilityBtn.vue +53 -0
  225. package/src/components/navigation/measurement/__tests__/MeasurementAngleSnackbar.spec.ts +34 -0
  226. package/src/components/navigation/measurement/__tests__/MeasurementDataTable.spec.ts +79 -0
  227. package/src/components/navigation/measurement/__tests__/MeasurementDeleteSnackbar.spec.ts +51 -0
  228. package/src/components/navigation/measurement/__tests__/MeasurementInfo.spec.ts +77 -0
  229. package/src/components/navigation/measurement/__tests__/MeasurementLengthSnackbar.spec.ts +35 -0
  230. package/src/components/navigation/measurement/__tests__/MeasurementPolygonSnackbar.spec.ts +35 -0
  231. package/src/components/navigation/measurement/__tests__/MeasurementTools.spec.ts +87 -0
  232. package/src/components/shared/ColourPalette.vue +72 -0
  233. package/src/components/shared/DoubleSliderSelector.vue +66 -28
  234. package/src/components/shared/HorizontalSliderSelector.vue +80 -0
  235. package/src/components/shared/KeyboardShortcuts.vue +184 -0
  236. package/src/components/shared/LoadingSpinner.vue +508 -144
  237. package/src/components/shared/MultiLoginError.vue +98 -0
  238. package/src/components/shared/NotificationToaster.vue +112 -0
  239. package/src/components/shared/UpdateSnackbar.vue +22 -9
  240. package/src/components/shared/ValueSelector.vue +10 -10
  241. package/src/components/shared/VerticalSliderSelector.vue +45 -44
  242. package/src/components/shared/__tests__/ColourPalette.spec.ts +21 -0
  243. package/src/components/shared/__tests__/DoubleSliderSelector.spec.ts +58 -46
  244. package/src/components/shared/__tests__/HorizontalSliderSelector.spec.ts +35 -0
  245. package/src/components/shared/__tests__/KeyboardShortcuts.spec.ts +50 -0
  246. package/src/components/shared/__tests__/MultiLoginError.spec.ts +50 -0
  247. package/src/components/shared/__tests__/NotificationToaster.spec.ts +65 -0
  248. package/src/components/shared/__tests__/UpdateSnackbar.spec.ts +7 -7
  249. package/src/components/shared/__tests__/ValueSelector.spec.ts +6 -0
  250. package/src/composables/__tests__/useDebounce.spec.ts +17 -0
  251. package/src/composables/__tests__/useMovingAverage.spec.ts +40 -0
  252. package/src/composables/__tests__/useNavigationCube.spec.ts +79 -0
  253. package/src/{functions/__tests__/notification.spec.ts → composables/__tests__/useNotificationHandler.spec.ts} +74 -17
  254. package/src/composables/__tests__/useToolGroup.spec.ts +41 -0
  255. package/src/composables/__tests__/useViewName.spec.ts +29 -0
  256. package/src/composables/useBoundingBox.ts +32 -0
  257. package/src/composables/useEventListener.ts +7 -9
  258. package/src/composables/useMedia.ts +27 -0
  259. package/src/composables/useNavigationCube.ts +80 -0
  260. package/src/composables/useNotificationHandler.ts +82 -0
  261. package/src/composables/useResizeObserver.ts +31 -0
  262. package/src/composables/useToolGroup.ts +36 -0
  263. package/src/composables/useViewName.ts +34 -0
  264. package/src/composables/useViewer3cr.ts +3 -2
  265. package/src/config.ts +1 -1
  266. package/src/constants.ts +8 -0
  267. package/src/functions/HotkeyScope.ts +87 -0
  268. package/src/functions/__tests__/HotkeyScope.spec.ts +49 -0
  269. package/src/functions/__tests__/colours.spec.ts +42 -0
  270. package/src/functions/__tests__/fileReader.spec.ts +130 -0
  271. package/src/functions/__tests__/modelHelper.spec.ts +1 -0
  272. package/src/functions/__tests__/tsHelper.spec.ts +7 -0
  273. package/src/functions/chunker.ts +21 -0
  274. package/src/functions/colours.ts +45 -0
  275. package/src/functions/fileReader.ts +48 -0
  276. package/src/functions/guards/__tests__/isDataOverlayAngle.spec.ts +21 -0
  277. package/src/functions/guards/__tests__/isDataOverlayLength.spec.ts +21 -0
  278. package/src/functions/guards/__tests__/isDataOverlayPolygon.spec.ts +21 -0
  279. package/src/functions/guards/isDataOverlayAngle.ts +3 -4
  280. package/src/functions/guards/isDataOverlayLength.ts +3 -4
  281. package/src/functions/guards/isDataOverlayPolygon.ts +3 -4
  282. package/src/functions/openUrl.ts +3 -0
  283. package/src/functions/{__tests__ → parsers/__tests__}/parseAction.spec.ts +1 -1
  284. package/src/functions/{__tests__ → parsers/__tests__}/parseCallToAction.spec.ts +1 -1
  285. package/src/functions/{__tests__ → parsers/__tests__}/parseDataOverlay.spec.ts +1 -1
  286. package/src/functions/{__tests__ → parsers/__tests__}/parseDataOverlayData.spec.ts +1 -1
  287. package/src/functions/{__tests__ → parsers/__tests__}/parseDataOverlayEvent.spec.ts +3 -3
  288. package/src/functions/{__tests__ → parsers/__tests__}/parseMcadEvent.spec.ts +3 -3
  289. package/src/functions/{parseAction.ts → parsers/parseAction.ts} +1 -2
  290. package/src/functions/{parseCallToAction.ts → parsers/parseCallToAction.ts} +2 -2
  291. package/src/functions/{parseDataOverlay.ts → parsers/parseDataOverlay.ts} +3 -3
  292. package/src/functions/parsers/parseDataOverlayData.ts +9 -0
  293. package/src/functions/parsers/parseDataOverlayEvent.ts +19 -0
  294. package/src/functions/parsers/parseMcadEvent.ts +9 -0
  295. package/src/functions/platform.ts +7 -0
  296. package/src/functions/translateTooltipShortcut.ts +35 -0
  297. package/src/functions/tsHelper.ts +3 -0
  298. package/src/main.ts +70 -48
  299. package/src/models/__tests__/iso-languages.spec.ts +23 -0
  300. package/src/models/__tests__/scanState.spec.ts +14 -38
  301. package/src/models/iso-languages.ts +1609 -0
  302. package/src/models/progress.ts +23 -0
  303. package/src/models/scanState.ts +56 -100
  304. package/src/plugins/__tests__/pinia.spec.ts +7 -0
  305. package/src/plugins/__tests__/vue-i18n.spec.ts +7 -0
  306. package/src/plugins/__tests__/vuetify.spec.ts +3 -3
  307. package/src/plugins/locales/en.json +442 -0
  308. package/src/plugins/material-symbols/aliases.ts +43 -0
  309. package/src/plugins/material-symbols/material-symbols-filled.ts +11 -0
  310. package/src/plugins/material-symbols/material-symbols-outlined.ts +9 -0
  311. package/src/plugins/pinia.ts +3 -0
  312. package/src/plugins/vue-i18n.ts +9 -0
  313. package/src/plugins/vuetify.ts +157 -25
  314. package/src/services/__tests__/features.service.spec.ts +14 -0
  315. package/src/services/__tests__/gpt.service.spec.ts +64 -3
  316. package/src/services/__tests__/viewer-3cr.service.spec.ts +616 -192
  317. package/src/services/features.service.ts +32 -0
  318. package/src/services/gpt.service.ts +5 -2
  319. package/src/services/viewer-3cr.service.ts +374 -307
  320. package/src/stores/__tests__/data-overlay.store.spec.ts +92 -0
  321. package/src/stores/__tests__/demo.store.spec.ts +196 -0
  322. package/src/stores/__tests__/drawer.store.spec.ts +27 -0
  323. package/src/stores/__tests__/intro.store.spec.ts +102 -0
  324. package/src/stores/__tests__/language.store.spec.ts +83 -0
  325. package/src/stores/__tests__/mcad-floating.store.spec.ts +339 -0
  326. package/src/stores/__tests__/mcad.store.spec.ts +88 -0
  327. package/src/stores/__tests__/save.store.spec.ts +51 -0
  328. package/src/stores/__tests__/theme.store.spec.ts +18 -0
  329. package/src/stores/__tests__/tool.store.spec.ts +53 -0
  330. package/src/stores/__tests__/upload.store.spec.ts +19 -0
  331. package/src/stores/__tests__/viewer.store.spec.ts +20 -0
  332. package/src/stores/data-overlay.store.ts +93 -0
  333. package/src/stores/demo.store.ts +284 -0
  334. package/src/stores/drawer.store.ts +23 -0
  335. package/src/stores/intro.store.ts +35 -0
  336. package/src/stores/language.store.ts +59 -0
  337. package/src/stores/mcad-floating.store.ts +141 -0
  338. package/src/stores/mcad.store.ts +53 -0
  339. package/src/stores/save.store.ts +59 -0
  340. package/src/stores/theme.store.ts +45 -0
  341. package/src/stores/tool.store.ts +41 -0
  342. package/src/stores/upload.store.ts +19 -0
  343. package/src/stores/viewer.store.ts +34 -0
  344. package/src/tools/__tests__/annotation-create.tool.spec.ts +90 -0
  345. package/src/tools/__tests__/annotation-move.tool.spec.ts +107 -0
  346. package/src/tools/__tests__/data-overlay.tool.spec.ts +127 -0
  347. package/src/tools/__tests__/mcad-move.tool.spec.ts +106 -0
  348. package/src/tools/__tests__/mcad-rotate.tool.spec.ts +103 -0
  349. package/src/tools/__tests__/mcad-scale.tool.spec.ts +8 -0
  350. package/src/tools/__tests__/mcad-select.tool.spec.ts +63 -0
  351. package/src/tools/__tests__/measurement-angle.tool.spec.ts +26 -0
  352. package/src/tools/__tests__/measurement-length.tool.spec.ts +26 -0
  353. package/src/tools/__tests__/measurement-polygon.tool.spec.ts +26 -0
  354. package/src/tools/annotation-create.tool.ts +48 -0
  355. package/src/tools/annotation-move.tool.ts +48 -0
  356. package/src/tools/data-overlay.tool.ts +45 -48
  357. package/src/tools/mcad-move.tool.ts +47 -0
  358. package/src/tools/mcad-rotate.tool.ts +47 -0
  359. package/src/tools/mcad-scale-tool.ts +10 -0
  360. package/src/tools/mcad-select-tool.ts +32 -0
  361. package/src/tools/measurement-angle.tool.ts +20 -0
  362. package/src/tools/measurement-length.tool.ts +20 -0
  363. package/src/tools/measurement-polygon.tool.ts +20 -0
  364. package/src/types/feature.ts +6 -0
  365. package/src/types/viewer-tool.ts +5 -0
  366. package/test/MockImportOriginal.ts +7 -0
  367. package/test/assertions/beTypeOrNull.ts +24 -0
  368. package/test/fakers/action-data.faker.ts +1 -1
  369. package/test/fakers/action.faker.ts +1 -1
  370. package/test/fakers/call-to-action.faker.ts +1 -1
  371. package/test/fakers/data-overlay-angle.faker.ts +1 -1
  372. package/test/fakers/data-overlay-annotation.faker.ts +1 -1
  373. package/test/fakers/data-overlay-data.faker.ts +18 -15
  374. package/test/fakers/data-overlay-interaction.faker.ts +25 -17
  375. package/test/fakers/data-overlay-length.faker.ts +1 -1
  376. package/test/fakers/data-overlay-mcad.faker.ts +4 -3
  377. package/test/fakers/data-overlay-polygon.faker.ts +1 -1
  378. package/test/fakers/feature.faker.ts +13 -0
  379. package/test/fakers/file.faker.ts +11 -0
  380. package/test/fakers/gpt-question.faker.ts +1 -1
  381. package/test/fakers/gpt-response.faker.ts +1 -1
  382. package/test/fakers/mcad-object-interaction.faker.ts +4 -4
  383. package/test/fakers/orientation.faker.ts +1 -1
  384. package/test/fakers/segment-angle.faker.ts +1 -1
  385. package/test/fakers/upload.faker.ts +14 -0
  386. package/test/getAnimationFrame.ts +3 -0
  387. package/test/plugins/findByTestId.ts +13 -6
  388. package/test/plugins/pinia.ts +20 -0
  389. package/test/plugins/vitest.d.ts +8 -0
  390. package/test/plugins/vue-i18n.ts +22 -0
  391. package/test/plugins/vuetify.ts +10 -0
  392. package/test/setup.ts +37 -12
  393. package/tsconfig.json +1 -1
  394. package/vite.config.mts +48 -18
  395. package/vitest.config.mts +12 -3
  396. package/src/assets/images/MainBackdrop.svg +0 -48
  397. package/src/assets/images/dark/Singular-Health-Disc-Mono.svg +0 -9
  398. package/src/assets/images/dark/demo-icon-small.png +0 -0
  399. package/src/assets/images/dark/demo-logo-small.svg +0 -27
  400. package/src/assets/images/dark/demo-logo.svg +0 -1
  401. package/src/assets/images/light/Singular-Health-Disc-Mono.svg +0 -9
  402. package/src/assets/logos/3dicom/white-mini.svg +0 -20
  403. package/src/components/demo/DemoModal.vue +0 -44
  404. package/src/components/demo/DemoPatientModal.vue +0 -52
  405. package/src/components/demo/__tests__/DemoModal.spec.ts +0 -26
  406. package/src/components/demo/__tests__/DemoPatientModal.spec.ts +0 -38
  407. package/src/components/demo/__tests__/options.spec.ts +0 -25
  408. package/src/components/demo/licence/DemoLicenceEnableCloudStorageModal.vue +0 -64
  409. package/src/components/demo/licence/DemoLicenceInfoModal.vue +0 -49
  410. package/src/components/demo/licence/DemoLicenceSendToPartyModal.vue +0 -178
  411. package/src/components/demo/licence/DemoLicenceShareToMobileModal.vue +0 -102
  412. package/src/components/demo/licence/__tests__/DemoLicenceSendToPartyModal.spec.ts +0 -36
  413. package/src/components/demo/licence/__tests__/DemoLicenceShareToMobileModal.spec.ts +0 -52
  414. package/src/components/demo/options.ts +0 -170
  415. package/src/components/demo/patient/DemoPatientEnableCloudStorageModal.vue +0 -64
  416. package/src/components/demo/patient/DemoPatientInfoModal.vue +0 -49
  417. package/src/components/demo/patient/DemoPatientSendToPartyModal.vue +0 -177
  418. package/src/components/demo/patient/DemoPatientShareToMobileModal.vue +0 -102
  419. package/src/components/demo/patient/__tests__/DemoPatientEnableCloudStorageModal.spec.ts +0 -38
  420. package/src/components/demo/patient/__tests__/DemoPatientInfoModal.spec.ts +0 -38
  421. package/src/components/demo/patient/__tests__/DemoPatientSendToPartyModal.spec.ts +0 -36
  422. package/src/components/demo/patient/__tests__/DemoPatientShareToMobileModal.spec.ts +0 -52
  423. package/src/components/modal/CloseViewerModal.vue +0 -69
  424. package/src/components/modal/MftpWebGL3DRModal.vue +0 -336
  425. package/src/components/modal/ViewerNavigationDrawerContent.vue +0 -168
  426. package/src/components/modal/ViewerNavigationDrawerFooter.vue +0 -131
  427. package/src/components/modal/ViewerNavigationDrawerHeader.vue +0 -33
  428. package/src/components/modal/WebGL3DR.vue +0 -91
  429. package/src/components/modal/__tests__/CloseViewerModal.spec.ts +0 -70
  430. package/src/components/modal/__tests__/ViewerNavigationDrawerContent.spec.ts +0 -11
  431. package/src/components/modal/__tests__/ViewerNavigationDrawerFooter.spec.ts +0 -46
  432. package/src/components/modal/__tests__/ViewerNavigationDrawerHeader.spec.ts +0 -40
  433. package/src/components/modal/actions/NavigationCubeAction.vue +0 -26
  434. package/src/components/modal/actions/__tests__/NavigationCubeAction.spec.ts +0 -25
  435. package/src/components/modal/buttons/AutoAnnotateBtn.vue +0 -197
  436. package/src/components/modal/buttons/__tests__/AutoAnnotateBtn.spec.ts +0 -28
  437. package/src/components/modal/menus/FileMenu.vue +0 -73
  438. package/src/components/modal/menus/__tests__/FileMenu.spec.ts +0 -110
  439. package/src/components/navigation/mcad/McadGlobalActions.vue +0 -20
  440. package/src/components/navigation/mcad/McadGlobalOpacitySlider.vue +0 -103
  441. package/src/components/navigation/mcad/McadGlobalScanViewBtn.vue +0 -28
  442. package/src/components/navigation/mcad/McadGlobalVisibilityBtn.vue +0 -38
  443. package/src/components/views/AnnotationTreeView.vue +0 -236
  444. package/src/components/views/DisplaySettings.vue +0 -94
  445. package/src/components/views/MarkupTreeView.vue +0 -201
  446. package/src/components/views/McadObjectTreeView.vue +0 -129
  447. package/src/components/views/__tests__/AnnotationTreeView.spec.ts +0 -62
  448. package/src/components/views/__tests__/MarkupTreeView.spec.ts +0 -41
  449. package/src/components/views/__tests__/McadObjectTreeView.spec.ts +0 -47
  450. package/src/components/views/modals/DataOverlayGeneralModal.vue +0 -71
  451. package/src/components/views/modals/DataOverlayMarkupModal.vue +0 -60
  452. package/src/components/views/modals/DataOverlayModal.vue +0 -88
  453. package/src/components/views/shared/MaskIcon.vue +0 -44
  454. package/src/components/views/shared/ObjectColor.vue +0 -31
  455. package/src/components/views/shared/ObjectLabel.vue +0 -30
  456. package/src/components/views/shared/Opacity.vue +0 -65
  457. package/src/components/views/shared/VisibilityBtn.vue +0 -25
  458. package/src/components/views/shared/__tests__/MaskIcon.spec.ts +0 -10
  459. package/src/components/views/shared/__tests__/ObjectColor.spec.ts +0 -10
  460. package/src/components/views/shared/__tests__/ObjectLabel.spec.ts +0 -10
  461. package/src/components/views/shared/__tests__/Opacity.spec.ts +0 -24
  462. package/src/components/views/shared/__tests__/VisibilityBtn.spec.ts +0 -11
  463. package/src/components/views/types/annotation-tree-view-item-child-action.ts +0 -6
  464. package/src/components/views/types/annotation-tree-view-item-child.ts +0 -9
  465. package/src/components/views/types/annotation-tree-view-item.ts +0 -13
  466. package/src/components/views/types/markup-tree-view-item-child.ts +0 -6
  467. package/src/components/views/types/markup-tree-view-item.ts +0 -14
  468. package/src/components/views/types/mcad-object-tree-view-item.ts +0 -13
  469. package/src/composables/__tests__/useAnnotations.spec.ts +0 -35
  470. package/src/composables/__tests__/useIntroJs.spec.ts +0 -51
  471. package/src/composables/__tests__/useMarkups.spec.ts +0 -39
  472. package/src/composables/__tests__/useMcadObjects.spec.ts +0 -36
  473. package/src/composables/__tests__/useNavigationCubeObserver.spec.ts +0 -61
  474. package/src/composables/useAnnotations.ts +0 -37
  475. package/src/composables/useIntroJs.ts +0 -142
  476. package/src/composables/useMarkups.ts +0 -41
  477. package/src/composables/useMcadObjects.ts +0 -32
  478. package/src/composables/useNavigationCubeObserver.ts +0 -114
  479. package/src/composables/useVersion3cr.ts +0 -7
  480. package/src/functions/__tests__/layoutOverlayStyle.spec.ts +0 -325
  481. package/src/functions/asyncTools.ts +0 -3
  482. package/src/functions/layoutOverlayStyle.ts +0 -84
  483. package/src/functions/notification.ts +0 -82
  484. package/src/functions/parseDataOverlayData.ts +0 -10
  485. package/src/functions/parseDataOverlayEvent.ts +0 -17
  486. package/src/functions/parseMcadEvent.ts +0 -10
  487. package/src/functions/rgbaToCss.ts +0 -13
  488. package/src/models/__tests__/loadViewerOptions.spec.ts +0 -72
  489. package/src/models/__tests__/loadViewerPayload.spec.ts +0 -10
  490. package/src/models/callbacks.ts +0 -4
  491. package/src/models/loadViewerOptions.ts +0 -79
  492. package/src/models/loadViewerPayload.ts +0 -17
  493. package/src/plugins/__tests__/usePlugins.spec.ts +0 -12
  494. package/src/plugins/usePlugins.ts +0 -8
  495. package/src/types/action-data.ts +0 -4
  496. package/src/types/action.ts +0 -13
  497. package/src/types/call-to-action.ts +0 -9
  498. package/src/types/colour.ts +0 -6
  499. package/src/types/data-overlay-angle.ts +0 -16
  500. package/src/types/data-overlay-annotation.ts +0 -18
  501. package/src/types/data-overlay-data.ts +0 -15
  502. package/src/types/data-overlay-event.ts +0 -5
  503. package/src/types/data-overlay-info.ts +0 -18
  504. package/src/types/data-overlay-interaction.ts +0 -15
  505. package/src/types/data-overlay-length.ts +0 -16
  506. package/src/types/data-overlay-markup.ts +0 -7
  507. package/src/types/data-overlay-mcad.ts +0 -20
  508. package/src/types/data-overlay-polygon.ts +0 -18
  509. package/src/types/data-overlay.ts +0 -16
  510. package/src/types/demo-type.ts +0 -4
  511. package/src/types/gpt-question.ts +0 -4
  512. package/src/types/gpt-response-payload.ts +0 -6
  513. package/src/types/mcad-object-interaction.ts +0 -15
  514. package/src/types/segment-angle.ts +0 -5
  515. package/src/types/vector2.ts +0 -4
  516. package/src/types/vector3.ts +0 -5
  517. package/test/fakers/data-overlay-info.faker.ts +0 -29
  518. /package/src/assets/logos/3dicom/{white.svg → white/white.svg} +0 -0
  519. /package/src/assets/{images/light/Singular-Health-Trademark-mono.svg → logos/singular-health/black/black.svg} +0 -0
  520. /package/src/assets/{images/dark/Singular-Health-Trademark-mono.svg → logos/singular-health/white/white.svg} +0 -0
@@ -1,178 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, ref } from "vue";
3
- import {openUrl, PRICING_URL} from "@/components/demo/options";
4
-
5
- export interface Props {
6
- modal: boolean;
7
- }
8
-
9
- const emit = defineEmits<{
10
- "update:modal": [value: boolean];
11
- }>();
12
-
13
- const props = withDefaults(defineProps<Props>(), {
14
- modal: false,
15
- });
16
-
17
- const step2 = ref<boolean>(false);
18
- const user = ref<string>("");
19
- const users = ref<Array<string>>([]);
20
- const modalState = computed({
21
- get() {
22
- return props.modal;
23
- },
24
- set(value) {
25
- emit("update:modal", value);
26
- },
27
- });
28
-
29
- function add() {
30
- if (user.value && !users.value.includes(user.value) && isValid()) {
31
- users.value.push(user.value);
32
- }
33
- }
34
-
35
- function isValid() {
36
- return /^(([^<>()[\]\\.,;:\s@']+(\.[^<>()\\[\]\\.,;:\s@']+)*)|('.+'))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(
37
- user.value
38
- );
39
- }
40
- </script>
41
-
42
- <template>
43
- <v-dialog v-model:model-value="modalState">
44
- <v-card
45
- class="pa-1 ma-auto position-relative motif-background card-bg-border"
46
- theme="dark"
47
- max-width="680"
48
- min-width="450"
49
- >
50
- <v-card-title class="text-center mb-4 mt-2 font-weight-bold">
51
- Send Scan to a 3rd Party
52
- </v-card-title>
53
- <v-card-text>
54
- <v-text-field
55
- class="text-justify"
56
- id="share-email-field-item"
57
- ref="shareEmail"
58
- v-model="user"
59
- label="Send to Email"
60
- variant="outlined"
61
- density="compact"
62
- :rules="[
63
- (v) =>
64
- /^(([^<>()[\]\\.,;:\s@']+(\.[^<>()\\[\]\\.,;:\s@']+)*)|('.+'))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(
65
- v
66
- ) || `Email must be valid`,
67
- ]"
68
- clearable
69
- @keyup.enter="add"
70
- >
71
- <template #append-inner>
72
- <v-btn
73
- v-show="isValid()"
74
- id="check-mark"
75
- icon
76
- class="check-background mt-n01 bg-transparent"
77
- size="sm"
78
- small
79
- elevation="0"
80
- :ripple="false"
81
- ><v-icon color="success">check</v-icon></v-btn
82
- >
83
- </template>
84
- <template #append>
85
- <v-tooltip top>
86
- <template #activator="{ props }">
87
- <v-btn
88
- v-bind="props"
89
- icon
90
- class="mt-n1 bg-transparent"
91
- elevation="0"
92
- @click="add"
93
- ><v-icon color="success">add</v-icon></v-btn
94
- >
95
- </template>
96
- Include as Pending below
97
- </v-tooltip>
98
- </template>
99
- </v-text-field>
100
- </v-card-text>
101
- <v-card-text v-if="users.length > 0">
102
- Pending 3rd Parties
103
- <v-alert
104
- v-for="userItem in users"
105
- class="my-1"
106
- style="font-size: 60%"
107
- close-label="Close Alert"
108
- color="orange-accent-4"
109
- density="compact"
110
- :title="userItem"
111
- variant="tonal"
112
- @click:close="users.splice(users.indexOf(userItem), 1)"
113
- closable
114
- >
115
- New User
116
- </v-alert>
117
- </v-card-text>
118
- <v-card-actions>
119
- <v-btn data-testid="close" color="red" @click="modalState = false">
120
- Continue with Demo
121
- </v-btn>
122
- <v-spacer />
123
- <v-btn
124
- data-testid="confirm"
125
- variant="flat"
126
- color="success"
127
- @click="
128
- step2 = true;
129
- modalState = false;
130
- "
131
- :disabled="users.length === 0"
132
- >
133
- Send to 3rd Parties
134
- </v-btn>
135
- </v-card-actions>
136
- </v-card>
137
- </v-dialog>
138
- <v-dialog v-model:model-value="step2">
139
- <v-card
140
- class="pa-1 ma-auto position-relative motif-background card-bg-border"
141
- theme="dark"
142
- max-width="680"
143
- >
144
- <v-card-title class="text-center mb-4 mt-2 font-weight-bold">
145
- Scan shared
146
- </v-card-title>
147
- <v-card-text class="text-justify">
148
- Congratulations, you have sent your scan to a 3rd party.
149
- </v-card-text>
150
- <v-card-text class="text-justify">
151
- Note: This is just a demonstration of how you can in the online viewer,
152
- so we have not sent it to the users specified.
153
- </v-card-text>
154
- <v-card-text class="text-justify">
155
- If you would like to view your own scan and/or send it to another party,
156
- please select below
157
- </v-card-text>
158
- <v-card-actions>
159
- <v-btn data-testid="close" color="red" @click="step2 = false"> Continue with Demo </v-btn>
160
- <v-spacer />
161
- <v-btn
162
- data-testid="confirm"
163
- variant="flat"
164
- color="success"
165
- @click="openUrl(PRICING_URL)"
166
- >
167
- I want to view my own scan
168
- </v-btn>
169
- </v-card-actions>
170
- </v-card>
171
- </v-dialog>
172
- </template>
173
-
174
- <style scoped>
175
- .v-alert-title {
176
- font-size: 80%;
177
- }
178
- </style>
@@ -1,102 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, ref } from "vue";
3
- import {openUrl, PRICING_URL} from "@/components/demo/options";
4
-
5
- export interface Props {
6
- modal: boolean;
7
- }
8
-
9
- const emit = defineEmits<{
10
- "update:modal": [value: boolean];
11
- }>();
12
-
13
- const props = withDefaults(defineProps<Props>(), {
14
- modal: false,
15
- });
16
-
17
- const step2 = ref<boolean>(false);
18
- const modalState = computed({
19
- get() {
20
- return props.modal;
21
- },
22
- set(value) {
23
- emit("update:modal", value);
24
- },
25
- });
26
- </script>
27
-
28
- <template>
29
- <v-dialog v-model:model-value="modalState">
30
- <v-card
31
- class="pa-1 ma-auto position-relative motif-background card-bg-border"
32
- theme="dark"
33
- max-width="680"
34
- >
35
- <v-card-title class="text-center mb-4 mt-2 font-weight-bold">
36
- Download 3Dicom Mobile
37
- </v-card-title>
38
- <v-card-text class="text-justify">
39
- <img
40
- src="../../../assets/images/apple-qr.svg"
41
- alt="logo-home"
42
- width="47%"
43
- class="mr-auto rounded-lg"
44
- />
45
- <img
46
- src="../../../assets/images/android-qr.svg"
47
- alt="logo-home"
48
- width="47%"
49
- class="ml-auto rounded-lg float-right"
50
- />
51
- </v-card-text>
52
- <v-card-actions>
53
- <v-btn data-testid="close-1" color="red" @click="modalState = false">
54
- Continue with Demo
55
- </v-btn>
56
- <v-spacer />
57
- <v-btn
58
- data-testid="confirm-1"
59
- variant="flat"
60
- color="success"
61
- @click="
62
- step2 = true;
63
- modalState = false;
64
- "
65
- >
66
- I have 3DICOM mobile installed
67
- </v-btn>
68
- </v-card-actions>
69
- </v-card>
70
- </v-dialog>
71
- <v-dialog v-model:model-value="step2">
72
- <v-card
73
- class="pa-1 ma-auto position-relative motif-background card-bg-border"
74
- theme="dark"
75
- max-width="680"
76
- >
77
- <v-card-title class="text-center mb-4 mt-2 font-weight-bold">
78
- Load your scan
79
- </v-card-title>
80
- <v-card-text class="text-justify">
81
- Once you have logged in and can see your dashboard, select your scan and
82
- open it to visualise your X-Ray (XR), Ultrasound (US), Computed
83
- Tomography (CT), Magnetic Resonance Imaging (MRI), and Positron Emitting
84
- Tomography (PET) scans.
85
- </v-card-text>
86
- <v-card-actions>
87
- <v-btn data-testid="close-2" color="red" @click="step2 = false"> Continue with Demo </v-btn>
88
- <v-spacer />
89
- <v-btn
90
- data-testid="confirm-2"
91
- variant="flat"
92
- color="success"
93
- @click="openUrl(PRICING_URL)"
94
- >
95
- I want to view my own scan
96
- </v-btn>
97
- </v-card-actions>
98
- </v-card>
99
- </v-dialog>
100
- </template>
101
-
102
- <style scoped></style>
@@ -1,36 +0,0 @@
1
- import { VDialog, VTextField } from 'vuetify/components';
2
- import { mount } from '@vue/test-utils';
3
- import DemoLicenceSendToPartyModal from '@/components/demo/licence/DemoLicenceSendToPartyModal.vue';
4
-
5
- describe('DemoLicenceSendToPartyModal tests', () => {
6
- it('should mount', () => {
7
- const props = { modal: true };
8
- const wrapper = mount(DemoLicenceSendToPartyModal, { props });
9
- expect(wrapper).toBeTruthy();
10
- });
11
-
12
- it('should enter email', async () => {
13
- const props = { modal: true };
14
- const wrapper = mount(DemoLicenceSendToPartyModal, { props });
15
- const input = wrapper.getComponent(VTextField);
16
- await input.setValue('example@singular.health');
17
- await input.trigger('keyup.enter');
18
- const confirm = wrapper.findComponent('[data-testid="confirm"]');
19
- await confirm.trigger('click');
20
- });
21
-
22
- it('should close modal', async () => {
23
- const props = { modal: true };
24
- const wrapper = mount(DemoLicenceSendToPartyModal, { props });
25
- const close = wrapper.findComponent('[data-testid="close"]');
26
- await close.trigger('click');
27
- expect(wrapper.emitted('update:modal')).toBeTruthy();
28
- });
29
-
30
- it('should open via input', async () => {
31
- const props = { modal: false };
32
- const wrapper = mount(DemoLicenceSendToPartyModal, { props });
33
- const dialog = wrapper.findComponent(VDialog);
34
- await dialog.setValue(true);
35
- });
36
- });
@@ -1,52 +0,0 @@
1
- import { PRICING_URL } from '../../options';
2
- import { mount } from '@vue/test-utils';
3
- import { VDialog } from 'vuetify/components';
4
- import DemoLicenceShareToMobileModal from '@/components/demo/licence/DemoLicenceShareToMobileModal.vue';
5
-
6
- describe('DemoLicenceShareToMobileModal tests', () => {
7
- it('should mount', () => {
8
- const props = { modal: true };
9
- const wrapper = mount(DemoLicenceShareToMobileModal, { props });
10
- expect(wrapper).toBeTruthy();
11
- });
12
-
13
- it('should close modal', async () => {
14
- const props = { modal: true };
15
- const wrapper = mount(DemoLicenceShareToMobileModal, { props });
16
- const close = wrapper.findComponent('[data-testid="close-1"]');
17
- await close.trigger('click');
18
- expect(wrapper.emitted('update:modal')).toBeTruthy();
19
- });
20
-
21
- it('should go to next step and open url', async () => {
22
- vi.stubGlobal('open', vi.fn());
23
- const spy = vi.spyOn(window, 'open');
24
- const props = { modal: true };
25
- const wrapper = mount(DemoLicenceShareToMobileModal, { props });
26
- const confirm1 = wrapper.findComponent('[data-testid="confirm-1"]');
27
- await confirm1.trigger('click');
28
- expect(wrapper.emitted('update:modal')).toBeTruthy();
29
- const confirm2 = wrapper.findComponent('[data-testid="confirm-2"]');
30
- await confirm2.trigger('click');
31
- expect(spy).toHaveBeenCalledWith(PRICING_URL, '_self');
32
- vi.restoreAllMocks();
33
- });
34
-
35
- it('should go to next step and close', async () => {
36
- const props = { modal: true };
37
- const wrapper = mount(DemoLicenceShareToMobileModal, { props });
38
- const confirm1 = wrapper.findComponent('[data-testid="confirm-1"]');
39
- await confirm1.trigger('click');
40
- expect(wrapper.emitted('update:modal')).toBeTruthy();
41
- const close2 = wrapper.findComponent('[data-testid="close-2"]');
42
- await close2.trigger('click');
43
- expect(wrapper.text()).toBe('');
44
- });
45
-
46
- it('should open via input', async () => {
47
- const props = { modal: false };
48
- const wrapper = mount(DemoLicenceShareToMobileModal, { props });
49
- const dialog = wrapper.findComponent(VDialog);
50
- await dialog.setValue(true);
51
- });
52
- });
@@ -1,170 +0,0 @@
1
- import { computed, ref } from 'vue';
2
- import { LoadViewerOptions } from '@/models/loadViewerOptions';
3
- import { LoadViewerPayload } from '@/models/loadViewerPayload';
4
- import { useViewer3cr } from '@/composables/useViewer3cr';
5
- import { mockDemoViewerStlDecimator } from '@/composables/useViewerOptions';
6
- import { DemoType } from '@/types/demo-type';
7
-
8
- export const PRICING_URL = 'https://3dicomviewer.com/pricing';
9
-
10
- export const SUPPORT_URL = 'https://3dicomviewer.com/contact-3dicom';
11
-
12
- const BASE_STATE_URL = 'https://webgl-3dr.singular.health/demo';
13
-
14
- const viewer3cr = useViewer3cr();
15
- export const isDemo = ref<boolean>(false);
16
- export const show = ref<boolean>(true);
17
- export const m_demoLicence = ref<boolean>(false);
18
- export const m_demoLicenceShareToMobile = ref<boolean>(false);
19
- export const m_demoLicenceSendToParty = ref<boolean>(false);
20
- export const m_demoLicenseEnableCloudStorage = ref<boolean>(false);
21
- export const m_demoPatient = ref<boolean>(false);
22
- export const m_demoPatientShareToMobile = ref<boolean>(false);
23
- export const m_demoPatientSendToParty = ref<boolean>(false);
24
- export const m_demoPatientEnableCloudStorage = ref<boolean>(false);
25
- export const demoPatientTitle = ref<string>('');
26
- export const demoPatientSubtitles = ref<Array<string>>([]);
27
- export const demoLicenceTitle = ref<string>('');
28
- export const demoLicenceSubtitles = ref<Array<string>>([]);
29
-
30
- export const demoLicenceOptions: LoadViewerOptions = {
31
- OnClosePopup: undefined,
32
- OnExitViewer: () => {
33
- demoLicenceTitle.value = 'Thank you for trying the 3Dicom Licensing Demo.';
34
- demoLicenceSubtitles.value = [
35
- 'Should you have any further questions or enquiries, please get in touch by emailing support@singular.health'
36
- ];
37
- m_demoLicence.value = true;
38
- show.value = false;
39
- },
40
- OnLoadNewDicomSeries: () => {
41
- demoLicenceTitle.value = 'Support multiple medical imaging file types';
42
- demoLicenceSubtitles.value = [
43
- '3Dicom’s white-labelled online 2D / 3D DICOM viewer allows the loading of X-Ray (XR), Ultrasound (US), Computed Tomography (CT), Magnetic Resonance Imaging (MRI), and Positron Emitting Tomography (PET) using the global DICOM file format.'
44
- ];
45
-
46
- m_demoLicence.value = true;
47
- },
48
- OnDownloadDicomSeries: () => {
49
- demoLicenceTitle.value = 'Improve interoperability with local download of DICOM series';
50
- demoLicenceSubtitles.value = [
51
- 'Integrate 3Dicom’s white-labelled online 2D/3D viewer into your PACS and/or medical records database to pull DICOM series and allow for local download direct from the viewer. This feature can be hidden upon request.'
52
- ];
53
- m_demoLicence.value = true;
54
- },
55
- OnLoadSavedSession: () => {
56
- demoLicenceTitle.value = 'Save previous progress and share particular sessions';
57
- demoLicenceSubtitles.value = [
58
- '3Dicom’s viewer enables session-saving to record any changes made during the viewing of medical scans including orientation of views, editing of labels, visualisation settings, and density settings. Changes made during sessions preserve the integrity of the DICOM file and are overlaid in future sessions.'
59
- ];
60
- m_demoLicence.value = true;
61
- },
62
- OnSaveSession: () => {
63
- demoLicenceTitle.value = 'Thank you for trying the 3Dicom Licensing Demo.';
64
- demoLicenceSubtitles.value = ['Each 3Dicom viewer session can be saved with your changes made for future viewing.'];
65
- m_demoLicence.value = true;
66
- },
67
- OnSendTo3rdParty: () => {
68
- m_demoLicenceSendToParty.value = true;
69
- },
70
- OnShareToMobile: () => {
71
- m_demoLicenceShareToMobile.value = true;
72
- },
73
- OnEnableCloudStorage: () => {
74
- m_demoLicenseEnableCloudStorage.value = true;
75
- },
76
- OnAutoAnnotate: async () => {
77
- mockDemoViewerStlDecimator();
78
- await viewer3cr.loadMcadObjects({ Url: `${BASE_STATE_URL}/state/TotalSegmentator_1722837421466.3crms` });
79
- },
80
- OnShare: undefined,
81
- OnScreenshot: undefined,
82
- OnErrorClose: undefined
83
- };
84
-
85
- export const demoPatientOptions: LoadViewerOptions = {
86
- OnClosePopup: undefined,
87
- OnExitViewer: () => {
88
- demoPatientTitle.value = 'Thank you for trying the 3Dicom Patient Demo.';
89
- demoPatientSubtitles.value = [
90
- 'Should you have any further questions or enquiries, please get in touch by emailing support@singular.health'
91
- ];
92
- m_demoPatient.value = true;
93
- show.value = false;
94
- },
95
- OnLoadNewDicomSeries: () => {
96
- demoPatientTitle.value = '3Dicom Patient supports multiple Medical Imaging Formats';
97
- demoPatientSubtitles.value = [
98
- '3Dicom Patient enables you to load of X-Ray (XR), Ultrasound (US), Computed Tomography (CT), Magnetic Resonance Imaging (MRI), and Positron Emitting Tomography (PET), using the global DICOM file format.',
99
- 'Purchase 3Dicom Patient to load your own medical images and view in 2D / 3D.'
100
- ];
101
- m_demoPatient.value = true;
102
- },
103
- OnDownloadDicomSeries: () => {
104
- demoPatientTitle.value = '3Dicom Patient enables on-demand download of DICOM series';
105
- demoPatientSubtitles.value = [
106
- '3Dicom Patient enables you to store your medical imaging and related files / reports online or share them temporarily between devices. ',
107
- 'DICOM files can be downloaded to your device for local storage and providing to 3rd parties via CD/USB.',
108
- 'Purchase 3Dicom Patient to gain control over your DICOM file storage.'
109
- ];
110
- m_demoPatient.value = true;
111
- },
112
- OnLoadSavedSession: () => {
113
- demoPatientTitle.value = '3Dicom Patient allows you to load previous Sessions';
114
- demoPatientSubtitles.value = [
115
- '3Dicom Patient gives you to option to save any changes made during the viewing of your scan including orientation of views, editing of labels, visualisation settings, and density settings to easily view your scans the same way in the future. Session data can also be shared to 3rd parties so they see your scan the same way that you do.'
116
- ];
117
- m_demoPatient.value = true;
118
- },
119
- OnSaveSession: () => {
120
- demoPatientTitle.value = 'Thank you for trying the 3Dicom Patient Demo.';
121
- demoPatientSubtitles.value = ['Each 3Dicom viewer session can be saved with your changes made for future viewing.'];
122
- m_demoPatient.value = true;
123
- },
124
- OnSendTo3rdParty: () => {
125
- m_demoPatientSendToParty.value = true;
126
- },
127
- OnShareToMobile: () => {
128
- m_demoPatientShareToMobile.value = true;
129
- },
130
- OnEnableCloudStorage: () => {
131
- m_demoPatientEnableCloudStorage.value = true;
132
- },
133
- OnAutoAnnotate: demoLicenceOptions.OnAutoAnnotate,
134
- OnShare: undefined,
135
- OnScreenshot: undefined,
136
- OnErrorClose: undefined
137
- };
138
-
139
- export function checkIsDemo(payload: LoadViewerPayload) {
140
- isDemo.value = payload.Url.startsWith('https://webgl-3dr.singular.health/demo');
141
- }
142
-
143
- export const demoType = computed(() => {
144
- const urlParams = new URLSearchParams(window.location.search);
145
- if (urlParams.has('demoType')) {
146
- const demoType = urlParams.get('demoType')!.toLowerCase();
147
- switch (demoType) {
148
- case 'patient':
149
- return DemoType.Patient;
150
- case 'licence':
151
- return DemoType.Licence;
152
- }
153
- }
154
- return DemoType.Patient;
155
- });
156
-
157
- export const demoOptions = computed(() => {
158
- switch (demoType.value) {
159
- case DemoType.Patient:
160
- return demoPatientOptions;
161
- case DemoType.Licence:
162
- return demoLicenceOptions;
163
- default:
164
- throw new Error('Unknown demo type');
165
- }
166
- });
167
-
168
- export function openUrl(url: string, target: string = '_self') {
169
- window.open(url, target);
170
- }
@@ -1,64 +0,0 @@
1
- <template>
2
- <v-dialog width="600" v-model:model-value="modalState">
3
- <v-card theme="dark" class="motif-background">
4
- <v-card-title class="text-center font-weight-bold">
5
- Enable Cloud Storage
6
- </v-card-title>
7
- <v-card-text>
8
- <p style="text-align: center;">Enable annual storage for just <b>5 credits</b>.</p>
9
- <br />
10
- <div>
11
- <v-row no-gutters v-for="(benefit, idx) in benefits" :key="idx">
12
- <v-col class="d-flex justify-end" cols="2">
13
- <v-icon class="mr-2" color="success" icon="check" />
14
- </v-col>
15
- <v-col>
16
- {{ benefit }}
17
- </v-col>
18
- </v-row>
19
- </div>
20
- </v-card-text>
21
- <v-card-actions>
22
- <v-btn data-testid="close" color="red" @click="modalState = false">
23
- Continue with Demo
24
- </v-btn>
25
- <v-spacer />
26
- <v-btn data-testid="confirm" variant="flat" color="success" @click="openUrl(PRICING_URL)">
27
- Enable Cloud Storage
28
- </v-btn>
29
- </v-card-actions>
30
- </v-card>
31
- </v-dialog>
32
- </template>
33
-
34
- <script setup lang="ts">
35
- import { computed } from 'vue';
36
- import { PRICING_URL, openUrl } from '@/components/demo/options';
37
-
38
- interface Props {
39
- modal?: boolean;
40
- }
41
-
42
- type Emits = {
43
- 'update:modal': [value: boolean];
44
- };
45
-
46
- const props = defineProps<Props>();
47
-
48
- const emit = defineEmits<Emits>();
49
-
50
- const benefits = [
51
- 'Secure storage',
52
- 'Access your scan from any device',
53
- 'Keep your medical imaging records at your fingertips'
54
- ];
55
-
56
- const modalState = computed({
57
- get(): boolean {
58
- return props.modal;
59
- },
60
- set(value: boolean): void {
61
- emit('update:modal', value);
62
- }
63
- });
64
- </script>
@@ -1,49 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue';
3
- import { demoPatientSubtitles, demoPatientTitle, openUrl, PRICING_URL } from '@/components/demo/options';
4
-
5
- export interface Props {
6
- modal: boolean;
7
- isModalOpen?: boolean;
8
- }
9
-
10
- const emit = defineEmits<{
11
- 'update:modal': [value: boolean];
12
- }>();
13
-
14
- const props = withDefaults(defineProps<Props>(), {
15
- modal: false,
16
- isModalOpen: true
17
- });
18
-
19
- const modalState = computed({
20
- get() {
21
- return props.modal;
22
- },
23
- set(value) {
24
- emit('update:modal', value);
25
- }
26
- });
27
- </script>
28
-
29
- <template>
30
- <v-dialog v-model:model-value="modalState">
31
- <v-card class="pa-1 ma-auto position-relative motif-background card-bg-border" theme="dark" max-width="680">
32
- <v-card-title class="text-center mb-4 mt-2 font-weight-bold">{{ demoPatientTitle }}</v-card-title>
33
- <v-card-text class="text-justify" v-for="subtitle in demoPatientSubtitles" :key="subtitle"
34
- >{{ subtitle }}
35
- </v-card-text>
36
- <v-card-actions class="mt-4">
37
- <v-btn data-testid="close" color="red" @click="modalState = false" :disabled="!isModalOpen">
38
- Continue with Demo
39
- </v-btn>
40
- <v-spacer />
41
- <v-btn data-testid="confirm" variant="flat" color="success" @click="openUrl(PRICING_URL)">
42
- Purchase 3Dicom Patient
43
- </v-btn>
44
- </v-card-actions>
45
- </v-card>
46
- </v-dialog>
47
- </template>
48
-
49
- <style scoped></style>