@morscherlab/mint-sdk 1.3.9 → 1.4.0-beta.1
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/README.md +152 -177
- package/dist/ActionMenu-CScINahU.js +445 -0
- package/dist/ActionMenu-CScINahU.js.map +1 -0
- package/dist/AppSidebar-BmiiPfz9.js +3514 -0
- package/dist/AppSidebar-BmiiPfz9.js.map +1 -0
- package/dist/{experiment-utils-DTANyVKV.js → BaseModal-DfRIuVoj.js} +74 -149
- package/dist/BaseModal-DfRIuVoj.js.map +1 -0
- package/dist/ConfirmDialog-CJ7hqYUP.js +102 -0
- package/dist/ConfirmDialog-CJ7hqYUP.js.map +1 -0
- package/dist/ExperimentPopover-C4sGw-is.js +359 -0
- package/dist/ExperimentPopover-C4sGw-is.js.map +1 -0
- package/dist/ExperimentSelectorModal-D-9z7cNx.js +527 -0
- package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +1 -0
- package/dist/SegmentedControl-DERBN-Xd.js +129 -0
- package/dist/SegmentedControl-DERBN-Xd.js.map +1 -0
- package/dist/SettingsModal-CSLE31yg.js +666 -0
- package/dist/SettingsModal-CSLE31yg.js.map +1 -0
- package/dist/analysisArtifactTypes-Cy3D0Ipg.js.map +1 -1
- package/dist/auth-SliLnFre.js +65 -0
- package/dist/auth-SliLnFre.js.map +1 -0
- package/dist/components/ActionMenu.vue.d.ts +1 -1
- package/dist/components/AdductText.vue.d.ts +1 -1
- package/dist/components/AlertBox.vue.d.ts +3 -3
- package/dist/components/AppContainer.vue.d.ts +1 -1
- package/dist/components/AppSidebar.vue.d.ts +14 -94
- package/dist/components/AppTopBar.vue.d.ts +16 -70
- package/dist/components/ArtifactSaveDialog.vue.d.ts +4 -4
- package/dist/components/ArtifactSelectorModal.vue.d.ts +4 -4
- package/dist/components/AuditTrail.vue.d.ts +2 -2
- package/dist/components/BaseButton.vue.d.ts +11 -4
- package/dist/components/BaseCheckbox.vue.d.ts +9 -3
- package/dist/components/BaseInput.vue.d.ts +13 -9
- package/dist/components/BaseModal.vue.d.ts +4 -4
- package/dist/components/BasePill.vue.d.ts +15 -8
- package/dist/components/BaseRadioGroup.vue.d.ts +2 -2
- package/dist/components/BaseSelect.vue.d.ts +51 -19
- package/dist/components/BaseTabs.vue.d.ts +6 -5
- package/dist/components/BatchProgressList.vue.d.ts +2 -2
- package/dist/components/ChartContainer.vue.d.ts +2 -2
- package/dist/components/ChemicalFormula.vue.d.ts +2 -2
- package/dist/components/CollapsibleCard.vue.d.ts +3 -3
- package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -3
- package/dist/components/ConcentrationInput.vue.d.ts +2 -2
- package/dist/components/ConfirmDialog.vue.d.ts +8 -7
- package/dist/components/DataFrame.vue.d.ts +32 -74
- package/dist/components/DatePicker.vue.d.ts +24 -2
- package/dist/components/DoseCalculator.vue.d.ts +1 -1
- package/dist/components/DoseCalculatorVolumeField.vue.d.ts +1 -1
- package/dist/components/EmptyState.vue.d.ts +3 -2
- package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -3
- package/dist/components/FormBuilder.vue.d.ts +17 -74
- package/dist/components/FormulaInput.vue.d.ts +2 -2
- package/dist/components/GeneratedPluginView.vue.d.ts +1 -1
- package/dist/components/GeneratedResultRenderer.vue.d.ts +5 -1
- package/dist/components/{StatusIndicator.vue.d.ts → InstrumentStatusPanels.vue.d.ts} +8 -9
- package/dist/components/JobsStatusTray.vue.d.ts +2 -9
- package/dist/components/LoadingSpinner.vue.d.ts +3 -3
- package/dist/components/MoleculeInput.vue.d.ts +2 -2
- package/dist/components/NumberInput.vue.d.ts +19 -5
- package/dist/components/PlateEditor.vue.d.ts +11 -61
- package/dist/components/PlotlyChart.vue.d.ts +2 -2
- package/dist/components/PluginIcon.vue.d.ts +5 -1
- package/dist/components/PluginWorkspaceView.controls.d.ts +2 -9
- package/dist/components/PluginWorkspaceView.navigation.d.ts +1 -7
- package/dist/components/PluginWorkspaceView.props.d.ts +18 -137
- package/dist/components/PluginWorkspaceView.shell.d.ts +2 -10
- package/dist/components/PluginWorkspaceView.vue.d.ts +14 -84
- package/dist/components/PresenceAvatars.vue.d.ts +31 -0
- package/dist/components/ProgressBar.vue.d.ts +3 -2
- package/dist/components/ProtocolStep.presentation.d.ts +0 -1
- package/dist/components/SampleHierarchyTree.vue.d.ts +3 -3
- package/dist/components/SampleSelector.vue.d.ts +3 -3
- package/dist/components/ScheduleCalendar.vue.d.ts +1 -1
- package/dist/components/ScientificNumber.vue.d.ts +1 -1
- package/dist/components/SecretInput.vue.d.ts +2 -2
- package/dist/components/SegmentedControl.vue.d.ts +2 -2
- package/dist/components/SequenceInput.vue.d.ts +2 -2
- package/dist/components/SettingsModal.vue.d.ts +12 -20
- package/dist/components/SmartGroup.types.d.ts +0 -1
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -1
- package/dist/components/StaleFormBanner.vue.d.ts +20 -0
- package/dist/components/TagsInput.vue.d.ts +4 -3
- package/dist/components/TimeRangeInput.vue.d.ts +2 -2
- package/dist/components/VersionConflictDialog.vue.d.ts +24 -0
- package/dist/components/WellPlate.geometry.d.ts +0 -6
- package/dist/components/WellPlate.rendering.d.ts +0 -2
- package/dist/components/WellPlate.vue.d.ts +7 -52
- package/dist/components/index.d.ts +0 -90
- package/dist/components/{AutoGroupModal.adapter.d.ts → internal/AutoGroupModalInternal.adapter.d.ts} +6 -6
- package/dist/components/{AutoGroupModal.vue.d.ts → internal/AutoGroupModalInternal.vue.d.ts} +6 -6
- package/dist/components/{BaseToggle.vue.d.ts → internal/CheckboxSwitchInternal.vue.d.ts} +2 -2
- package/dist/components/internal/DatePickerDateInternal.vue.d.ts +22 -0
- package/dist/components/{DateTimePicker.vue.d.ts → internal/DatePickerDateTimeInternal.vue.d.ts} +2 -2
- package/dist/components/{TimePicker.vue.d.ts → internal/DatePickerTimeInternal.vue.d.ts} +3 -3
- package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -2
- package/dist/components/internal/FormSchemaInternal.vue.d.ts +95 -0
- package/dist/components/{UnitInput.vue.d.ts → internal/NumberUnitInputInternal.vue.d.ts} +6 -14
- package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +3 -2
- package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +3 -3
- package/dist/components/{MultiSelect.vue.d.ts → internal/SelectMultipleInternal.vue.d.ts} +11 -8
- package/dist/components/{SearchableSelect.vue.d.ts → internal/SelectSearchableInternal.vue.d.ts} +5 -2
- package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +1 -15
- package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +4 -4
- package/dist/{composables → components/internal}/autoGroup/classKey.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/classify.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/columns.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/compose.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/cooccurrence.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/csv-shim.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/fingerprint.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/template.d.ts +1 -1
- package/dist/{composables → components/internal}/autoGroup/tokenLength.d.ts +1 -1
- package/dist/components/internal/generatedJobsApi.d.ts +1 -1
- package/dist/{composables → components/internal}/useAutoGroup.d.ts +9 -18
- package/dist/composables/componentSpecs.d.ts +41 -0
- package/dist/composables/controlComponentBindings.d.ts +6 -0
- package/dist/composables/controlSchemaAdapters.d.ts +28 -2
- package/dist/composables/controlSchemaDoseDesign.d.ts +1 -1
- package/dist/composables/controlSchemaModel.d.ts +1 -1
- package/dist/composables/controlSchemaTypes.d.ts +35 -23
- package/dist/composables/{usePluginClient.d.ts → createClient.d.ts} +20 -49
- package/dist/composables/{useEventStream.d.ts → eventStream.d.ts} +2 -2
- package/dist/composables/experiment-utils.d.ts +1 -6
- package/dist/composables/index.d.ts +6 -59
- package/dist/composables/platformContextHelpers.d.ts +0 -11
- package/dist/composables/pluginEndpointBuilder.d.ts +2 -2
- package/dist/composables/pluginWorkspaceModel.d.ts +14 -97
- package/dist/composables/useApi.d.ts +1 -3
- package/dist/composables/useAppExperiment.d.ts +1 -1
- package/dist/composables/{useAnalysisArtifacts.d.ts → useArtifacts.d.ts} +6 -6
- package/dist/composables/useExperiment.d.ts +30 -0
- package/dist/composables/useFilePicker.d.ts +2 -2
- package/dist/composables/useJobCenter.d.ts +63 -0
- package/dist/composables/{useGeneratedAnalysis.d.ts → useJobsEndpoint.d.ts} +22 -23
- package/dist/composables/useMenuKeyboard.d.ts +1 -1
- package/dist/composables/usePlatform.d.ts +63 -0
- package/dist/composables/usePluginWorkspace.d.ts +6 -11
- package/dist/composables/usePresence.d.ts +41 -0
- package/dist/composables/useRackEditor.d.ts +2 -2
- package/dist/composables/useRealtime.d.ts +71 -0
- package/dist/composables/{useRequestSyncState.d.ts → useRequest.d.ts} +12 -17
- package/dist/composables/useToast.d.ts +7 -5
- package/dist/composables/useVersionedSave.d.ts +76 -0
- package/dist/controlSchemaModel-CP5-_nAj.js +95 -0
- package/dist/controlSchemaModel-CP5-_nAj.js.map +1 -0
- package/dist/data-C2PwI_dn.js +3811 -0
- package/dist/data-C2PwI_dn.js.map +1 -0
- package/dist/data.d.ts +32 -0
- package/dist/data.js +10 -0
- package/dist/deprecatedRootExports.d.ts +191 -0
- package/dist/experiment-43OJtH7R.js +673 -0
- package/dist/experiment-43OJtH7R.js.map +1 -0
- package/dist/experimentStatus-BZmU4czV.js +60 -0
- package/dist/experimentStatus-BZmU4czV.js.map +1 -0
- package/dist/host.d.ts +10 -0
- package/dist/host.js +26 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +1 -12
- package/dist/index.js +65 -277
- package/dist/index.js.map +1 -1
- package/dist/install-DAID6c2-.js +668 -0
- package/dist/install-DAID6c2-.js.map +1 -0
- package/dist/install.d.ts +2 -1
- package/dist/install.js +1 -21
- package/dist/instrument.d.ts +0 -6
- package/dist/lab-DLwRl_Ql.js +7513 -0
- package/dist/lab-DLwRl_Ql.js.map +1 -0
- package/dist/lab.d.ts +42 -0
- package/dist/lab.js +4 -0
- package/dist/permissions.d.ts +0 -4
- package/dist/permissions.js +1 -20
- package/dist/permissions.js.map +1 -1
- package/dist/records-BzTcxekG.js +3070 -0
- package/dist/records-BzTcxekG.js.map +1 -0
- package/dist/runtime-D6gVat6r.js +1495 -0
- package/dist/runtime-D6gVat6r.js.map +1 -0
- package/dist/runtime.d.ts +25 -0
- package/dist/runtime.js +8 -0
- package/dist/shell-5ju97nOS.js +197 -0
- package/dist/shell-5ju97nOS.js.map +1 -0
- package/dist/shell.d.ts +16 -0
- package/dist/shell.js +8 -0
- package/dist/stores/auth.d.ts +13 -35
- package/dist/stores/experiment.d.ts +4 -0
- package/dist/stores/index.js +2 -2
- package/dist/styles.css +12030 -14845
- package/dist/types/analysisArtifactTypes.d.ts +1 -1
- package/dist/types/auth.d.ts +0 -8
- package/dist/types/componentLabTypes.d.ts +98 -34
- package/dist/types/componentWorkflowTypes.d.ts +0 -27
- package/dist/types/components.d.ts +145 -74
- package/dist/types/form-builder.d.ts +4 -0
- package/dist/types/generated/platformContext.d.ts +52 -0
- package/dist/types/generated-ui.d.ts +2 -2
- package/dist/types/index.d.ts +4 -5
- package/dist/types/instrument.d.ts +41 -0
- package/dist/types/platform.d.ts +20 -58
- package/dist/useDebouncedWatch-BPwyl6eS.js +73 -0
- package/dist/useDebouncedWatch-BPwyl6eS.js.map +1 -0
- package/dist/useExpansionSet-CvoNMZJi.js +68 -0
- package/dist/useExpansionSet-CvoNMZJi.js.map +1 -0
- package/dist/useExperimentSamples-CxcnxZ8h.js +366 -0
- package/dist/useExperimentSamples-CxcnxZ8h.js.map +1 -0
- package/dist/useListReorder-CcbEYxX-.js +5462 -0
- package/dist/useListReorder-CcbEYxX-.js.map +1 -0
- package/dist/useRackEditor-BD5NIo5s.js +5916 -0
- package/dist/useRackEditor-BD5NIo5s.js.map +1 -0
- package/dist/useRealtime-PalKue84.js +696 -0
- package/dist/useRealtime-PalKue84.js.map +1 -0
- package/dist/useRequest-D5JDfsgZ.js +76 -0
- package/dist/useRequest-D5JDfsgZ.js.map +1 -0
- package/dist/utils/color.d.ts +0 -5
- package/dist/{composables/useDoseCalculator.d.ts → utils/dose.d.ts} +10 -13
- package/dist/utils/experimentStatus.d.ts +9 -0
- package/dist/{composables/useChemicalFormula.d.ts → utils/formula.d.ts} +3 -6
- package/dist/utils/integrationHost.d.ts +18 -0
- package/dist/utils/plotlyTemplate.d.ts +2 -0
- package/dist/utils/pluginSecrets.d.ts +12 -12
- package/dist/utils/presenceAvatars.d.ts +30 -0
- package/dist/utils/records.d.ts +0 -2
- package/dist/{composables/useTimeUtils.d.ts → utils/time.d.ts} +0 -18
- package/package.json +20 -17
- package/src/__tests__/components/ActionMenu.test.ts +0 -13
- package/src/__tests__/components/AlertBox.test.ts +1 -1
- package/src/__tests__/components/AppSidebar.test.ts +119 -167
- package/src/__tests__/components/AppToastContainer.test.ts +2 -2
- package/src/__tests__/components/AppTopBar.test.ts +181 -176
- package/src/__tests__/components/ArtifactSaveDialog.test.ts +5 -3
- package/src/__tests__/components/ArtifactSelectorModal.test.ts +6 -4
- package/src/__tests__/components/AuditTrail.test.ts +1 -1
- package/src/__tests__/components/AutoGroupModal.adapter.test.ts +1 -1
- package/src/__tests__/components/AutoGroupModal.anatomy.test.ts +2 -2
- package/src/__tests__/components/AutoGroupModal.wiring.test.ts +2 -2
- package/src/__tests__/components/BaseButton.test.ts +51 -0
- package/src/__tests__/components/{BaseToggle.test.ts → BaseCheckbox.switch.test.ts} +8 -6
- package/src/__tests__/components/BaseInput.test.ts +13 -34
- package/src/__tests__/components/BaseModal.test.ts +6 -6
- package/src/__tests__/components/BasePill.test.ts +33 -39
- package/src/__tests__/components/{MultiSelect.test.ts → BaseSelect.multiple.test.ts} +16 -7
- package/src/__tests__/components/{SearchableSelect.test.ts → BaseSelect.searchable.test.ts} +19 -9
- package/src/__tests__/components/BaseSelect.test.ts +10 -0
- package/src/__tests__/components/BaseTabs.test.ts +13 -13
- package/src/__tests__/components/CollapsibleCard.test.ts +1 -1
- package/src/__tests__/components/ComponentBindingRenderer.test.ts +25 -73
- package/src/__tests__/components/ConcentrationInput.test.ts +3 -3
- package/src/__tests__/components/ConfirmDialog.test.ts +23 -0
- package/src/__tests__/components/DataFrame.test.ts +140 -142
- package/src/__tests__/components/DataStates.test.ts +6 -22
- package/src/__tests__/components/{DateTimePicker.test.ts → DatePicker.datetime.test.ts} +9 -7
- package/src/__tests__/components/{TimePicker.test.ts → DatePicker.time.test.ts} +18 -17
- package/src/__tests__/components/DoseCalculator.test.ts +12 -7
- package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +6 -6
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +15 -15
- package/src/__tests__/components/FormBuilder.test.ts +49 -167
- package/src/__tests__/components/FormSchemaInternal.test.ts +91 -0
- package/src/__tests__/components/GeneratedPathInput.test.ts +18 -13
- package/src/__tests__/components/GeneratedPluginView.test.ts +38 -24
- package/src/__tests__/components/GeneratedResultRenderer.test.ts +6 -4
- package/src/__tests__/components/InstrumentStatusPanels.test.ts +79 -0
- package/src/__tests__/components/JobsStatusTray.test.ts +4 -4
- package/src/__tests__/components/NumberInput.test.ts +28 -0
- package/src/__tests__/components/{UnitInput.test.ts → NumberInput.units.test.ts} +6 -6
- package/src/__tests__/components/PlateEditor.test.ts +108 -108
- package/src/__tests__/components/PlateEditorBindingInternal.test.ts +13 -13
- package/src/__tests__/components/PlotlyChart.test.ts +1 -1
- package/src/__tests__/components/PluginIcon.test.ts +9 -4
- package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +16 -29
- package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +28 -34
- package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +4 -19
- package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +1 -6
- package/src/__tests__/components/PluginWorkspaceView.test.ts +176 -155
- package/src/__tests__/components/PresenceAvatars.test.ts +90 -0
- package/src/__tests__/components/ProtocolStep.presentation.test.ts +1 -3
- package/src/__tests__/components/ProtocolStepEditor.test.ts +10 -11
- package/src/__tests__/components/ProtocolStepParameterField.test.ts +8 -7
- package/src/__tests__/components/ResourcePickerListInternal.test.ts +2 -2
- package/src/__tests__/components/RetiredStyles.test.ts +0 -18
- package/src/__tests__/components/SampleSelector.test.ts +17 -17
- package/src/__tests__/components/SecretInput.test.ts +14 -19
- package/src/__tests__/components/SettingsModal.test.ts +76 -84
- package/src/__tests__/components/StaleFormBanner.test.ts +48 -0
- package/src/__tests__/components/ThemeToggle.test.ts +1 -1
- package/src/__tests__/components/WellPlate.decoration.test.ts +10 -8
- package/src/__tests__/components/WellPlate.interaction.test.ts +6 -7
- package/src/__tests__/components/WellPlate.keyboard.test.ts +2 -2
- package/src/__tests__/components/deprecationTags.test.ts +90 -0
- package/src/__tests__/composables/analysisArtifactTarget.test.ts +1 -12
- package/src/__tests__/composables/autoGroup/classKey.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/classify.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/columns.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/compose.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/fieldEdits.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/fingerprint.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/golden.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/groupTree.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/integration.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/template.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/tokenLength.test.ts +1 -1
- package/src/__tests__/composables/autoGroup/tokenize.test.ts +1 -1
- package/src/__tests__/composables/{usePluginClient.test.ts → createClient.test.ts} +84 -222
- package/src/__tests__/composables/{useEventStream.test.ts → eventStream.test.ts} +6 -6
- package/src/__tests__/composables/experiment-utils.test.ts +13 -14
- package/src/__tests__/composables/useApi.test.ts +32 -21
- package/src/__tests__/composables/useAppExperiment.test.ts +19 -2
- package/src/__tests__/composables/{useAnalysisArtifacts.test.ts → useArtifacts.test.ts} +19 -27
- package/src/__tests__/composables/useAutoGroup.test.ts +3 -13
- package/src/__tests__/composables/useControlSchema.test.ts +41 -99
- package/src/__tests__/composables/useExperiment.test.ts +63 -0
- package/src/__tests__/composables/useFileBrowser.test.ts +4 -6
- package/src/__tests__/composables/{useJobsStatusTray.test.ts → useJobCenter.test.ts} +31 -31
- package/src/__tests__/composables/{useGeneratedAnalysis.test.ts → useJobsEndpoint.test.ts} +213 -139
- package/src/__tests__/composables/usePlatform.test.ts +102 -0
- package/src/__tests__/composables/usePresence.test.ts +164 -0
- package/src/__tests__/composables/useRackEditor.test.ts +2 -2
- package/src/__tests__/composables/useRealtime.test.ts +196 -0
- package/src/__tests__/composables/{useRequestSyncState.test.ts → useRequest.test.ts} +32 -47
- package/src/__tests__/composables/useVersionedSave.test.ts +194 -0
- package/src/__tests__/docs/extractDocsComponents.test.ts +36 -0
- package/src/__tests__/docs/extractDocsParsing.test.ts +2 -2
- package/src/__tests__/docs/extractDocsTheme.test.ts +1 -46
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +164 -84
- package/src/__tests__/styles/baseControlsRules.test.ts +1 -1
- package/src/__tests__/styles/darkModeRules.test.ts +0 -6
- package/src/__tests__/{composables/useChemicalFormula.test.ts → utils/formula.test.ts} +3 -5
- package/src/__tests__/utils/permissions.test.ts +1 -36
- package/src/__tests__/utils/plotlyTemplate.test.ts +16 -1
- package/src/__tests__/{composables/useTimeUtils.test.ts → utils/time.test.ts} +2 -9
- package/src/components/ActionMenu.vue +7 -13
- package/src/components/AlertBox.story.vue +25 -25
- package/src/components/AlertBox.vue +8 -8
- package/src/components/AppLayout.story.vue +33 -44
- package/src/components/AppLayout.vue +1 -1
- package/src/components/AppSidebar.story.vue +40 -73
- package/src/components/AppSidebar.vue +66 -147
- package/src/components/AppToastContainer.story.vue +1 -1
- package/src/components/AppTopBar.story.vue +51 -100
- package/src/components/AppTopBar.vue +74 -198
- package/src/components/ArtifactSaveDialog.story.vue +9 -9
- package/src/components/ArtifactSaveDialog.vue +23 -26
- package/src/components/ArtifactSelectorModal.story.vue +4 -4
- package/src/components/ArtifactSelectorModal.vue +10 -10
- package/src/components/AuditTrail.story.vue +4 -4
- package/src/components/AuditTrail.vue +3 -3
- package/src/components/Avatar.story.vue +2 -3
- package/src/components/Avatar.vue +1 -2
- package/src/components/BaseButton.story.vue +25 -0
- package/src/components/BaseButton.vue +39 -10
- package/src/components/BaseCheckbox.story.vue +2 -2
- package/src/components/{BaseToggle.story.vue → BaseCheckbox.switch.story.vue} +22 -19
- package/src/components/BaseCheckbox.vue +39 -7
- package/src/components/BaseInput.story.vue +3 -15
- package/src/components/{BaseTextarea.story.vue → BaseInput.textarea.story.vue} +14 -10
- package/src/components/BaseInput.vue +53 -26
- package/src/components/BaseModal.story.vue +11 -11
- package/src/components/BaseModal.vue +8 -8
- package/src/components/BasePill.story.vue +48 -28
- package/src/components/BasePill.vue +22 -11
- package/src/components/BaseRadioGroup.story.vue +4 -4
- package/src/components/BaseRadioGroup.vue +3 -3
- package/src/components/{MultiSelect.story.vue → BaseSelect.multiple.story.vue} +20 -14
- package/src/components/{SearchableSelect.story.vue → BaseSelect.searchable.story.vue} +4 -4
- package/src/components/BaseSelect.story.vue +2 -2
- package/src/components/BaseSelect.vue +117 -22
- package/src/components/BaseTabs.story.vue +20 -20
- package/src/components/BaseTabs.vue +17 -9
- package/src/components/BatchProgressList.vue +3 -3
- package/src/components/ChartContainer.story.vue +8 -13
- package/src/components/ChartContainer.vue +3 -3
- package/src/components/ChemicalFormula.vue +1 -2
- package/src/components/CollapsibleCard.vue +5 -4
- package/src/components/ComponentBindingRenderer.story.vue +0 -29
- package/src/components/ComponentBindingRenderer.vue +15 -39
- package/src/components/ConcentrationInput.story.vue +2 -2
- package/src/components/ConcentrationInput.vue +9 -9
- package/src/components/ConfirmDialog.story.vue +21 -21
- package/src/components/ConfirmDialog.vue +15 -14
- package/src/components/DataFrame.story.vue +28 -40
- package/src/components/DataFrame.vue +112 -128
- package/src/components/{DateTimePicker.story.vue → DatePicker.datetime.story.vue} +19 -14
- package/src/components/DatePicker.story.vue +2 -2
- package/src/components/{TimePicker.story.vue → DatePicker.time.story.vue} +15 -12
- package/src/components/DatePicker.vue +82 -220
- package/src/components/DoseCalculator.vue +13 -19
- package/src/components/DoseCalculatorVolumeField.vue +6 -6
- package/src/components/EmptyState.story.vue +17 -17
- package/src/components/EmptyState.vue +5 -4
- package/src/components/ExperimentPopover.story.vue +1 -1
- package/src/components/ExperimentPopover.vue +4 -4
- package/src/components/ExperimentSelectorModal.story.vue +5 -5
- package/src/components/ExperimentSelectorModal.vue +11 -13
- package/src/components/FilePicker.vue +1 -1
- package/src/components/FormBuilder.story.vue +9 -4
- package/src/components/FormBuilder.vue +46 -253
- package/src/components/FormField.story.vue +1 -2
- package/src/components/FormulaInput.story.vue +2 -2
- package/src/components/FormulaInput.vue +5 -6
- package/src/components/GeneratedPathInput.vue +8 -9
- package/src/components/GeneratedPluginView.story.vue +1 -1
- package/src/components/GeneratedPluginView.vue +23 -22
- package/src/components/GeneratedResultRenderer.vue +16 -17
- package/src/components/InstrumentStatusPanels.story.vue +64 -0
- package/src/components/InstrumentStatusPanels.vue +133 -0
- package/src/components/JobsStatusTray.story.vue +2 -2
- package/src/components/JobsStatusTray.vue +4 -19
- package/src/components/LoadingSpinner.story.vue +11 -11
- package/src/components/LoadingSpinner.vue +6 -4
- package/src/components/MoleculeInput.story.vue +2 -2
- package/src/components/MoleculeInput.vue +3 -3
- package/src/components/NumberInput.story.vue +55 -15
- package/src/components/NumberInput.vue +80 -18
- package/src/components/PlateEditor.story.vue +51 -43
- package/src/components/PlateEditor.vue +97 -128
- package/src/components/PlotlyChart.story.vue +1 -1
- package/src/components/PlotlyChart.vue +6 -4
- package/src/components/PluginIcon.story.vue +9 -6
- package/src/components/PluginIcon.vue +7 -2
- package/src/components/PluginWorkspaceView.controls.ts +9 -29
- package/src/components/PluginWorkspaceView.navigation.ts +2 -23
- package/src/components/PluginWorkspaceView.props.ts +17 -151
- package/src/components/PluginWorkspaceView.shell.ts +13 -24
- package/src/components/PluginWorkspaceView.story.vue +64 -62
- package/src/components/PluginWorkspaceView.vue +21 -78
- package/src/components/PresenceAvatars.story.vue +75 -0
- package/src/components/PresenceAvatars.vue +114 -0
- package/src/components/ProgressBar.story.vue +7 -7
- package/src/components/ProgressBar.vue +4 -3
- package/src/components/ProtocolStep.presentation.ts +0 -11
- package/src/components/ProtocolStepEditor.vue +6 -5
- package/src/components/ProtocolStepParameterField.vue +15 -12
- package/src/components/SampleSelector.colors.ts +1 -1
- package/src/components/SampleSelector.vue +6 -6
- package/src/components/ScheduleCalendar.vue +4 -4
- package/src/components/SecretInput.story.vue +1 -1
- package/src/components/SecretInput.vue +16 -25
- package/src/components/SegmentedControl.story.vue +7 -7
- package/src/components/SegmentedControl.vue +5 -3
- package/src/components/SequenceInput.story.vue +2 -2
- package/src/components/SequenceInput.vue +3 -3
- package/src/components/SettingsModal.story.vue +13 -14
- package/src/components/SettingsModal.vue +29 -47
- package/src/components/SmartGroup.types.ts +4 -6
- package/src/components/SmartGroupFieldRecipe.vue +7 -5
- package/src/components/StaleFormBanner.story.vue +90 -0
- package/src/components/StaleFormBanner.vue +83 -0
- package/src/components/TagsInput.story.vue +7 -7
- package/src/components/TagsInput.vue +7 -6
- package/src/components/ThemeToggle.vue +5 -30
- package/src/components/TimeRangeInput.story.vue +1 -1
- package/src/components/TimeRangeInput.vue +10 -8
- package/src/components/VersionConflictDialog.story.vue +60 -0
- package/src/components/VersionConflictDialog.vue +79 -0
- package/src/components/WellPlate.geometry.ts +0 -38
- package/src/components/WellPlate.rendering.ts +0 -13
- package/src/components/WellPlate.story.vue +61 -50
- package/src/components/WellPlate.vue +61 -87
- package/src/components/index.ts +3 -105
- package/src/components/{AutoGroupModal.adapter.ts → internal/AutoGroupModalInternal.adapter.ts} +8 -8
- package/src/components/{AutoGroupModal.vue → internal/AutoGroupModalInternal.vue} +23 -23
- package/src/components/{BaseToggle.vue → internal/CheckboxSwitchInternal.vue} +8 -8
- package/src/components/internal/DataStateInternal.vue +1 -1
- package/src/components/internal/DatePickerDateInternal.vue +243 -0
- package/src/components/{DateTimePicker.vue → internal/DatePickerDateTimeInternal.vue} +9 -9
- package/src/components/{TimePicker.vue → internal/DatePickerTimeInternal.vue} +7 -7
- package/src/components/internal/FilePickerListInternal.vue +8 -14
- package/src/components/{FormActions.vue → internal/FormActionsInternal.vue} +2 -2
- package/src/components/internal/FormFieldRendererInternal.vue +1 -1
- package/src/components/internal/FormSchemaInternal.vue +253 -0
- package/src/components/{UnitInput.vue → internal/NumberUnitInputInternal.vue} +28 -28
- package/src/components/internal/PlateEditorBindingInternal.vue +8 -7
- package/src/components/internal/ResourcePickerListInternal.vue +4 -4
- package/src/components/{MultiSelect.vue → internal/SelectMultipleInternal.vue} +21 -15
- package/src/components/{SearchableSelect.vue → internal/SelectSearchableInternal.vue} +24 -8
- package/src/components/internal/WellEditPopupInternal.vue +4 -9
- package/src/components/internal/WorkspaceShellInternal.vue +3 -36
- package/src/components/internal/WorkspaceSidebarInternal.vue +4 -25
- package/src/{composables → components/internal}/autoGroup/classKey.ts +1 -1
- package/src/{composables → components/internal}/autoGroup/classify.ts +1 -1
- package/src/{composables → components/internal}/autoGroup/columns.ts +1 -1
- package/src/{composables → components/internal}/autoGroup/compose.ts +3 -3
- package/src/{composables → components/internal}/autoGroup/cooccurrence.ts +1 -1
- package/src/{composables → components/internal}/autoGroup/csv-shim.ts +1 -1
- package/src/{composables → components/internal}/autoGroup/fingerprint.ts +1 -1
- package/src/{composables → components/internal}/autoGroup/index.ts +1 -2
- package/src/{composables → components/internal}/autoGroup/template.ts +1 -1
- package/src/{composables → components/internal}/autoGroup/tokenLength.ts +1 -1
- package/src/components/internal/generatedJobsApi.ts +1 -1
- package/src/{composables → components/internal}/useAutoGroup.ts +3 -57
- package/src/composables/componentSpecs.ts +62 -0
- package/src/composables/controlComponentBindings.ts +7 -0
- package/src/composables/controlSchemaAdapters.ts +45 -7
- package/src/composables/controlSchemaDoseDesign.ts +16 -5
- package/src/composables/controlSchemaModel.ts +1 -1
- package/src/composables/controlSchemaTypes.ts +31 -22
- package/src/composables/{usePluginClient.ts → createClient.ts} +52 -190
- package/src/composables/{useEventStream.ts → eventStream.ts} +3 -3
- package/src/composables/experiment-utils.ts +1 -39
- package/src/composables/formBuilderRegistry.ts +6 -12
- package/src/composables/index.ts +16 -480
- package/src/composables/platformContextHelpers.ts +0 -57
- package/src/composables/pluginEndpointBuilder.ts +8 -10
- package/src/composables/pluginWorkspaceModel.ts +14 -105
- package/src/composables/useApi.ts +18 -30
- package/src/composables/useAppExperiment.ts +6 -5
- package/src/composables/{useAnalysisArtifacts.ts → useArtifacts.ts} +18 -19
- package/src/composables/useControlSchema.ts +5 -9
- package/src/composables/useControlWorkspace.ts +4 -7
- package/src/composables/useExperiment.ts +49 -0
- package/src/composables/useExperimentData.ts +4 -4
- package/src/composables/useExperimentSelector.ts +5 -5
- package/src/composables/useFileBrowser.ts +5 -13
- package/src/composables/useFilePicker.ts +2 -2
- package/src/composables/useFormBuilder.ts +3 -4
- package/src/composables/useJobCenter.ts +324 -0
- package/src/composables/{useGeneratedAnalysis.ts → useJobsEndpoint.ts} +53 -67
- package/src/composables/useMenuKeyboard.ts +1 -1
- package/src/composables/usePlatform.ts +95 -0
- package/src/composables/usePlatformFilePickerAdapter.ts +2 -1
- package/src/composables/usePluginWorkspace.ts +62 -107
- package/src/composables/usePresence.ts +110 -0
- package/src/composables/useRackEditor.ts +3 -3
- package/src/composables/useRealtime.ts +194 -0
- package/src/composables/{useRequestSyncState.ts → useRequest.ts} +25 -48
- package/src/composables/useScheduleCalendarLayout.ts +1 -1
- package/src/composables/useToast.ts +14 -11
- package/src/composables/useVersionedSave.ts +165 -0
- package/src/data.ts +130 -0
- package/src/deprecatedRootExports.ts +226 -0
- package/src/generated/schema.ts +1 -0
- package/src/host.ts +27 -0
- package/src/index.ts +2 -71
- package/src/install.ts +15 -2
- package/src/instrument.ts +1 -6
- package/src/lab.ts +128 -0
- package/src/permissions.ts +0 -27
- package/src/runtime.ts +145 -0
- package/src/shell.ts +103 -0
- package/src/stores/auth.ts +26 -162
- package/src/stores/experiment.ts +27 -1
- package/src/styles/components/action-menu.css +0 -5
- package/src/styles/components/alert-box.css +18 -0
- package/src/styles/components/app-top-bar.css +7 -48
- package/src/styles/components/button.css +12 -0
- package/src/styles/components/checkbox.css +1 -1
- package/src/styles/components/collapsible-card.css +1 -1
- package/src/styles/components/confirm-dialog.css +18 -2
- package/src/styles/components/empty-state.css +4 -2
- package/src/styles/components/file-picker.css +1 -1
- package/src/styles/components/icon-button.css +1 -1
- package/src/styles/components/loading-spinner.css +9 -12
- package/src/styles/components/multi-select.css +6 -1
- package/src/styles/components/pill.css +40 -35
- package/src/styles/components/plugin-icon.css +9 -0
- package/src/styles/components/presence-avatars.css +194 -0
- package/src/styles/components/progress-bar.css +2 -0
- package/src/styles/components/searchable-select.css +3 -0
- package/src/styles/components/smart-group.css +1 -6
- package/src/styles/components/textarea.css +1 -1
- package/src/styles/components/toggle.css +2 -2
- package/src/styles/components/version-conflict.css +122 -0
- package/src/styles/components/well-plate.css +0 -7
- package/src/styles/index.css +2 -11
- package/src/styles/variables.css +1 -527
- package/src/types/analysisArtifactTypes.ts +1 -1
- package/src/types/auth.ts +0 -10
- package/src/types/componentLabTypes.ts +103 -53
- package/src/types/componentWorkflowTypes.ts +2 -33
- package/src/types/components.ts +148 -114
- package/src/types/form-builder.ts +4 -0
- package/src/types/generated/platformContext.ts +59 -0
- package/src/types/generated-ui.ts +2 -2
- package/src/types/index.ts +15 -53
- package/src/types/instrument.ts +27 -0
- package/src/types/platform.ts +25 -89
- package/src/utils/color.ts +1 -12
- package/src/utils/dose.ts +335 -0
- package/src/utils/experimentStatus.ts +43 -0
- package/src/utils/formula.ts +292 -0
- package/src/utils/integrationHost.ts +27 -0
- package/src/utils/plotlyTemplate.ts +6 -0
- package/src/utils/pluginSecrets.ts +23 -23
- package/src/utils/presenceAvatars.ts +53 -0
- package/src/utils/records.ts +0 -5
- package/src/{composables/useTimeUtils.ts → utils/time.ts} +0 -21
- package/dist/ResourcePickerListInternal-CFAw4vTZ.js +0 -605
- package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +0 -1
- package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +0 -1
- package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +0 -1
- package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +0 -1
- package/dist/__tests__/composables/useChemicalFormula.test.d.ts +0 -1
- package/dist/__tests__/composables/useEventStream.test.d.ts +0 -1
- package/dist/__tests__/composables/useExperimentSave.test.d.ts +0 -1
- package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +0 -1
- package/dist/__tests__/composables/useGroupAssignment.test.d.ts +0 -1
- package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +0 -1
- package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +0 -1
- package/dist/__tests__/composables/usePlatformContext.test.d.ts +0 -1
- package/dist/__tests__/composables/usePluginClient.test.d.ts +0 -1
- package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +0 -1
- package/dist/__tests__/composables/useRequestSyncState.test.d.ts +0 -1
- package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +0 -1
- package/dist/__tests__/composables/useTemplateCollection.test.d.ts +0 -1
- package/dist/__tests__/composables/useTimeUtils.test.d.ts +0 -1
- package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +0 -1
- package/dist/__tests__/templates/templates.test.d.ts +0 -1
- package/dist/__tests__/templates/templatesDeprecation.test.d.ts +0 -1
- package/dist/__tests__/utils/lcms.test.d.ts +0 -1
- package/dist/__tests__/utils/rack.test.d.ts +0 -1
- package/dist/components/AppAvatarMenu.vue.d.ts +0 -47
- package/dist/components/AppTopBar.navigation.d.ts +0 -10
- package/dist/components/BaseTextarea.vue.d.ts +0 -31
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +0 -112
- package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +0 -86
- package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +0 -80
- package/dist/components/BioTemplateRenderer.vue.d.ts +0 -30
- package/dist/components/ControlWorkspaceView.vue.d.ts +0 -138
- package/dist/components/DoseDesignWorkspaceView.vue.d.ts +0 -140
- package/dist/components/ExperimentDataViewer.vue.d.ts +0 -54
- package/dist/components/ExperimentTimeline.vue.d.ts +0 -70
- package/dist/components/FitPanel.vue.d.ts +0 -56
- package/dist/components/GroupAssigner.vue.d.ts +0 -26
- package/dist/components/IconButton.vue.d.ts +0 -30
- package/dist/components/MobileSupportGate.vue.d.ts +0 -32
- package/dist/components/ReagentEditor.vue.d.ts +0 -31
- package/dist/components/ReagentList.presentation.d.ts +0 -17
- package/dist/components/ReagentList.vue.d.ts +0 -58
- package/dist/components/SampleLegend.vue.d.ts +0 -33
- package/dist/components/SmartGroupModal.vue.d.ts +0 -29
- package/dist/components/index.js +0 -5
- package/dist/components-BOA5e7kb.js +0 -23137
- package/dist/components-BOA5e7kb.js.map +0 -1
- package/dist/composables/flattenWorkspaceBindings.d.ts +0 -61
- package/dist/composables/index.js +0 -7
- package/dist/composables/useBioTemplateComponents.d.ts +0 -34
- package/dist/composables/useBioTemplateControls.d.ts +0 -10
- package/dist/composables/useBioTemplatePackWorkspace.d.ts +0 -56
- package/dist/composables/useBioTemplatePresetWorkspace.d.ts +0 -79
- package/dist/composables/useBioTemplateWorkspace.d.ts +0 -39
- package/dist/composables/useExperimentSave.d.ts +0 -69
- package/dist/composables/useGroupAssignment.d.ts +0 -35
- package/dist/composables/useJobsStatusTray.d.ts +0 -87
- package/dist/composables/useMobileSupportGate.d.ts +0 -14
- package/dist/composables/usePlatformContext.d.ts +0 -218
- package/dist/composables/usePresenceHeartbeat.d.ts +0 -49
- package/dist/composables/useRuntimeAlignment.d.ts +0 -44
- package/dist/composables/useTemplateCollection.d.ts +0 -62
- package/dist/composables/workspaceRecipes.d.ts +0 -189
- package/dist/composables-izSQH8Ky.js +0 -591
- package/dist/composables-izSQH8Ky.js.map +0 -1
- package/dist/experiment-D49y_Kro.js +0 -459
- package/dist/experiment-D49y_Kro.js.map +0 -1
- package/dist/experiment-utils-DTANyVKV.js.map +0 -1
- package/dist/install.js.map +0 -1
- package/dist/lcms.d.ts +0 -38
- package/dist/settings-BG6v13Zq.js +0 -341
- package/dist/settings-BG6v13Zq.js.map +0 -1
- package/dist/tailwind.preset.d.ts +0 -63
- package/dist/tailwind.preset.js +0 -71
- package/dist/tailwind.preset.js.map +0 -1
- package/dist/templates/adapters.d.ts +0 -19
- package/dist/templates/assayLookups.d.ts +0 -3
- package/dist/templates/assayMatrixAdapters.d.ts +0 -13
- package/dist/templates/assayMatrixBuilder.d.ts +0 -3
- package/dist/templates/assayNormalizers.d.ts +0 -4
- package/dist/templates/builderIdUtils.d.ts +0 -4
- package/dist/templates/builderPresetControls.d.ts +0 -11
- package/dist/templates/builderReadUtils.d.ts +0 -8
- package/dist/templates/builders.d.ts +0 -26
- package/dist/templates/calibrationCurveAdapters.d.ts +0 -7
- package/dist/templates/calibrationCurveBuilder.d.ts +0 -3
- package/dist/templates/calibrationNormalizers.d.ts +0 -5
- package/dist/templates/catalog.d.ts +0 -192
- package/dist/templates/componentBindingCatalog.d.ts +0 -25
- package/dist/templates/componentBindingHelpers.d.ts +0 -17
- package/dist/templates/componentBindings.d.ts +0 -97
- package/dist/templates/componentDoseResponseProps.d.ts +0 -3
- package/dist/templates/componentGenericProps.d.ts +0 -8
- package/dist/templates/componentPlateHelpers.d.ts +0 -11
- package/dist/templates/componentPlateMapProps.d.ts +0 -3
- package/dist/templates/componentPropsFactory.d.ts +0 -3
- package/dist/templates/componentQpcrPlateProps.d.ts +0 -3
- package/dist/templates/componentTargetResolvers.d.ts +0 -5
- package/dist/templates/componentTemplateProps.d.ts +0 -3
- package/dist/templates/controlSchemaClone.d.ts +0 -4
- package/dist/templates/controlSchemaConstants.d.ts +0 -10
- package/dist/templates/controlSchemaMerge.d.ts +0 -3
- package/dist/templates/controlSchemaTargets.d.ts +0 -17
- package/dist/templates/controlSchemaTypes.d.ts +0 -4
- package/dist/templates/controlSchemas.d.ts +0 -34
- package/dist/templates/defaultBioTemplateBuilder.d.ts +0 -3
- package/dist/templates/doseResponseAdapters.d.ts +0 -6
- package/dist/templates/doseResponseBuilder.d.ts +0 -3
- package/dist/templates/elisaAssayCollectionBuilder.d.ts +0 -3
- package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +0 -3
- package/dist/templates/flowCytometryPanelBuilder.d.ts +0 -3
- package/dist/templates/flowNormalizers.d.ts +0 -8
- package/dist/templates/flowPanelAdapters.d.ts +0 -7
- package/dist/templates/index.d.ts +0 -15
- package/dist/templates/index.js +0 -2
- package/dist/templates/instrumentRunAdapterHelpers.d.ts +0 -8
- package/dist/templates/instrumentRunAdapters.d.ts +0 -19
- package/dist/templates/instrumentRunBuilder.d.ts +0 -3
- package/dist/templates/lcmsBatchCollectionBuilder.d.ts +0 -3
- package/dist/templates/lookup.d.ts +0 -4
- package/dist/templates/packs.d.ts +0 -21
- package/dist/templates/plateMapAdapters.d.ts +0 -5
- package/dist/templates/plateMapBuilder.d.ts +0 -3
- package/dist/templates/presetControlSchemas.d.ts +0 -534
- package/dist/templates/presets.d.ts +0 -106
- package/dist/templates/protocolAdapters.d.ts +0 -9
- package/dist/templates/protocolNormalizers.d.ts +0 -6
- package/dist/templates/protocolStepsBuilder.d.ts +0 -3
- package/dist/templates/qpcrAdapters.d.ts +0 -9
- package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +0 -3
- package/dist/templates/qpcrPlateBuilder.d.ts +0 -3
- package/dist/templates/reagentAdapters.d.ts +0 -9
- package/dist/templates/reagentListBuilder.d.ts +0 -3
- package/dist/templates/runNormalizers.d.ts +0 -10
- package/dist/templates/sampleNormalizers.d.ts +0 -4
- package/dist/templates/samplePrepAdapters.d.ts +0 -7
- package/dist/templates/samplePrepBuilder.d.ts +0 -3
- package/dist/templates/sampleSheetAdapters.d.ts +0 -9
- package/dist/templates/sampleSheetBuilder.d.ts +0 -3
- package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +0 -3
- package/dist/templates/targetedMetabolomicsHelpers.d.ts +0 -5
- package/dist/templates/templateAdapterTypes.d.ts +0 -48
- package/dist/templates/templateControlSchemas.d.ts +0 -400
- package/dist/templates/templateCreateOptions.d.ts +0 -165
- package/dist/templates/templateEnvelopes.d.ts +0 -17
- package/dist/templates/templatePackCollectionBuilder.d.ts +0 -3
- package/dist/templates/templatePresetCollectionBuilder.d.ts +0 -20
- package/dist/templates/templateQpcrTypes.d.ts +0 -42
- package/dist/templates/templateValidators.d.ts +0 -25
- package/dist/templates/timeCourseAdapters.d.ts +0 -9
- package/dist/templates/timeCourseBuilder.d.ts +0 -3
- package/dist/templates/types.d.ts +0 -304
- package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +0 -3
- package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +0 -3
- package/dist/templates-B2DB0MCM.js +0 -12304
- package/dist/templates-B2DB0MCM.js.map +0 -1
- package/dist/utils/rack.d.ts +0 -63
- package/dist/validation-C_eH_vIg.js +0 -7999
- package/dist/validation-C_eH_vIg.js.map +0 -1
- package/src/__tests__/components/AppAvatarMenu.test.ts +0 -186
- package/src/__tests__/components/AppTopBar.navigation.test.ts +0 -68
- package/src/__tests__/components/AppTopBarPresence.test.ts +0 -47
- package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +0 -159
- package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +0 -192
- package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +0 -307
- package/src/__tests__/components/BioTemplateRenderer.test.ts +0 -96
- package/src/__tests__/components/ControlWorkspaceView.test.ts +0 -1100
- package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +0 -183
- package/src/__tests__/components/ExperimentTimeline.test.ts +0 -108
- package/src/__tests__/components/FitPanel.test.ts +0 -96
- package/src/__tests__/components/GroupAssigner.test.ts +0 -101
- package/src/__tests__/components/MobileSupportGate.test.ts +0 -120
- package/src/__tests__/components/ReagentList.presentation.test.ts +0 -73
- package/src/__tests__/components/ReagentList.test.ts +0 -167
- package/src/__tests__/components/SampleLegend.test.ts +0 -18
- package/src/__tests__/components/SmartGroupModal.test.ts +0 -69
- package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +0 -58
- package/src/__tests__/components/iconButtonIconSizing.test.ts +0 -18
- package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +0 -125
- package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +0 -199
- package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +0 -104
- package/src/__tests__/composables/useExperimentSave.test.ts +0 -542
- package/src/__tests__/composables/useGroupAssignment.test.ts +0 -73
- package/src/__tests__/composables/useMobileSupportGate.test.ts +0 -74
- package/src/__tests__/composables/usePlatformContext.test.ts +0 -148
- package/src/__tests__/composables/usePresenceHeartbeat.test.ts +0 -164
- package/src/__tests__/composables/useRuntimeAlignment.test.ts +0 -145
- package/src/__tests__/composables/useTemplateCollection.test.ts +0 -147
- package/src/__tests__/docs/extractDocsTemplates.test.ts +0 -53
- package/src/__tests__/fixtures/templates/dose-response.json +0 -81
- package/src/__tests__/fixtures/templates/plate-map.json +0 -54
- package/src/__tests__/fixtures/templates/qpcr-plate.json +0 -96
- package/src/__tests__/fixtures/templates/sample-sheet.json +0 -71
- package/src/__tests__/templates/templates.test.ts +0 -1235
- package/src/__tests__/templates/templatesDeprecation.test.ts +0 -78
- package/src/__tests__/utils/lcms.test.ts +0 -73
- package/src/__tests__/utils/rack.test.ts +0 -120
- package/src/components/AppAvatarMenu.story.vue +0 -155
- package/src/components/AppAvatarMenu.vue +0 -154
- package/src/components/AppTopBar.navigation.ts +0 -60
- package/src/components/AutoGroupModal.story.vue +0 -458
- package/src/components/BaseTextarea.vue +0 -58
- package/src/components/BioTemplateExperimentWorkspaceView.story.vue +0 -123
- package/src/components/BioTemplateExperimentWorkspaceView.vue +0 -339
- package/src/components/BioTemplatePackWorkspaceView.story.vue +0 -107
- package/src/components/BioTemplatePackWorkspaceView.vue +0 -180
- package/src/components/BioTemplatePresetWorkspaceView.story.vue +0 -163
- package/src/components/BioTemplatePresetWorkspaceView.vue +0 -403
- package/src/components/BioTemplateRenderer.story.vue +0 -57
- package/src/components/BioTemplateRenderer.vue +0 -64
- package/src/components/ControlWorkspaceView.story.vue +0 -347
- package/src/components/ControlWorkspaceView.vue +0 -370
- package/src/components/DoseDesignWorkspaceView.story.vue +0 -77
- package/src/components/DoseDesignWorkspaceView.vue +0 -243
- package/src/components/ExperimentDataViewer.story.vue +0 -177
- package/src/components/ExperimentDataViewer.vue +0 -313
- package/src/components/ExperimentTimeline.story.vue +0 -208
- package/src/components/ExperimentTimeline.vue +0 -383
- package/src/components/FitPanel.story.vue +0 -191
- package/src/components/FitPanel.vue +0 -168
- package/src/components/FormActions.story.vue +0 -96
- package/src/components/GroupAssigner.story.vue +0 -83
- package/src/components/GroupAssigner.vue +0 -319
- package/src/components/IconButton.story.vue +0 -140
- package/src/components/IconButton.vue +0 -69
- package/src/components/MobileSupportGate.story.vue +0 -52
- package/src/components/MobileSupportGate.vue +0 -111
- package/src/components/ReagentEditor.story.vue +0 -153
- package/src/components/ReagentEditor.vue +0 -414
- package/src/components/ReagentList.presentation.ts +0 -106
- package/src/components/ReagentList.story.vue +0 -155
- package/src/components/ReagentList.vue +0 -438
- package/src/components/SampleLegend.story.vue +0 -91
- package/src/components/SampleLegend.vue +0 -121
- package/src/components/SmartGroupModal.story.vue +0 -61
- package/src/components/SmartGroupModal.vue +0 -61
- package/src/components/StatusIndicator.story.vue +0 -99
- package/src/components/StatusIndicator.vue +0 -36
- package/src/components/UnitInput.story.vue +0 -194
- package/src/composables/flattenWorkspaceBindings.ts +0 -104
- package/src/composables/useBioTemplateComponents.ts +0 -117
- package/src/composables/useBioTemplateControls.ts +0 -45
- package/src/composables/useBioTemplatePackWorkspace.ts +0 -201
- package/src/composables/useBioTemplatePresetWorkspace.ts +0 -329
- package/src/composables/useBioTemplateWorkspace.ts +0 -120
- package/src/composables/useChemicalFormula.ts +0 -301
- package/src/composables/useDoseCalculator.ts +0 -370
- package/src/composables/useExperimentSave.ts +0 -348
- package/src/composables/useGroupAssignment.ts +0 -152
- package/src/composables/useJobsStatusTray.ts +0 -493
- package/src/composables/useMobileSupportGate.ts +0 -80
- package/src/composables/usePlatformContext.ts +0 -299
- package/src/composables/usePresenceHeartbeat.ts +0 -201
- package/src/composables/useRuntimeAlignment.ts +0 -184
- package/src/composables/useTemplateCollection.ts +0 -233
- package/src/composables/workspaceRecipes.ts +0 -268
- package/src/lcms.ts +0 -119
- package/src/styles/components/app-avatar-menu.css +0 -121
- package/src/styles/components/experiment-data-viewer.css +0 -138
- package/src/styles/components/experiment-timeline.css +0 -572
- package/src/styles/components/fit-panel.css +0 -153
- package/src/styles/components/group-assigner.css +0 -198
- package/src/styles/components/mobile-support-gate.css +0 -117
- package/src/styles/components/reagent-editor.css +0 -501
- package/src/styles/components/reagent-list.css +0 -408
- package/src/styles/components/sample-legend.css +0 -212
- package/src/styles/components/status-indicator.css +0 -66
- package/src/styles/components/theme-toggle.css +0 -6
- package/src/tailwind.preset.ts +0 -66
- package/src/templates/adapters.ts +0 -141
- package/src/templates/assayLookups.ts +0 -33
- package/src/templates/assayMatrixAdapters.ts +0 -85
- package/src/templates/assayMatrixBuilder.ts +0 -60
- package/src/templates/assayNormalizers.ts +0 -34
- package/src/templates/builderIdUtils.ts +0 -20
- package/src/templates/builderPresetControls.ts +0 -166
- package/src/templates/builderReadUtils.ts +0 -55
- package/src/templates/builders.ts +0 -122
- package/src/templates/calibrationCurveAdapters.ts +0 -62
- package/src/templates/calibrationCurveBuilder.ts +0 -100
- package/src/templates/calibrationNormalizers.ts +0 -60
- package/src/templates/catalog.ts +0 -249
- package/src/templates/componentBindingCatalog.ts +0 -90
- package/src/templates/componentBindingHelpers.ts +0 -93
- package/src/templates/componentBindings.ts +0 -279
- package/src/templates/componentDoseResponseProps.ts +0 -41
- package/src/templates/componentGenericProps.ts +0 -77
- package/src/templates/componentPlateHelpers.ts +0 -52
- package/src/templates/componentPlateMapProps.ts +0 -34
- package/src/templates/componentPropsFactory.ts +0 -21
- package/src/templates/componentQpcrPlateProps.ts +0 -27
- package/src/templates/componentTargetResolvers.ts +0 -67
- package/src/templates/componentTemplateProps.ts +0 -78
- package/src/templates/controlSchemaClone.ts +0 -32
- package/src/templates/controlSchemaConstants.ts +0 -11
- package/src/templates/controlSchemaMerge.ts +0 -40
- package/src/templates/controlSchemaTargets.ts +0 -85
- package/src/templates/controlSchemaTypes.ts +0 -20
- package/src/templates/controlSchemas.ts +0 -113
- package/src/templates/defaultBioTemplateBuilder.ts +0 -125
- package/src/templates/doseResponseAdapters.ts +0 -36
- package/src/templates/doseResponseBuilder.ts +0 -45
- package/src/templates/elisaAssayCollectionBuilder.ts +0 -63
- package/src/templates/flowCytometryAssayCollectionBuilder.ts +0 -42
- package/src/templates/flowCytometryPanelBuilder.ts +0 -54
- package/src/templates/flowNormalizers.ts +0 -58
- package/src/templates/flowPanelAdapters.ts +0 -61
- package/src/templates/index.ts +0 -330
- package/src/templates/instrumentRunAdapterHelpers.ts +0 -94
- package/src/templates/instrumentRunAdapters.ts +0 -174
- package/src/templates/instrumentRunBuilder.ts +0 -98
- package/src/templates/lcmsBatchCollectionBuilder.ts +0 -39
- package/src/templates/lookup.ts +0 -18
- package/src/templates/packs.ts +0 -166
- package/src/templates/plateMapAdapters.ts +0 -38
- package/src/templates/plateMapBuilder.ts +0 -44
- package/src/templates/presetControlSchemas.ts +0 -258
- package/src/templates/presets.ts +0 -183
- package/src/templates/protocolAdapters.ts +0 -73
- package/src/templates/protocolNormalizers.ts +0 -37
- package/src/templates/protocolStepsBuilder.ts +0 -37
- package/src/templates/qpcrAdapters.ts +0 -108
- package/src/templates/qpcrExpressionCollectionBuilder.ts +0 -34
- package/src/templates/qpcrPlateBuilder.ts +0 -97
- package/src/templates/reagentAdapters.ts +0 -81
- package/src/templates/reagentListBuilder.ts +0 -31
- package/src/templates/runNormalizers.ts +0 -63
- package/src/templates/sampleNormalizers.ts +0 -58
- package/src/templates/samplePrepAdapters.ts +0 -66
- package/src/templates/samplePrepBuilder.ts +0 -52
- package/src/templates/sampleSheetAdapters.ts +0 -79
- package/src/templates/sampleSheetBuilder.ts +0 -24
- package/src/templates/targetedMetabolomicsCollectionBuilder.ts +0 -80
- package/src/templates/targetedMetabolomicsHelpers.ts +0 -102
- package/src/templates/templateAdapterTypes.ts +0 -58
- package/src/templates/templateControlSchemas.ts +0 -320
- package/src/templates/templateCreateOptions.ts +0 -208
- package/src/templates/templateEnvelopes.ts +0 -145
- package/src/templates/templatePackCollectionBuilder.ts +0 -24
- package/src/templates/templatePresetCollectionBuilder.ts +0 -141
- package/src/templates/templateQpcrTypes.ts +0 -48
- package/src/templates/templateValidators.ts +0 -426
- package/src/templates/timeCourseAdapters.ts +0 -77
- package/src/templates/timeCourseBuilder.ts +0 -65
- package/src/templates/types.ts +0 -493
- package/src/templates/wellPlateScreenCollectionBuilder.ts +0 -37
- package/src/templates/westernBlotAssayCollectionBuilder.ts +0 -69
- package/src/utils/rack.ts +0 -225
- /package/dist/__tests__/components/{AppAvatarMenu.test.d.ts → BaseButton.test.d.ts} +0 -0
- /package/dist/__tests__/components/{AppTopBar.navigation.test.d.ts → BaseCheckbox.switch.test.d.ts} +0 -0
- /package/dist/__tests__/components/{AppTopBarPresence.test.d.ts → BaseSelect.multiple.test.d.ts} +0 -0
- /package/dist/__tests__/components/{BaseToggle.test.d.ts → BaseSelect.searchable.test.d.ts} +0 -0
- /package/dist/__tests__/components/{BioTemplateExperimentWorkspaceView.test.d.ts → ConfirmDialog.test.d.ts} +0 -0
- /package/dist/__tests__/components/{BioTemplatePackWorkspaceView.test.d.ts → DatePicker.datetime.test.d.ts} +0 -0
- /package/dist/__tests__/components/{BioTemplatePresetWorkspaceView.test.d.ts → DatePicker.time.test.d.ts} +0 -0
- /package/dist/__tests__/components/{BioTemplateRenderer.test.d.ts → FormSchemaInternal.test.d.ts} +0 -0
- /package/dist/__tests__/components/{ControlWorkspaceView.test.d.ts → InstrumentStatusPanels.test.d.ts} +0 -0
- /package/dist/__tests__/components/{DateTimePicker.test.d.ts → NumberInput.units.test.d.ts} +0 -0
- /package/dist/__tests__/components/{DoseDesignWorkspaceView.test.d.ts → PresenceAvatars.test.d.ts} +0 -0
- /package/dist/__tests__/components/{ExperimentTimeline.test.d.ts → StaleFormBanner.test.d.ts} +0 -0
- /package/dist/__tests__/components/{FitPanel.test.d.ts → deprecationTags.test.d.ts} +0 -0
- /package/dist/__tests__/{components/GroupAssigner.test.d.ts → composables/createClient.test.d.ts} +0 -0
- /package/dist/__tests__/{components/MobileSupportGate.test.d.ts → composables/eventStream.test.d.ts} +0 -0
- /package/dist/__tests__/{components/MultiSelect.test.d.ts → composables/useArtifacts.test.d.ts} +0 -0
- /package/dist/__tests__/{components/ReagentList.presentation.test.d.ts → composables/useExperiment.test.d.ts} +0 -0
- /package/dist/__tests__/{components/ReagentList.test.d.ts → composables/useJobCenter.test.d.ts} +0 -0
- /package/dist/__tests__/{components/SampleLegend.test.d.ts → composables/useJobsEndpoint.test.d.ts} +0 -0
- /package/dist/__tests__/{components/SearchableSelect.test.d.ts → composables/usePlatform.test.d.ts} +0 -0
- /package/dist/__tests__/{components/SmartGroupModal.test.d.ts → composables/usePresence.test.d.ts} +0 -0
- /package/dist/__tests__/{components/TimePicker.test.d.ts → composables/useRealtime.test.d.ts} +0 -0
- /package/dist/__tests__/{components/UnitInput.test.d.ts → composables/useRequest.test.d.ts} +0 -0
- /package/dist/__tests__/{components/WellPlate.sampleTypeIndicator.test.d.ts → composables/useVersionedSave.test.d.ts} +0 -0
- /package/dist/__tests__/{components/iconButtonIconSizing.test.d.ts → utils/formula.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useAnalysisArtifacts.test.d.ts → utils/time.test.d.ts} +0 -0
- /package/dist/components/{FormActions.vue.d.ts → internal/FormActionsInternal.vue.d.ts} +0 -0
- /package/dist/{composables → components/internal}/autoGroup/colors.d.ts +0 -0
- /package/dist/{composables → components/internal}/autoGroup/index.d.ts +0 -0
- /package/dist/{composables → components/internal}/autoGroup/tokenize.d.ts +0 -0
- /package/src/{composables → components/internal}/autoGroup/colors.ts +0 -0
- /package/src/{composables → components/internal}/autoGroup/tokenize.ts +0 -0
- /package/src/{composables → components/internal}/autoGroup/vocab.json +0 -0
|
@@ -5,25 +5,23 @@ import { createPinia } from 'pinia'
|
|
|
5
5
|
import AppTopBar from '../../components/AppTopBar.vue'
|
|
6
6
|
import ExperimentPopover from '../../components/ExperimentPopover.vue'
|
|
7
7
|
import ExperimentSelectorModal from '../../components/ExperimentSelectorModal.vue'
|
|
8
|
-
import {
|
|
8
|
+
import { usePlatform } from '../../composables/usePlatform'
|
|
9
9
|
import { APP_EXPERIMENT_KEY, type AppExperimentState } from '../../composables/useAppExperiment'
|
|
10
10
|
import { defineControlModel, defineControls } from '../../composables/useControlSchema'
|
|
11
11
|
import ThemeToggle from '../../components/ThemeToggle.vue'
|
|
12
12
|
import SettingsModal from '../../components/SettingsModal.vue'
|
|
13
13
|
import type { TopBarSettingsConfig } from '../../types/components'
|
|
14
14
|
|
|
15
|
-
// Mock the
|
|
16
|
-
vi.mock('../../composables/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
// Mock the usePlatform composable
|
|
16
|
+
vi.mock('../../composables/usePlatform', () => ({
|
|
17
|
+
usePlatform: vi.fn(() => ({
|
|
18
|
+
integrated: computed(() => false),
|
|
19
|
+
isAdmin: computed(() => true),
|
|
20
|
+
can: () => true,
|
|
20
21
|
plugin: computed(() => undefined),
|
|
21
22
|
user: computed(() => undefined),
|
|
22
23
|
theme: computed(() => 'system' as const),
|
|
23
24
|
features: computed(() => undefined),
|
|
24
|
-
navigate: vi.fn(),
|
|
25
|
-
notify: vi.fn(),
|
|
26
|
-
sendToPlatform: vi.fn(),
|
|
27
25
|
})),
|
|
28
26
|
}))
|
|
29
27
|
|
|
@@ -117,19 +115,19 @@ describe('AppTopBar', () => {
|
|
|
117
115
|
})
|
|
118
116
|
})
|
|
119
117
|
|
|
120
|
-
describe('
|
|
121
|
-
it('should not render ThemeToggle when
|
|
118
|
+
describe('spec.themeToggle', () => {
|
|
119
|
+
it('should not render ThemeToggle when spec.themeToggle is false', () => {
|
|
122
120
|
const wrapper = createWrapper({
|
|
121
|
+
spec: { themeToggle: false },
|
|
123
122
|
title: 'Test App',
|
|
124
|
-
showThemeToggle: false,
|
|
125
123
|
})
|
|
126
124
|
expect(wrapper.findComponent(ThemeToggle).exists()).toBe(false)
|
|
127
125
|
})
|
|
128
126
|
|
|
129
|
-
it('should render ThemeToggle when
|
|
127
|
+
it('should render ThemeToggle when spec.themeToggle is true', () => {
|
|
130
128
|
const wrapper = createWrapper({
|
|
129
|
+
spec: { themeToggle: true },
|
|
131
130
|
title: 'Test App',
|
|
132
|
-
showThemeToggle: true,
|
|
133
131
|
})
|
|
134
132
|
const themeToggle = wrapper.findComponent(ThemeToggle)
|
|
135
133
|
expect(themeToggle.exists()).toBe(true)
|
|
@@ -137,8 +135,8 @@ describe('AppTopBar', () => {
|
|
|
137
135
|
|
|
138
136
|
it('should pass size="sm" to ThemeToggle', () => {
|
|
139
137
|
const wrapper = createWrapper({
|
|
138
|
+
spec: { themeToggle: true },
|
|
140
139
|
title: 'Test App',
|
|
141
|
-
showThemeToggle: true,
|
|
142
140
|
})
|
|
143
141
|
const themeToggle = wrapper.findComponent(ThemeToggle)
|
|
144
142
|
expect(themeToggle.props('size')).toBe('sm')
|
|
@@ -146,36 +144,48 @@ describe('AppTopBar', () => {
|
|
|
146
144
|
|
|
147
145
|
it('should render ThemeToggle in right section', () => {
|
|
148
146
|
const wrapper = createWrapper({
|
|
147
|
+
spec: { themeToggle: true },
|
|
149
148
|
title: 'Test App',
|
|
150
|
-
showThemeToggle: true,
|
|
151
149
|
})
|
|
152
150
|
const rightSection = wrapper.find('.mint-topbar__right')
|
|
153
151
|
expect(rightSection.findComponent(ThemeToggle).exists()).toBe(true)
|
|
154
152
|
})
|
|
155
153
|
})
|
|
156
154
|
|
|
157
|
-
describe('
|
|
158
|
-
it('should not render settings button when
|
|
155
|
+
describe('spec.settings', () => {
|
|
156
|
+
it('should not render settings button when spec.settings is false', () => {
|
|
159
157
|
const wrapper = createWrapper({
|
|
158
|
+
spec: { settings: false },
|
|
160
159
|
title: 'Test App',
|
|
161
|
-
showSettings: false,
|
|
162
160
|
})
|
|
163
161
|
expect(wrapper.find('.mint-topbar__settings-btn').exists()).toBe(false)
|
|
164
162
|
})
|
|
165
163
|
|
|
166
|
-
it('should render settings button when
|
|
164
|
+
it('should render settings button when spec.settings is set', () => {
|
|
167
165
|
const wrapper = createWrapper({
|
|
166
|
+
spec: { settings: {} },
|
|
168
167
|
title: 'Test App',
|
|
169
|
-
showSettings: true,
|
|
170
168
|
})
|
|
171
169
|
const settingsBtn = wrapper.find('.mint-topbar__settings-btn')
|
|
172
170
|
expect(settingsBtn.exists()).toBe(true)
|
|
173
171
|
})
|
|
174
172
|
|
|
173
|
+
it('should follow a spec.settings getter', async () => {
|
|
174
|
+
const canConfigure = ref(true)
|
|
175
|
+
const wrapper = createWrapper({
|
|
176
|
+
spec: { settings: () => (canConfigure.value ? {} : false) },
|
|
177
|
+
title: 'Test App',
|
|
178
|
+
})
|
|
179
|
+
canConfigure.value = false
|
|
180
|
+
await wrapper.vm.$nextTick()
|
|
181
|
+
|
|
182
|
+
expect(wrapper.find('.mint-topbar__settings-btn').exists()).toBe(false)
|
|
183
|
+
})
|
|
184
|
+
|
|
175
185
|
it('should render SettingsModal after settings is opened', async () => {
|
|
176
186
|
const wrapper = createWrapper({
|
|
187
|
+
spec: { settings: {} },
|
|
177
188
|
title: 'Test App',
|
|
178
|
-
showSettings: true,
|
|
179
189
|
})
|
|
180
190
|
expect(wrapper.findComponent(SettingsModal).exists()).toBe(false)
|
|
181
191
|
|
|
@@ -185,8 +195,8 @@ describe('AppTopBar', () => {
|
|
|
185
195
|
|
|
186
196
|
it('should have aria-label on settings button', () => {
|
|
187
197
|
const wrapper = createWrapper({
|
|
198
|
+
spec: { settings: {} },
|
|
188
199
|
title: 'Test App',
|
|
189
|
-
showSettings: true,
|
|
190
200
|
})
|
|
191
201
|
const settingsBtn = wrapper.find('.mint-topbar__settings-btn')
|
|
192
202
|
expect(settingsBtn.attributes('aria-label')).toBe('Open settings')
|
|
@@ -194,8 +204,8 @@ describe('AppTopBar', () => {
|
|
|
194
204
|
|
|
195
205
|
it('should render settings icon SVG', () => {
|
|
196
206
|
const wrapper = createWrapper({
|
|
207
|
+
spec: { settings: {} },
|
|
197
208
|
title: 'Test App',
|
|
198
|
-
showSettings: true,
|
|
199
209
|
})
|
|
200
210
|
const settingsBtn = wrapper.find('.mint-topbar__settings-btn')
|
|
201
211
|
const icon = settingsBtn.find('.mint-topbar__settings-icon')
|
|
@@ -207,34 +217,33 @@ describe('AppTopBar', () => {
|
|
|
207
217
|
describe('settings button interaction', () => {
|
|
208
218
|
it('should open SettingsModal when settings button is clicked', async () => {
|
|
209
219
|
const wrapper = createWrapper({
|
|
220
|
+
spec: { settings: {} },
|
|
210
221
|
title: 'Test App',
|
|
211
|
-
showSettings: true,
|
|
212
222
|
})
|
|
213
223
|
|
|
214
224
|
const settingsModal = await openSettingsModal(wrapper)
|
|
215
|
-
expect(settingsModal.props('
|
|
225
|
+
expect(settingsModal.props('open')).toBe(true)
|
|
216
226
|
})
|
|
217
227
|
|
|
218
228
|
it('should not mount SettingsModal while closed', () => {
|
|
219
229
|
const wrapper = createWrapper({
|
|
230
|
+
spec: { settings: {} },
|
|
220
231
|
title: 'Test App',
|
|
221
|
-
showSettings: true,
|
|
222
232
|
})
|
|
223
233
|
|
|
224
234
|
expect(wrapper.findComponent(SettingsModal).exists()).toBe(false)
|
|
225
235
|
})
|
|
226
236
|
})
|
|
227
237
|
|
|
228
|
-
describe('
|
|
238
|
+
describe('spec.settings config', () => {
|
|
229
239
|
it('should pass title to SettingsModal', async () => {
|
|
230
240
|
const settingsConfig: TopBarSettingsConfig = {
|
|
231
241
|
title: 'Custom Settings',
|
|
232
242
|
}
|
|
233
243
|
|
|
234
244
|
const wrapper = createWrapper({
|
|
245
|
+
spec: { settings: settingsConfig },
|
|
235
246
|
title: 'Test App',
|
|
236
|
-
showSettings: true,
|
|
237
|
-
settingsConfig,
|
|
238
247
|
})
|
|
239
248
|
|
|
240
249
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -250,9 +259,8 @@ describe('AppTopBar', () => {
|
|
|
250
259
|
}
|
|
251
260
|
|
|
252
261
|
const wrapper = createWrapper({
|
|
262
|
+
spec: { settings: settingsConfig },
|
|
253
263
|
title: 'Test App',
|
|
254
|
-
showSettings: true,
|
|
255
|
-
settingsConfig,
|
|
256
264
|
})
|
|
257
265
|
|
|
258
266
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -261,12 +269,13 @@ describe('AppTopBar', () => {
|
|
|
261
269
|
|
|
262
270
|
it('should normalize shorthand settings tabs for SettingsModal', async () => {
|
|
263
271
|
const wrapper = createWrapper({
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
272
|
+
spec: {
|
|
273
|
+
settings: {
|
|
274
|
+
tabs: ['General', 'Advanced'],
|
|
275
|
+
showAppearance: false,
|
|
276
|
+
},
|
|
269
277
|
},
|
|
278
|
+
title: 'Test App',
|
|
270
279
|
})
|
|
271
280
|
|
|
272
281
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -301,21 +310,22 @@ describe('AppTopBar', () => {
|
|
|
301
310
|
}
|
|
302
311
|
const settingsConfig: TopBarSettingsConfig = {
|
|
303
312
|
showAppearance: false,
|
|
304
|
-
schema,
|
|
313
|
+
spec: schema,
|
|
305
314
|
values: { threshold: 0.25, method: 'linear', externalContext: 'experiment-1' },
|
|
306
315
|
}
|
|
307
316
|
|
|
308
317
|
const wrapper = createWrapper({
|
|
318
|
+
spec: { settings: settingsConfig },
|
|
309
319
|
title: 'Test App',
|
|
310
|
-
showSettings: true,
|
|
311
|
-
settingsConfig,
|
|
312
320
|
})
|
|
313
321
|
|
|
314
322
|
await openSettingsModal(wrapper)
|
|
315
323
|
await wrapper.setProps({
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
324
|
+
spec: {
|
|
325
|
+
settings: {
|
|
326
|
+
...settingsConfig,
|
|
327
|
+
values: { threshold: 0.75, method: 'logistic', externalContext: 'experiment-2' },
|
|
328
|
+
},
|
|
319
329
|
},
|
|
320
330
|
})
|
|
321
331
|
await waitForAsyncComponents(wrapper)
|
|
@@ -324,7 +334,7 @@ describe('AppTopBar', () => {
|
|
|
324
334
|
expect((wrapper.find('select').element as HTMLSelectElement).value).toBe('logistic')
|
|
325
335
|
})
|
|
326
336
|
|
|
327
|
-
it('should
|
|
337
|
+
it('should pass a control model built from controls to SettingsModal', async () => {
|
|
328
338
|
const controls = defineControls({
|
|
329
339
|
threshold: {
|
|
330
340
|
label: 'Threshold',
|
|
@@ -333,19 +343,19 @@ describe('AppTopBar', () => {
|
|
|
333
343
|
sectionLabel: 'Parameters',
|
|
334
344
|
},
|
|
335
345
|
})
|
|
346
|
+
const model = defineControlModel({ controls })
|
|
336
347
|
const settingsConfig: TopBarSettingsConfig = {
|
|
337
348
|
showAppearance: false,
|
|
338
|
-
|
|
349
|
+
spec: model,
|
|
339
350
|
}
|
|
340
351
|
|
|
341
352
|
const wrapper = createWrapper({
|
|
353
|
+
spec: { settings: settingsConfig },
|
|
342
354
|
title: 'Test App',
|
|
343
|
-
showSettings: true,
|
|
344
|
-
settingsConfig,
|
|
345
355
|
})
|
|
346
356
|
|
|
347
357
|
const settingsModal = await openSettingsModal(wrapper)
|
|
348
|
-
expect(settingsModal.props('
|
|
358
|
+
expect(settingsModal.props('spec')).toStrictEqual(model)
|
|
349
359
|
expect(wrapper.text()).toContain('Threshold')
|
|
350
360
|
expect((wrapper.find('input').element as HTMLInputElement).value).toBe('0.25')
|
|
351
361
|
})
|
|
@@ -363,17 +373,16 @@ describe('AppTopBar', () => {
|
|
|
363
373
|
})
|
|
364
374
|
const settingsConfig: TopBarSettingsConfig = {
|
|
365
375
|
showAppearance: false,
|
|
366
|
-
model,
|
|
376
|
+
spec: model,
|
|
367
377
|
}
|
|
368
378
|
|
|
369
379
|
const wrapper = createWrapper({
|
|
380
|
+
spec: { settings: settingsConfig },
|
|
370
381
|
title: 'Test App',
|
|
371
|
-
showSettings: true,
|
|
372
|
-
settingsConfig,
|
|
373
382
|
})
|
|
374
383
|
|
|
375
384
|
const settingsModal = await openSettingsModal(wrapper)
|
|
376
|
-
expect(settingsModal.props('
|
|
385
|
+
expect(settingsModal.props('spec')).toStrictEqual(model)
|
|
377
386
|
expect(wrapper.text()).toContain('Threshold')
|
|
378
387
|
expect((wrapper.find('input').element as HTMLInputElement).value).toBe('0.25')
|
|
379
388
|
})
|
|
@@ -384,9 +393,8 @@ describe('AppTopBar', () => {
|
|
|
384
393
|
}
|
|
385
394
|
|
|
386
395
|
const wrapper = createWrapper({
|
|
396
|
+
spec: { settings: settingsConfig },
|
|
387
397
|
title: 'Test App',
|
|
388
|
-
showSettings: true,
|
|
389
|
-
settingsConfig,
|
|
390
398
|
})
|
|
391
399
|
|
|
392
400
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -399,9 +407,8 @@ describe('AppTopBar', () => {
|
|
|
399
407
|
}
|
|
400
408
|
|
|
401
409
|
const wrapper = createWrapper({
|
|
410
|
+
spec: { settings: settingsConfig },
|
|
402
411
|
title: 'Test App',
|
|
403
|
-
showSettings: true,
|
|
404
|
-
settingsConfig,
|
|
405
412
|
})
|
|
406
413
|
|
|
407
414
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -410,9 +417,8 @@ describe('AppTopBar', () => {
|
|
|
410
417
|
|
|
411
418
|
it('should default showAppearance to true when not specified', async () => {
|
|
412
419
|
const wrapper = createWrapper({
|
|
420
|
+
spec: { settings: {} },
|
|
413
421
|
title: 'Test App',
|
|
414
|
-
showSettings: true,
|
|
415
|
-
settingsConfig: {},
|
|
416
422
|
})
|
|
417
423
|
|
|
418
424
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -425,9 +431,8 @@ describe('AppTopBar', () => {
|
|
|
425
431
|
}
|
|
426
432
|
|
|
427
433
|
const wrapper = createWrapper({
|
|
434
|
+
spec: { settings: settingsConfig },
|
|
428
435
|
title: 'Test App',
|
|
429
|
-
showSettings: true,
|
|
430
|
-
settingsConfig,
|
|
431
436
|
})
|
|
432
437
|
|
|
433
438
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -436,8 +441,8 @@ describe('AppTopBar', () => {
|
|
|
436
441
|
|
|
437
442
|
it('should use default size when not specified', async () => {
|
|
438
443
|
const wrapper = createWrapper({
|
|
444
|
+
spec: { settings: {} },
|
|
439
445
|
title: 'Test App',
|
|
440
|
-
showSettings: true,
|
|
441
446
|
})
|
|
442
447
|
|
|
443
448
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -453,9 +458,8 @@ describe('AppTopBar', () => {
|
|
|
453
458
|
}
|
|
454
459
|
|
|
455
460
|
const wrapper = createWrapper({
|
|
461
|
+
spec: { settings: settingsConfig },
|
|
456
462
|
title: 'Test App',
|
|
457
|
-
showSettings: true,
|
|
458
|
-
settingsConfig,
|
|
459
463
|
}, {
|
|
460
464
|
'settings-tab-general': '<div class="custom-tab-content">Custom General Tab</div>',
|
|
461
465
|
})
|
|
@@ -466,12 +470,13 @@ describe('AppTopBar', () => {
|
|
|
466
470
|
|
|
467
471
|
it('should forward shorthand settings-tab slots to SettingsModal', async () => {
|
|
468
472
|
const wrapper = createWrapper({
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
473
|
+
spec: {
|
|
474
|
+
settings: {
|
|
475
|
+
tabs: ['General'],
|
|
476
|
+
showAppearance: false,
|
|
477
|
+
},
|
|
474
478
|
},
|
|
479
|
+
title: 'Test App',
|
|
475
480
|
}, {
|
|
476
481
|
'settings-tab-General': '<div>General Content</div>',
|
|
477
482
|
})
|
|
@@ -489,9 +494,8 @@ describe('AppTopBar', () => {
|
|
|
489
494
|
}
|
|
490
495
|
|
|
491
496
|
const wrapper = createWrapper({
|
|
497
|
+
spec: { settings: settingsConfig },
|
|
492
498
|
title: 'Test App',
|
|
493
|
-
showSettings: true,
|
|
494
|
-
settingsConfig,
|
|
495
499
|
}, {
|
|
496
500
|
'settings-tab-general': '<div>General Content</div>',
|
|
497
501
|
'settings-tab-advanced': '<div>Advanced Content</div>',
|
|
@@ -504,8 +508,8 @@ describe('AppTopBar', () => {
|
|
|
504
508
|
|
|
505
509
|
it('should forward settings-appearance slot', async () => {
|
|
506
510
|
const wrapper = createWrapper({
|
|
511
|
+
spec: { settings: {} },
|
|
507
512
|
title: 'Test App',
|
|
508
|
-
showSettings: true,
|
|
509
513
|
}, {
|
|
510
514
|
'settings-appearance': '<div class="custom-appearance">Custom Appearance</div>',
|
|
511
515
|
})
|
|
@@ -515,25 +519,36 @@ describe('AppTopBar', () => {
|
|
|
515
519
|
})
|
|
516
520
|
})
|
|
517
521
|
|
|
518
|
-
describe('
|
|
519
|
-
it('should show standalone badge
|
|
522
|
+
describe('spec.standaloneLabel visibility', () => {
|
|
523
|
+
it('should show standalone badge by default', () => {
|
|
520
524
|
const wrapper = createWrapper({
|
|
521
525
|
title: 'Test App',
|
|
522
|
-
showStandaloneLabel: true,
|
|
523
526
|
})
|
|
524
527
|
expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(true)
|
|
525
528
|
})
|
|
526
529
|
|
|
527
|
-
it('should hide standalone badge when
|
|
530
|
+
it('should hide standalone badge when spec.standaloneLabel is false', () => {
|
|
528
531
|
const wrapper = createWrapper({
|
|
532
|
+
spec: { standaloneLabel: false },
|
|
529
533
|
title: 'Test App',
|
|
530
|
-
|
|
534
|
+
})
|
|
535
|
+
expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(false)
|
|
536
|
+
})
|
|
537
|
+
|
|
538
|
+
it('should hide standalone badge when spec.standaloneLabel is false and an app experiment is provided', () => {
|
|
539
|
+
const wrapper = mount(AppTopBar, {
|
|
540
|
+
props: { title: 'Test App', spec: { standaloneLabel: false } },
|
|
541
|
+
global: {
|
|
542
|
+
plugins: [createPinia()],
|
|
543
|
+
provide: { [APP_EXPERIMENT_KEY as symbol]: {} as AppExperimentState },
|
|
544
|
+
stubs: { 'router-link': { template: '<a><slot /></a>' } },
|
|
545
|
+
},
|
|
531
546
|
})
|
|
532
547
|
expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(false)
|
|
533
548
|
})
|
|
534
549
|
})
|
|
535
550
|
|
|
536
|
-
describe('standaloneLabel
|
|
551
|
+
describe('spec.standaloneLabel text', () => {
|
|
537
552
|
it('should display default "Standalone" label', () => {
|
|
538
553
|
const wrapper = createWrapper({
|
|
539
554
|
title: 'Test App',
|
|
@@ -544,8 +559,8 @@ describe('AppTopBar', () => {
|
|
|
544
559
|
|
|
545
560
|
it('should display custom standalone label', () => {
|
|
546
561
|
const wrapper = createWrapper({
|
|
562
|
+
spec: { standaloneLabel: 'Demo Mode' },
|
|
547
563
|
title: 'Test App',
|
|
548
|
-
standaloneLabel: 'Demo Mode',
|
|
549
564
|
})
|
|
550
565
|
const badge = wrapper.find('.mint-topbar__standalone-badge')
|
|
551
566
|
expect(badge.text()).toBe('Demo Mode')
|
|
@@ -553,8 +568,8 @@ describe('AppTopBar', () => {
|
|
|
553
568
|
|
|
554
569
|
it('should support empty string as label', () => {
|
|
555
570
|
const wrapper = createWrapper({
|
|
571
|
+
spec: { standaloneLabel: '' },
|
|
556
572
|
title: 'Test App',
|
|
557
|
-
standaloneLabel: '',
|
|
558
573
|
})
|
|
559
574
|
const badge = wrapper.find('.mint-topbar__standalone-badge')
|
|
560
575
|
expect(badge.text()).toBe('')
|
|
@@ -568,7 +583,6 @@ describe('AppTopBar', () => {
|
|
|
568
583
|
// The component code correctly checks isStandalone computed property
|
|
569
584
|
const wrapper = createWrapper({
|
|
570
585
|
title: 'Test App',
|
|
571
|
-
showStandaloneLabel: true,
|
|
572
586
|
})
|
|
573
587
|
|
|
574
588
|
// In non-integrated mode (default mock), badge should be visible
|
|
@@ -578,9 +592,10 @@ describe('AppTopBar', () => {
|
|
|
578
592
|
|
|
579
593
|
describe('combined features', () => {
|
|
580
594
|
it('does not bind an experiment when the integrated plugin is static', async () => {
|
|
581
|
-
vi.mocked(
|
|
582
|
-
|
|
583
|
-
|
|
595
|
+
vi.mocked(usePlatform).mockReturnValueOnce({
|
|
596
|
+
integrated: computed(() => true),
|
|
597
|
+
isAdmin: computed(() => true),
|
|
598
|
+
can: () => true,
|
|
584
599
|
plugin: computed(() => ({
|
|
585
600
|
id: 'hmdb',
|
|
586
601
|
name: 'HMDB',
|
|
@@ -588,13 +603,12 @@ describe('AppTopBar', () => {
|
|
|
588
603
|
route_prefix: '/hmdb',
|
|
589
604
|
api_prefix: '/api/hmdb',
|
|
590
605
|
plugin_type: 'static',
|
|
606
|
+
display_name: 'HMDB',
|
|
607
|
+
settings_api: 'platform' as const,
|
|
591
608
|
})),
|
|
592
609
|
user: computed(() => undefined),
|
|
593
610
|
theme: computed(() => 'system' as const),
|
|
594
611
|
features: computed(() => undefined),
|
|
595
|
-
navigate: vi.fn(),
|
|
596
|
-
notify: vi.fn(),
|
|
597
|
-
sendToPlatform: vi.fn(),
|
|
598
612
|
})
|
|
599
613
|
const wrapper = mount(AppTopBar, {
|
|
600
614
|
props: { title: 'HMDB' },
|
|
@@ -618,16 +632,14 @@ describe('AppTopBar', () => {
|
|
|
618
632
|
})
|
|
619
633
|
|
|
620
634
|
it('passes injected app experiment bindings to the popover and selector modal', async () => {
|
|
621
|
-
vi.mocked(
|
|
622
|
-
|
|
623
|
-
|
|
635
|
+
vi.mocked(usePlatform).mockReturnValueOnce({
|
|
636
|
+
integrated: computed(() => true),
|
|
637
|
+
isAdmin: computed(() => true),
|
|
638
|
+
can: () => true,
|
|
624
639
|
plugin: computed(() => undefined),
|
|
625
640
|
user: computed(() => undefined),
|
|
626
641
|
theme: computed(() => 'system' as const),
|
|
627
642
|
features: computed(() => undefined),
|
|
628
|
-
navigate: vi.fn(),
|
|
629
|
-
notify: vi.fn(),
|
|
630
|
-
sendToPlatform: vi.fn(),
|
|
631
643
|
})
|
|
632
644
|
const appExperiment: AppExperimentState = {
|
|
633
645
|
experimentName: computed(() => 'Dose response'),
|
|
@@ -657,7 +669,7 @@ describe('AppTopBar', () => {
|
|
|
657
669
|
saveSuccessMessage: 'Saved',
|
|
658
670
|
})),
|
|
659
671
|
selectorModal: computed(() => ({
|
|
660
|
-
|
|
672
|
+
open: true,
|
|
661
673
|
currentExperimentId: 12,
|
|
662
674
|
})),
|
|
663
675
|
openModal: vi.fn(),
|
|
@@ -697,16 +709,15 @@ describe('AppTopBar', () => {
|
|
|
697
709
|
saveSuccessMessage: 'Saved',
|
|
698
710
|
})
|
|
699
711
|
expect(wrapper.findComponent(ExperimentSelectorModal).props()).toMatchObject({
|
|
700
|
-
|
|
712
|
+
open: true,
|
|
701
713
|
currentExperimentId: 12,
|
|
702
714
|
})
|
|
703
715
|
})
|
|
704
716
|
|
|
705
717
|
it('should render ThemeToggle and settings button together', () => {
|
|
706
718
|
const wrapper = createWrapper({
|
|
719
|
+
spec: { themeToggle: true, settings: {} },
|
|
707
720
|
title: 'Test App',
|
|
708
|
-
showThemeToggle: true,
|
|
709
|
-
showSettings: true,
|
|
710
721
|
})
|
|
711
722
|
|
|
712
723
|
expect(wrapper.findComponent(ThemeToggle).exists()).toBe(true)
|
|
@@ -715,11 +726,8 @@ describe('AppTopBar', () => {
|
|
|
715
726
|
|
|
716
727
|
it('should render standalone badge, ThemeToggle, and settings button together', () => {
|
|
717
728
|
const wrapper = createWrapper({
|
|
729
|
+
spec: { themeToggle: true, standaloneLabel: 'Offline', settings: {} },
|
|
718
730
|
title: 'Test App',
|
|
719
|
-
showThemeToggle: true,
|
|
720
|
-
showSettings: true,
|
|
721
|
-
showStandaloneLabel: true,
|
|
722
|
-
standaloneLabel: 'Offline',
|
|
723
731
|
})
|
|
724
732
|
|
|
725
733
|
expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(true)
|
|
@@ -730,11 +738,9 @@ describe('AppTopBar', () => {
|
|
|
730
738
|
|
|
731
739
|
it('should maintain existing topbar functionality with new features', () => {
|
|
732
740
|
const wrapper = createWrapper({
|
|
741
|
+
spec: { themeToggle: true, settings: {} },
|
|
733
742
|
title: 'My Plugin',
|
|
734
743
|
subtitle: 'Version 1.0',
|
|
735
|
-
showThemeToggle: true,
|
|
736
|
-
showSettings: true,
|
|
737
|
-
showStandaloneLabel: true,
|
|
738
744
|
})
|
|
739
745
|
|
|
740
746
|
// Verify title and subtitle still render
|
|
@@ -749,10 +755,8 @@ describe('AppTopBar', () => {
|
|
|
749
755
|
|
|
750
756
|
it('should render all elements in correct order in right section', () => {
|
|
751
757
|
const wrapper = createWrapper({
|
|
758
|
+
spec: { themeToggle: true, settings: {} },
|
|
752
759
|
title: 'Test App',
|
|
753
|
-
showThemeToggle: true,
|
|
754
|
-
showSettings: true,
|
|
755
|
-
showStandaloneLabel: true,
|
|
756
760
|
}, {
|
|
757
761
|
actions: '<button class="custom-action">Action</button>',
|
|
758
762
|
})
|
|
@@ -784,19 +788,21 @@ describe('AppTopBar', () => {
|
|
|
784
788
|
|
|
785
789
|
it('composes page selector, pill nav, theme, and settings controls', () => {
|
|
786
790
|
const wrapper = createWrapper({
|
|
791
|
+
spec: {
|
|
792
|
+
themeToggle: true,
|
|
793
|
+
pills: [
|
|
794
|
+
{ id: 'overview', label: 'Overview' },
|
|
795
|
+
{ id: 'details', label: 'Details' },
|
|
796
|
+
],
|
|
797
|
+
settings: {},
|
|
798
|
+
},
|
|
799
|
+
pill: 'overview',
|
|
787
800
|
title: 'Dashboard',
|
|
788
801
|
pageSelector: [
|
|
789
802
|
{ id: 'dashboard', label: 'Dashboard' },
|
|
790
803
|
{ id: 'settings', label: 'Settings' },
|
|
791
804
|
],
|
|
792
805
|
currentPageSelectorId: 'dashboard',
|
|
793
|
-
pillNav: [
|
|
794
|
-
{ id: 'overview', label: 'Overview' },
|
|
795
|
-
{ id: 'details', label: 'Details' },
|
|
796
|
-
],
|
|
797
|
-
currentPillId: 'overview',
|
|
798
|
-
showThemeToggle: true,
|
|
799
|
-
showSettings: true,
|
|
800
806
|
})
|
|
801
807
|
|
|
802
808
|
expect(wrapper.find('.mint-page-selector__label').text()).toBe('Dashboard')
|
|
@@ -812,11 +818,13 @@ describe('AppTopBar', () => {
|
|
|
812
818
|
it('renders pill nav items with icon metadata', async () => {
|
|
813
819
|
const runIcon = 'M8 5v14l11-7z'
|
|
814
820
|
const wrapper = createWrapper({
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
821
|
+
spec: {
|
|
822
|
+
pills: [
|
|
823
|
+
{ id: 'analysis', label: 'Run', icon: runIcon },
|
|
824
|
+
{ id: 'results', label: 'Results' },
|
|
825
|
+
],
|
|
826
|
+
},
|
|
827
|
+
pill: 'analysis',
|
|
820
828
|
})
|
|
821
829
|
|
|
822
830
|
const pills = wrapper.findAll('.mint-pill-nav__item')
|
|
@@ -829,6 +837,17 @@ describe('AppTopBar', () => {
|
|
|
829
837
|
expect(wrapper.emitted('pill-select')?.[0][0]).toMatchObject({ id: 'results', label: 'Results' })
|
|
830
838
|
})
|
|
831
839
|
|
|
840
|
+
it('emits update:pill with the id of the selected pill', async () => {
|
|
841
|
+
const wrapper = createWrapper({
|
|
842
|
+
spec: { pills: ['Run', 'Results'] },
|
|
843
|
+
pill: 'Run',
|
|
844
|
+
})
|
|
845
|
+
|
|
846
|
+
await wrapper.findAll('.mint-pill-nav__item')[1].trigger('click')
|
|
847
|
+
|
|
848
|
+
expect(wrapper.emitted('update:pill')).toEqual([['Results']])
|
|
849
|
+
})
|
|
850
|
+
|
|
832
851
|
it('uses shared dropdown state for the page selector menu', async () => {
|
|
833
852
|
const wrapper = createWrapper({
|
|
834
853
|
pageSelector: [
|
|
@@ -893,11 +912,10 @@ describe('AppTopBar', () => {
|
|
|
893
912
|
})
|
|
894
913
|
|
|
895
914
|
describe('edge cases', () => {
|
|
896
|
-
it('should handle empty
|
|
915
|
+
it('should handle empty spec.settings object', async () => {
|
|
897
916
|
const wrapper = createWrapper({
|
|
917
|
+
spec: { settings: {} },
|
|
898
918
|
title: 'Test App',
|
|
899
|
-
showSettings: true,
|
|
900
|
-
settingsConfig: {},
|
|
901
919
|
})
|
|
902
920
|
|
|
903
921
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -908,15 +926,14 @@ describe('AppTopBar', () => {
|
|
|
908
926
|
expect(settingsModal.props('size')).toBe('lg')
|
|
909
927
|
})
|
|
910
928
|
|
|
911
|
-
it('should handle
|
|
929
|
+
it('should handle spec.settings with only some fields', async () => {
|
|
912
930
|
const settingsConfig: TopBarSettingsConfig = {
|
|
913
931
|
title: 'Partial Config',
|
|
914
932
|
}
|
|
915
933
|
|
|
916
934
|
const wrapper = createWrapper({
|
|
935
|
+
spec: { settings: settingsConfig },
|
|
917
936
|
title: 'Test App',
|
|
918
|
-
showSettings: true,
|
|
919
|
-
settingsConfig,
|
|
920
937
|
})
|
|
921
938
|
|
|
922
939
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -930,8 +947,8 @@ describe('AppTopBar', () => {
|
|
|
930
947
|
|
|
931
948
|
it('should handle standalone label with special characters', () => {
|
|
932
949
|
const wrapper = createWrapper({
|
|
950
|
+
spec: { standaloneLabel: '🚀 Preview' },
|
|
933
951
|
title: 'Test App',
|
|
934
|
-
standaloneLabel: '🚀 Preview',
|
|
935
952
|
})
|
|
936
953
|
|
|
937
954
|
const badge = wrapper.find('.mint-topbar__standalone-badge')
|
|
@@ -941,8 +958,8 @@ describe('AppTopBar', () => {
|
|
|
941
958
|
it('should handle very long standalone label', () => {
|
|
942
959
|
const longLabel = 'This is a very long standalone mode label text'
|
|
943
960
|
const wrapper = createWrapper({
|
|
961
|
+
spec: { standaloneLabel: longLabel },
|
|
944
962
|
title: 'Test App',
|
|
945
|
-
standaloneLabel: longLabel,
|
|
946
963
|
})
|
|
947
964
|
|
|
948
965
|
const badge = wrapper.find('.mint-topbar__standalone-badge')
|
|
@@ -951,7 +968,7 @@ describe('AppTopBar', () => {
|
|
|
951
968
|
})
|
|
952
969
|
|
|
953
970
|
describe('type safety', () => {
|
|
954
|
-
it('should accept valid
|
|
971
|
+
it('should accept valid spec.settings with all fields', async () => {
|
|
955
972
|
const settingsConfig: TopBarSettingsConfig = {
|
|
956
973
|
title: 'Complete Settings',
|
|
957
974
|
tabs: [
|
|
@@ -963,9 +980,8 @@ describe('AppTopBar', () => {
|
|
|
963
980
|
}
|
|
964
981
|
|
|
965
982
|
const wrapper = createWrapper({
|
|
983
|
+
spec: { settings: settingsConfig },
|
|
966
984
|
title: 'Test App',
|
|
967
|
-
showSettings: true,
|
|
968
|
-
settingsConfig,
|
|
969
985
|
})
|
|
970
986
|
|
|
971
987
|
expect((await openSettingsModal(wrapper)).exists()).toBe(true)
|
|
@@ -976,9 +992,8 @@ describe('AppTopBar', () => {
|
|
|
976
992
|
|
|
977
993
|
for (const size of sizes) {
|
|
978
994
|
const wrapper = createWrapper({
|
|
995
|
+
spec: { settings: { size } },
|
|
979
996
|
title: 'Test App',
|
|
980
|
-
showSettings: true,
|
|
981
|
-
settingsConfig: { size },
|
|
982
997
|
})
|
|
983
998
|
|
|
984
999
|
const settingsModal = await openSettingsModal(wrapper)
|
|
@@ -997,16 +1012,14 @@ describe('AppTopBar', () => {
|
|
|
997
1012
|
features: undefined as unknown,
|
|
998
1013
|
}
|
|
999
1014
|
const merged = { ...defaults, ...overrides }
|
|
1000
|
-
vi.mocked(
|
|
1001
|
-
|
|
1002
|
-
|
|
1015
|
+
vi.mocked(usePlatform).mockReturnValue({
|
|
1016
|
+
integrated: computed(() => merged.isIntegrated as boolean),
|
|
1017
|
+
isAdmin: computed(() => true),
|
|
1018
|
+
can: () => true,
|
|
1003
1019
|
plugin: computed(() => merged.plugin as any),
|
|
1004
1020
|
user: computed(() => merged.user as any),
|
|
1005
1021
|
theme: computed(() => merged.theme as any),
|
|
1006
1022
|
features: computed(() => merged.features as any),
|
|
1007
|
-
navigate: vi.fn(),
|
|
1008
|
-
notify: vi.fn(),
|
|
1009
|
-
sendToPlatform: vi.fn(),
|
|
1010
1023
|
})
|
|
1011
1024
|
}
|
|
1012
1025
|
|
|
@@ -1045,7 +1058,7 @@ describe('AppTopBar', () => {
|
|
|
1045
1058
|
expect(wrapper.find('.mint-topbar__identity').exists()).toBe(true)
|
|
1046
1059
|
})
|
|
1047
1060
|
|
|
1048
|
-
it('should pass plugin.color to PluginIcon as
|
|
1061
|
+
it('should pass plugin.color to PluginIcon as color', () => {
|
|
1049
1062
|
const iconPath = 'M13 10V3L4 14h7v7l9-11h-7z'
|
|
1050
1063
|
mockPlatformCtx({
|
|
1051
1064
|
isIntegrated: true,
|
|
@@ -1058,7 +1071,7 @@ describe('AppTopBar', () => {
|
|
|
1058
1071
|
|
|
1059
1072
|
const wrapper = createWrapper({ title: 'Test App' })
|
|
1060
1073
|
|
|
1061
|
-
expect(wrapper.findComponent({ name: 'PluginIcon' }).props('
|
|
1074
|
+
expect(wrapper.findComponent({ name: 'PluginIcon' }).props('color')).toBe('#22C55E')
|
|
1062
1075
|
})
|
|
1063
1076
|
|
|
1064
1077
|
it('should ignore the custom icon slot when integrated', () => {
|
|
@@ -1124,44 +1137,34 @@ describe('AppTopBar', () => {
|
|
|
1124
1137
|
expect(wrapper.findComponent({ name: 'PluginIcon' }).exists()).toBe(true)
|
|
1125
1138
|
})
|
|
1126
1139
|
|
|
1127
|
-
it('
|
|
1128
|
-
const
|
|
1129
|
-
|
|
1140
|
+
it('should hand the platform page selector an element when pageSelector is omitted', () => {
|
|
1141
|
+
const unmount = vi.fn()
|
|
1142
|
+
const mountPageSelector = vi.fn((_element: HTMLElement) => unmount)
|
|
1143
|
+
const integratedWindow = window as Window & { __MINT_INTEGRATION__?: unknown }
|
|
1144
|
+
integratedWindow.__MINT_INTEGRATION__ = { mountPageSelector, bindExperimentStore: vi.fn() }
|
|
1130
1145
|
try {
|
|
1131
|
-
const pluginIcon = 'M13 10V3L4 14h7v7l9-11h-7z'
|
|
1132
|
-
const analysisIcon = 'M4 19h16M7 16V8m5 8V4m5 12v-6'
|
|
1133
1146
|
mockPlatformCtx({
|
|
1134
1147
|
isIntegrated: true,
|
|
1135
1148
|
plugin: {
|
|
1136
1149
|
id: 'test',
|
|
1137
1150
|
name: 'Dose Designer',
|
|
1138
1151
|
version: '1.0',
|
|
1139
|
-
icon: pluginIcon,
|
|
1140
1152
|
route_prefix: '/test',
|
|
1141
1153
|
api_prefix: '/api/test',
|
|
1142
1154
|
nav_items: [
|
|
1143
1155
|
{ path: '/', label: 'Dashboard' },
|
|
1144
|
-
{ path: '/analysis', label: 'Analysis'
|
|
1156
|
+
{ path: '/analysis', label: 'Analysis' },
|
|
1145
1157
|
],
|
|
1146
1158
|
},
|
|
1147
1159
|
})
|
|
1148
1160
|
|
|
1149
1161
|
const wrapper = createWrapper()
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
expect(
|
|
1154
|
-
'Dashboard',
|
|
1155
|
-
'Analysis',
|
|
1156
|
-
])
|
|
1157
|
-
expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
|
|
1158
|
-
const dropdownIcons = wrapper
|
|
1159
|
-
.findAllComponents({ name: 'PluginIcon' })
|
|
1160
|
-
.filter(icon => icon.classes().includes('mint-page-selector__metadata-icon'))
|
|
1161
|
-
expect(dropdownIcons.map(icon => icon.props('icon'))).toEqual([pluginIcon, analysisIcon])
|
|
1162
|
-
expect(wrapper.findAll('.mint-page-selector__item')[1].classes()).toContain('mint-page-selector__item--active')
|
|
1162
|
+
const host = wrapper.get('.mint-topbar__platform-page-selector').element
|
|
1163
|
+
wrapper.unmount()
|
|
1164
|
+
|
|
1165
|
+
expect([mountPageSelector.mock.calls[0]?.[0], unmount.mock.calls.length]).toEqual([host, 1])
|
|
1163
1166
|
} finally {
|
|
1164
|
-
|
|
1167
|
+
delete integratedWindow.__MINT_INTEGRATION__
|
|
1165
1168
|
}
|
|
1166
1169
|
})
|
|
1167
1170
|
|
|
@@ -1285,10 +1288,10 @@ describe('AppTopBar', () => {
|
|
|
1285
1288
|
])
|
|
1286
1289
|
})
|
|
1287
1290
|
|
|
1288
|
-
it('accepts string shorthand for
|
|
1291
|
+
it('accepts string shorthand for spec.pills', async () => {
|
|
1289
1292
|
const wrapper = createWrapper({
|
|
1290
|
-
|
|
1291
|
-
|
|
1293
|
+
spec: { pills: ['Run', 'Results'] },
|
|
1294
|
+
pill: 'Run',
|
|
1292
1295
|
})
|
|
1293
1296
|
|
|
1294
1297
|
expect(wrapper.findAll('.mint-pill-nav__item').map(item => item.text())).toEqual([
|
|
@@ -1303,20 +1306,22 @@ describe('AppTopBar', () => {
|
|
|
1303
1306
|
])
|
|
1304
1307
|
})
|
|
1305
1308
|
|
|
1306
|
-
it('emits pill-option-select for
|
|
1309
|
+
it('emits pill-option-select for spec.pills dropdown children', async () => {
|
|
1307
1310
|
const wrapper = createWrapper({
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1311
|
+
spec: {
|
|
1312
|
+
pills: [
|
|
1313
|
+
{ id: 'charts', label: 'Charts' },
|
|
1314
|
+
{
|
|
1315
|
+
id: 'visualize',
|
|
1316
|
+
label: 'Visualize',
|
|
1317
|
+
children: [
|
|
1318
|
+
{ id: 'pca', label: 'PCA', description: 'Principal component analysis' },
|
|
1319
|
+
{ id: 'heatmap', label: 'Heatmap', description: 'Metabolite heatmap' },
|
|
1320
|
+
],
|
|
1321
|
+
},
|
|
1322
|
+
],
|
|
1323
|
+
},
|
|
1324
|
+
pill: 'pca',
|
|
1320
1325
|
})
|
|
1321
1326
|
|
|
1322
1327
|
await wrapper.findAll('.mint-pill-nav__item')[1].trigger('click')
|