@morscherlab/mint-sdk 1.2.0-beta.1 → 1.2.0-beta.11
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 +35 -5
- package/dist/{ExperimentPopover-tLwJ7XF4.js → ExperimentPopover-oL0fg_A0.js} +6 -4
- package/dist/ExperimentPopover-oL0fg_A0.js.map +1 -0
- package/dist/{ExperimentSelectorModal-DyPAUCLw.js → ExperimentSelectorModal-BeEOomw_.js} +5 -5
- package/dist/ExperimentSelectorModal-BeEOomw_.js.map +1 -0
- package/dist/{SettingsModal-BgKY93zh.js → SettingsModal-Dphh3RrI.js} +5 -8
- package/dist/SettingsModal-Dphh3RrI.js.map +1 -0
- package/dist/{EmptyState-p90quq8Z.js → Skeleton-DxtwJ5gt.js} +111 -93
- package/dist/Skeleton-DxtwJ5gt.js.map +1 -0
- package/dist/__tests__/components/ExperimentTimeline.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__/composables/useListReorder.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/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/BatchProgressList.vue.d.ts +17 -0
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
- package/dist/components/DataFrame.vue.d.ts +14 -2
- package/dist/components/DatePicker.vue.d.ts +1 -1
- package/dist/components/DateTimePicker.vue.d.ts +2 -0
- 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/FitPanel.vue.d.ts +1 -1
- package/dist/components/JobsStatusTray.vue.d.ts +9 -2
- package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
- 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/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/SettingsModal.vue.d.ts +1 -1
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -1
- package/dist/components/TimePicker.vue.d.ts +1 -0
- 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 +29 -0
- package/dist/components/index.d.ts +9 -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/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-CgAUzF8F.js} +2497 -2235
- package/dist/components-CgAUzF8F.js.map +1 -0
- package/dist/composables/controlSchemaTypes.d.ts +34 -0
- package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
- package/dist/composables/index.d.ts +9 -2
- package/dist/composables/index.js +10 -10
- package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
- 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/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/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-B_pia3hO.js} +209 -82
- package/dist/composables-B_pia3hO.js.map +1 -0
- package/dist/{useApi-J6zFkHmn.js → errors-_W0-LbA6.js} +103 -3
- package/dist/errors-_W0-LbA6.js.map +1 -0
- package/dist/{experiment-Cq145oEW.js → experiment-Cwl9AYxw.js} +3 -8
- package/dist/experiment-Cwl9AYxw.js.map +1 -0
- package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-DV3DrvE_.js} +70 -51
- package/dist/experiment-utils-DV3DrvE_.js.map +1 -0
- package/dist/index.d.ts +1 -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 +11247 -29501
- package/dist/templates/builderReadUtils.d.ts +1 -1
- package/dist/templates/index.js +2 -4
- package/dist/{templates-DsP51i-S.js → templates-Qq113pyZ.js} +303 -106
- package/dist/templates-Qq113pyZ.js.map +1 -0
- package/dist/types/auth.d.ts +1 -0
- package/dist/types/form-builder.d.ts +1 -1
- package/dist/{useControlSchema-BDx2Olha.js → useControlSchema-aMZlb4Sc.js} +462 -1130
- package/dist/useControlSchema-aMZlb4Sc.js.map +1 -0
- package/dist/{useDropdownState-DSb3BC3N.js → useDropdownState-DitCtrTT.js} +22 -6
- package/dist/useDropdownState-DitCtrTT.js.map +1 -0
- package/dist/{useExperimentSelector-CV4iNfMS.js → useExperimentSelector-I8HC8hUu.js} +4 -4
- package/dist/{useExperimentSelector-CV4iNfMS.js.map → useExperimentSelector-I8HC8hUu.js.map} +1 -1
- package/dist/{useFormBuilder-BLxG3BOX.js → useFormBuilder-TCxNnqeb.js} +2 -2
- package/dist/{useFormBuilder-BLxG3BOX.js.map → useFormBuilder-TCxNnqeb.js.map} +1 -1
- package/dist/{useProtocolTemplates-CS_SQl6U.js → useProtocolTemplates-BmX_iVBR.js} +766 -212
- package/dist/useProtocolTemplates-BmX_iVBR.js.map +1 -0
- 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/package.json +1 -1
- 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/ExperimentTimeline.test.ts +63 -0
- package/src/__tests__/components/GroupAssigner.test.ts +53 -0
- package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -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 +88 -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__/composables/useAuth.test.ts +2 -0
- package/src/__tests__/composables/useDropdownState.test.ts +58 -1
- package/src/__tests__/composables/useListReorder.test.ts +145 -0
- package/src/__tests__/composables/usePluginClient.test.ts +140 -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/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 +2 -5
- 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/FileUploader.vue +0 -4
- 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 +3 -3
- 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 -4
- 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/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 +48 -5
- 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/index.ts +9 -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/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/flattenWorkspaceBindings.ts +104 -0
- package/src/composables/formBuilderRegistry.ts +5 -0
- package/src/composables/index.ts +43 -0
- package/src/composables/pluginWorkspaceModel.ts +182 -0
- 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/useFileImport.ts +2 -7
- package/src/composables/useFocusTrap.ts +91 -0
- package/src/composables/useGeneratedAnalysis.ts +22 -10
- 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/usePluginClient.ts +47 -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 +16 -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/form-builder.css +5 -5
- 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 +9 -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/form-builder.ts +1 -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 → components/DataStates.test.d.ts} +0 -0
|
@@ -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
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ref, shallowRef, type Ref, type ShallowRef } from 'vue'
|
|
2
|
+
import { readErrorMessage } from '../utils/errors'
|
|
2
3
|
|
|
3
4
|
export interface DelimitedTable {
|
|
4
5
|
columns: string[]
|
|
@@ -63,7 +64,7 @@ export function useFileImport<TResult = string>(
|
|
|
63
64
|
result.value = parsed
|
|
64
65
|
return parsed
|
|
65
66
|
} catch (err) {
|
|
66
|
-
const message = readErrorMessage(err)
|
|
67
|
+
const message = readErrorMessage(err, 'Failed to import file.')
|
|
67
68
|
error.value = message
|
|
68
69
|
throw err
|
|
69
70
|
} finally {
|
|
@@ -223,9 +224,3 @@ function formatBytes(bytes: number): string {
|
|
|
223
224
|
if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`
|
|
224
225
|
return `${Math.round(bytes / (1024 * 1024))} MB`
|
|
225
226
|
}
|
|
226
|
-
|
|
227
|
-
function readErrorMessage(value: unknown): string {
|
|
228
|
-
if (value instanceof Error && value.message) return value.message
|
|
229
|
-
if (typeof value === 'string' && value.trim()) return value
|
|
230
|
-
return 'Failed to import file.'
|
|
231
|
-
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { nextTick, watch, type Ref } from 'vue'
|
|
2
|
+
import { useEventListener } from './useEventListener'
|
|
3
|
+
|
|
4
|
+
export interface UseFocusTrapOptions {
|
|
5
|
+
/** Ref to the trap's container element. Focusable elements are queried within it. */
|
|
6
|
+
containerRef: Ref<HTMLElement | null>
|
|
7
|
+
/** Reactive flag — the trap activates when this becomes `true` and releases when it becomes `false`. */
|
|
8
|
+
active: Ref<boolean>
|
|
9
|
+
/** Restore focus to the element that was focused before activation, when the trap releases. Default `true`. */
|
|
10
|
+
restoreFocus?: boolean
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface UseFocusTrapReturn {
|
|
14
|
+
/** Focusable descendants of the container, in DOM order, excluding roving-tabindex (`tabindex="-1"`) elements. */
|
|
15
|
+
getFocusableElements: () => HTMLElement[]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const FOCUSABLE_SELECTOR = [
|
|
19
|
+
'a[href]',
|
|
20
|
+
'button:not([disabled])',
|
|
21
|
+
'input:not([disabled])',
|
|
22
|
+
'select:not([disabled])',
|
|
23
|
+
'textarea:not([disabled])',
|
|
24
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
25
|
+
].join(', ')
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Traps Tab focus within a container while `active` is true: Tab wraps from the last
|
|
29
|
+
* focusable element back to the first (and Shift+Tab from the first to the last), the
|
|
30
|
+
* first focusable element (or the container itself, if none) receives focus when the
|
|
31
|
+
* trap activates, and focus returns to whatever was focused beforehand when it releases.
|
|
32
|
+
* Used by BaseModal and WellEditPopupInternal.
|
|
33
|
+
*/
|
|
34
|
+
export function useFocusTrap(options: UseFocusTrapOptions): UseFocusTrapReturn {
|
|
35
|
+
const { containerRef, active } = options
|
|
36
|
+
const restoreFocus = options.restoreFocus ?? true
|
|
37
|
+
let previouslyFocused: HTMLElement | null = null
|
|
38
|
+
|
|
39
|
+
function getFocusableElements(): HTMLElement[] {
|
|
40
|
+
if (!containerRef.value) return []
|
|
41
|
+
// Roving tabindex (inactive tabs/rail items) stays out of the Tab cycle. Checking
|
|
42
|
+
// the attribute directly (rather than the `.tabIndex` IDL property) avoids relying
|
|
43
|
+
// on a browser/engine's default-tabindex computation for freshly-patched elements.
|
|
44
|
+
return Array.from(containerRef.value.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))
|
|
45
|
+
.filter((el) => el.getAttribute('tabindex') !== '-1')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function handleKeydown(event: KeyboardEvent) {
|
|
49
|
+
if (event.key !== 'Tab' || !active.value || !containerRef.value) return
|
|
50
|
+
|
|
51
|
+
const focusable = getFocusableElements()
|
|
52
|
+
if (focusable.length === 0) {
|
|
53
|
+
event.preventDefault()
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const first = focusable[0]
|
|
58
|
+
const last = focusable[focusable.length - 1]
|
|
59
|
+
|
|
60
|
+
if (event.shiftKey && document.activeElement === first) {
|
|
61
|
+
event.preventDefault()
|
|
62
|
+
last.focus()
|
|
63
|
+
} else if (!event.shiftKey && document.activeElement === last) {
|
|
64
|
+
event.preventDefault()
|
|
65
|
+
first.focus()
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// `flush: 'sync'` so releasing the trap from `onBeforeUnmount` restores focus
|
|
70
|
+
// before the component's reactive scope is torn down — a batched (default
|
|
71
|
+
// 'pre') watcher would be scheduled but never flushed once that scope stops.
|
|
72
|
+
watch(active, async (isActive) => {
|
|
73
|
+
if (isActive) {
|
|
74
|
+
previouslyFocused = document.activeElement as HTMLElement | null
|
|
75
|
+
await nextTick()
|
|
76
|
+
const focusable = getFocusableElements()
|
|
77
|
+
if (focusable.length > 0) {
|
|
78
|
+
focusable[0].focus()
|
|
79
|
+
} else {
|
|
80
|
+
containerRef.value?.focus()
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
if (restoreFocus) previouslyFocused?.focus()
|
|
84
|
+
previouslyFocused = null
|
|
85
|
+
}
|
|
86
|
+
}, { flush: 'sync' })
|
|
87
|
+
|
|
88
|
+
useEventListener(() => document, 'keydown', handleKeydown)
|
|
89
|
+
|
|
90
|
+
return { getFocusableElements }
|
|
91
|
+
}
|
|
@@ -8,9 +8,12 @@ import {
|
|
|
8
8
|
type ShallowRef,
|
|
9
9
|
} from 'vue'
|
|
10
10
|
|
|
11
|
-
import type {
|
|
11
|
+
import type {
|
|
12
|
+
JobsStatusTrayAdapter,
|
|
13
|
+
PluginJobCenterSource,
|
|
14
|
+
} from './useJobsStatusTray'
|
|
12
15
|
import { useEventStream, type EventStreamMessage } from './useEventStream'
|
|
13
|
-
import { normalizeJobState } from '../jobs'
|
|
16
|
+
import { isActiveJobStatus, normalizeJobState } from '../jobs'
|
|
14
17
|
import type {
|
|
15
18
|
GeneratedAnalysisJob,
|
|
16
19
|
GeneratedAnalysisJobInput,
|
|
@@ -102,11 +105,12 @@ export interface UsePluginJobsReturn extends PluginJobCenterSource {
|
|
|
102
105
|
pause: () => void
|
|
103
106
|
resume: () => void
|
|
104
107
|
dispose: () => void
|
|
108
|
+
/** @deprecated Pass the runtime itself to SDK job UI as its source. */
|
|
109
|
+
jobsAdapter: JobsStatusTrayAdapter
|
|
105
110
|
}
|
|
106
111
|
|
|
107
112
|
export type UseGeneratedAnalysisReturn = UsePluginJobsReturn
|
|
108
113
|
|
|
109
|
-
const ACTIVE_STATUSES = new Set(['awaiting_input', 'queued', 'running'])
|
|
110
114
|
const AUTH_TOKEN_KEY = 'mint-auth-token'
|
|
111
115
|
const SESSION_NOT_FOUND_DETAIL = 'Session not found'
|
|
112
116
|
const MAX_RESULT_CACHE_ENTRIES = 32
|
|
@@ -468,12 +472,12 @@ function createPluginJobs(
|
|
|
468
472
|
.then((payload) => {
|
|
469
473
|
if (disposed) return jobs.value
|
|
470
474
|
if (revision !== jobsRevision) {
|
|
471
|
-
if (jobs.value.some(job =>
|
|
475
|
+
if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
|
|
472
476
|
return jobs.value
|
|
473
477
|
}
|
|
474
478
|
replaceJobs(payload.jobs)
|
|
475
479
|
error.value = null
|
|
476
|
-
if (!paused && !jobStream.isConnected.value && jobs.value.some(job =>
|
|
480
|
+
if (!paused && !jobStream.isConnected.value && jobs.value.some(job => isActiveJobStatus(job.status))) {
|
|
477
481
|
schedulePoll()
|
|
478
482
|
}
|
|
479
483
|
return jobs.value
|
|
@@ -525,7 +529,7 @@ function createPluginJobs(
|
|
|
525
529
|
const current = typeof job === 'string'
|
|
526
530
|
? jobs.value.find(candidate => candidate.job_id === jobId)
|
|
527
531
|
: jobs.value.find(candidate => candidate.job_id === jobId) ?? job
|
|
528
|
-
if (current && !
|
|
532
|
+
if (current && !isActiveJobStatus(current.status)) {
|
|
529
533
|
return terminalWaitResult(current, options.rejectOnFailure === true)
|
|
530
534
|
}
|
|
531
535
|
if (paused) return Promise.reject(new Error('Plugin jobs runtime is paused'))
|
|
@@ -562,7 +566,7 @@ function createPluginJobs(
|
|
|
562
566
|
}
|
|
563
567
|
|
|
564
568
|
function settleJobWaiters(job: GeneratedAnalysisJob): void {
|
|
565
|
-
if (
|
|
569
|
+
if (isActiveJobStatus(job.status)) return
|
|
566
570
|
const waiting = jobWaiters.get(job.job_id)
|
|
567
571
|
if (!waiting) return
|
|
568
572
|
jobWaiters.delete(job.job_id)
|
|
@@ -910,7 +914,7 @@ function createPluginJobs(
|
|
|
910
914
|
await refreshJobs()
|
|
911
915
|
} catch (cause) {
|
|
912
916
|
error.value = errorMessage(cause, 'Failed to refresh analysis jobs')
|
|
913
|
-
if (jobs.value.some(job =>
|
|
917
|
+
if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
|
|
914
918
|
}
|
|
915
919
|
}, pollInterval)
|
|
916
920
|
}
|
|
@@ -922,7 +926,7 @@ function createPluginJobs(
|
|
|
922
926
|
}
|
|
923
927
|
|
|
924
928
|
function schedulePollForActiveJobs(): void {
|
|
925
|
-
if (jobs.value.some(job =>
|
|
929
|
+
if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
|
|
926
930
|
}
|
|
927
931
|
|
|
928
932
|
function applyJobStreamMessage(message: EventStreamMessage<PluginJobStreamData>): void {
|
|
@@ -972,6 +976,13 @@ function createPluginJobs(
|
|
|
972
976
|
return payload.deleted
|
|
973
977
|
}
|
|
974
978
|
|
|
979
|
+
const jobsAdapter: JobsStatusTrayAdapter = {
|
|
980
|
+
listJobs: async () => ({ jobs: await refreshJobs() }),
|
|
981
|
+
cancelJob: async job => cancelJob(job as GeneratedAnalysisJob),
|
|
982
|
+
deleteJob: async job => deleteJob(job as GeneratedAnalysisJob),
|
|
983
|
+
clearFinishedJobs: async () => clearFinishedJobs(),
|
|
984
|
+
}
|
|
985
|
+
|
|
975
986
|
function pause(): void {
|
|
976
987
|
if (disposed || paused) return
|
|
977
988
|
paused = true
|
|
@@ -993,7 +1004,7 @@ function createPluginJobs(
|
|
|
993
1004
|
scheduleManagedDownloadRefresh(jobId, managedDownloadRefreshDelay(result))
|
|
994
1005
|
}
|
|
995
1006
|
if (streamEnabled) jobStream.start()
|
|
996
|
-
else if (jobs.value.some(job =>
|
|
1007
|
+
else if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
|
|
997
1008
|
}
|
|
998
1009
|
|
|
999
1010
|
function dispose(): void {
|
|
@@ -1065,6 +1076,7 @@ function createPluginJobs(
|
|
|
1065
1076
|
pause,
|
|
1066
1077
|
resume,
|
|
1067
1078
|
dispose,
|
|
1079
|
+
jobsAdapter,
|
|
1068
1080
|
}
|
|
1069
1081
|
}
|
|
1070
1082
|
|