@morscherlab/mint-sdk 1.2.0-beta.2 → 1.2.0-beta.20
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 +65 -5
- package/dist/{ExperimentPopover-tLwJ7XF4.js → ExperimentPopover-CJdNlCZb.js} +24 -15
- package/dist/ExperimentPopover-CJdNlCZb.js.map +1 -0
- package/dist/{ExperimentSelectorModal-DyPAUCLw.js → ExperimentSelectorModal-DCXmwKNS.js} +5 -5
- package/dist/ExperimentSelectorModal-DCXmwKNS.js.map +1 -0
- package/dist/{SettingsModal-BgKY93zh.js → SettingsModal-BYR20I4c.js} +5 -8
- package/dist/SettingsModal-BYR20I4c.js.map +1 -0
- package/dist/{EmptyState-p90quq8Z.js → Skeleton-BAF3CKY7.js} +111 -93
- package/dist/Skeleton-BAF3CKY7.js.map +1 -0
- package/dist/__tests__/components/DataStates.test.d.ts +1 -0
- package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
- package/dist/__tests__/components/FileBrowserModal.test.d.ts +1 -0
- package/dist/__tests__/components/FilePicker.state.test.d.ts +1 -0
- package/dist/__tests__/components/FilePicker.test.d.ts +1 -0
- package/dist/__tests__/components/PlotlyChart.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.internal.test.d.ts +1 -0
- package/dist/__tests__/components/SecretInput.test.d.ts +1 -0
- package/dist/__tests__/components/WellEditPopupInternal.test.d.ts +1 -0
- package/dist/__tests__/components/iconButtonIconSizing.test.d.ts +1 -0
- package/dist/__tests__/composables/useFileBrowser.test.d.ts +1 -0
- package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
- package/dist/__tests__/composables/usePlatformFilePickerAdapter.test.d.ts +1 -0
- package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
- package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
- package/dist/apiErrors.d.ts +26 -0
- package/dist/components/ActionMenu.vue.d.ts +1 -1
- package/dist/components/AppAvatarMenu.vue.d.ts +4 -0
- package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
- package/dist/components/AppSidebar.vue.d.ts +1 -1
- package/dist/components/AuditTrail.vue.d.ts +13 -0
- package/dist/components/AutoGroupModal.vue.d.ts +1 -1
- package/dist/components/BaseInput.vue.d.ts +1 -1
- package/dist/components/BaseSelect.vue.d.ts +1 -1
- package/dist/components/BaseTextarea.vue.d.ts +1 -1
- package/dist/components/BatchProgressList.vue.d.ts +17 -0
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +4 -4
- package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +2 -2
- package/dist/components/ConcentrationInput.vue.d.ts +1 -1
- package/dist/components/DataFrame.vue.d.ts +14 -2
- package/dist/components/DatePicker.vue.d.ts +2 -2
- package/dist/components/DateTimePicker.vue.d.ts +3 -1
- package/dist/components/DropdownButton.vue.d.ts +2 -0
- package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
- package/dist/components/ExperimentPopover.vue.d.ts +1 -0
- package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
- package/dist/components/FileBrowserModal.vue.d.ts +99 -0
- package/dist/components/FilePicker.vue.d.ts +32 -0
- package/dist/components/FileUploader.vue.d.ts +5 -2
- package/dist/components/FitPanel.vue.d.ts +1 -1
- package/dist/components/FormulaInput.vue.d.ts +1 -1
- package/dist/components/GeneratedPlotlyResult.vue.d.ts +1 -3
- package/dist/components/JobsStatusTray.vue.d.ts +9 -2
- package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
- package/dist/components/MobileSupportGate.vue.d.ts +1 -1
- package/dist/components/MoleculeInput.vue.d.ts +1 -1
- package/dist/components/NumberInput.vue.d.ts +1 -1
- package/dist/components/PlotlyChart.vue.d.ts +59 -0
- package/dist/components/PluginWorkspaceView.props.d.ts +29 -1
- package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
- package/dist/components/ProgressBar.vue.d.ts +1 -1
- package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
- package/dist/components/ReagentList.vue.d.ts +29 -1
- package/dist/components/ResourceCard.vue.d.ts +1 -1
- package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
- package/dist/components/SampleLegend.vue.d.ts +1 -1
- package/dist/components/SampleSelector.drag.d.ts +13 -0
- package/dist/components/SampleSelector.tree.d.ts +2 -0
- package/dist/components/SampleSelector.vue.d.ts +35 -2
- package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
- package/dist/components/SecretInput.vue.d.ts +28 -0
- package/dist/components/SequenceInput.vue.d.ts +1 -1
- package/dist/components/SettingsModal.vue.d.ts +1 -1
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -1
- package/dist/components/StatusIndicator.vue.d.ts +1 -1
- package/dist/components/TagsInput.vue.d.ts +1 -1
- package/dist/components/TimePicker.vue.d.ts +2 -1
- package/dist/components/TimeRangeInput.vue.d.ts +1 -1
- package/dist/components/UnitInput.vue.d.ts +1 -1
- package/dist/components/WellPlate.geometry.d.ts +15 -0
- package/dist/components/WellPlate.interaction.d.ts +13 -0
- package/dist/components/WellPlate.vue.d.ts +30 -1
- package/dist/components/fileBrowserPresentation.d.ts +10 -0
- package/dist/components/index.d.ts +13 -0
- package/dist/components/index.js +8 -8
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
- package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
- package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +34 -0
- package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +25 -0
- package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +26 -0
- package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +18 -0
- package/dist/components/internal/FilePickerTreeInternal.vue.d.ts +31 -0
- package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
- package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
- package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
- package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
- package/dist/{components-DkHddRMl.js → components-DIum5hkx.js} +5882 -3200
- package/dist/components-DIum5hkx.js.map +1 -0
- package/dist/composables/controlSchemaTypes.d.ts +34 -0
- package/dist/composables/filePicker/localFiles.d.ts +3 -0
- package/dist/composables/filePicker/usePickerNavigation.d.ts +96 -0
- package/dist/composables/filePicker/usePickerSelection.d.ts +31 -0
- package/dist/composables/filePicker/validation.d.ts +5 -0
- package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
- package/dist/composables/index.d.ts +11 -2
- package/dist/composables/index.js +10 -10
- package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
- package/dist/composables/useApi.d.ts +14 -7
- package/dist/composables/useAsync.d.ts +5 -1
- package/dist/composables/useBioTemplateWorkspace.d.ts +4 -20
- package/dist/composables/useCommandHistory.d.ts +5 -1
- package/dist/composables/useDropdownState.d.ts +18 -2
- package/dist/composables/useEventStream.d.ts +9 -0
- package/dist/composables/useFileBrowser.d.ts +55 -0
- package/dist/composables/useFilePicker.d.ts +189 -0
- package/dist/composables/useFocusTrap.d.ts +21 -0
- package/dist/composables/useGeneratedAnalysis.d.ts +3 -1
- package/dist/composables/useJobsStatusTray.d.ts +25 -1
- package/dist/composables/useListReorder.d.ts +90 -0
- package/dist/composables/useMenuKeyboard.d.ts +29 -0
- package/dist/composables/useOptimisticMutation.d.ts +5 -1
- package/dist/composables/usePlatformFilePickerAdapter.d.ts +11 -0
- package/dist/composables/usePluginClient.d.ts +2 -0
- package/dist/composables/usePluginConfig.d.ts +27 -0
- package/dist/composables/usePluginWorkspace.d.ts +51 -0
- package/dist/composables/useRequestSyncState.d.ts +42 -2
- package/dist/composables/useResourceCrud.d.ts +5 -1
- package/dist/composables/useRovingFocus.d.ts +24 -0
- package/dist/composables/useScheduleDrag.d.ts +1 -0
- package/dist/composables/useWellPainting.d.ts +5 -1
- package/dist/composables/useWellPlateAdapter.d.ts +5 -1
- package/dist/composables/useWellPlateValidation.d.ts +5 -1
- package/dist/composables/workspaceRecipes.d.ts +188 -0
- package/dist/{composables-C_i90sGS.js → composables-mFXsTA4g.js} +502 -86
- package/dist/composables-mFXsTA4g.js.map +1 -0
- package/dist/{useApi-J6zFkHmn.js → errors-BLuqMee5.js} +179 -16
- package/dist/errors-BLuqMee5.js.map +1 -0
- package/dist/{experiment-Cq145oEW.js → experiment-CVDRAnqp.js} +3 -8
- package/dist/experiment-CVDRAnqp.js.map +1 -0
- package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-CV2Wza3z.js} +70 -51
- package/dist/experiment-utils-CV2Wza3z.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +15 -15
- package/dist/install.js +2 -7
- package/dist/install.js.map +1 -1
- package/dist/permissions.d.ts +42 -1
- package/dist/permissions.js +20 -10
- package/dist/permissions.js.map +1 -1
- package/dist/stores/auth.d.ts +6 -0
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +3 -3
- package/dist/stores/settings.d.ts +31 -1
- package/dist/styles.css +15135 -32397
- package/dist/templates/builderReadUtils.d.ts +1 -1
- package/dist/templates/index.js +2 -4
- package/dist/{templates-DsP51i-S.js → templates-CmGfmBRA.js} +303 -106
- package/dist/templates-CmGfmBRA.js.map +1 -0
- package/dist/types/auth.d.ts +1 -0
- package/dist/types/fileBrowserTypes.d.ts +77 -0
- package/dist/types/filePicker.d.ts +77 -0
- package/dist/types/form-builder.d.ts +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/{useControlSchema-BDx2Olha.js → useControlSchema-DldpxNOP.js} +499 -1162
- package/dist/useControlSchema-DldpxNOP.js.map +1 -0
- package/dist/{useDropdownState-DSb3BC3N.js → useDropdownState-C7hRiVQf.js} +22 -6
- package/dist/useDropdownState-C7hRiVQf.js.map +1 -0
- package/dist/{useExperimentSelector-CV4iNfMS.js → useExperimentSelector-CEcIaueJ.js} +4 -4
- package/dist/{useExperimentSelector-CV4iNfMS.js.map → useExperimentSelector-CEcIaueJ.js.map} +1 -1
- package/dist/{useFormBuilder-BLxG3BOX.js → useFormBuilder-z5L_dUIy.js} +2 -2
- package/dist/{useFormBuilder-BLxG3BOX.js.map → useFormBuilder-z5L_dUIy.js.map} +1 -1
- package/dist/utils/color.d.ts +13 -0
- package/dist/utils/errors.d.ts +9 -0
- package/dist/utils/pluginSecrets.d.ts +53 -0
- package/dist/utils/records.d.ts +4 -0
- package/dist/{useProtocolTemplates-CS_SQl6U.js → validation-uwoJGEb6.js} +811 -212
- package/dist/validation-uwoJGEb6.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/apiErrors.test.ts +81 -0
- package/src/__tests__/components/ActionMenu.test.ts +94 -0
- package/src/__tests__/components/AppAvatarMenu.test.ts +123 -0
- package/src/__tests__/components/BaseTabs.test.ts +67 -0
- package/src/__tests__/components/DataFrame.test.ts +183 -11
- package/src/__tests__/components/DataStates.test.ts +176 -0
- package/src/__tests__/components/DatePicker.test.ts +76 -0
- package/src/__tests__/components/DateTimePicker.test.ts +36 -0
- package/src/__tests__/components/DropdownButton.test.ts +134 -0
- package/src/__tests__/components/ExperimentPopover.test.ts +30 -0
- package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
- package/src/__tests__/components/FileBrowserModal.test.ts +460 -0
- package/src/__tests__/components/FilePicker.state.test.ts +287 -0
- package/src/__tests__/components/FilePicker.test.ts +487 -0
- package/src/__tests__/components/GeneratedPlotlyResult.test.ts +52 -5
- package/src/__tests__/components/GroupAssigner.test.ts +53 -0
- package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
- package/src/__tests__/components/PlotlyChart.test.ts +305 -0
- package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +230 -0
- package/src/__tests__/components/RackEditor.test.ts +35 -0
- package/src/__tests__/components/ReagentList.test.ts +64 -2
- package/src/__tests__/components/RetiredStyles.test.ts +31 -0
- package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
- package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
- package/src/__tests__/components/SecretInput.test.ts +87 -0
- package/src/__tests__/components/SegmentedControl.test.ts +107 -0
- package/src/__tests__/components/TimePicker.test.ts +61 -0
- package/src/__tests__/components/WellEditPopupInternal.test.ts +108 -0
- package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
- package/src/__tests__/components/iconButtonIconSizing.test.ts +18 -0
- package/src/__tests__/composables/useApi.test.ts +92 -9
- package/src/__tests__/composables/useAuth.test.ts +2 -0
- package/src/__tests__/composables/useDropdownState.test.ts +58 -1
- package/src/__tests__/composables/useFileBrowser.test.ts +305 -0
- package/src/__tests__/composables/useGeneratedAnalysis.test.ts +7 -2
- package/src/__tests__/composables/useListReorder.test.ts +145 -0
- package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +67 -0
- package/src/__tests__/composables/usePluginClient.test.ts +143 -0
- package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
- package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +39 -7
- package/src/__tests__/stores/settings.test.ts +71 -1
- package/src/__tests__/styles/cssTokens.test.ts +131 -0
- package/src/__tests__/utils/permissions.test.ts +68 -0
- package/src/apiErrors.ts +85 -0
- package/src/components/ActionMenu.vue +45 -88
- package/src/components/AlertBox.vue +0 -4
- package/src/components/AppAvatarMenu.vue +26 -7
- package/src/components/AppLayout.vue +0 -4
- package/src/components/AppPluginSwitcher.story.vue +87 -0
- package/src/components/AppPluginSwitcher.vue +2 -5
- package/src/components/AppSidebar.vue +0 -4
- package/src/components/AppToastContainer.vue +6 -8
- package/src/components/AppTopBar.vue +0 -4
- package/src/components/ArtifactSaveDialog.vue +0 -4
- package/src/components/ArtifactSelectorModal.vue +0 -4
- package/src/components/AuditTrail.story.vue +18 -0
- package/src/components/AuditTrail.vue +27 -7
- package/src/components/AutoGroupModal.vue +0 -4
- package/src/components/Avatar.vue +0 -4
- package/src/components/BaseButton.vue +0 -4
- package/src/components/BaseCheckbox.vue +0 -4
- package/src/components/BaseInput.vue +0 -4
- package/src/components/BaseModal.vue +8 -60
- package/src/components/BasePill.vue +0 -4
- package/src/components/BaseRadioGroup.vue +0 -4
- package/src/components/BaseSelect.vue +0 -4
- package/src/components/BaseSlider.vue +0 -4
- package/src/components/BaseTabs.vue +26 -5
- package/src/components/BaseTextarea.vue +0 -4
- package/src/components/BaseToggle.vue +0 -4
- package/src/components/BatchProgressList.story.vue +18 -0
- package/src/components/BatchProgressList.vue +32 -4
- package/src/components/BioTemplateExperimentWorkspaceView.vue +10 -21
- package/src/components/BioTemplatePackWorkspaceView.vue +11 -15
- package/src/components/BioTemplatePresetWorkspaceView.vue +8 -13
- package/src/components/Breadcrumb.vue +0 -4
- package/src/components/Calendar.vue +0 -4
- package/src/components/ChartContainer.story.vue +1 -1
- package/src/components/ChartContainer.vue +0 -4
- package/src/components/ChemicalFormula.vue +0 -4
- package/src/components/CollapsibleCard.vue +0 -4
- package/src/components/ColorSlider.vue +0 -4
- package/src/components/ComponentBindingRenderer.vue +1 -3
- package/src/components/ConcentrationInput.vue +0 -4
- package/src/components/ConfirmDialog.vue +0 -4
- package/src/components/ControlWorkspaceView.vue +11 -22
- package/src/components/DataFrame.story.vue +14 -0
- package/src/components/DataFrame.vue +97 -23
- package/src/components/DatePicker.vue +73 -27
- package/src/components/DateTimePicker.vue +45 -17
- package/src/components/Divider.vue +0 -4
- package/src/components/DoseCalculator.vue +0 -4
- package/src/components/DoseDesignWorkspaceView.vue +6 -25
- package/src/components/DropdownButton.vue +24 -6
- package/src/components/EmptyState.vue +0 -4
- package/src/components/ExperimentCodeBadge.vue +0 -4
- package/src/components/ExperimentDataViewer.story.vue +3 -0
- package/src/components/ExperimentDataViewer.vue +33 -13
- package/src/components/ExperimentPopover.vue +12 -7
- package/src/components/ExperimentSelectorModal.vue +0 -4
- package/src/components/ExperimentTimeline.story.vue +18 -0
- package/src/components/ExperimentTimeline.vue +81 -75
- package/src/components/FileBrowserModal.story.vue +203 -0
- package/src/components/FileBrowserModal.vue +384 -0
- package/src/components/FilePicker.story.vue +44 -0
- package/src/components/FilePicker.vue +284 -0
- package/src/components/FileUploader.vue +32 -18
- package/src/components/FitPanel.vue +0 -4
- package/src/components/FormActions.story.vue +96 -0
- package/src/components/FormActions.vue +0 -4
- package/src/components/FormBuilder.vue +0 -4
- package/src/components/FormField.vue +0 -4
- package/src/components/FormulaInput.vue +0 -4
- package/src/components/GeneratedPathInput.story.vue +68 -0
- package/src/components/GeneratedPlotlyResult.story.vue +96 -0
- package/src/components/GeneratedPlotlyResult.vue +34 -69
- package/src/components/GeneratedPluginView.story.vue +145 -0
- package/src/components/GeneratedPluginView.vue +10 -10
- package/src/components/GeneratedResultRenderer.story.vue +117 -0
- package/src/components/GeneratedResultRenderer.vue +4 -9
- package/src/components/GroupAssigner.vue +67 -5
- package/src/components/IconButton.vue +0 -4
- package/src/components/InstrumentAlertLog.vue +0 -4
- package/src/components/InstrumentStateBadge.vue +0 -4
- package/src/components/InstrumentStatusCard.vue +0 -4
- package/src/components/JobsStatusTray.vue +16 -5
- package/src/components/LcmsSequenceTable.vue +81 -50
- package/src/components/LoadingSpinner.vue +0 -4
- package/src/components/MobileSupportGate.vue +0 -4
- package/src/components/MoleculeInput.vue +0 -4
- package/src/components/MultiSelect.vue +0 -4
- package/src/components/NumberInput.vue +0 -4
- package/src/components/PlateMapEditor.vue +3 -14
- package/src/components/PlotlyChart.story.vue +61 -0
- package/src/components/PlotlyChart.vue +233 -0
- package/src/components/PluginIcon.vue +0 -4
- package/src/components/PluginWorkspaceView.props.ts +38 -0
- package/src/components/PluginWorkspaceView.vue +53 -224
- package/src/components/ProgressBar.vue +0 -4
- package/src/components/ProtocolStepEditor.vue +2 -4
- package/src/components/RackEditor.vue +51 -70
- package/src/components/ReagentEditor.vue +0 -4
- package/src/components/ReagentList.story.vue +18 -0
- package/src/components/ReagentList.vue +127 -82
- package/src/components/ResourceCard.vue +0 -4
- package/src/components/RuntimeUpdateNotice.story.vue +49 -0
- package/src/components/RuntimeUpdateNotice.vue +4 -4
- package/src/components/SampleHierarchyTree.story.vue +18 -0
- package/src/components/SampleHierarchyTree.vue +32 -9
- package/src/components/SampleLegend.vue +2 -8
- package/src/components/SampleSelector.drag.ts +51 -0
- package/src/components/SampleSelector.story.vue +6 -0
- package/src/components/SampleSelector.tree.ts +2 -0
- package/src/components/SampleSelector.vue +49 -10
- package/src/components/SampleSelectorGroupNode.vue +19 -0
- package/src/components/ScheduleCalendar.story.vue +6 -0
- package/src/components/ScheduleCalendar.vue +82 -7
- package/src/components/ScientificNumber.vue +0 -4
- package/src/components/SecretInput.story.vue +79 -0
- package/src/components/SecretInput.vue +150 -0
- package/src/components/SectionCard.vue +0 -4
- package/src/components/SegmentedControl.vue +50 -7
- package/src/components/SequenceInput.vue +0 -4
- package/src/components/SequenceProgressBar.story.vue +110 -0
- package/src/components/SequenceProgressBar.vue +0 -4
- package/src/components/SettingsModal.vue +0 -4
- package/src/components/Skeleton.vue +0 -4
- package/src/components/SmartGroupFieldRecipe.vue +8 -6
- package/src/components/SmartGroupManual.vue +0 -4
- package/src/components/StatusIndicator.vue +0 -4
- package/src/components/StepWizard.vue +0 -4
- package/src/components/TagsInput.vue +4 -6
- package/src/components/ThemeToggle.vue +0 -4
- package/src/components/TimePicker.vue +36 -7
- package/src/components/TimeRangeInput.vue +0 -4
- package/src/components/Tooltip.story.vue +3 -3
- package/src/components/Tooltip.vue +0 -4
- package/src/components/UnitInput.vue +0 -4
- package/src/components/WellPlate.geometry.ts +60 -1
- package/src/components/WellPlate.interaction.ts +44 -0
- package/src/components/WellPlate.story.vue +8 -0
- package/src/components/WellPlate.vue +53 -7
- package/src/components/fileBrowserPresentation.ts +39 -0
- package/src/components/index.ts +14 -0
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
- package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
- package/src/components/internal/DataStateInternal.vue +74 -0
- package/src/components/internal/FileBrowserDialogInternal.vue +75 -0
- package/src/components/internal/FileBrowserListingInternal.vue +197 -0
- package/src/components/internal/FileBrowserToolbarInternal.vue +136 -0
- package/src/components/internal/FilePickerPreviewInternal.vue +100 -0
- package/src/components/internal/FilePickerTreeInternal.vue +238 -0
- package/src/components/internal/FormSectionRenderer.vue +0 -4
- package/src/components/internal/WellEditPopupInternal.vue +20 -5
- package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
- package/src/components/internal/WorkspaceShellInternal.vue +125 -0
- package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
- package/src/composables/controlSchemaTypes.ts +34 -0
- package/src/composables/experimentDesignData.ts +1 -3
- package/src/composables/filePicker/localFiles.ts +58 -0
- package/src/composables/filePicker/usePickerNavigation.ts +220 -0
- package/src/composables/filePicker/usePickerSelection.ts +259 -0
- package/src/composables/filePicker/validation.ts +41 -0
- package/src/composables/flattenWorkspaceBindings.ts +104 -0
- package/src/composables/formBuilderRegistry.ts +5 -0
- package/src/composables/index.ts +50 -0
- package/src/composables/pluginWorkspaceModel.ts +182 -0
- package/src/composables/useApi.ts +57 -13
- package/src/composables/useAsync.ts +5 -1
- package/src/composables/useAuth.ts +3 -0
- package/src/composables/useBioTemplatePackWorkspace.ts +15 -9
- package/src/composables/useBioTemplatePresetWorkspace.ts +14 -15
- package/src/composables/useBioTemplateWorkspace.ts +18 -43
- package/src/composables/useCommandHistory.ts +5 -1
- package/src/composables/useDropdownState.ts +35 -5
- package/src/composables/useEventStream.ts +14 -2
- package/src/composables/useFileBrowser.ts +314 -0
- package/src/composables/useFileImport.ts +2 -7
- package/src/composables/useFilePicker.ts +366 -0
- package/src/composables/useFocusTrap.ts +91 -0
- package/src/composables/useGeneratedAnalysis.ts +32 -27
- package/src/composables/useJobsStatusTray.ts +184 -17
- package/src/composables/useListReorder.story.vue +143 -0
- package/src/composables/useListReorder.ts +242 -0
- package/src/composables/useMenuKeyboard.ts +90 -0
- package/src/composables/useOptimisticMutation.ts +6 -16
- package/src/composables/usePlatformFilePickerAdapter.ts +104 -0
- package/src/composables/usePluginClient.ts +50 -4
- package/src/composables/usePluginConfig.ts +252 -0
- package/src/composables/usePluginWorkspace.ts +208 -0
- package/src/composables/useRackEditor.ts +2 -11
- package/src/composables/useRequestSyncState.ts +98 -28
- package/src/composables/useResourceCrud.ts +6 -16
- package/src/composables/useRovingFocus.ts +66 -0
- package/src/composables/useScheduleDrag.ts +37 -0
- package/src/composables/useWellPainting.ts +10 -30
- package/src/composables/useWellPlateAdapter.ts +5 -1
- package/src/composables/useWellPlateEditor.ts +1 -11
- package/src/composables/useWellPlateValidation.ts +5 -1
- package/src/composables/workspaceRecipes.ts +267 -0
- package/src/index.ts +19 -0
- package/src/permissions.ts +48 -9
- package/src/stores/auth.ts +1 -0
- package/src/stores/experiment.ts +2 -7
- package/src/stores/index.ts +9 -1
- package/src/stores/settings.ts +93 -1
- package/src/styles/components/audit-trail.css +5 -5
- package/src/styles/components/batch-progress-list.css +7 -0
- package/src/styles/components/color-slider.css +2 -2
- package/src/styles/components/data-state.css +30 -0
- package/src/styles/components/dataframe.css +29 -35
- package/src/styles/components/experiment-data-viewer.css +4 -4
- package/src/styles/components/experiment-timeline.css +3 -30
- package/src/styles/components/file-browser-modal.css +489 -0
- package/src/styles/components/file-picker.css +502 -0
- package/src/styles/components/form-builder.css +5 -5
- package/src/styles/components/icon-button.css +9 -0
- package/src/styles/components/lcms-sequence-table.css +16 -1
- package/src/styles/components/multi-select.css +1 -1
- package/src/styles/components/reagent-list.css +38 -31
- package/src/styles/components/sample-hierarchy-tree.css +5 -19
- package/src/styles/components/sample-selector.css +9 -2
- package/src/styles/components/schedule-calendar.css +8 -0
- package/src/styles/components/scientific-number.css +1 -1
- package/src/styles/components/secret-input.css +60 -0
- package/src/styles/components/well-plate.css +8 -0
- package/src/styles/index.css +12 -0
- package/src/styles/variables.css +29 -0
- package/src/templates/builderPresetControls.ts +1 -1
- package/src/templates/builderReadUtils.ts +1 -3
- package/src/templates/componentPlateHelpers.ts +3 -1
- package/src/templates/componentTargetResolvers.ts +1 -3
- package/src/templates/controlSchemaTargets.ts +1 -3
- package/src/templates/doseResponseAdapters.ts +2 -13
- package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
- package/src/templates/plateMapBuilder.ts +2 -2
- package/src/templates/qpcrPlateBuilder.ts +1 -1
- package/src/templates/templateValidators.ts +1 -1
- package/src/templates/timeCourseBuilder.ts +2 -2
- package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
- package/src/types/auth.ts +1 -0
- package/src/types/fileBrowserTypes.ts +85 -0
- package/src/types/filePicker.ts +72 -0
- package/src/types/form-builder.ts +1 -0
- package/src/types/index.ts +14 -0
- package/src/utils/color.ts +51 -0
- package/src/utils/errors.ts +29 -0
- package/src/utils/formModelSync.ts +1 -3
- package/src/utils/pluginIcon.ts +1 -3
- package/src/utils/pluginSecrets.ts +102 -0
- package/src/utils/records.ts +9 -0
- package/dist/EmptyState-p90quq8Z.js.map +0 -1
- package/dist/ExperimentPopover-tLwJ7XF4.js.map +0 -1
- package/dist/ExperimentSelectorModal-DyPAUCLw.js.map +0 -1
- package/dist/SettingsModal-BgKY93zh.js.map +0 -1
- package/dist/components-DkHddRMl.js.map +0 -1
- package/dist/composables/autoGroupConstants.d.ts +0 -1
- package/dist/composables/autoGroupGrouping.d.ts +0 -3
- package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
- package/dist/composables-C_i90sGS.js.map +0 -1
- package/dist/experiment-Cq145oEW.js.map +0 -1
- package/dist/experiment-utils-CLnzPPq5.js.map +0 -1
- package/dist/templates/builderDefaults.d.ts +0 -1
- package/dist/templates/plateGeometry.d.ts +0 -4
- package/dist/templates-DsP51i-S.js.map +0 -1
- package/dist/useApi-J6zFkHmn.js.map +0 -1
- package/dist/useControlSchema-BDx2Olha.js.map +0 -1
- package/dist/useDropdownState-DSb3BC3N.js.map +0 -1
- package/dist/useProtocolTemplates-CS_SQl6U.js.map +0 -1
- package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
- package/src/composables/autoGroupConstants.ts +0 -4
- package/src/composables/autoGroupGrouping.ts +0 -148
- package/src/composables/useAutoGroupInputSources.ts +0 -147
- package/src/templates/builderDefaults.ts +0 -11
- package/src/templates/plateGeometry.ts +0 -62
- /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → apiErrors.test.d.ts} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import axios, { type AxiosInstance, type AxiosRequestConfig, type InternalAxiosRequestConfig } from 'axios'
|
|
2
2
|
import { useSettingsStore } from '../stores/settings'
|
|
3
3
|
import { useAuthStore } from '../stores/auth'
|
|
4
|
+
import { MintApiError, mintApiErrorFromResponse } from '../apiErrors'
|
|
4
5
|
|
|
5
6
|
let apiClientInstance: AxiosInstance | null = null
|
|
6
7
|
let interceptorAttached = false
|
|
@@ -8,11 +9,13 @@ let interceptorAttached = false
|
|
|
8
9
|
interface MintAxiosRequestConfig extends AxiosRequestConfig {
|
|
9
10
|
_mintSkipAuth?: boolean
|
|
10
11
|
_mintAuthToken?: string
|
|
12
|
+
_mintTypedErrors?: boolean
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
interface MintInternalAxiosRequestConfig extends InternalAxiosRequestConfig {
|
|
14
16
|
_mintSkipAuth?: boolean
|
|
15
17
|
_mintAuthToken?: string
|
|
18
|
+
_mintTypedErrors?: boolean
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
type MutableHeaders = Record<string, unknown> & {
|
|
@@ -103,14 +106,27 @@ function getAuthorizationHeader(headers: AxiosRequestConfig['headers']): unknown
|
|
|
103
106
|
return key ? bag[key] : undefined
|
|
104
107
|
}
|
|
105
108
|
|
|
106
|
-
/**
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
/**
|
|
110
|
+
* Raised when an authenticated SDK request is rejected because the login is no
|
|
111
|
+
* longer valid. It is also a `MintApiError` (status 401), so typed-error callers
|
|
112
|
+
* and `instanceof AuthenticationRequiredError` callers both recognise it.
|
|
113
|
+
*/
|
|
114
|
+
export class AuthenticationRequiredError extends MintApiError {
|
|
115
|
+
override readonly name: string = 'AuthenticationRequiredError'
|
|
116
|
+
declare readonly code: 'AUTHENTICATION_REQUIRED'
|
|
117
|
+
declare readonly status: 401
|
|
118
|
+
|
|
119
|
+
constructor(cause?: unknown, envelope?: MintApiError) {
|
|
120
|
+
super(
|
|
121
|
+
'Authentication required. Please sign in again.',
|
|
122
|
+
'AUTHENTICATION_REQUIRED',
|
|
123
|
+
401,
|
|
124
|
+
envelope?.requestId ?? null,
|
|
125
|
+
envelope?.details ?? null,
|
|
126
|
+
envelope?.detail,
|
|
127
|
+
envelope?.body ?? null,
|
|
128
|
+
cause,
|
|
129
|
+
)
|
|
114
130
|
}
|
|
115
131
|
}
|
|
116
132
|
|
|
@@ -118,12 +134,13 @@ export class AuthenticationRequiredError extends Error {
|
|
|
118
134
|
export function authenticationRequiredError(
|
|
119
135
|
cause: unknown,
|
|
120
136
|
rejectedToken?: string,
|
|
137
|
+
envelope?: MintApiError,
|
|
121
138
|
): AuthenticationRequiredError {
|
|
122
139
|
const currentAuthStore = useAuthStore()
|
|
123
140
|
if (rejectedToken && currentAuthStore.token === rejectedToken) {
|
|
124
141
|
currentAuthStore.clearToken()
|
|
125
142
|
}
|
|
126
|
-
return new AuthenticationRequiredError(cause)
|
|
143
|
+
return new AuthenticationRequiredError(cause, envelope)
|
|
127
144
|
}
|
|
128
145
|
|
|
129
146
|
function getApiClient(): AxiosInstance {
|
|
@@ -141,6 +158,8 @@ export interface ApiClientOptions {
|
|
|
141
158
|
baseUrl?: string
|
|
142
159
|
timeout?: number
|
|
143
160
|
withAuth?: boolean
|
|
161
|
+
/** Normalize failed responses into MintApiError. Generated clients enable this by default. */
|
|
162
|
+
typedErrors?: boolean
|
|
144
163
|
}
|
|
145
164
|
|
|
146
165
|
export interface UseApiReturn {
|
|
@@ -187,11 +206,35 @@ export function useApi(options: ApiClientOptions = {}): UseApiReturn {
|
|
|
187
206
|
})
|
|
188
207
|
apiClient.interceptors.response.use(
|
|
189
208
|
(response) => response,
|
|
190
|
-
(error: unknown) => {
|
|
191
|
-
if (axios.isAxiosError(error) && error.response
|
|
209
|
+
async (error: unknown) => {
|
|
210
|
+
if (axios.isAxiosError(error) && error.response) {
|
|
192
211
|
const request = error.config as MintInternalAxiosRequestConfig | undefined
|
|
193
|
-
if (request?.
|
|
194
|
-
|
|
212
|
+
if (request?._mintTypedErrors) {
|
|
213
|
+
let payload: unknown = error.response.data
|
|
214
|
+
if (payload instanceof Blob) {
|
|
215
|
+
try {
|
|
216
|
+
payload = JSON.parse(await payload.text())
|
|
217
|
+
} catch {
|
|
218
|
+
// Keep non-JSON download errors available as the original body.
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const typed = mintApiErrorFromResponse(
|
|
222
|
+
error.response.status,
|
|
223
|
+
payload,
|
|
224
|
+
{
|
|
225
|
+
requestId: String(error.response.headers?.['x-request-id'] ?? '') || null,
|
|
226
|
+
cause: error,
|
|
227
|
+
},
|
|
228
|
+
)
|
|
229
|
+
if (error.response.status === 401 && request._mintSkipAuth !== true) {
|
|
230
|
+
return Promise.reject(authenticationRequiredError(error, request._mintAuthToken, typed))
|
|
231
|
+
}
|
|
232
|
+
return Promise.reject(typed)
|
|
233
|
+
}
|
|
234
|
+
if (error.response.status === 401) {
|
|
235
|
+
if (request?._mintSkipAuth !== true) {
|
|
236
|
+
return Promise.reject(authenticationRequiredError(error, request?._mintAuthToken))
|
|
237
|
+
}
|
|
195
238
|
}
|
|
196
239
|
}
|
|
197
240
|
return Promise.reject(error)
|
|
@@ -213,6 +256,7 @@ export function useApi(options: ApiClientOptions = {}): UseApiReturn {
|
|
|
213
256
|
const base: MintAxiosRequestConfig = {
|
|
214
257
|
baseURL: getBaseUrl(),
|
|
215
258
|
timeout: options.timeout ?? settingsStore.requestTimeout,
|
|
259
|
+
_mintTypedErrors: options.typedErrors,
|
|
216
260
|
...config,
|
|
217
261
|
}
|
|
218
262
|
// Strip auth header if explicitly disabled
|
|
@@ -165,7 +165,11 @@ function defaultTransformError(error: unknown): AsyncError {
|
|
|
165
165
|
* const handleSubmit = () => submit(new FormData(formRef.value))
|
|
166
166
|
* ```
|
|
167
167
|
*/
|
|
168
|
-
/**
|
|
168
|
+
/**
|
|
169
|
+
* Wraps an async function with reactive loading, error, and success state plus optional auto-execute.
|
|
170
|
+
*
|
|
171
|
+
* @deprecated Unused by the MINT platform and scheduled for removal in MINT 1.3; use `useRequestSyncState()` instead.
|
|
172
|
+
*/
|
|
169
173
|
export function useAsync<T>(
|
|
170
174
|
asyncFn: (...args: unknown[]) => Promise<T>,
|
|
171
175
|
options: UseAsyncOptions<T> = {}
|
|
@@ -93,6 +93,7 @@ export function useAuth(): UseAuthReturn {
|
|
|
93
93
|
passkey_enabled: boolean
|
|
94
94
|
passkey_registered?: boolean
|
|
95
95
|
registration_enabled?: boolean
|
|
96
|
+
database_mode?: string
|
|
96
97
|
access?: {
|
|
97
98
|
experiment_visibility_mode?: 'open' | 'restricted'
|
|
98
99
|
experimentVisibilityMode?: 'open' | 'restricted'
|
|
@@ -104,6 +105,7 @@ export function useAuth(): UseAuthReturn {
|
|
|
104
105
|
passkeyEnabled: response.data.passkey_enabled,
|
|
105
106
|
passkeyRegistered: response.data.passkey_registered ?? false,
|
|
106
107
|
registrationEnabled: response.data.registration_enabled ?? false,
|
|
108
|
+
databaseMode: response.data.database_mode ?? 'none',
|
|
107
109
|
experimentVisibilityMode:
|
|
108
110
|
response.data.access?.experiment_visibility_mode
|
|
109
111
|
?? response.data.access?.experimentVisibilityMode
|
|
@@ -119,6 +121,7 @@ export function useAuth(): UseAuthReturn {
|
|
|
119
121
|
passkeyEnabled: false,
|
|
120
122
|
passkeyRegistered: false,
|
|
121
123
|
registrationEnabled: false,
|
|
124
|
+
databaseMode: 'none',
|
|
122
125
|
experimentVisibilityMode: 'open',
|
|
123
126
|
}
|
|
124
127
|
}
|
|
@@ -27,6 +27,9 @@ import {
|
|
|
27
27
|
type BioTemplateWorkspaceBindings,
|
|
28
28
|
type UseBioTemplateWorkspaceReturn,
|
|
29
29
|
} from './useBioTemplateWorkspace'
|
|
30
|
+
import {
|
|
31
|
+
liftWorkspaceComponentBindings,
|
|
32
|
+
} from './flattenWorkspaceBindings'
|
|
30
33
|
import type {
|
|
31
34
|
BioTemplateComponentBinding,
|
|
32
35
|
BioTemplateComponentBindingsById,
|
|
@@ -120,14 +123,17 @@ export function useBioTemplatePackWorkspace(
|
|
|
120
123
|
const pillNav = computed(() => workspace.value.pillNav)
|
|
121
124
|
const topBarSettings = computed(() => workspace.value.topBarSettings)
|
|
122
125
|
const bindings = computed(() => workspace.value.bindings)
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
126
|
+
const {
|
|
127
|
+
componentBindings,
|
|
128
|
+
componentBindingsById,
|
|
129
|
+
componentImports,
|
|
130
|
+
componentProps,
|
|
131
|
+
componentPropsById,
|
|
132
|
+
componentPropsByComponent,
|
|
133
|
+
componentSnippets,
|
|
134
|
+
componentUsage,
|
|
135
|
+
getComponentProps: getWorkspaceComponentProps,
|
|
136
|
+
} = liftWorkspaceComponentBindings(workspace)
|
|
131
137
|
|
|
132
138
|
watch(collection, value => {
|
|
133
139
|
workspaceRef.value = createWorkspace(value)
|
|
@@ -181,7 +187,7 @@ export function useBioTemplatePackWorkspace(
|
|
|
181
187
|
componentPropsByComponent,
|
|
182
188
|
componentSnippets,
|
|
183
189
|
componentUsage,
|
|
184
|
-
getComponentProps:
|
|
190
|
+
getComponentProps: getWorkspaceComponentProps,
|
|
185
191
|
applyCollection,
|
|
186
192
|
resetToDefaultCollection,
|
|
187
193
|
save: templateCollection.save,
|
|
@@ -34,6 +34,9 @@ import {
|
|
|
34
34
|
type BioTemplateRendererBinding,
|
|
35
35
|
type UseBioTemplateWorkspaceReturn,
|
|
36
36
|
} from './useBioTemplateWorkspace'
|
|
37
|
+
import {
|
|
38
|
+
liftWorkspaceComponentBindings,
|
|
39
|
+
} from './flattenWorkspaceBindings'
|
|
37
40
|
import type {
|
|
38
41
|
BioTemplateComponentBinding,
|
|
39
42
|
BioTemplateComponentBindingsById,
|
|
@@ -138,14 +141,17 @@ export function useBioTemplatePresetWorkspace(
|
|
|
138
141
|
const collection = templateCollection.templateCollection
|
|
139
142
|
const workspace = computed(() => useBioTemplateWorkspace(collection.value, resolvedControlOptions))
|
|
140
143
|
const renderer = computed<BioTemplateRendererBinding>(() => ({ target: collection.value }))
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
144
|
+
const {
|
|
145
|
+
componentBindings,
|
|
146
|
+
componentBindingsById,
|
|
147
|
+
componentImports,
|
|
148
|
+
componentProps,
|
|
149
|
+
componentPropsById,
|
|
150
|
+
componentPropsByComponent,
|
|
151
|
+
componentSnippets,
|
|
152
|
+
componentUsage,
|
|
153
|
+
getComponentProps,
|
|
154
|
+
} = liftWorkspaceComponentBindings(workspace)
|
|
149
155
|
const form = reactive({
|
|
150
156
|
...controls.form,
|
|
151
157
|
modelValue: controlValues.value,
|
|
@@ -179,13 +185,6 @@ export function useBioTemplatePresetWorkspace(
|
|
|
179
185
|
...topBarSettings,
|
|
180
186
|
}))
|
|
181
187
|
|
|
182
|
-
function getComponentProps(
|
|
183
|
-
component: string,
|
|
184
|
-
options?: Parameters<UseBioTemplateWorkspaceReturn['getComponentProps']>[1],
|
|
185
|
-
) {
|
|
186
|
-
return workspace.value.getComponentProps(component, options)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
188
|
const bindings: BioTemplatePresetWorkspaceBindings = {
|
|
190
189
|
renderer,
|
|
191
190
|
form,
|
|
@@ -21,16 +21,12 @@ import {
|
|
|
21
21
|
} from './useBioTemplateControls'
|
|
22
22
|
import {
|
|
23
23
|
useBioTemplateComponents,
|
|
24
|
-
type BioTemplateComponentBinding,
|
|
25
|
-
type BioTemplateComponentBindingsById,
|
|
26
|
-
type BioTemplateComponentImport,
|
|
27
|
-
type BioTemplateComponentPropsByComponent,
|
|
28
|
-
type BioTemplateComponentPropsBinding,
|
|
29
|
-
type BioTemplateComponentPropsById,
|
|
30
|
-
type BioTemplateComponentSnippet,
|
|
31
|
-
type BioTemplateComponentUsage,
|
|
32
24
|
type UseBioTemplateComponentsReturn,
|
|
33
25
|
} from './useBioTemplateComponents'
|
|
26
|
+
import {
|
|
27
|
+
flattenWorkspaceComponentBindings,
|
|
28
|
+
type BioTemplateWorkspaceComponentBindings,
|
|
29
|
+
} from './flattenWorkspaceBindings'
|
|
34
30
|
|
|
35
31
|
export type BioTemplateWorkspaceTarget = BioTemplateControlTarget
|
|
36
32
|
|
|
@@ -38,24 +34,16 @@ export interface BioTemplateRendererBinding {
|
|
|
38
34
|
target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope
|
|
39
35
|
}
|
|
40
36
|
|
|
41
|
-
export interface BioTemplateWorkspaceBindings {
|
|
37
|
+
export interface BioTemplateWorkspaceBindings extends BioTemplateWorkspaceComponentBindings {
|
|
42
38
|
renderer: BioTemplateRendererBinding | null
|
|
43
39
|
form: ControlWorkspaceFormBinding
|
|
44
40
|
sidebar: ControlWorkspaceSidebarBinding
|
|
45
41
|
topBar: UseControlWorkspaceReturn<BioTemplateControlSchema>['bindings']['topBar']
|
|
46
42
|
topBarSettings: ControlWorkspaceTopBarSettingsBinding
|
|
47
43
|
pillNav: ControlWorkspacePillNavBinding
|
|
48
|
-
componentBindings: BioTemplateComponentBinding[]
|
|
49
|
-
componentBindingsById: BioTemplateComponentBindingsById
|
|
50
|
-
componentProps: BioTemplateComponentPropsBinding[]
|
|
51
|
-
componentPropsById: BioTemplateComponentPropsById
|
|
52
|
-
componentPropsByComponent: BioTemplateComponentPropsByComponent
|
|
53
|
-
componentSnippets: BioTemplateComponentSnippet[]
|
|
54
|
-
componentUsage: BioTemplateComponentUsage | null
|
|
55
|
-
getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
|
|
56
44
|
}
|
|
57
45
|
|
|
58
|
-
export interface UseBioTemplateWorkspaceReturn {
|
|
46
|
+
export interface UseBioTemplateWorkspaceReturn extends BioTemplateWorkspaceComponentBindings {
|
|
59
47
|
target: BioTemplateWorkspaceTarget
|
|
60
48
|
controls: UseControlSchemaReturn<BioTemplateControlSchema>
|
|
61
49
|
workspace: UseControlWorkspaceReturn<BioTemplateControlSchema>
|
|
@@ -70,15 +58,6 @@ export interface UseBioTemplateWorkspaceReturn {
|
|
|
70
58
|
topBarSettings: ControlWorkspaceTopBarSettingsBinding
|
|
71
59
|
bindings: BioTemplateWorkspaceBindings
|
|
72
60
|
renderer: BioTemplateRendererBinding | null
|
|
73
|
-
componentBindings: BioTemplateComponentBinding[]
|
|
74
|
-
componentBindingsById: BioTemplateComponentBindingsById
|
|
75
|
-
componentImports: BioTemplateComponentImport[]
|
|
76
|
-
componentProps: BioTemplateComponentPropsBinding[]
|
|
77
|
-
componentPropsById: BioTemplateComponentPropsById
|
|
78
|
-
componentPropsByComponent: BioTemplateComponentPropsByComponent
|
|
79
|
-
componentSnippets: BioTemplateComponentSnippet[]
|
|
80
|
-
componentUsage: BioTemplateComponentUsage | null
|
|
81
|
-
getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
|
|
82
61
|
}
|
|
83
62
|
|
|
84
63
|
/** One-stop wiring for BioTemplateRenderer, FormBuilder, AppSidebar, and template-aware SDK components. */
|
|
@@ -90,21 +69,25 @@ export function useBioTemplateWorkspace(
|
|
|
90
69
|
const workspace = useControlWorkspace(controls.controls, options)
|
|
91
70
|
const components = useBioTemplateComponents(target)
|
|
92
71
|
const renderer = isTemplateObjectTarget(target) ? { target } : null
|
|
93
|
-
const
|
|
94
|
-
renderer,
|
|
95
|
-
form: workspace.bindings.form,
|
|
96
|
-
sidebar: workspace.bindings.sidebar,
|
|
97
|
-
topBar: workspace.bindings.topBar,
|
|
98
|
-
topBarSettings: workspace.bindings.topBarSettings,
|
|
99
|
-
pillNav: workspace.bindings.pillNav,
|
|
72
|
+
const componentBindings = flattenWorkspaceComponentBindings({
|
|
100
73
|
componentBindings: components.bindings,
|
|
101
74
|
componentBindingsById: components.componentBindingsById,
|
|
75
|
+
componentImports: components.imports,
|
|
102
76
|
componentProps: components.componentProps,
|
|
103
77
|
componentPropsById: components.componentPropsById,
|
|
104
78
|
componentPropsByComponent: components.componentPropsByComponent,
|
|
105
79
|
componentSnippets: components.snippets,
|
|
106
80
|
componentUsage: components.usage,
|
|
107
81
|
getComponentProps: components.getComponentProps,
|
|
82
|
+
})
|
|
83
|
+
const bindings: BioTemplateWorkspaceBindings = {
|
|
84
|
+
renderer,
|
|
85
|
+
form: workspace.bindings.form,
|
|
86
|
+
sidebar: workspace.bindings.sidebar,
|
|
87
|
+
topBar: workspace.bindings.topBar,
|
|
88
|
+
topBarSettings: workspace.bindings.topBarSettings,
|
|
89
|
+
pillNav: workspace.bindings.pillNav,
|
|
90
|
+
...componentBindings,
|
|
108
91
|
}
|
|
109
92
|
|
|
110
93
|
return {
|
|
@@ -122,15 +105,7 @@ export function useBioTemplateWorkspace(
|
|
|
122
105
|
topBarSettings: workspace.topBarSettings,
|
|
123
106
|
bindings,
|
|
124
107
|
renderer,
|
|
125
|
-
componentBindings
|
|
126
|
-
componentBindingsById: components.componentBindingsById,
|
|
127
|
-
componentImports: components.imports,
|
|
128
|
-
componentProps: components.componentProps,
|
|
129
|
-
componentPropsById: components.componentPropsById,
|
|
130
|
-
componentPropsByComponent: components.componentPropsByComponent,
|
|
131
|
-
componentSnippets: components.snippets,
|
|
132
|
-
componentUsage: components.usage,
|
|
133
|
-
getComponentProps: components.getComponentProps,
|
|
108
|
+
...componentBindings,
|
|
134
109
|
}
|
|
135
110
|
}
|
|
136
111
|
|
|
@@ -31,7 +31,11 @@ export interface UseCommandHistoryReturn<TCommand extends CommandHistoryCommand
|
|
|
31
31
|
clear: () => void
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Generic command-stack state for plugin editors with undo/redo controls.
|
|
36
|
+
*
|
|
37
|
+
* @deprecated Unused by the MINT platform and scheduled for removal in MINT 1.3; keep command stacks plugin-local.
|
|
38
|
+
*/
|
|
35
39
|
export function useCommandHistory<TCommand extends CommandHistoryCommand = CommandHistoryCommand>(
|
|
36
40
|
options: UseCommandHistoryOptions = {},
|
|
37
41
|
): UseCommandHistoryReturn<TCommand> {
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import { ref, type Ref } from 'vue'
|
|
1
|
+
import { nextTick, ref, type Ref } from 'vue'
|
|
2
2
|
import { useEventListener } from './useEventListener'
|
|
3
3
|
|
|
4
4
|
export interface UseDropdownStateOptions {
|
|
5
5
|
closeOnOutsideClick?: boolean
|
|
6
6
|
closeOnEscape?: boolean
|
|
7
|
+
/** Close the panel when the page scrolls or the viewport resizes. Default `false`. */
|
|
8
|
+
closeOnScroll?: boolean
|
|
7
9
|
insideRefs?: Array<Ref<HTMLElement | null>>
|
|
10
|
+
/**
|
|
11
|
+
* Element focus returns to when the panel closes with `close(true)` (Escape).
|
|
12
|
+
* Pass one when the trigger lives outside `rootRef`; otherwise bind the
|
|
13
|
+
* returned `triggerRef` to the trigger element.
|
|
14
|
+
*/
|
|
15
|
+
triggerRef?: Ref<HTMLElement | null>
|
|
8
16
|
onOpen?: () => void
|
|
9
17
|
onClose?: () => void
|
|
10
18
|
}
|
|
@@ -12,19 +20,29 @@ export interface UseDropdownStateOptions {
|
|
|
12
20
|
export interface UseDropdownStateReturn {
|
|
13
21
|
isOpen: Ref<boolean>
|
|
14
22
|
rootRef: Ref<HTMLElement | null>
|
|
23
|
+
/** Bind to the trigger element so Escape can return focus to it. */
|
|
24
|
+
triggerRef: Ref<HTMLElement | null>
|
|
15
25
|
open: () => void
|
|
16
|
-
|
|
26
|
+
/** Closes the panel; `returnFocus` moves focus back to `triggerRef`. */
|
|
27
|
+
close: (returnFocus?: boolean) => void
|
|
17
28
|
toggle: () => void
|
|
18
29
|
handleClickOutside: (event: MouseEvent) => void
|
|
19
30
|
handleKeydown: (event: KeyboardEvent) => void
|
|
20
31
|
}
|
|
21
32
|
|
|
22
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Shared disclosure state for dropdown-style SDK components: open/close state,
|
|
35
|
+
* outside-click and Escape closing, optional scroll/resize closing, and focus
|
|
36
|
+
* return to the trigger. `close(returnFocus)` mirrors `useMenuKeyboard`'s
|
|
37
|
+
* contract, so the two compose directly.
|
|
38
|
+
*/
|
|
23
39
|
export function useDropdownState(options: UseDropdownStateOptions = {}): UseDropdownStateReturn {
|
|
24
40
|
const isOpen = ref(false)
|
|
25
41
|
const rootRef = ref<HTMLElement | null>(null)
|
|
42
|
+
const triggerRef = options.triggerRef ?? ref<HTMLElement | null>(null)
|
|
26
43
|
const closeOnOutsideClick = options.closeOnOutsideClick ?? true
|
|
27
44
|
const closeOnEscape = options.closeOnEscape ?? true
|
|
45
|
+
const closeOnScroll = options.closeOnScroll ?? false
|
|
28
46
|
|
|
29
47
|
function open(): void {
|
|
30
48
|
if (isOpen.value) return
|
|
@@ -32,10 +50,13 @@ export function useDropdownState(options: UseDropdownStateOptions = {}): UseDrop
|
|
|
32
50
|
options.onOpen?.()
|
|
33
51
|
}
|
|
34
52
|
|
|
35
|
-
function close(): void {
|
|
53
|
+
function close(returnFocus = false): void {
|
|
36
54
|
if (!isOpen.value) return
|
|
37
55
|
isOpen.value = false
|
|
38
56
|
options.onClose?.()
|
|
57
|
+
if (returnFocus) {
|
|
58
|
+
void nextTick(() => triggerRef.value?.focus())
|
|
59
|
+
}
|
|
39
60
|
}
|
|
40
61
|
|
|
41
62
|
function toggle(): void {
|
|
@@ -60,20 +81,29 @@ export function useDropdownState(options: UseDropdownStateOptions = {}): UseDrop
|
|
|
60
81
|
|
|
61
82
|
function handleKeydown(event: KeyboardEvent): void {
|
|
62
83
|
if (closeOnEscape && event.key === 'Escape') {
|
|
63
|
-
close()
|
|
84
|
+
close(true)
|
|
64
85
|
}
|
|
65
86
|
}
|
|
66
87
|
|
|
88
|
+
function handleViewportChange(): void {
|
|
89
|
+
if (isOpen.value) close()
|
|
90
|
+
}
|
|
91
|
+
|
|
67
92
|
if (closeOnOutsideClick) {
|
|
68
93
|
useEventListener(() => document, 'click', handleClickOutside)
|
|
69
94
|
}
|
|
70
95
|
if (closeOnEscape) {
|
|
71
96
|
useEventListener(() => document, 'keydown', handleKeydown)
|
|
72
97
|
}
|
|
98
|
+
if (closeOnScroll) {
|
|
99
|
+
useEventListener(() => window, 'scroll', handleViewportChange, true)
|
|
100
|
+
useEventListener(() => window, 'resize', handleViewportChange)
|
|
101
|
+
}
|
|
73
102
|
|
|
74
103
|
return {
|
|
75
104
|
isOpen,
|
|
76
105
|
rootRef,
|
|
106
|
+
triggerRef,
|
|
77
107
|
open,
|
|
78
108
|
close,
|
|
79
109
|
toggle,
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
shallowRef,
|
|
8
8
|
type Ref,
|
|
9
9
|
} from 'vue'
|
|
10
|
+
import { tryUseSettingsStore } from '../stores/settings'
|
|
10
11
|
|
|
11
12
|
export type EventStreamTransport = (
|
|
12
13
|
input: RequestInfo | URL,
|
|
@@ -26,7 +27,16 @@ export interface EventStreamOptions<TData = string> {
|
|
|
26
27
|
headers?: HeadersInit
|
|
27
28
|
credentials?: RequestCredentials
|
|
28
29
|
immediate?: boolean
|
|
30
|
+
/**
|
|
31
|
+
* Reconnect after a dropped stream. Left unset, it follows the platform's
|
|
32
|
+
* `wsAutoReconnect` setting, defaulting to `true` without a settings store.
|
|
33
|
+
*/
|
|
29
34
|
reconnect?: boolean
|
|
35
|
+
/**
|
|
36
|
+
* Delay before the first reconnect attempt. Left unset, it follows the
|
|
37
|
+
* platform's `wsReconnectInterval` setting, defaulting to 2000 ms without a
|
|
38
|
+
* settings store. A server-sent `retry:` field still overrides it.
|
|
39
|
+
*/
|
|
30
40
|
reconnectDelayMs?: number
|
|
31
41
|
parseJson?: boolean
|
|
32
42
|
shouldReconnect?: (cause?: unknown) => boolean
|
|
@@ -114,7 +124,9 @@ export function useEventStream<TData = string>(
|
|
|
114
124
|
let controller: AbortController | null = null
|
|
115
125
|
let reader: ReadableStreamDefaultReader<Uint8Array> | null = null
|
|
116
126
|
let reconnectTimer: ReturnType<typeof setTimeout> | null = null
|
|
117
|
-
|
|
127
|
+
const settings = tryUseSettingsStore()
|
|
128
|
+
const reconnectEnabled = options.reconnect ?? settings?.wsAutoReconnect ?? true
|
|
129
|
+
let reconnectDelayMs = options.reconnectDelayMs ?? settings?.wsReconnectInterval ?? 2_000
|
|
118
130
|
let stopped = true
|
|
119
131
|
let generation = 0
|
|
120
132
|
|
|
@@ -135,7 +147,7 @@ export function useEventStream<TData = string>(
|
|
|
135
147
|
|
|
136
148
|
function scheduleReconnect(connectionGeneration: number, cause?: unknown): void {
|
|
137
149
|
if (stopped || generation !== connectionGeneration) return
|
|
138
|
-
if (
|
|
150
|
+
if (!reconnectEnabled || options.shouldReconnect?.(cause) === false) {
|
|
139
151
|
stopped = true
|
|
140
152
|
return
|
|
141
153
|
}
|