@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.
- package/.circleci/config.yml +46 -22
- package/.prettierrc +6 -0
- package/components.d.ts +27 -10
- package/dist/Viewer3CR.js +36 -45
- package/dist/Viewer3CR.mjs +26893 -21667
- package/dist/Viewer3CR.umd.js +36 -45
- package/dist/android-chrome-192x192.png +0 -0
- package/dist/android-chrome-512x512.png +0 -0
- package/dist/apple-touch-icon.png +0 -0
- package/dist/browserconfig.xml +9 -0
- package/dist/favicon-16x16.png +0 -0
- package/dist/favicon-32x32.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/mstile-144x144.png +0 -0
- package/dist/mstile-150x150.png +0 -0
- package/dist/mstile-310x150.png +0 -0
- package/dist/mstile-310x310.png +0 -0
- package/dist/mstile-70x70.png +0 -0
- package/dist/safari-pinned-tab.svg +50 -0
- package/dist/site.webmanifest +19 -0
- package/index.html +34 -41
- package/package.json +24 -20
- package/playground/android-chrome-192x192.png +0 -0
- package/playground/android-chrome-512x512.png +0 -0
- package/playground/apple-touch-icon.png +0 -0
- package/playground/browserconfig.xml +9 -0
- package/playground/favicon-16x16.png +0 -0
- package/playground/favicon-32x32.png +0 -0
- package/playground/favicon.ico +0 -0
- package/playground/index.html +30 -41
- package/playground/mstile-144x144.png +0 -0
- package/playground/mstile-150x150.png +0 -0
- package/playground/mstile-310x150.png +0 -0
- package/playground/mstile-310x310.png +0 -0
- package/playground/mstile-70x70.png +0 -0
- package/playground/safari-pinned-tab.svg +50 -0
- package/playground/site.webmanifest +19 -0
- package/playground/sw.js +15 -1
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/browserconfig.xml +9 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/mstile-144x144.png +0 -0
- package/public/mstile-150x150.png +0 -0
- package/public/mstile-310x150.png +0 -0
- package/public/mstile-310x310.png +0 -0
- package/public/mstile-70x70.png +0 -0
- package/public/safari-pinned-tab.svg +50 -0
- package/public/site.webmanifest +19 -0
- package/src/App.vue +55 -50
- package/src/__tests__/app.spec.ts +7 -8
- package/{__tests__/index.spec.ts → src/__tests__/main.spec.ts} +5 -6
- package/src/assets/logos/3dicom/white-mini.svg +20 -0
- package/src/assets/logos/3dicom/white.svg +30 -0
- package/src/assets/styles.scss +18 -4
- package/src/components/demo/DemoPatientModal.vue +12 -22
- package/src/components/demo/__tests__/DemoModal.spec.ts +9 -8
- package/src/components/demo/__tests__/DemoPatientModal.spec.ts +11 -10
- package/src/components/demo/__tests__/options.spec.ts +1 -1
- package/src/components/demo/licence/DemoLicenceInfoModal.vue +11 -29
- package/src/components/demo/licence/__tests__/DemoLicenceEnableCloudStorageModal.spec.ts +11 -10
- package/src/components/demo/licence/__tests__/DemoLicenceInfoModal.spec.ts +21 -11
- package/src/components/demo/licence/__tests__/DemoLicenceSendToPartyModal.spec.ts +10 -10
- package/src/components/demo/licence/__tests__/DemoLicenceShareToMobileModal.spec.ts +14 -13
- package/src/components/demo/options.ts +74 -76
- package/src/components/demo/patient/DemoPatientInfoModal.vue +11 -29
- package/src/components/demo/patient/__tests__/DemoPatientEnableCloudStorageModal.spec.ts +11 -10
- package/src/components/demo/patient/__tests__/DemoPatientInfoModal.spec.ts +12 -11
- package/src/components/demo/patient/__tests__/DemoPatientSendToPartyModal.spec.ts +10 -10
- package/src/components/demo/patient/__tests__/DemoPatientShareToMobileModal.spec.ts +14 -13
- package/src/components/modal/ActionRail.vue +7 -11
- package/src/components/modal/AskAI.vue +35 -50
- package/src/components/modal/CloseViewerModal.vue +22 -57
- package/src/components/modal/MftpWebGL3DRModal.vue +230 -635
- package/src/components/modal/ViewerActionRail.vue +44 -39
- package/src/components/modal/ViewerNavigationDrawer.vue +10 -8
- package/src/components/modal/ViewerNavigationDrawerContent.vue +91 -49
- package/src/components/modal/ViewerNavigationDrawerFooter.vue +83 -63
- package/src/components/modal/ViewerNavigationDrawerHeader.vue +14 -44
- package/src/components/modal/ViewerScanView.vue +114 -0
- package/src/components/modal/WebGL3DR.vue +91 -0
- package/src/components/modal/__tests__/ActionRail.spec.ts +10 -0
- package/src/components/modal/__tests__/AskAI.spec.ts +33 -0
- package/src/components/modal/__tests__/CloseViewerModal.spec.ts +24 -14
- package/src/components/modal/__tests__/MftpWebGL3DRModal.spec.ts +147 -176
- package/src/components/modal/__tests__/ViewerActionRail.spec.ts +11 -0
- package/src/components/modal/__tests__/ViewerNavigationDrawer.spec.ts +10 -12
- package/src/components/modal/__tests__/ViewerNavigationDrawerContent.spec.ts +4 -22
- package/src/components/modal/__tests__/ViewerNavigationDrawerFooter.spec.ts +35 -32
- package/src/components/modal/__tests__/ViewerNavigationDrawerHeader.spec.ts +14 -11
- package/src/components/modal/__tests__/ViewerScanView.spec.ts +60 -0
- package/src/components/modal/__tests__/WebGL3DR.spec.ts +57 -0
- package/src/components/modal/actions/Flip3dAction.vue +1 -1
- package/src/components/modal/actions/FlipHorizontalAction.vue +5 -10
- package/src/components/modal/actions/FlipVerticalAction.vue +5 -10
- package/src/components/modal/actions/FullscreenAction.vue +6 -11
- package/src/components/modal/actions/NavigationCubeAction.vue +7 -14
- package/src/components/modal/actions/PanAction.vue +4 -4
- package/src/components/modal/actions/ResetViewAction.vue +1 -1
- package/src/components/modal/actions/Rotate2dAction.vue +8 -20
- package/src/components/modal/actions/Slice3dAction.vue +10 -32
- package/src/components/modal/actions/ZoomAction.vue +1 -1
- package/src/components/modal/actions/__tests__/Action.spec.ts +8 -9
- package/src/components/modal/actions/__tests__/Flip3dAction.spec.ts +6 -8
- package/src/components/modal/actions/__tests__/FlipHorizontalAction.spec.ts +6 -7
- package/src/components/modal/actions/__tests__/FlipVerticalAction.spec.ts +6 -7
- package/src/components/modal/actions/__tests__/FullscreenAction.spec.ts +9 -10
- package/src/components/modal/actions/__tests__/NavigationCubeAction.spec.ts +11 -11
- package/src/components/modal/actions/__tests__/PanAction.spec.ts +9 -10
- package/src/components/modal/actions/__tests__/ResetViewAction.spec.ts +7 -7
- package/src/components/modal/actions/__tests__/Rotate2dAction.spec.ts +6 -8
- package/src/components/modal/actions/__tests__/Slice3dAction.spec.ts +23 -5
- package/src/components/modal/actions/__tests__/ZoomAction.spec.ts +8 -10
- package/src/components/modal/buttons/AutoAnnotateBtn.vue +197 -0
- package/src/components/modal/buttons/__tests__/AutoAnnotateBtn.spec.ts +28 -0
- package/src/components/modal/menus/FileMenu.vue +73 -0
- package/src/components/modal/menus/SettingsMenu.vue +106 -0
- package/src/components/modal/menus/__tests__/FileMenu.spec.ts +110 -0
- package/src/components/modal/menus/__tests__/SettingsMenu.spec.ts +71 -0
- package/src/components/navigation/mcad/McadGlobalActions.vue +20 -0
- package/src/components/navigation/mcad/McadGlobalOpacitySlider.vue +103 -0
- package/src/components/navigation/mcad/McadGlobalScanViewBtn.vue +28 -0
- package/src/components/navigation/mcad/McadGlobalVisibilityBtn.vue +38 -0
- package/src/components/shared/DoubleSliderSelector.vue +142 -0
- package/src/components/{loading → shared}/LoadingSpinner.vue +27 -36
- package/src/components/shared/UpdateSnackbar.vue +72 -0
- package/src/components/{selectors → shared}/ValueSelector.vue +9 -12
- package/src/components/shared/__tests__/DoubleSliderSelector.spec.ts +83 -0
- package/src/components/shared/__tests__/LoadingSpinner.spec.ts +9 -0
- package/src/components/shared/__tests__/UpdateSnackbar.spec.ts +116 -0
- package/src/components/shared/__tests__/ValueSelector.spec.ts +39 -0
- package/src/components/shared/__tests__/VerticalSliderSelector.spec.ts +50 -0
- package/src/components/views/AnnotationTreeView.vue +236 -0
- package/src/components/{modal/ViewerDisplaySettings.vue → views/DisplaySettings.vue} +7 -15
- package/src/components/views/MarkupTreeView.vue +201 -0
- package/src/components/views/McadObjectTreeView.vue +129 -0
- package/src/components/views/__tests__/AnnotationTreeView.spec.ts +62 -0
- package/src/components/{modal/__tests__/ViewerDisplaySettings.spec.ts → views/__tests__/DisplaySettings.spec.ts} +24 -20
- package/src/components/views/__tests__/MarkupTreeView.spec.ts +41 -0
- package/src/components/views/__tests__/McadObjectTreeView.spec.ts +47 -0
- package/src/components/views/modals/DataOverlayGeneralModal.vue +71 -0
- package/src/components/views/modals/DataOverlayMarkupModal.vue +60 -0
- package/src/components/views/modals/DataOverlayModal.vue +88 -0
- package/src/components/views/shared/MaskIcon.vue +44 -0
- package/src/components/views/shared/ObjectColor.vue +31 -0
- package/src/components/views/shared/ObjectLabel.vue +30 -0
- package/src/components/views/shared/Opacity.vue +65 -0
- package/src/components/views/shared/VisibilityBtn.vue +25 -0
- package/src/components/views/shared/__tests__/MaskIcon.spec.ts +10 -0
- package/src/components/views/shared/__tests__/ObjectColor.spec.ts +10 -0
- package/src/components/views/shared/__tests__/ObjectLabel.spec.ts +10 -0
- package/src/components/views/shared/__tests__/Opacity.spec.ts +24 -0
- package/src/components/views/shared/__tests__/VisibilityBtn.spec.ts +11 -0
- package/src/components/views/types/annotation-tree-view-item-child-action.ts +6 -0
- package/src/components/views/types/annotation-tree-view-item-child.ts +9 -0
- package/src/components/views/types/annotation-tree-view-item.ts +13 -0
- package/src/components/views/types/markup-tree-view-item-child.ts +6 -0
- package/src/components/views/types/markup-tree-view-item.ts +14 -0
- package/src/components/views/types/mcad-object-tree-view-item.ts +13 -0
- package/src/composables/__tests__/useAnnotations.spec.ts +35 -0
- package/src/composables/__tests__/useEventListener.spec.ts +32 -0
- package/src/composables/__tests__/useIntroJs.spec.ts +51 -0
- package/src/composables/__tests__/useMarkups.spec.ts +39 -0
- package/src/composables/__tests__/useMcadObjects.spec.ts +36 -0
- package/src/composables/__tests__/useMouse.spec.ts +20 -0
- package/src/{components/modal/composables → composables}/__tests__/useNavigationCubeObserver.spec.ts +17 -12
- package/src/{dataLayer → composables}/__tests__/useViewer3cr.spec.ts +1 -2
- package/src/composables/useAnnotations.ts +37 -0
- package/src/composables/useDebounce.ts +11 -0
- package/src/composables/useEventListener.ts +25 -0
- package/src/composables/useIntroJs.ts +142 -0
- package/src/composables/useMarkups.ts +41 -0
- package/src/composables/useMcadObjects.ts +32 -0
- package/src/composables/useMouse.ts +14 -0
- package/src/{components/modal/composables → composables}/useNavigationCubeObserver.ts +35 -25
- package/src/composables/useScanMovement.ts +25 -0
- package/src/composables/useScanSliders.ts +36 -0
- package/src/composables/useVersion3cr.ts +7 -0
- package/src/composables/useViewer3cr.ts +7 -0
- package/src/composables/useViewerOptions.ts +36 -0
- package/src/{dataLayer → functions}/__tests__/clamp.spec.ts +1 -2
- package/src/functions/__tests__/layoutOverlayStyle.spec.ts +325 -0
- package/src/{helpers/__tests__/model-helper.spec.ts → functions/__tests__/modelHelper.spec.ts} +77 -40
- package/src/{notifications → functions}/__tests__/notification.spec.ts +19 -29
- package/src/functions/__tests__/parseAction.spec.ts +9 -0
- package/src/functions/__tests__/parseCallToAction.spec.ts +11 -0
- package/src/functions/__tests__/parseDataOverlay.spec.ts +15 -0
- package/src/functions/__tests__/parseDataOverlayData.spec.ts +9 -0
- package/src/functions/__tests__/parseDataOverlayEvent.spec.ts +10 -0
- package/src/functions/__tests__/parseMcadEvent.spec.ts +10 -0
- package/src/functions/guards/isDataOverlayAngle.ts +6 -0
- package/src/functions/guards/isDataOverlayLength.ts +6 -0
- package/src/functions/guards/isDataOverlayPolygon.ts +6 -0
- package/src/functions/layoutOverlayStyle.ts +84 -0
- package/src/{helpers → functions}/modelHelper.ts +81 -18
- package/src/functions/notification.ts +82 -0
- package/src/functions/parseAction.ts +9 -0
- package/src/functions/parseCallToAction.ts +9 -0
- package/src/functions/parseDataOverlay.ts +10 -0
- package/src/functions/parseDataOverlayData.ts +10 -0
- package/src/functions/parseDataOverlayEvent.ts +17 -0
- package/src/functions/parseMcadEvent.ts +10 -0
- package/src/functions/rgbaToCss.ts +13 -0
- package/src/main.ts +57 -9
- package/src/{dataLayer → models}/__tests__/eventHandlers.spec.ts +2 -3
- package/src/models/__tests__/loadViewerOptions.spec.ts +72 -0
- package/src/models/__tests__/loadViewerPayload.spec.ts +10 -0
- package/src/models/__tests__/scanState.spec.ts +190 -0
- package/src/models/callbacks.ts +4 -0
- package/src/models/loadViewerOptions.ts +79 -0
- package/src/models/loadViewerPayload.ts +17 -0
- package/src/{dataLayer → models}/scanState.ts +63 -74
- package/src/plugins/__tests__/usePlugins.spec.ts +12 -0
- package/src/plugins/__tests__/vuetify.spec.ts +3 -4
- package/src/plugins/usePlugins.ts +8 -0
- package/src/plugins/vuetify.ts +31 -65
- package/src/services/{gpt/__tests__ → __tests__}/gpt.service.spec.ts +2 -2
- package/src/services/__tests__/service-worker.service.spec.ts +32 -0
- package/src/{dataLayer/__tests__/viewer3cr.spec.ts → services/__tests__/viewer-3cr.service.spec.ts} +97 -36
- package/src/services/gpt.service.ts +17 -0
- package/src/services/service-worker.service.ts +16 -0
- package/src/{dataLayer/viewer3cr.ts → services/viewer-3cr.service.ts} +281 -150
- package/src/tools/data-overlay.tool.ts +71 -0
- package/src/types/action.ts +13 -0
- package/src/types/call-to-action.ts +9 -0
- package/src/types/colour.ts +6 -0
- package/src/types/data-overlay-angle.ts +16 -0
- package/src/types/data-overlay-annotation.ts +18 -0
- package/src/types/data-overlay-data.ts +15 -0
- package/src/types/data-overlay-event.ts +5 -0
- package/src/types/data-overlay-info.ts +18 -0
- package/src/types/data-overlay-interaction.ts +15 -0
- package/src/types/data-overlay-length.ts +16 -0
- package/src/types/data-overlay-markup.ts +7 -0
- package/src/types/data-overlay-mcad.ts +20 -0
- package/src/types/data-overlay-polygon.ts +18 -0
- package/src/types/data-overlay.ts +16 -0
- package/src/types/demo-type.ts +4 -0
- package/src/types/gpt-question.ts +4 -0
- package/src/types/gpt-response-payload.ts +6 -0
- package/src/types/mcad-object-interaction.ts +15 -0
- package/src/types/segment-angle.ts +5 -0
- package/src/types/vector2.ts +4 -0
- package/src/types/vector3.ts +5 -0
- package/test/fakers/action-data.faker.ts +11 -0
- package/test/fakers/action.faker.ts +19 -0
- package/test/fakers/call-to-action.faker.ts +17 -0
- package/test/fakers/colour.faker.ts +17 -0
- package/test/fakers/data-overlay-angle.faker.ts +37 -0
- package/test/fakers/data-overlay-annotation.faker.ts +41 -0
- package/test/fakers/data-overlay-data.faker.ts +97 -0
- package/test/fakers/data-overlay-info.faker.ts +29 -0
- package/test/fakers/data-overlay-interaction.faker.ts +62 -0
- package/test/fakers/data-overlay-length.faker.ts +37 -0
- package/test/fakers/data-overlay-mcad.faker.ts +40 -0
- package/test/fakers/data-overlay-polygon.faker.ts +39 -0
- package/test/fakers/gpt-question.faker.ts +11 -0
- package/test/fakers/gpt-response.faker.ts +12 -0
- package/test/fakers/invert-transform.faker.ts +16 -0
- package/test/fakers/mcad-object-interaction.faker.ts +22 -0
- package/test/fakers/orientation.faker.ts +17 -0
- package/test/fakers/segment-angle.faker.ts +12 -0
- package/test/fakers/vector2.faker.ts +12 -0
- package/test/fakers/vector3.faker.ts +16 -0
- package/test/plugins/findByTestId.ts +25 -0
- package/test/plugins/vuetify.ts +16 -0
- package/test/setup.ts +16 -5
- package/tsconfig.json +4 -15
- package/vite.config.mts +20 -46
- package/vitest.config.mts +24 -43
- package/index.ts +0 -72
- package/src/assets/images/dark/3DICOM.png +0 -0
- package/src/assets/images/dark/3dicom-logo.svg +0 -1
- package/src/assets/images/light/3DICOM.png +0 -0
- package/src/assets/images/light/3dicom-logo.svg +0 -1
- package/src/assets/logo.png +0 -0
- package/src/assets/logo.svg +0 -6
- package/src/components/WebGL3DR.vue +0 -102
- package/src/components/__tests__/webgl3dr.spec.ts +0 -37
- package/src/components/icons/liver.vue +0 -21
- package/src/components/loading/__tests__/loading-spinner.spec.ts +0 -11
- package/src/components/modal/ViewerAnnotationModal.vue +0 -111
- package/src/components/modal/ViewerAnnotations.vue +0 -289
- package/src/components/modal/__tests__/ViewerAnnotationModal.spec.ts +0 -79
- package/src/components/modal/composables/useEventListener.ts +0 -22
- package/src/components/selectors/__tests__/value-selector.spec.ts +0 -53
- package/src/components/sliders/DoubleSliderSelector.vue +0 -141
- package/src/components/sliders/__tests__/double-slider-selector.spec.ts +0 -104
- package/src/components/sliders/__tests__/vertical-slider-selector.spec.ts +0 -61
- package/src/dataLayer/__tests__/getIconForPreset.spec.ts +0 -40
- package/src/dataLayer/__tests__/patchDataOverlay.spec.ts +0 -88
- package/src/dataLayer/__tests__/scanState.spec.ts +0 -93
- package/src/dataLayer/getIconForPreset.ts +0 -11
- package/src/dataLayer/patchDataOverlay.ts +0 -101
- package/src/dataLayer/useViewer3cr.ts +0 -7
- package/src/helpers/__tests__/layout-overlay-style.spec.ts +0 -290
- package/src/helpers/__tests__/utils.spec.ts +0 -70
- package/src/helpers/layoutOverlayStyle.ts +0 -96
- package/src/helpers/utils.ts +0 -16
- package/src/models/Callbacks.ts +0 -2
- package/src/models/LoadViewerOptions.ts +0 -31
- package/src/models/LoadViewerPayload.ts +0 -9
- package/src/models/__tests__/load-viewer-options.spec.ts +0 -22
- package/src/notifications/notification.ts +0 -50
- package/src/plugins/__tests__/index.spec.ts +0 -19
- package/src/plugins/index.ts +0 -17
- package/src/services/gpt/gpt.service.ts +0 -35
- package/static/3cr-types-browser/index.ts +0 -74
- package/static/3cr-types-browser/types/Action.ts +0 -6
- package/static/3cr-types-browser/types/AlphaKeys.ts +0 -5
- package/static/3cr-types-browser/types/AnchorPoint.ts +0 -12
- package/static/3cr-types-browser/types/CallToAction.ts +0 -5
- package/static/3cr-types-browser/types/ColourData.ts +0 -7
- package/static/3cr-types-browser/types/ColourPresetData.ts +0 -9
- package/static/3cr-types-browser/types/CurrentDataOverlayState.ts +0 -6
- package/static/3cr-types-browser/types/CurrentScanState.ts +0 -22
- package/static/3cr-types-browser/types/DataOverlay.ts +0 -22
- package/static/3cr-types-browser/types/DataOverlayActions.ts +0 -14
- package/static/3cr-types-browser/types/DataOverlayData.ts +0 -8
- package/static/3cr-types-browser/types/DataOverlayEvent.ts +0 -8
- package/static/3cr-types-browser/types/DecryptionKey.ts +0 -4
- package/static/3cr-types-browser/types/DisplaySettings.ts +0 -10
- package/static/3cr-types-browser/types/EmptyPayload.ts +0 -3
- package/static/3cr-types-browser/types/EnumPayload.ts +0 -4
- package/static/3cr-types-browser/types/FileManagementActions.ts +0 -11
- package/static/3cr-types-browser/types/FlipValue.ts +0 -7
- package/static/3cr-types-browser/types/FrontEndInterfaces.ts +0 -14
- package/static/3cr-types-browser/types/GradientKeys.ts +0 -7
- package/static/3cr-types-browser/types/GreyscalePresetData.ts +0 -6
- package/static/3cr-types-browser/types/InitialDataOverlayState.ts +0 -6
- package/static/3cr-types-browser/types/InitialScanState.ts +0 -19
- package/static/3cr-types-browser/types/InteractionType.ts +0 -8
- package/static/3cr-types-browser/types/InteractivityActions.ts +0 -6
- package/static/3cr-types-browser/types/InteractivityState.ts +0 -4
- package/static/3cr-types-browser/types/InvertTransformData.ts +0 -6
- package/static/3cr-types-browser/types/LayoutActions.ts +0 -6
- package/static/3cr-types-browser/types/LayoutData.ts +0 -7
- package/static/3cr-types-browser/types/LoadDataSet.ts +0 -6
- package/static/3cr-types-browser/types/LoadSessionState.ts +0 -4
- package/static/3cr-types-browser/types/LocalLoadDataset.ts +0 -3
- package/static/3cr-types-browser/types/MovementData.ts +0 -7
- package/static/3cr-types-browser/types/NavigationCubeActions.ts +0 -8
- package/static/3cr-types-browser/types/NavigationCubeData.ts +0 -12
- package/static/3cr-types-browser/types/NavigationCubeTransform.ts +0 -9
- package/static/3cr-types-browser/types/NotificationPayload.ts +0 -7
- package/static/3cr-types-browser/types/NotificationsActions.ts +0 -6
- package/static/3cr-types-browser/types/Object.ts +0 -1
- package/static/3cr-types-browser/types/ObjectColour.ts +0 -7
- package/static/3cr-types-browser/types/ObjectIcon.ts +0 -5
- package/static/3cr-types-browser/types/ObjectInvert.ts +0 -7
- package/static/3cr-types-browser/types/ObjectSize.ts +0 -7
- package/static/3cr-types-browser/types/ObjectSize2D.ts +0 -7
- package/static/3cr-types-browser/types/ObjectVisible.ts +0 -5
- package/static/3cr-types-browser/types/PositionData.ts +0 -14
- package/static/3cr-types-browser/types/PresetsActions.ts +0 -4
- package/static/3cr-types-browser/types/RotationValue.ts +0 -7
- package/static/3cr-types-browser/types/ScanMovementActions.ts +0 -27
- package/static/3cr-types-browser/types/ScanMovementData.ts +0 -3
- package/static/3cr-types-browser/types/ScanOrientationActions.ts +0 -6
- package/static/3cr-types-browser/types/ScanStateActions.ts +0 -4
- package/static/3cr-types-browser/types/ScanView.ts +0 -6
- package/static/3cr-types-browser/types/SettingsData.ts +0 -12
- package/static/3cr-types-browser/types/SlicerData.ts +0 -9
- package/static/3cr-types-browser/types/SliderValue.ts +0 -4
- package/static/3cr-types-browser/types/SlidersActions.ts +0 -18
- package/static/3cr-types-browser/types/Vector2Data.ts +0 -5
- package/static/3cr-types-browser/types/Vector3Data.ts +0 -6
- package/static/3cr-types-browser/types/VectorMovementData.ts +0 -8
- package/static/3cr-types-browser/types/ViewInteractiveMode.ts +0 -5
- package/static/3cr-types-browser/types/ViewOrientation.ts +0 -8
- package/static/3cr-types-browser/types/ViewOrientations.ts +0 -10
- package/static/3cr-types-browser/types/ViewSelectionActions.ts +0 -9
- package/static/3cr-types-browser/types/ViewToggleData.ts +0 -7
- package/static/3cr-types-browser/types/VolumeOrientation.ts +0 -7
- package/test/helper.ts +0 -44
- /package/src/components/{sliders → shared}/VerticalSliderSelector.vue +0 -0
- /package/{config.ts → src/config.ts} +0 -0
- /package/src/{dataLayer → functions}/clamp.ts +0 -0
- /package/src/{dataLayer → models}/eventHandlers.ts +0 -0
- /package/{static/3cr-types-browser/types/ActionData.ts → src/types/action-data.ts} +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
|
3
|
+
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
|
4
|
+
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
|
|
6
|
+
preserveAspectRatio="xMidYMid meet">
|
|
7
|
+
<metadata>
|
|
8
|
+
Created by potrace 1.14, written by Peter Selinger 2001-2017
|
|
9
|
+
</metadata>
|
|
10
|
+
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
|
|
11
|
+
fill="#000000" stroke="none">
|
|
12
|
+
<path d="M2939 6958 c-1 -7 -2 -337 -3 -733 -1 -470 -5 -719 -11 -718 -11 1
|
|
13
|
+
-440 111 -560 143 -147 39 -391 102 -405 105 -14 3 -202 52 -437 113 l-111 30
|
|
14
|
+
-4 -22 c-1 -11 -3 -333 -2 -713 0 -381 -3 -693 -7 -693 -7 0 -296 76 -454 119
|
|
15
|
+
-138 38 -810 213 -832 217 -12 2 -34 9 -48 14 -15 6 -28 10 -31 10 -2 0 -3
|
|
16
|
+
-840 -2 -1867 l3 -1867 65 -19 c141 -40 359 -104 405 -118 35 -11 267 -78 310
|
|
17
|
+
-89 17 -5 71 -20 120 -35 50 -14 104 -30 120 -34 17 -5 134 -39 260 -76 127
|
|
18
|
+
-37 244 -70 260 -75 17 -4 156 -44 310 -89 154 -45 492 -143 750 -217 259 -75
|
|
19
|
+
597 -173 752 -218 l282 -83 -2 919 c-1 505 -1 918 0 918 2 0 67 -18 145 -41
|
|
20
|
+
79 -22 166 -47 193 -54 28 -7 84 -23 125 -35 41 -12 82 -23 90 -25 8 -2 125
|
|
21
|
+
-36 260 -74 135 -39 248 -71 252 -71 3 0 6 412 7 916 0 504 1 917 3 919 2 1
|
|
22
|
+
55 -13 118 -32 202 -61 302 -91 445 -133 162 -48 315 -94 400 -120 33 -10 70
|
|
23
|
+
-21 83 -25 l22 -6 -2 1548 -3 1548 -155 43 c-85 23 -195 53 -245 67 -49 13
|
|
24
|
+
-216 58 -370 100 -154 42 -287 78 -295 80 -8 2 -42 11 -75 20 -33 9 -82 23
|
|
25
|
+
-110 30 -125 34 -335 90 -495 134 -96 27 -287 79 -425 116 -137 37 -295 79
|
|
26
|
+
-350 95 -173 48 -330 90 -337 90 -5 0 -8 -6 -9 -12z m981 -1008 c85 -23 184
|
|
27
|
+
-50 220 -60 36 -10 108 -30 160 -44 239 -64 554 -149 640 -172 52 -14 104 -29
|
|
28
|
+
116 -34 l21 -8 0 -769 c0 -422 -1 -771 -3 -775 -2 -3 -52 9 -112 27 -59 18
|
|
29
|
+
-133 40 -164 49 l-58 17 -1 62 c0 34 0 227 0 428 l0 366 -87 22 c-48 12 -154
|
|
30
|
+
39 -237 60 -82 22 -231 60 -330 86 -349 90 -409 106 -412 109 -3 3 -5 402 -4
|
|
31
|
+
618 l1 87 48 -14 c26 -7 117 -32 202 -55z m-1632 -1036 c75 -19 225 -58 332
|
|
32
|
+
-86 107 -27 222 -57 255 -65 l61 -15 0 -339 c0 -198 -4 -339 -9 -339 -5 0 -37
|
|
33
|
+
7 -71 16 -33 9 -68 18 -76 20 -8 2 -73 19 -145 38 -71 19 -211 55 -310 81 -99
|
|
34
|
+
26 -182 48 -183 50 -2 2 -4 133 -4 292 1 366 1 383 7 383 3 0 67 -16 143 -36z
|
|
35
|
+
m1447 -374 c11 -5 43 -13 70 -20 28 -6 85 -20 128 -32 78 -20 78 -20 74 -52
|
|
36
|
+
-4 -36 -4 -36 -117 -1 -41 13 -108 33 -147 45 -69 20 -73 23 -73 49 0 25 3 28
|
|
37
|
+
23 24 12 -2 31 -8 42 -13z m-2845 -694 c52 -13 149 -39 215 -56 66 -17 143
|
|
38
|
+
-37 170 -45 28 -8 68 -19 91 -24 l40 -11 1 -590 c0 -324 1 -592 4 -594 3 -3
|
|
39
|
+
926 -268 979 -281 8 -2 65 -18 125 -35 61 -17 124 -35 140 -40 17 -4 68 -20
|
|
40
|
+
115 -33 47 -14 103 -30 125 -36 l41 -11 -1 -529 c0 -291 -3 -532 -6 -535 -3
|
|
41
|
+
-3 -19 -2 -35 3 -16 5 -164 48 -329 96 -165 47 -406 117 -535 155 -129 37
|
|
42
|
+
-332 96 -450 130 -118 34 -260 75 -314 92 -55 16 -109 32 -120 34 -12 2 -102
|
|
43
|
+
28 -201 57 l-180 53 -2 1118 c-1 1034 0 1116 15 1112 10 -3 60 -16 112 -30z
|
|
44
|
+
m2910 -147 c36 -11 89 -27 118 -35 99 -26 89 38 88 -568 -1 -294 -4 -537 -7
|
|
45
|
+
-541 -6 -5 -315 78 -326 88 -3 4 -6 810 -3 1059 l0 37 33 -10 c17 -6 61 -19
|
|
46
|
+
97 -30z m-1270 -284 c118 -31 256 -67 307 -81 50 -13 93 -24 95 -24 2 0 4
|
|
47
|
+
-102 3 -227 0 -143 -4 -228 -10 -227 -11 1 -778 217 -783 220 -3 2 -5 264 -3
|
|
48
|
+
400 l1 42 88 -23 c48 -13 184 -48 302 -80z"/>
|
|
49
|
+
</g>
|
|
50
|
+
</svg>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "",
|
|
3
|
+
"short_name": "",
|
|
4
|
+
"icons": [
|
|
5
|
+
{
|
|
6
|
+
"src": "/android-chrome-192x192.png",
|
|
7
|
+
"sizes": "192x192",
|
|
8
|
+
"type": "image/png"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"src": "/android-chrome-512x512.png",
|
|
12
|
+
"sizes": "512x512",
|
|
13
|
+
"type": "image/png"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"theme_color": "#ffffff",
|
|
17
|
+
"background_color": "#ffffff",
|
|
18
|
+
"display": "standalone"
|
|
19
|
+
}
|
package/src/App.vue
CHANGED
|
@@ -1,84 +1,92 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
<MftpWebGL3DRModal v-if="show" ref="mftpWebGL3DRModal" :payload="payload" :options="options" />
|
|
3
|
+
<DemoLicenceInfoModal v-model:modal="m_demoLicence" />
|
|
4
|
+
<DemoLicenceShareToMobileModal v-model:modal="m_demoLicenceShareToMobile" />
|
|
5
|
+
<DemoLicenceSendToPartyModal v-model:modal="m_demoLicenceSendToParty" />
|
|
6
|
+
<DemoLicenceEnableCloudStorageModal v-model:modal="m_demoLicenseEnableCloudStorage" />
|
|
7
|
+
<DemoPatientInfoModal v-model:modal="m_demoPatient" />
|
|
8
|
+
<DemoPatientShareToMobileModal v-model:modal="m_demoPatientShareToMobile" />
|
|
9
|
+
<DemoPatientSendToPartyModal v-model:modal="m_demoPatientSendToParty" />
|
|
10
|
+
<DemoPatientEnableCloudStorageModal v-model:modal="m_demoPatientEnableCloudStorage" />
|
|
11
|
+
<Notifications />
|
|
12
|
+
<update-snackbar />
|
|
12
13
|
</template>
|
|
13
14
|
|
|
14
15
|
<script setup lang="ts">
|
|
15
|
-
import
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
16
|
+
import { ref } from 'vue';
|
|
17
|
+
import { Notifications } from '@kyvg/vue3-notification';
|
|
18
|
+
import { defaultLoadViewerPayload, LoadViewerPayload } from '@/models/loadViewerPayload';
|
|
19
|
+
import { defaultLoadViewerOptions, LoadViewerOptions } from '@/models/loadViewerOptions';
|
|
19
20
|
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
isDemo,
|
|
22
|
+
m_demoLicence,
|
|
23
|
+
m_demoLicenceSendToParty,
|
|
24
|
+
m_demoLicenceShareToMobile,
|
|
25
|
+
m_demoLicenseEnableCloudStorage,
|
|
26
|
+
m_demoPatient,
|
|
27
|
+
m_demoPatientEnableCloudStorage,
|
|
28
|
+
m_demoPatientSendToParty,
|
|
29
|
+
m_demoPatientShareToMobile,
|
|
30
|
+
show
|
|
31
|
+
} from '@/components/demo/options';
|
|
32
|
+
import MftpWebGL3DRModal from '@/components/modal/MftpWebGL3DRModal.vue';
|
|
33
|
+
import LogRocket from 'logrocket';
|
|
25
34
|
|
|
26
35
|
if (isDemo.value) {
|
|
27
|
-
LogRocket.init(
|
|
36
|
+
LogRocket.init('qfib9l/3crviewer-browser');
|
|
28
37
|
}
|
|
29
38
|
|
|
30
|
-
const payload = ref<LoadViewerPayload>(
|
|
31
|
-
Url: "https://webgl-3dr.singular.health/test_scans/01440d4e-8b04-4b90-bb2c-698535ce16d6/CHEST.3vxl",
|
|
32
|
-
DecryptionKey: {
|
|
33
|
-
Iv: "XEloSh+OcO7TG77au6HjPw==",
|
|
34
|
-
Key: "KUc722X1y4w42M+jCf9a3+6EGz66z7UMWK3m2aMqGxM=",
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
|
|
39
|
+
const payload = ref<LoadViewerPayload>(defaultLoadViewerPayload);
|
|
38
40
|
const options = ref<LoadViewerOptions>(defaultLoadViewerOptions);
|
|
41
|
+
const mftpWebGL3DRModal = ref<typeof MftpWebGL3DRModal>();
|
|
39
42
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
async function loadInstance(
|
|
43
|
-
payloadIncoming: LoadViewerPayload | undefined,
|
|
44
|
-
optionsIncoming: LoadViewerOptions
|
|
45
|
-
) {
|
|
43
|
+
async function loadInstance(payloadIncoming: LoadViewerPayload | undefined, optionsIncoming: LoadViewerOptions) {
|
|
46
44
|
payload.value = payloadIncoming || payload.value;
|
|
47
45
|
options.value = optionsIncoming;
|
|
48
|
-
|
|
49
|
-
await nextTick();
|
|
50
|
-
unref(mftpWebGL3DRModal)?.alterValue(true);
|
|
51
46
|
}
|
|
52
47
|
|
|
53
48
|
async function loadSession(url: string): Promise<void> {
|
|
54
|
-
await
|
|
49
|
+
await mftpWebGL3DRModal.value?.loadSession(url);
|
|
55
50
|
}
|
|
56
51
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
52
|
+
async function close(): Promise<void> {
|
|
53
|
+
await mftpWebGL3DRModal.value?.close();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
defineExpose({ loadInstance, loadSession, close });
|
|
61
57
|
</script>
|
|
62
58
|
|
|
63
59
|
<style>
|
|
64
60
|
.material-icons-outlined,
|
|
65
61
|
.material-symbols-outlined {
|
|
66
|
-
font-variation-settings:
|
|
62
|
+
font-variation-settings:
|
|
63
|
+
'FILL' 0,
|
|
64
|
+
'wght' 300,
|
|
65
|
+
'GRAD' 0,
|
|
66
|
+
'opsz' 24;
|
|
67
67
|
}
|
|
68
68
|
.material-icons,
|
|
69
69
|
.material-symbols {
|
|
70
|
-
font-variation-settings:
|
|
70
|
+
font-variation-settings:
|
|
71
|
+
'FILL' 0,
|
|
72
|
+
'wght' 300,
|
|
73
|
+
'GRAD' 0,
|
|
74
|
+
'opsz' 24;
|
|
71
75
|
}
|
|
72
76
|
.material-icons-filled,
|
|
73
77
|
.material-symbols-filled {
|
|
74
|
-
font-variation-settings:
|
|
78
|
+
font-variation-settings:
|
|
79
|
+
'FILL' 1,
|
|
80
|
+
'wght' 300,
|
|
81
|
+
'GRAD' 0,
|
|
82
|
+
'opsz' 24 !important;
|
|
75
83
|
}
|
|
76
84
|
.overflow-y-scroll {
|
|
77
85
|
overflow-y: scroll;
|
|
78
86
|
}
|
|
79
87
|
.material-icons-outlined,
|
|
80
88
|
.material-icons {
|
|
81
|
-
font-family:
|
|
89
|
+
font-family: 'Material Symbols Outlined' !important;
|
|
82
90
|
font-weight: normal;
|
|
83
91
|
font-style: normal;
|
|
84
92
|
font-size: 24px;
|
|
@@ -89,15 +97,12 @@ defineExpose({
|
|
|
89
97
|
white-space: nowrap;
|
|
90
98
|
word-wrap: normal;
|
|
91
99
|
direction: ltr;
|
|
92
|
-
-webkit-font-feature-settings:
|
|
100
|
+
-webkit-font-feature-settings: 'liga';
|
|
93
101
|
-webkit-font-smoothing: antialiased;
|
|
94
102
|
}
|
|
95
103
|
.transparent {
|
|
96
104
|
background-color: transparent;
|
|
97
105
|
}
|
|
98
|
-
.v-dialog.v-overlay--active:not(.v-tooltip) {
|
|
99
|
-
backdrop-filter: blur(4px);
|
|
100
|
-
}
|
|
101
106
|
.card-bg-border {
|
|
102
107
|
border-radius: 12px !important;
|
|
103
108
|
border: 2px #ffffffaa solid;
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import App from "@/App.vue";
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
|
+
import App from '@/App.vue';
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
it("should inflate component", () => {
|
|
4
|
+
describe('App.vue', () => {
|
|
5
|
+
it('should inflate component', () => {
|
|
6
|
+
const wrapper = shallowMount(App);
|
|
9
7
|
expect(wrapper).toBeTruthy();
|
|
10
8
|
});
|
|
11
9
|
|
|
12
|
-
it(
|
|
10
|
+
it('should loadScan', async () => {
|
|
11
|
+
const wrapper = shallowMount(App);
|
|
13
12
|
await wrapper.vm.loadInstance(undefined, {});
|
|
14
13
|
expect(wrapper).toBeTruthy();
|
|
15
14
|
});
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {ejectViewer, loadSession, loadViewer, registerViewer} from "../index";
|
|
1
|
+
import { ejectViewer, loadSession, loadViewer, registerViewer } from '@/main';
|
|
3
2
|
|
|
4
3
|
describe('index tests', () => {
|
|
5
4
|
const errorMessage = 'Please call `registerViewer(version: string)` first';
|
|
@@ -13,22 +12,22 @@ describe('index tests', () => {
|
|
|
13
12
|
});
|
|
14
13
|
|
|
15
14
|
it('should resolve loadViewer', async () => {
|
|
16
|
-
await registerViewer(
|
|
15
|
+
await registerViewer(document.body, '1.0.0');
|
|
17
16
|
expect(loadViewer()).resolves.not.toThrow(errorMessage);
|
|
18
17
|
});
|
|
19
18
|
|
|
20
19
|
it('should resolve loadSession 3crds url', async () => {
|
|
21
|
-
await registerViewer(
|
|
20
|
+
await registerViewer(document.body, '1.0.0');
|
|
22
21
|
expect(loadSession('https://localhost/example.3crds')).resolves.not.toThrow(errorMessage);
|
|
23
22
|
});
|
|
24
23
|
|
|
25
24
|
it('should resolve loadSession 3crms url', async () => {
|
|
26
|
-
await registerViewer(
|
|
25
|
+
await registerViewer(document.body, '1.0.0');
|
|
27
26
|
expect(loadSession('https://localhost/example.3crms')).resolves.not.toThrow(errorMessage);
|
|
28
27
|
});
|
|
29
28
|
|
|
30
29
|
it('should resolve loadSession 3crs url', async () => {
|
|
31
|
-
await registerViewer(
|
|
30
|
+
await registerViewer(document.body, '1.0.0');
|
|
32
31
|
expect(loadSession('https://localhost/example.3crs')).resolves.not.toThrow(errorMessage);
|
|
33
32
|
});
|
|
34
33
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<svg viewBox="0 0 130 155" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<defs>
|
|
4
|
+
<linearGradient id="paint0_linear_184_3640" x1="97.4467" y1="10.5294" x2="85.8199" y2="69.4832" gradientUnits="userSpaceOnUse">
|
|
5
|
+
<stop stop-color="white" stop-opacity="0.8"/>
|
|
6
|
+
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
<linearGradient id="paint1_linear_184_3640" x1="68.472" y1="34.3899" x2="55.5909" y2="102.885" gradientUnits="userSpaceOnUse">
|
|
9
|
+
<stop stop-color="white" stop-opacity="0.8"/>
|
|
10
|
+
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
|
|
11
|
+
</linearGradient>
|
|
12
|
+
<linearGradient id="paint2_linear_184_3640" x1="41.2011" y1="58.2533" x2="26.3355" y2="135.999" gradientUnits="userSpaceOnUse">
|
|
13
|
+
<stop stop-color="white" stop-opacity="0.8"/>
|
|
14
|
+
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
|
|
15
|
+
</linearGradient>
|
|
16
|
+
</defs>
|
|
17
|
+
<path d="M121.308 23.4829L73.585 10.5294V61.048L121.308 75.2969V23.4829Z" stroke="url(#paint0_linear_184_3640)" stroke-width="16" transform="matrix(1, 0, 0, 1, 0, 7.105427357601002e-15)"/>
|
|
18
|
+
<path d="M97.447 49.3887L39.4971 34.3899V92.8852L97.447 109.384V49.3887Z" stroke="url(#paint1_linear_184_3640)" stroke-width="16" transform="matrix(1, 0, 0, 1, 0, 7.105427357601002e-15)"/>
|
|
19
|
+
<path d="M73.5849 75.2974L8.81738 58.2533V124.725L73.5849 143.474V75.2974Z" stroke="url(#paint2_linear_184_3640)" stroke-width="16" transform="matrix(1, 0, 0, 1, 0, 7.105427357601002e-15)"/>
|
|
20
|
+
</svg>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<svg width="498" height="155" viewBox="0 0 498 155" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M121.308 23.4829L73.585 10.5294V61.048L121.308 75.2969V23.4829Z" stroke="url(#paint0_linear_184_3640)" stroke-width="16"/>
|
|
3
|
+
<path d="M97.447 49.3887L39.4971 34.3899V92.8852L97.447 109.384V49.3887Z" stroke="url(#paint1_linear_184_3640)" stroke-width="16"/>
|
|
4
|
+
<path d="M73.5849 75.2974L8.81738 58.2533V124.725L73.5849 143.474V75.2974Z" stroke="url(#paint2_linear_184_3640)" stroke-width="16"/>
|
|
5
|
+
<g clip-path="url(#clip0_184_3640)">
|
|
6
|
+
<path d="M428.03 110.332V43.6685H441.452L466.418 76.7767H460.154L484.404 43.6685H497.826V110.332H483.956V58.9699L489.504 60.2226L463.823 93.3307H462.033L437.247 60.2226L441.9 58.9699V110.332H428.03Z" fill="white"/>
|
|
7
|
+
<path d="M386.427 111.406C381.416 111.406 376.763 110.541 372.468 108.811C368.173 107.081 364.415 104.665 361.193 101.563C358.032 98.401 355.556 94.7323 353.766 90.5565C351.977 86.3807 351.082 81.847 351.082 76.9553C351.082 72.0637 351.947 67.5299 353.677 63.3541C355.467 59.1783 357.942 55.5394 361.104 52.4374C364.325 49.3354 368.083 46.9194 372.379 45.1894C376.674 43.4594 381.357 42.5944 386.427 42.5944C391.498 42.5944 396.181 43.4594 400.476 45.1894C404.771 46.9194 408.499 49.3354 411.661 52.4374C414.882 55.5394 417.358 59.1783 419.088 63.3541C420.878 67.5299 421.772 72.0637 421.772 76.9553C421.772 81.847 420.878 86.3807 419.088 90.5565C417.298 94.7323 414.793 98.401 411.572 101.563C408.41 104.665 404.681 107.081 400.386 108.811C396.091 110.541 391.438 111.406 386.427 111.406ZM386.427 98.8783C389.47 98.8783 392.273 98.3414 394.838 97.2676C397.463 96.1938 399.76 94.7025 401.729 92.7935C403.697 90.8249 405.218 88.4984 406.292 85.814C407.366 83.1295 407.903 80.1766 407.903 76.9553C407.903 73.734 407.366 70.8109 406.292 68.1861C405.218 65.5017 403.697 63.1752 401.729 61.2066C399.76 59.238 397.463 57.7466 394.838 56.7325C392.273 55.6587 389.47 55.1218 386.427 55.1218C383.385 55.1218 380.551 55.6587 377.926 56.7325C375.361 57.7466 373.094 59.238 371.126 61.2066C369.157 63.1752 367.636 65.5017 366.562 68.1861C365.489 70.8109 364.952 73.734 364.952 76.9553C364.952 80.1766 365.489 83.1295 366.562 85.814C367.636 88.4984 369.157 90.8249 371.126 92.7935C373.094 94.7025 375.361 96.1938 377.926 97.2676C380.551 98.3414 383.385 98.8783 386.427 98.8783Z" fill="white"/>
|
|
8
|
+
<path d="M319.185 111.406C314.413 111.406 309.968 110.541 305.852 108.811C301.796 107.081 298.246 104.665 295.204 101.563C292.162 98.4609 289.775 94.822 288.046 90.6462C286.375 86.4704 285.54 81.9068 285.54 76.9555C285.54 72.0042 286.375 67.4406 288.046 63.2648C289.716 59.0294 292.072 55.3905 295.115 52.3481C298.157 49.2461 301.706 46.8599 305.763 45.1896C309.879 43.4596 314.353 42.5946 319.185 42.5946C324.017 42.5946 328.342 43.3999 332.16 45.0106C336.037 46.6213 339.318 48.7688 342.003 51.4533C344.687 54.1377 346.596 57.1204 347.73 60.4014L335.471 66.3072C334.337 63.0859 332.339 60.4312 329.475 58.3433C326.672 56.1958 323.242 55.122 319.185 55.122C315.248 55.122 311.788 56.0467 308.805 57.8959C305.823 59.7452 303.496 62.3104 301.826 65.5913C300.215 68.8127 299.41 72.6007 299.41 76.9555C299.41 81.3103 300.215 85.1281 301.826 88.4091C303.496 91.6901 305.823 94.2552 308.805 96.1045C311.788 97.9538 315.248 98.8785 319.185 98.8785C323.242 98.8785 326.672 97.8345 329.475 95.7466C332.339 93.599 334.337 90.9146 335.471 87.6933L347.73 93.599C346.596 96.88 344.687 99.8627 342.003 102.547C339.318 105.232 336.037 107.379 332.16 108.99C328.342 110.601 324.017 111.406 319.185 111.406Z" fill="white"/>
|
|
9
|
+
<path d="M265.397 110.332V43.6685H279.267V110.332H265.397Z" fill="white"/>
|
|
10
|
+
<path d="M202.827 110.332V43.6685H224.571C231.789 43.6685 238.053 45.1002 243.362 47.9636C248.671 50.827 252.788 54.7642 255.711 59.7752C258.634 64.7861 260.095 70.513 260.095 76.9556C260.095 83.3983 258.634 89.1549 255.711 94.2255C252.788 99.2365 248.671 103.174 243.362 106.037C238.053 108.9 231.789 110.332 224.571 110.332H202.827ZM216.697 98.2522H224.929C229.284 98.2522 233.042 97.3872 236.204 95.6573C239.365 93.8676 241.811 91.392 243.541 88.2303C245.331 85.009 246.226 81.2507 246.226 76.9556C246.226 72.6009 245.331 68.8426 243.541 65.681C241.811 62.5193 239.365 60.0735 236.204 58.3435C233.042 56.6135 229.284 55.7485 224.929 55.7485H216.697V98.2522Z" fill="white"/>
|
|
11
|
+
<path d="M171.839 111.406C168.14 111.406 164.62 110.72 161.28 109.348C157.939 107.916 155.106 105.918 152.779 103.353C150.452 100.788 148.901 97.775 148.126 94.315L160.385 90.1989C161.399 93.0623 162.89 95.2397 164.859 96.731C166.828 98.1627 169.154 98.8786 171.839 98.8786C174.046 98.8786 175.925 98.461 177.476 97.6258C179.087 96.7907 180.339 95.6274 181.234 94.1361C182.129 92.5851 182.576 90.7954 182.576 88.7672C182.576 86.7389 182.129 85.009 181.234 83.5773C180.399 82.0859 179.176 80.9525 177.565 80.177C176.014 79.3418 174.105 78.9242 171.839 78.9242C170.526 78.9242 169.214 79.0734 167.901 79.3716C166.589 79.6699 165.396 80.0875 164.322 80.6244L161.101 73.9133L178.192 55.3011H152.153V43.6685H193.762V54.4063L176.223 74.3607L176.671 68.7233C180.667 68.7233 184.127 69.5585 187.05 71.2288C190.033 72.8395 192.33 75.1063 193.94 78.0294C195.611 80.9525 196.446 84.3528 196.446 88.2303C196.446 92.6447 195.372 96.6117 193.225 100.131C191.077 103.651 188.154 106.425 184.455 108.453C180.757 110.422 176.551 111.406 171.839 111.406Z" fill="white"/>
|
|
12
|
+
</g>
|
|
13
|
+
<defs>
|
|
14
|
+
<linearGradient id="paint0_linear_184_3640" x1="97.4467" y1="10.5294" x2="85.8199" y2="69.4832" gradientUnits="userSpaceOnUse">
|
|
15
|
+
<stop stop-color="white" stop-opacity="0.8"/>
|
|
16
|
+
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
|
|
17
|
+
</linearGradient>
|
|
18
|
+
<linearGradient id="paint1_linear_184_3640" x1="68.472" y1="34.3899" x2="55.5909" y2="102.885" gradientUnits="userSpaceOnUse">
|
|
19
|
+
<stop stop-color="white" stop-opacity="0.8"/>
|
|
20
|
+
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
|
|
21
|
+
</linearGradient>
|
|
22
|
+
<linearGradient id="paint2_linear_184_3640" x1="41.2011" y1="58.2533" x2="26.3355" y2="135.999" gradientUnits="userSpaceOnUse">
|
|
23
|
+
<stop stop-color="white" stop-opacity="0.8"/>
|
|
24
|
+
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
|
|
25
|
+
</linearGradient>
|
|
26
|
+
<clipPath id="clip0_184_3640">
|
|
27
|
+
<rect width="349.699" height="68.8112" fill="white" transform="translate(148.126 42.5944)"/>
|
|
28
|
+
</clipPath>
|
|
29
|
+
</defs>
|
|
30
|
+
</svg>
|
package/src/assets/styles.scss
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
|
-
@
|
|
1
|
+
@import 'vuetify/styles';
|
|
2
|
+
@import 'intro.js/introjs.css';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
.v-overlay {
|
|
5
|
+
z-index: 3400 !important;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.introjs-tooltipReferenceLayer {
|
|
9
|
+
z-index: 3401;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.introjs-overlay,
|
|
13
|
+
.introjs-helperLayer {
|
|
14
|
+
pointer-events: none;
|
|
15
|
+
z-index: 3401;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.introjs-dontShowAgain {
|
|
19
|
+
display: none;
|
|
5
20
|
}
|
|
6
|
-
@import "vuetify/_styles.scss";
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { computed } from
|
|
3
|
-
import {PRICING_URL} from
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import { PRICING_URL } from '@/components/demo/options';
|
|
4
4
|
|
|
5
5
|
export interface Props {
|
|
6
6
|
modal: boolean;
|
|
7
|
-
isModalOpen
|
|
7
|
+
isModalOpen?: boolean;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
const emit = defineEmits<{
|
|
11
|
-
|
|
11
|
+
'update:modal': [value: boolean];
|
|
12
12
|
}>();
|
|
13
13
|
|
|
14
14
|
const props = withDefaults(defineProps<Props>(), {
|
|
15
15
|
modal: false,
|
|
16
|
-
isModalOpen: true
|
|
16
|
+
isModalOpen: true
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
const modalState = computed({
|
|
@@ -21,11 +21,11 @@ const modalState = computed({
|
|
|
21
21
|
return props.modal;
|
|
22
22
|
},
|
|
23
23
|
set(value) {
|
|
24
|
-
emit(
|
|
25
|
-
}
|
|
24
|
+
emit('update:modal', value);
|
|
25
|
+
}
|
|
26
26
|
});
|
|
27
27
|
function openUrl(url: string) {
|
|
28
|
-
window.open(url,
|
|
28
|
+
window.open(url, '_self');
|
|
29
29
|
}
|
|
30
30
|
</script>
|
|
31
31
|
|
|
@@ -35,25 +35,15 @@ function openUrl(url: string) {
|
|
|
35
35
|
<v-card-title>Purchase 3Dicom Viewer</v-card-title>
|
|
36
36
|
<v-card-text> Thank you for trying 3Dicom Online Viewer! </v-card-text>
|
|
37
37
|
<v-card-text>
|
|
38
|
-
This instance of the Online Viewer is a Demo instance. If you would like
|
|
39
|
-
|
|
38
|
+
This instance of the Online Viewer is a Demo instance. If you would like to see your scans in 3D, please choose
|
|
39
|
+
a plan for 3DICOM
|
|
40
40
|
</v-card-text>
|
|
41
41
|
<v-card-actions>
|
|
42
|
-
<v-btn
|
|
43
|
-
data-testid="close"
|
|
44
|
-
color="error"
|
|
45
|
-
@click="modalState = false"
|
|
46
|
-
:disabled="!isModalOpen"
|
|
47
|
-
>
|
|
42
|
+
<v-btn data-testid="close" color="error" @click="modalState = false" :disabled="!isModalOpen">
|
|
48
43
|
Continue with Viewer
|
|
49
44
|
</v-btn>
|
|
50
45
|
<v-spacer />
|
|
51
|
-
<v-btn
|
|
52
|
-
data-testid="select-plan"
|
|
53
|
-
variant="tonal"
|
|
54
|
-
color="success"
|
|
55
|
-
@click="openUrl(PRICING_URL)"
|
|
56
|
-
>
|
|
46
|
+
<v-btn data-testid="select-plan" variant="tonal" color="success" @click="openUrl(PRICING_URL)">
|
|
57
47
|
Select a Plan
|
|
58
48
|
</v-btn>
|
|
59
49
|
</v-card-actions>
|
|
@@ -1,25 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import DemoModal from
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
|
+
import { VDialog } from 'vuetify/components';
|
|
3
|
+
import DemoModal from '@/components/demo/DemoModal.vue';
|
|
4
4
|
|
|
5
5
|
describe('DemoModal tests', () => {
|
|
6
6
|
it('should mount', () => {
|
|
7
7
|
const props = { modal: true };
|
|
8
|
-
const wrapper =
|
|
8
|
+
const wrapper = mount(DemoModal, { props });
|
|
9
9
|
expect(wrapper).toBeTruthy();
|
|
10
10
|
});
|
|
11
11
|
|
|
12
12
|
it('should close', async () => {
|
|
13
13
|
const props = { modal: true };
|
|
14
|
-
const wrapper =
|
|
14
|
+
const wrapper = mount(DemoModal, { props });
|
|
15
15
|
const button = wrapper.findComponent('[data-testid="close"]');
|
|
16
16
|
await button.trigger('click');
|
|
17
|
-
expect(wrapper.emitted(
|
|
17
|
+
expect(wrapper.emitted('update:modal')).toBeTruthy();
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
it('should open via input', async () => {
|
|
21
21
|
const props = { modal: false };
|
|
22
|
-
const wrapper =
|
|
23
|
-
|
|
22
|
+
const wrapper = mount(DemoModal, { props });
|
|
23
|
+
const dialog = wrapper.findComponent(VDialog);
|
|
24
|
+
await dialog.setValue(true);
|
|
24
25
|
});
|
|
25
26
|
});
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import DemoPatientModal from
|
|
1
|
+
import { PRICING_URL } from '@/components/demo/options';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import { VDialog } from 'vuetify/components';
|
|
4
|
+
import DemoPatientModal from '@/components/demo/DemoPatientModal.vue';
|
|
5
5
|
|
|
6
6
|
describe('DemoPatientModal tests', () => {
|
|
7
7
|
it('should mount', () => {
|
|
8
8
|
const props = { modal: true, isModalOpen: true };
|
|
9
|
-
const wrapper =
|
|
9
|
+
const wrapper = mount(DemoPatientModal, { props });
|
|
10
10
|
expect(wrapper).toBeTruthy();
|
|
11
11
|
});
|
|
12
12
|
|
|
13
13
|
it('should close', async () => {
|
|
14
14
|
const props = { modal: true, isModalOpen: true };
|
|
15
|
-
const wrapper =
|
|
15
|
+
const wrapper = mount(DemoPatientModal, { props });
|
|
16
16
|
const button = wrapper.findComponent('[data-testid="close"]');
|
|
17
17
|
await button.trigger('click');
|
|
18
|
-
expect(wrapper.emitted(
|
|
18
|
+
expect(wrapper.emitted('update:modal')).toBeTruthy();
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
it('should open pricing url', async () => {
|
|
22
22
|
vi.stubGlobal('open', vi.fn());
|
|
23
23
|
const spy = vi.spyOn(window, 'open');
|
|
24
24
|
const props = { modal: true, isModalOpen: true };
|
|
25
|
-
const wrapper =
|
|
25
|
+
const wrapper = mount(DemoPatientModal, { props });
|
|
26
26
|
const button = wrapper.findComponent('[data-testid="select-plan"]');
|
|
27
27
|
await button.trigger('click');
|
|
28
28
|
expect(spy).toHaveBeenCalledWith(PRICING_URL, '_self');
|
|
@@ -31,7 +31,8 @@ describe('DemoPatientModal tests', () => {
|
|
|
31
31
|
|
|
32
32
|
it('should open via input', async () => {
|
|
33
33
|
const props = { modal: false, isModalOpen: true };
|
|
34
|
-
const wrapper =
|
|
35
|
-
|
|
34
|
+
const wrapper = mount(DemoPatientModal, { props });
|
|
35
|
+
const dialog = wrapper.findComponent(VDialog);
|
|
36
|
+
await dialog.setValue(true);
|
|
36
37
|
});
|
|
37
38
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { demoLicenceOptions, demoPatientOptions } from "@/components/demo/options";
|
|
3
|
-
import { LoadViewerOptions } from "@/models/
|
|
3
|
+
import { LoadViewerOptions } from "@/models/loadViewerOptions";
|
|
4
4
|
|
|
5
5
|
describe('options tests', () => {
|
|
6
6
|
it('should call demo license options', () => {
|
|
@@ -1,23 +1,19 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { computed } from
|
|
3
|
-
import {
|
|
4
|
-
demoLicenceSubtitles,
|
|
5
|
-
demoLicenceTitle,
|
|
6
|
-
openUrl, SUPPORT_URL,
|
|
7
|
-
} from "@/components/demo/options";
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import { demoLicenceSubtitles, demoLicenceTitle, openUrl, SUPPORT_URL } from '@/components/demo/options';
|
|
8
4
|
|
|
9
5
|
export interface Props {
|
|
10
6
|
modal: boolean;
|
|
11
|
-
isModalOpen
|
|
7
|
+
isModalOpen?: boolean;
|
|
12
8
|
}
|
|
13
9
|
|
|
14
10
|
const emit = defineEmits<{
|
|
15
|
-
|
|
11
|
+
'update:modal': [value: boolean];
|
|
16
12
|
}>();
|
|
17
13
|
|
|
18
14
|
const props = withDefaults(defineProps<Props>(), {
|
|
19
15
|
modal: false,
|
|
20
|
-
isModalOpen: true
|
|
16
|
+
isModalOpen: true
|
|
21
17
|
});
|
|
22
18
|
|
|
23
19
|
const modalState = computed({
|
|
@@ -25,25 +21,16 @@ const modalState = computed({
|
|
|
25
21
|
return props.modal;
|
|
26
22
|
},
|
|
27
23
|
set(value) {
|
|
28
|
-
emit(
|
|
29
|
-
}
|
|
24
|
+
emit('update:modal', value);
|
|
25
|
+
}
|
|
30
26
|
});
|
|
31
27
|
</script>
|
|
32
28
|
|
|
33
29
|
<template>
|
|
34
30
|
<v-dialog v-model:model-value="modalState">
|
|
35
|
-
<v-card
|
|
36
|
-
class="
|
|
37
|
-
|
|
38
|
-
max-width="680"
|
|
39
|
-
>
|
|
40
|
-
<v-card-title class="text-center mb-4 mt-2 font-weight-bold">{{
|
|
41
|
-
demoLicenceTitle
|
|
42
|
-
}}</v-card-title>
|
|
43
|
-
<v-card-text
|
|
44
|
-
class="text-justify"
|
|
45
|
-
v-for="subtitle in demoLicenceSubtitles"
|
|
46
|
-
:key="subtitle"
|
|
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">{{ demoLicenceTitle }}</v-card-title>
|
|
33
|
+
<v-card-text class="text-justify" v-for="subtitle in demoLicenceSubtitles" :key="subtitle"
|
|
47
34
|
>{{ subtitle }}
|
|
48
35
|
</v-card-text>
|
|
49
36
|
<v-card-actions class="mt-4">
|
|
@@ -51,12 +38,7 @@ const modalState = computed({
|
|
|
51
38
|
Continue with Demo
|
|
52
39
|
</v-btn>
|
|
53
40
|
<v-spacer />
|
|
54
|
-
<v-btn
|
|
55
|
-
data-testid="confirm"
|
|
56
|
-
variant="flat"
|
|
57
|
-
color="success"
|
|
58
|
-
@click="openUrl(SUPPORT_URL)"
|
|
59
|
-
>
|
|
41
|
+
<v-btn data-testid="confirm" variant="flat" color="success" @click="openUrl(SUPPORT_URL)">
|
|
60
42
|
Enquire about technical integration
|
|
61
43
|
</v-btn>
|
|
62
44
|
</v-card-actions>
|