@morscherlab/mint-sdk 1.2.0-beta.3 → 1.2.0-beta.4
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 +8 -2
- package/dist/EmptyState-p90quq8Z.js +2 -0
- package/dist/EmptyState-p90quq8Z.js.map +1 -0
- package/dist/{ExperimentPopover-Bn6PIGHE.js → ExperimentPopover-tLwJ7XF4.js} +10 -5
- package/dist/ExperimentPopover-tLwJ7XF4.js.map +1 -0
- package/dist/{ExperimentSelectorModal-DGhrJSSV.js → ExperimentSelectorModal-B6P2msT4.js} +11 -6
- package/dist/ExperimentSelectorModal-B6P2msT4.js.map +1 -0
- package/dist/{SettingsModal-wF2btHu6.js → SettingsModal-CkNM8qAI.js} +12 -7
- package/dist/SettingsModal-CkNM8qAI.js.map +1 -0
- package/dist/__stories__/experiment-helpers.d.ts +28 -0
- package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
- package/dist/__tests__/components/ActionMenu.test.d.ts +1 -0
- package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
- package/dist/__tests__/components/AppLayout.test.d.ts +1 -0
- package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
- package/dist/__tests__/components/AppSidebar.test.d.ts +1 -0
- package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
- package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
- package/dist/__tests__/components/AppTopBar.test.d.ts +1 -0
- package/dist/__tests__/components/AppTopBarPageSelector.test.d.ts +1 -0
- package/dist/__tests__/components/AppTopBarPillNav.test.d.ts +1 -0
- package/dist/__tests__/components/AppTopBarPresence.test.d.ts +1 -0
- package/dist/__tests__/components/ArtifactSaveDialog.test.d.ts +1 -0
- package/dist/__tests__/components/ArtifactSelectorModal.test.d.ts +1 -0
- package/dist/__tests__/components/AutoGroupModal.adapter.test.d.ts +1 -0
- package/dist/__tests__/components/BaseInput.test.d.ts +1 -0
- package/dist/__tests__/components/BaseModal.test.d.ts +1 -0
- package/dist/__tests__/components/BasePill.test.d.ts +1 -0
- package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
- package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
- package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
- package/dist/__tests__/components/BaseToggle.test.d.ts +1 -0
- package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
- package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
- package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
- package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
- package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
- package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
- package/dist/__tests__/components/Calendar.test.d.ts +1 -0
- package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
- package/dist/__tests__/components/CollapsibleCard.test.d.ts +1 -0
- package/dist/__tests__/components/ComponentBindingRenderer.test.d.ts +1 -0
- package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
- package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
- package/dist/__tests__/components/DataFrame.test.d.ts +1 -0
- package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
- package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
- package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
- package/dist/__tests__/components/DoseDesignWorkspaceView.test.d.ts +1 -0
- package/dist/__tests__/components/DropdownButton.test.d.ts +1 -0
- package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
- package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
- package/dist/__tests__/components/ExperimentSelectorModal.test.d.ts +1 -0
- package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedPathInput.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedPlotlyResult.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedPluginView.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedResultRenderer.test.d.ts +1 -0
- package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
- package/dist/__tests__/components/InstrumentAlertLog.test.d.ts +1 -0
- package/dist/__tests__/components/JobsStatusTray.test.d.ts +1 -0
- package/dist/__tests__/components/LcmsSequenceTable.test.d.ts +1 -0
- package/dist/__tests__/components/MobileSupportGate.test.d.ts +1 -0
- package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
- package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
- package/dist/__tests__/components/PluginIcon.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.test.d.ts +1 -0
- package/dist/__tests__/components/ProgressBar.test.d.ts +1 -0
- package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
- package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
- package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
- package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
- package/dist/__tests__/components/RackEditor.test.d.ts +1 -0
- package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
- package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
- package/dist/__tests__/components/RetiredStyles.test.d.ts +1 -0
- package/dist/__tests__/components/RuntimeUpdateNotice.test.d.ts +1 -0
- package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
- package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
- package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
- package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
- package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
- package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
- package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
- package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
- package/dist/__tests__/components/SectionCard.test.d.ts +1 -0
- package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
- package/dist/__tests__/components/SequenceProgressBar.test.d.ts +1 -0
- package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
- package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
- package/dist/__tests__/components/SmartGroupFieldRecipe.groups.test.d.ts +1 -0
- package/dist/__tests__/components/SmartGroupManual.cohorts.test.d.ts +1 -0
- package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
- package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
- package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
- package/dist/__tests__/composables/analysisArtifactTarget.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/classKey.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/groupByOrder.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/groupTree.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/tokenLength.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
- package/dist/__tests__/composables/experiment-utils.test.d.ts +1 -0
- package/dist/__tests__/composables/formBuilderRegistry.test.d.ts +1 -0
- package/dist/__tests__/composables/resolvePluginFrontendBase.test.d.ts +1 -0
- package/dist/__tests__/composables/useAnalysisArtifacts.test.d.ts +1 -0
- package/dist/__tests__/composables/useApi.test.d.ts +1 -0
- package/dist/__tests__/composables/useAppExperiment.test.d.ts +1 -0
- package/dist/__tests__/composables/useAuth.test.d.ts +1 -0
- package/dist/__tests__/composables/useAutoGroup.test.d.ts +1 -0
- package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
- package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
- package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
- package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
- package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
- package/dist/__tests__/composables/useCommandHistory.test.d.ts +1 -0
- package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
- package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
- package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
- package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
- package/dist/__tests__/composables/useEventStream.test.d.ts +1 -0
- package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
- package/dist/__tests__/composables/useExperimentData.test.d.ts +14 -0
- package/dist/__tests__/composables/useExperimentSamples.test.d.ts +1 -0
- package/dist/__tests__/composables/useExperimentSave.test.d.ts +1 -0
- package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
- package/dist/__tests__/composables/useFileImport.test.d.ts +1 -0
- package/dist/__tests__/composables/useForm.test.d.ts +1 -0
- package/dist/__tests__/composables/useFormBuilder.test.d.ts +1 -0
- package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +1 -0
- package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
- package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +1 -0
- package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
- package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +1 -0
- package/dist/__tests__/composables/useOptimisticMutation.test.d.ts +1 -0
- package/dist/__tests__/composables/usePlatformContext.test.d.ts +1 -0
- package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
- package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
- package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +1 -0
- package/dist/__tests__/composables/useProtocolTemplates.test.d.ts +1 -0
- package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
- package/dist/__tests__/composables/useResourceCrud.test.d.ts +1 -0
- package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +1 -0
- package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
- package/dist/__tests__/composables/useSampleGroups.tree.test.d.ts +1 -0
- package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
- package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
- package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
- package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
- package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
- package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
- package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
- package/dist/__tests__/composables/useWellPainting.test.d.ts +1 -0
- package/dist/__tests__/composables/useWellPlateAdapter.test.d.ts +1 -0
- package/dist/__tests__/composables/useWellPlateValidation.test.d.ts +1 -0
- package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
- package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
- package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
- package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
- package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
- package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
- package/dist/__tests__/generatedUi.test.d.ts +1 -0
- package/dist/__tests__/stores/experiment.test.d.ts +1 -0
- package/dist/__tests__/stores/settings.test.d.ts +1 -0
- package/dist/__tests__/templates/templates.test.d.ts +1 -0
- package/dist/__tests__/types/GeneratedJsonSchema.test.d.ts +1 -0
- package/dist/__tests__/utils/color.test.d.ts +1 -0
- package/dist/__tests__/utils/instrument.test.d.ts +1 -0
- package/dist/__tests__/utils/jobs.test.d.ts +1 -0
- package/dist/__tests__/utils/lcms.test.d.ts +1 -0
- package/dist/__tests__/utils/permissions.test.d.ts +1 -0
- package/dist/__tests__/utils/rack.test.d.ts +1 -0
- package/dist/{analysisArtifactTypes-ejqR8MX3.js → analysisArtifactTypes-DQ0MjwHZ.js} +2 -0
- package/dist/analysisArtifactTypes-DQ0MjwHZ.js.map +1 -0
- package/dist/chunk-BoAXSpZd.js +33 -0
- package/dist/components/AuditTrail.vue.d.ts +38 -0
- package/dist/components/AutoGroupModal.vue.d.ts +1 -1
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +1 -1
- package/dist/components/ColorSlider.vue.d.ts +34 -0
- package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
- package/dist/components/FitPanel.vue.d.ts +46 -0
- package/dist/components/GroupAssigner.vue.d.ts +25 -0
- package/dist/components/JobsStatusTray.vue.d.ts +11 -2
- package/dist/components/RackEditor.vue.d.ts +78 -0
- package/dist/components/ReagentEditor.vue.d.ts +30 -0
- package/dist/components/ResourceCard.vue.d.ts +50 -0
- package/dist/components/SampleLegend.vue.d.ts +1 -1
- package/dist/components/SampleSelector.vue.d.ts +1 -1
- package/dist/components/ScientificNumber.vue.d.ts +14 -0
- package/dist/components/SettingsModal.vue.d.ts +1 -1
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
- package/dist/components/SmartGroupManual.vue.d.ts +2 -2
- package/dist/components/WellPlate.vue.d.ts +1 -1
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.js +6 -6
- package/dist/{components-DpyzaeIc.js → components-MGNL6tRn.js} +3268 -1353
- package/dist/components-MGNL6tRn.js.map +1 -0
- package/dist/composables/autoGroupConstants.d.ts +1 -0
- package/dist/composables/autoGroupGrouping.d.ts +3 -0
- package/dist/composables/index.d.ts +10 -2
- package/dist/composables/index.js +9 -9
- package/dist/composables/useAnalysisArtifacts.d.ts +2 -0
- package/dist/composables/useAsync.d.ts +128 -0
- package/dist/composables/useAuth.d.ts +2 -0
- package/dist/composables/useAutoGroup.d.ts +30 -1
- package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
- package/dist/composables/useCommandHistory.d.ts +29 -0
- package/dist/composables/useGeneratedAnalysis.d.ts +5 -1
- package/dist/composables/useGroupAssignment.d.ts +31 -0
- package/dist/composables/useJobsStatusTray.d.ts +41 -4
- package/dist/composables/usePluginClient.d.ts +4 -0
- package/dist/composables/usePluginConfig.d.ts +25 -0
- package/dist/composables/useRackEditor.d.ts +31 -0
- package/dist/composables/useResourceCrud.d.ts +40 -0
- package/dist/composables/useWellPainting.d.ts +35 -0
- package/dist/composables/useWellPlateAdapter.d.ts +36 -0
- package/dist/{composables-yz8bTkEV.js → composables-CKxOcvgh.js} +764 -59
- package/dist/composables-CKxOcvgh.js.map +1 -0
- package/dist/{experiment-D08H_TIH.js → experiment-Y9Iz7KYi.js} +3 -1
- package/dist/experiment-Y9Iz7KYi.js.map +1 -0
- package/dist/experiment-utils-CLnzPPq5.js +2 -0
- package/dist/experiment-utils-CLnzPPq5.js.map +1 -0
- package/dist/histoire.setup.d.ts +1 -0
- package/dist/index.js +18 -33
- package/dist/index.js.map +1 -0
- package/dist/install.js +28 -0
- package/dist/install.js.map +1 -0
- package/dist/jobs.d.ts +15 -1
- package/dist/permissions.d.ts +5 -0
- package/dist/permissions.js +4 -2
- package/dist/permissions.js.map +1 -0
- package/dist/plotly.min-c2Sez60c.js +180634 -0
- package/dist/plotly.min-c2Sez60c.js.map +1 -0
- package/dist/stores/auth.d.ts +6 -0
- package/dist/stores/index.js +2 -2
- package/dist/styles.css +2836 -270
- package/dist/tailwind.preset.js +2 -0
- package/dist/tailwind.preset.js.map +1 -0
- package/dist/templates/catalog.d.ts +4 -4
- package/dist/templates/index.js +2 -2
- package/dist/templates/presets.d.ts +2 -2
- package/dist/{templates-Pbxjdqlh.js → templates-BTJ9C9Kb.js} +22 -5
- package/dist/templates-BTJ9C9Kb.js.map +1 -0
- package/dist/types/auth.d.ts +1 -0
- package/dist/types/auto-group.d.ts +7 -0
- package/dist/types/componentWorkflowTypes.d.ts +22 -0
- package/dist/types/components.d.ts +1 -1
- package/dist/types/generated-ui.d.ts +11 -2
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.js +1 -1
- package/dist/types/jobs.d.ts +11 -3
- package/dist/{useApi-yE0re8k-.js → useApi-CDBq6z23.js} +15 -0
- package/dist/useApi-CDBq6z23.js.map +1 -0
- package/dist/{useControlSchema-Ds4VeFxt.js → useControlSchema-CXhxTul7.js} +104 -9
- package/dist/useControlSchema-CXhxTul7.js.map +1 -0
- package/dist/{useDropdownState-WIGW6Rr-.js → useDropdownState-DSb3BC3N.js} +2 -0
- package/dist/useDropdownState-DSb3BC3N.js.map +1 -0
- package/dist/{useExperimentSelector-DXqsZuSk.js → useExperimentSelector-D0pjj9WH.js} +3 -1
- package/dist/useExperimentSelector-D0pjj9WH.js.map +1 -0
- package/dist/{useFormBuilder-1so6QSQL.js → useFormBuilder-CuOFB3aP.js} +3 -1
- package/dist/useFormBuilder-CuOFB3aP.js.map +1 -0
- package/dist/{useProtocolTemplates-Cv0ca1AM.js → useProtocolTemplates-BWhQIWV5.js} +584 -47
- package/dist/useProtocolTemplates-BWhQIWV5.js.map +1 -0
- package/package.json +8 -2
- package/src/__stories__/experiment-helpers.ts +86 -0
- package/src/__tests__/components/ActionItem.test.ts +99 -0
- package/src/__tests__/components/ActionMenu.test.ts +120 -0
- package/src/__tests__/components/AppAvatarMenu.test.ts +38 -0
- package/src/__tests__/components/AppLayout.test.ts +207 -0
- package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
- package/src/__tests__/components/AppSidebar.test.ts +857 -0
- package/src/__tests__/components/AppToastContainer.test.ts +37 -0
- package/src/__tests__/components/AppTopBar.navigation.test.ts +68 -0
- package/src/__tests__/components/AppTopBar.test.ts +1256 -0
- package/src/__tests__/components/AppTopBarPageSelector.test.ts +156 -0
- package/src/__tests__/components/AppTopBarPillNav.test.ts +125 -0
- package/src/__tests__/components/AppTopBarPresence.test.ts +47 -0
- package/src/__tests__/components/ArtifactSaveDialog.test.ts +566 -0
- package/src/__tests__/components/ArtifactSelectorModal.test.ts +178 -0
- package/src/__tests__/components/AutoGroupModal.adapter.test.ts +204 -0
- package/src/__tests__/components/BaseInput.test.ts +99 -0
- package/src/__tests__/components/BaseModal.test.ts +133 -0
- package/src/__tests__/components/BasePill.test.ts +291 -0
- package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
- package/src/__tests__/components/BaseSelect.test.ts +73 -0
- package/src/__tests__/components/BaseTabs.test.ts +40 -0
- package/src/__tests__/components/BaseToggle.test.ts +40 -0
- package/src/__tests__/components/BatchProgressList.test.ts +52 -0
- package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
- package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +192 -0
- package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +328 -0
- package/src/__tests__/components/BioTemplateRenderer.test.ts +96 -0
- package/src/__tests__/components/Breadcrumb.test.ts +23 -0
- package/src/__tests__/components/Calendar.test.ts +566 -0
- package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
- package/src/__tests__/components/CollapsibleCard.test.ts +571 -0
- package/src/__tests__/components/ComponentBindingRenderer.test.ts +278 -0
- package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
- package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
- package/src/__tests__/components/DataFrame.test.ts +915 -0
- package/src/__tests__/components/DatePicker.test.ts +45 -0
- package/src/__tests__/components/DateTimePicker.test.ts +48 -0
- package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
- package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
- package/src/__tests__/components/DropdownButton.test.ts +494 -0
- package/src/__tests__/components/EmptyState.test.ts +23 -0
- package/src/__tests__/components/ExperimentPopover.test.ts +143 -0
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +143 -0
- package/src/__tests__/components/FormBuilder.test.ts +353 -0
- package/src/__tests__/components/GeneratedPathInput.test.ts +132 -0
- package/src/__tests__/components/GeneratedPlotlyResult.test.ts +117 -0
- package/src/__tests__/components/GeneratedPluginView.test.ts +235 -0
- package/src/__tests__/components/GeneratedResultRenderer.test.ts +93 -0
- package/src/__tests__/components/GroupAssigner.test.ts +48 -0
- package/src/__tests__/components/InstrumentAlertLog.test.ts +59 -0
- package/src/__tests__/components/JobsStatusTray.test.ts +165 -0
- package/src/__tests__/components/LcmsSequenceTable.test.ts +57 -0
- package/src/__tests__/components/MobileSupportGate.test.ts +120 -0
- package/src/__tests__/components/MultiSelect.test.ts +48 -0
- package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
- package/src/__tests__/components/PluginIcon.test.ts +215 -0
- package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
- package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
- package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +43 -0
- package/src/__tests__/components/PluginWorkspaceView.test.ts +719 -0
- package/src/__tests__/components/ProgressBar.test.ts +18 -0
- package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
- package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
- package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
- package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
- package/src/__tests__/components/RackEditor.test.ts +125 -0
- package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
- package/src/__tests__/components/ReagentList.test.ts +82 -0
- package/src/__tests__/components/RetiredStyles.test.ts +82 -0
- package/src/__tests__/components/RuntimeUpdateNotice.test.ts +14 -0
- package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
- package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
- package/src/__tests__/components/SampleSelector.drag.test.ts +126 -0
- package/src/__tests__/components/SampleSelector.groups.test.ts +94 -0
- package/src/__tests__/components/SampleSelector.selection.test.ts +56 -0
- package/src/__tests__/components/SampleSelector.test.ts +466 -0
- package/src/__tests__/components/SampleSelectorSampleRow.test.ts +40 -0
- package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
- package/src/__tests__/components/SectionCard.test.ts +181 -0
- package/src/__tests__/components/SegmentedControl.test.ts +69 -0
- package/src/__tests__/components/SequenceProgressBar.test.ts +39 -0
- package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
- package/src/__tests__/components/SettingsModal.test.ts +407 -0
- package/src/__tests__/components/SmartGroupFieldRecipe.groups.test.ts +101 -0
- package/src/__tests__/components/SmartGroupManual.cohorts.test.ts +97 -0
- package/src/__tests__/components/TagsInput.test.ts +75 -0
- package/src/__tests__/components/ThemeToggle.test.ts +47 -0
- package/src/__tests__/components/TimePicker.test.ts +38 -0
- package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
- package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
- package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
- package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
- package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
- package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
- package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
- package/src/__tests__/composables/analysisArtifactTarget.test.ts +77 -0
- package/src/__tests__/composables/autoGroup/classKey.test.ts +25 -0
- package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
- package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
- package/src/__tests__/composables/autoGroup/compose.test.ts +226 -0
- package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
- package/src/__tests__/composables/autoGroup/fingerprint.test.ts +122 -0
- package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +278 -0
- package/src/__tests__/composables/autoGroup/groupTree.test.ts +99 -0
- package/src/__tests__/composables/autoGroup/integration.test.ts +75 -0
- package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
- package/src/__tests__/composables/autoGroup/tokenLength.test.ts +85 -0
- package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
- package/src/__tests__/composables/experiment-utils.test.ts +63 -0
- package/src/__tests__/composables/formBuilderRegistry.test.ts +191 -0
- package/src/__tests__/composables/resolvePluginFrontendBase.test.ts +65 -0
- package/src/__tests__/composables/useAnalysisArtifacts.test.ts +740 -0
- package/src/__tests__/composables/useApi.test.ts +157 -0
- package/src/__tests__/composables/useAppExperiment.test.ts +899 -0
- package/src/__tests__/composables/useAuth.test.ts +233 -0
- package/src/__tests__/composables/useAutoGroup.test.ts +524 -0
- package/src/__tests__/composables/useAutoGroupInputSources.test.ts +127 -0
- package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
- package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
- package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
- package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
- package/src/__tests__/composables/useCommandHistory.test.ts +43 -0
- package/src/__tests__/composables/useControlSchema.test.ts +1060 -0
- package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
- package/src/__tests__/composables/useDropdownState.test.ts +95 -0
- package/src/__tests__/composables/useEventListener.test.ts +116 -0
- package/src/__tests__/composables/useEventStream.test.ts +140 -0
- package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
- package/src/__tests__/composables/useExperimentData.test.ts +154 -0
- package/src/__tests__/composables/useExperimentSamples.test.ts +91 -0
- package/src/__tests__/composables/useExperimentSave.test.ts +542 -0
- package/src/__tests__/composables/useExperimentSelector.test.ts +338 -0
- package/src/__tests__/composables/useFileImport.test.ts +44 -0
- package/src/__tests__/composables/useForm.test.ts +263 -0
- package/src/__tests__/composables/useFormBuilder.test.ts +994 -0
- package/src/__tests__/composables/useGeneratedAnalysis.test.ts +1903 -0
- package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
- package/src/__tests__/composables/useJobsStatusTray.test.ts +283 -0
- package/src/__tests__/composables/useListSelection.test.ts +66 -0
- package/src/__tests__/composables/useMobileSupportGate.test.ts +74 -0
- package/src/__tests__/composables/useOptimisticMutation.test.ts +40 -0
- package/src/__tests__/composables/usePlatformContext.test.ts +148 -0
- package/src/__tests__/composables/usePluginClient.test.ts +1772 -0
- package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
- package/src/__tests__/composables/usePresenceHeartbeat.test.ts +164 -0
- package/src/__tests__/composables/useProtocolTemplates.test.ts +64 -0
- package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
- package/src/__tests__/composables/useResourceCrud.test.ts +56 -0
- package/src/__tests__/composables/useRuntimeAlignment.test.ts +145 -0
- package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
- package/src/__tests__/composables/useSampleGroups.tree.test.ts +145 -0
- package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
- package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
- package/src/__tests__/composables/useSortedItems.test.ts +87 -0
- package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
- package/src/__tests__/composables/useTextSearch.test.ts +55 -0
- package/src/__tests__/composables/useTheme.test.ts +91 -0
- package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
- package/src/__tests__/composables/useWellPainting.test.ts +52 -0
- package/src/__tests__/composables/useWellPlateAdapter.test.ts +50 -0
- package/src/__tests__/composables/useWellPlateValidation.test.ts +42 -0
- package/src/__tests__/docs/extractDocsComponents.test.ts +156 -0
- package/src/__tests__/docs/extractDocsExports.test.ts +92 -0
- package/src/__tests__/docs/extractDocsParsing.test.ts +91 -0
- package/src/__tests__/docs/extractDocsTemplates.test.ts +53 -0
- package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +436 -0
- package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
- package/src/__tests__/fixtures/templates/dose-response.json +81 -0
- package/src/__tests__/fixtures/templates/plate-map.json +54 -0
- package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
- package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
- package/src/__tests__/generatedUi.test.ts +119 -0
- package/src/__tests__/stores/experiment.test.ts +300 -0
- package/src/__tests__/stores/settings.test.ts +78 -0
- package/src/__tests__/templates/templates.test.ts +1185 -0
- package/src/__tests__/types/GeneratedJsonSchema.test.ts +62 -0
- package/src/__tests__/utils/color.test.ts +96 -0
- package/src/__tests__/utils/instrument.test.ts +47 -0
- package/src/__tests__/utils/jobs.test.ts +95 -0
- package/src/__tests__/utils/lcms.test.ts +73 -0
- package/src/__tests__/utils/permissions.test.ts +62 -0
- package/src/__tests__/utils/rack.test.ts +120 -0
- package/src/components/ActionMenu.story.vue +26 -0
- package/src/components/ActionMenu.vue +209 -0
- package/src/components/AlertBox.story.vue +204 -0
- package/src/components/AlertBox.vue +88 -0
- package/src/components/AppAvatarMenu.story.vue +155 -0
- package/src/components/AppAvatarMenu.vue +133 -0
- package/src/components/AppContainer.story.vue +104 -0
- package/src/components/AppContainer.vue +34 -0
- package/src/components/AppLayout.story.vue +331 -0
- package/src/components/AppLayout.vue +156 -0
- package/src/components/AppPluginSwitcher.vue +137 -0
- package/src/components/AppSidebar.story.vue +584 -0
- package/src/components/AppSidebar.vue +471 -0
- package/src/components/AppToastContainer.story.vue +157 -0
- package/src/components/AppToastContainer.vue +62 -0
- package/src/components/AppTopBar.navigation.ts +60 -0
- package/src/components/AppTopBar.story.vue +280 -0
- package/src/components/AppTopBar.vue +474 -0
- package/src/components/ArtifactSaveDialog.story.vue +319 -0
- package/src/components/ArtifactSaveDialog.vue +434 -0
- package/src/components/ArtifactSelectorModal.story.vue +295 -0
- package/src/components/ArtifactSelectorModal.vue +333 -0
- package/src/components/AuditTrail.story.vue +163 -0
- package/src/components/AuditTrail.vue +151 -0
- package/src/components/AutoGroupModal.adapter.ts +203 -0
- package/src/components/AutoGroupModal.story.vue +458 -0
- package/src/components/AutoGroupModal.vue +294 -0
- package/src/components/Avatar.story.vue +115 -0
- package/src/components/Avatar.vue +79 -0
- package/src/components/BaseButton.story.vue +96 -0
- package/src/components/BaseButton.vue +75 -0
- package/src/components/BaseCheckbox.story.vue +100 -0
- package/src/components/BaseCheckbox.vue +131 -0
- package/src/components/BaseInput.story.vue +98 -0
- package/src/components/BaseInput.vue +76 -0
- package/src/components/BaseModal.story.vue +335 -0
- package/src/components/BaseModal.vue +328 -0
- package/src/components/BasePill.story.vue +142 -0
- package/src/components/BasePill.vue +89 -0
- package/src/components/BaseRadioGroup.story.vue +145 -0
- package/src/components/BaseRadioGroup.vue +128 -0
- package/src/components/BaseSelect.story.vue +120 -0
- package/src/components/BaseSelect.vue +89 -0
- package/src/components/BaseSlider.story.vue +122 -0
- package/src/components/BaseSlider.vue +126 -0
- package/src/components/BaseTabs.story.vue +127 -0
- package/src/components/BaseTabs.vue +82 -0
- package/src/components/BaseTextarea.story.vue +91 -0
- package/src/components/BaseTextarea.vue +62 -0
- package/src/components/BaseToggle.story.vue +108 -0
- package/src/components/BaseToggle.vue +143 -0
- package/src/components/BatchProgressList.story.vue +92 -0
- package/src/components/BatchProgressList.vue +181 -0
- package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
- package/src/components/BioTemplateExperimentWorkspaceView.vue +350 -0
- package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
- package/src/components/BioTemplatePackWorkspaceView.vue +184 -0
- package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
- package/src/components/BioTemplatePresetWorkspaceView.vue +408 -0
- package/src/components/BioTemplateRenderer.story.vue +57 -0
- package/src/components/BioTemplateRenderer.vue +64 -0
- package/src/components/Breadcrumb.story.vue +106 -0
- package/src/components/Breadcrumb.vue +81 -0
- package/src/components/Calendar.story.vue +106 -0
- package/src/components/Calendar.vue +367 -0
- package/src/components/ChartContainer.story.vue +113 -0
- package/src/components/ChartContainer.vue +64 -0
- package/src/components/ChemicalFormula.story.vue +102 -0
- package/src/components/ChemicalFormula.vue +39 -0
- package/src/components/CollapsibleCard.story.vue +135 -0
- package/src/components/CollapsibleCard.vue +245 -0
- package/src/components/ColorSlider.story.vue +120 -0
- package/src/components/ColorSlider.vue +164 -0
- package/src/components/ComponentBindingRenderer.story.vue +87 -0
- package/src/components/ComponentBindingRenderer.vue +324 -0
- package/src/components/ConcentrationInput.story.vue +77 -0
- package/src/components/ConcentrationInput.vue +149 -0
- package/src/components/ConfirmDialog.story.vue +248 -0
- package/src/components/ConfirmDialog.vue +100 -0
- package/src/components/ControlWorkspaceView.story.vue +347 -0
- package/src/components/ControlWorkspaceView.vue +381 -0
- package/src/components/DataFrame.story.vue +148 -0
- package/src/components/DataFrame.vue +520 -0
- package/src/components/DatePicker.story.vue +119 -0
- package/src/components/DatePicker.vue +197 -0
- package/src/components/DateTimePicker.story.vue +112 -0
- package/src/components/DateTimePicker.vue +271 -0
- package/src/components/Divider.story.vue +80 -0
- package/src/components/Divider.vue +49 -0
- package/src/components/DoseCalculator.story.vue +68 -0
- package/src/components/DoseCalculator.vue +416 -0
- package/src/components/DoseCalculatorVolumeField.vue +61 -0
- package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
- package/src/components/DoseDesignWorkspaceView.vue +262 -0
- package/src/components/DropdownButton.story.vue +102 -0
- package/src/components/DropdownButton.vue +163 -0
- package/src/components/EmptyState.story.vue +135 -0
- package/src/components/EmptyState.vue +71 -0
- package/src/components/ExperimentCodeBadge.story.vue +77 -0
- package/src/components/ExperimentCodeBadge.vue +64 -0
- package/src/components/ExperimentDataViewer.story.vue +174 -0
- package/src/components/ExperimentDataViewer.vue +293 -0
- package/src/components/ExperimentPopover.story.vue +442 -0
- package/src/components/ExperimentPopover.vue +312 -0
- package/src/components/ExperimentSelectorModal.story.vue +381 -0
- package/src/components/ExperimentSelectorModal.vue +432 -0
- package/src/components/ExperimentTimeline.story.vue +161 -0
- package/src/components/ExperimentTimeline.vue +357 -0
- package/src/components/FileUploader.story.vue +107 -0
- package/src/components/FileUploader.vue +424 -0
- package/src/components/FitPanel.story.vue +125 -0
- package/src/components/FitPanel.vue +120 -0
- package/src/components/FormActions.vue +92 -0
- package/src/components/FormBuilder.story.vue +203 -0
- package/src/components/FormBuilder.vue +311 -0
- package/src/components/FormField.story.vue +132 -0
- package/src/components/FormField.vue +59 -0
- package/src/components/FormulaInput.story.vue +96 -0
- package/src/components/FormulaInput.vue +125 -0
- package/src/components/GeneratedPathInput.vue +218 -0
- package/src/components/GeneratedPlotlyResult.vue +87 -0
- package/src/components/GeneratedPluginView.vue +289 -0
- package/src/components/GeneratedResultRenderer.vue +147 -0
- package/src/components/GroupAssigner.story.vue +83 -0
- package/src/components/GroupAssigner.vue +257 -0
- package/src/components/IconButton.story.vue +140 -0
- package/src/components/IconButton.vue +73 -0
- package/src/components/InstrumentAlertLog.vue +191 -0
- package/src/components/InstrumentStateBadge.vue +50 -0
- package/src/components/InstrumentStatusCard.vue +188 -0
- package/src/components/JobsStatusTray.story.vue +126 -0
- package/src/components/JobsStatusTray.vue +407 -0
- package/src/components/LcmsSequenceTable.vue +191 -0
- package/src/components/LoadingSpinner.story.vue +70 -0
- package/src/components/LoadingSpinner.vue +50 -0
- package/src/components/MobileSupportGate.story.vue +52 -0
- package/src/components/MobileSupportGate.vue +115 -0
- package/src/components/MoleculeInput.story.vue +66 -0
- package/src/components/MoleculeInput.vue +426 -0
- package/src/components/MultiSelect.story.vue +132 -0
- package/src/components/MultiSelect.vue +123 -0
- package/src/components/NumberInput.story.vue +122 -0
- package/src/components/NumberInput.vue +162 -0
- package/src/components/PlateMapEditor.story.vue +92 -0
- package/src/components/PlateMapEditor.vue +434 -0
- package/src/components/PluginIcon.story.vue +103 -0
- package/src/components/PluginIcon.vue +158 -0
- package/src/components/PluginWorkspaceView.controls.ts +182 -0
- package/src/components/PluginWorkspaceView.navigation.ts +106 -0
- package/src/components/PluginWorkspaceView.props.ts +169 -0
- package/src/components/PluginWorkspaceView.shell.ts +67 -0
- package/src/components/PluginWorkspaceView.story.vue +341 -0
- package/src/components/PluginWorkspaceView.vue +395 -0
- package/src/components/ProgressBar.story.vue +148 -0
- package/src/components/ProgressBar.vue +117 -0
- package/src/components/ProtocolStep.presentation.ts +31 -0
- package/src/components/ProtocolStepEditor.state.ts +104 -0
- package/src/components/ProtocolStepEditor.story.vue +69 -0
- package/src/components/ProtocolStepEditor.vue +382 -0
- package/src/components/ProtocolStepParameterField.vue +134 -0
- package/src/components/RackEditor.story.vue +100 -0
- package/src/components/RackEditor.vue +442 -0
- package/src/components/ReagentEditor.story.vue +153 -0
- package/src/components/ReagentEditor.vue +418 -0
- package/src/components/ReagentList.presentation.ts +105 -0
- package/src/components/ReagentList.story.vue +137 -0
- package/src/components/ReagentList.vue +392 -0
- package/src/components/ResourceCard.story.vue +150 -0
- package/src/components/ResourceCard.vue +161 -0
- package/src/components/RuntimeUpdateNotice.vue +51 -0
- package/src/components/SampleHierarchyTree.story.vue +161 -0
- package/src/components/SampleHierarchyTree.vue +246 -0
- package/src/components/SampleLegend.story.vue +91 -0
- package/src/components/SampleLegend.vue +119 -0
- package/src/components/SampleSelector.colors.ts +48 -0
- package/src/components/SampleSelector.drag.ts +164 -0
- package/src/components/SampleSelector.groups.ts +109 -0
- package/src/components/SampleSelector.selection.ts +64 -0
- package/src/components/SampleSelector.story.vue +192 -0
- package/src/components/SampleSelector.tree.ts +48 -0
- package/src/components/SampleSelector.vue +451 -0
- package/src/components/SampleSelectorGroupNode.vue +197 -0
- package/src/components/SampleSelectorSampleRow.vue +68 -0
- package/src/components/ScheduleCalendar.story.vue +195 -0
- package/src/components/ScheduleCalendar.vue +414 -0
- package/src/components/ScientificNumber.story.vue +127 -0
- package/src/components/ScientificNumber.vue +197 -0
- package/src/components/SectionCard.story.vue +163 -0
- package/src/components/SectionCard.vue +98 -0
- package/src/components/SegmentedControl.story.vue +149 -0
- package/src/components/SegmentedControl.vue +94 -0
- package/src/components/SequenceInput.story.vue +119 -0
- package/src/components/SequenceInput.vue +209 -0
- package/src/components/SequenceProgressBar.vue +71 -0
- package/src/components/SettingsModal.schema.ts +74 -0
- package/src/components/SettingsModal.story.vue +524 -0
- package/src/components/SettingsModal.vue +399 -0
- package/src/components/Skeleton.story.vue +141 -0
- package/src/components/Skeleton.vue +74 -0
- package/src/components/SmartGroup.types.ts +98 -0
- package/src/components/SmartGroupFieldRecipe.groups.ts +109 -0
- package/src/components/SmartGroupFieldRecipe.story.vue +58 -0
- package/src/components/SmartGroupFieldRecipe.vue +499 -0
- package/src/components/SmartGroupManual.cohorts.ts +112 -0
- package/src/components/SmartGroupManual.story.vue +55 -0
- package/src/components/SmartGroupManual.vue +398 -0
- package/src/components/SmartGroupModal.story.vue +61 -0
- package/src/components/SmartGroupModal.vue +61 -0
- package/src/components/StatusIndicator.story.vue +99 -0
- package/src/components/StatusIndicator.vue +40 -0
- package/src/components/StepWizard.story.vue +155 -0
- package/src/components/StepWizard.vue +223 -0
- package/src/components/TagsInput.story.vue +155 -0
- package/src/components/TagsInput.vue +280 -0
- package/src/components/ThemeToggle.story.vue +36 -0
- package/src/components/ThemeToggle.vue +56 -0
- package/src/components/TimePicker.story.vue +96 -0
- package/src/components/TimePicker.vue +251 -0
- package/src/components/TimeRangeInput.story.vue +104 -0
- package/src/components/TimeRangeInput.vue +122 -0
- package/src/components/Tooltip.story.vue +138 -0
- package/src/components/Tooltip.vue +114 -0
- package/src/components/UnitInput.story.vue +194 -0
- package/src/components/UnitInput.vue +217 -0
- package/src/components/WellPlate.colors.ts +56 -0
- package/src/components/WellPlate.conditions.ts +100 -0
- package/src/components/WellPlate.geometry.ts +91 -0
- package/src/components/WellPlate.interaction.ts +272 -0
- package/src/components/WellPlate.legend.ts +8 -0
- package/src/components/WellPlate.rendering.ts +105 -0
- package/src/components/WellPlate.sampleDrop.ts +73 -0
- package/src/components/WellPlate.story.vue +282 -0
- package/src/components/WellPlate.vue +497 -0
- package/src/components/index.ts +139 -0
- package/src/components/internal/ActionItemInternal.vue +82 -0
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +127 -0
- package/src/components/internal/AppTopBarPillNavInternal.vue +194 -0
- package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
- package/src/components/internal/FormFieldRendererInternal.vue +68 -0
- package/src/components/internal/FormSectionRenderer.vue +78 -0
- package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
- package/src/components/internal/WellEditPopupInternal.vue +230 -0
- package/src/composables/analysisArtifactTarget.ts +53 -0
- package/src/composables/autoGroup/classKey.ts +8 -0
- package/src/composables/autoGroup/classify.ts +205 -0
- package/src/composables/autoGroup/colors.ts +6 -0
- package/src/composables/autoGroup/columns.ts +226 -0
- package/src/composables/autoGroup/compose.ts +244 -0
- package/src/composables/autoGroup/cooccurrence.ts +46 -0
- package/src/composables/autoGroup/csv-shim.ts +44 -0
- package/src/composables/autoGroup/fingerprint.ts +63 -0
- package/src/composables/autoGroup/index.ts +22 -0
- package/src/composables/autoGroup/replicatePreGroup.ts +124 -0
- package/src/composables/autoGroup/template.ts +126 -0
- package/src/composables/autoGroup/tokenLength.ts +53 -0
- package/src/composables/autoGroup/tokenize.ts +41 -0
- package/src/composables/autoGroup/vocab.json +66 -0
- package/src/composables/autoGroupConstants.ts +4 -0
- package/src/composables/autoGroupGrouping.ts +148 -0
- package/src/composables/controlComponentBindings.ts +80 -0
- package/src/composables/controlSchemaAdapters.ts +199 -0
- package/src/composables/controlSchemaDoseDesign.ts +222 -0
- package/src/composables/controlSchemaFormFields.ts +64 -0
- package/src/composables/controlSchemaLayout.ts +59 -0
- package/src/composables/controlSchemaModel.ts +172 -0
- package/src/composables/controlSchemaNormalize.ts +101 -0
- package/src/composables/controlSchemaTypes.ts +372 -0
- package/src/composables/controlSchemaUtils.ts +36 -0
- package/src/composables/controlWorkspaceOptions.ts +21 -0
- package/src/composables/experiment-utils.ts +105 -0
- package/src/composables/experimentDesignData.ts +182 -0
- package/src/composables/formBuilderRegistry.ts +81 -0
- package/src/composables/formBuilderSchema.ts +153 -0
- package/src/composables/index.ts +530 -0
- package/src/composables/platformContextHelpers.ts +81 -0
- package/src/composables/pluginEndpointBuilder.ts +267 -0
- package/src/composables/pluginFrontendBase.ts +22 -0
- package/src/composables/protocolTemplateCatalog.ts +325 -0
- package/src/composables/useAnalysisArtifacts.ts +361 -0
- package/src/composables/useApi.ts +319 -0
- package/src/composables/useAppExperiment.ts +228 -0
- package/src/composables/useAsync.ts +323 -0
- package/src/composables/useAuth.ts +458 -0
- package/src/composables/useAutoGroup.ts +682 -0
- package/src/composables/useAutoGroupInputSources.ts +147 -0
- package/src/composables/useBioTemplateComponents.ts +105 -0
- package/src/composables/useBioTemplateControls.ts +41 -0
- package/src/composables/useBioTemplatePackWorkspace.ts +193 -0
- package/src/composables/useBioTemplatePresetWorkspace.ts +326 -0
- package/src/composables/useBioTemplateWorkspace.ts +141 -0
- package/src/composables/useCalendarGrid.ts +140 -0
- package/src/composables/useChemicalFormula.ts +275 -0
- package/src/composables/useCommandHistory.ts +113 -0
- package/src/composables/useConcentrationUnits.ts +246 -0
- package/src/composables/useControlSchema.ts +135 -0
- package/src/composables/useControlWorkspace.ts +209 -0
- package/src/composables/useDebouncedWatch.ts +119 -0
- package/src/composables/useDoseCalculator.ts +370 -0
- package/src/composables/useDropdownState.ts +83 -0
- package/src/composables/useEventListener.ts +111 -0
- package/src/composables/useEventStream.ts +314 -0
- package/src/composables/useExpansionSet.ts +117 -0
- package/src/composables/useExperimentData.ts +136 -0
- package/src/composables/useExperimentSamples.ts +142 -0
- package/src/composables/useExperimentSave.ts +344 -0
- package/src/composables/useExperimentSelector.ts +408 -0
- package/src/composables/useFileImport.ts +231 -0
- package/src/composables/useForm.ts +279 -0
- package/src/composables/useFormBuilder.ts +292 -0
- package/src/composables/useFormValidation.ts +154 -0
- package/src/composables/useGeneratedAnalysis.ts +1227 -0
- package/src/composables/useGroupAssignment.ts +148 -0
- package/src/composables/useJobsStatusTray.ts +493 -0
- package/src/composables/useListSelection.ts +158 -0
- package/src/composables/useMobileSupportGate.ts +80 -0
- package/src/composables/useOptimisticMutation.ts +107 -0
- package/src/composables/usePasskey.ts +216 -0
- package/src/composables/usePlatformContext.ts +299 -0
- package/src/composables/usePluginClient.ts +968 -0
- package/src/composables/usePluginConfig.ts +250 -0
- package/src/composables/usePresenceHeartbeat.ts +201 -0
- package/src/composables/useProtocolTemplates.ts +212 -0
- package/src/composables/useRackEditor.ts +223 -0
- package/src/composables/useReagentSeries.ts +91 -0
- package/src/composables/useRequestSyncState.ts +126 -0
- package/src/composables/useResourceCrud.ts +245 -0
- package/src/composables/useRuntimeAlignment.ts +184 -0
- package/src/composables/useSampleGroups.ts +211 -0
- package/src/composables/useScheduleCalendarLayout.ts +287 -0
- package/src/composables/useScheduleDrag.ts +245 -0
- package/src/composables/useSelectionLimit.ts +57 -0
- package/src/composables/useSequenceUtils.ts +105 -0
- package/src/composables/useSortedItems.ts +118 -0
- package/src/composables/useTemplateCollection.ts +229 -0
- package/src/composables/useTextSearch.ts +60 -0
- package/src/composables/useTheme.ts +32 -0
- package/src/composables/useTimeUtils.ts +155 -0
- package/src/composables/useToast.ts +40 -0
- package/src/composables/useWellPainting.ts +187 -0
- package/src/composables/useWellPlateAdapter.ts +147 -0
- package/src/composables/useWellPlateEditor.ts +425 -0
- package/src/composables/useWellPlateValidation.ts +85 -0
- package/src/generated/schema.ts +130 -0
- package/src/generated-ui/main.ts +21 -0
- package/src/histoire.setup.ts +17 -0
- package/src/index.ts +67 -0
- package/src/install.ts +39 -0
- package/src/instrument.ts +90 -0
- package/src/jobs.ts +80 -0
- package/src/lcms.ts +108 -0
- package/src/permissions.ts +144 -0
- package/src/plotly-dist.d.ts +3 -0
- package/src/stores/auth.ts +206 -0
- package/src/stores/experiment.ts +120 -0
- package/src/stores/index.ts +3 -0
- package/src/stores/settings.ts +232 -0
- package/src/styles/components/action-menu.css +59 -0
- package/src/styles/components/alert-box.css +150 -0
- package/src/styles/components/app-avatar-menu.css +156 -0
- package/src/styles/components/app-container.css +33 -0
- package/src/styles/components/app-layout.css +180 -0
- package/src/styles/components/app-page-selector.css +212 -0
- package/src/styles/components/app-pill-nav.css +133 -0
- package/src/styles/components/app-plugin-switcher.css +196 -0
- package/src/styles/components/app-sidebar.css +392 -0
- package/src/styles/components/app-top-bar.css +249 -0
- package/src/styles/components/artifact-save-dialog.css +17 -0
- package/src/styles/components/artifact-selector-modal.css +216 -0
- package/src/styles/components/audit-trail.css +143 -0
- package/src/styles/components/avatar.css +73 -0
- package/src/styles/components/batch-progress-list.css +196 -0
- package/src/styles/components/breadcrumb.css +64 -0
- package/src/styles/components/button.css +192 -0
- package/src/styles/components/calendar.css +192 -0
- package/src/styles/components/chart-container.css +69 -0
- package/src/styles/components/checkbox.css +210 -0
- package/src/styles/components/chemical-formula.css +46 -0
- package/src/styles/components/collapsible-card.css +393 -0
- package/src/styles/components/color-slider.css +110 -0
- package/src/styles/components/concentration-input.css +17 -0
- package/src/styles/components/confirm-dialog.css +59 -0
- package/src/styles/components/dataframe.css +554 -0
- package/src/styles/components/date-picker.css +243 -0
- package/src/styles/components/datetime-picker.css +229 -0
- package/src/styles/components/divider.css +63 -0
- package/src/styles/components/dose-calculator.css +297 -0
- package/src/styles/components/dropdown-button.css +280 -0
- package/src/styles/components/empty-state.css +135 -0
- package/src/styles/components/experiment-code-badge.css +33 -0
- package/src/styles/components/experiment-data-viewer.css +138 -0
- package/src/styles/components/experiment-popover.css +563 -0
- package/src/styles/components/experiment-selector-modal.css +341 -0
- package/src/styles/components/experiment-timeline.css +529 -0
- package/src/styles/components/file-uploader.css +310 -0
- package/src/styles/components/fit-panel.css +67 -0
- package/src/styles/components/form-builder.css +69 -0
- package/src/styles/components/form-field.css +48 -0
- package/src/styles/components/formula-input.css +103 -0
- package/src/styles/components/group-assigner.css +200 -0
- package/src/styles/components/icon-button.css +196 -0
- package/src/styles/components/input.css +65 -0
- package/src/styles/components/instrument-monitor.css +478 -0
- package/src/styles/components/jobs-status-tray.css +420 -0
- package/src/styles/components/lcms-sequence-table.css +189 -0
- package/src/styles/components/loading-spinner.css +67 -0
- package/src/styles/components/mobile-support-gate.css +119 -0
- package/src/styles/components/modal.css +646 -0
- package/src/styles/components/molecule-input.css +186 -0
- package/src/styles/components/multi-select.css +131 -0
- package/src/styles/components/number-input.css +199 -0
- package/src/styles/components/pill.css +188 -0
- package/src/styles/components/plate-map-editor.css +464 -0
- package/src/styles/components/plugin-icon.css +46 -0
- package/src/styles/components/progress-bar.css +133 -0
- package/src/styles/components/protocol-step-editor.css +443 -0
- package/src/styles/components/rack-editor.css +265 -0
- package/src/styles/components/radio-group.css +240 -0
- package/src/styles/components/reagent-editor.css +505 -0
- package/src/styles/components/reagent-list.css +407 -0
- package/src/styles/components/resource-card.css +360 -0
- package/src/styles/components/sample-hierarchy-tree.css +310 -0
- package/src/styles/components/sample-legend.css +201 -0
- package/src/styles/components/sample-selector.css +682 -0
- package/src/styles/components/schedule-calendar.css +472 -0
- package/src/styles/components/scientific-number.css +63 -0
- package/src/styles/components/section-card.css +161 -0
- package/src/styles/components/segmented-control.css +194 -0
- package/src/styles/components/select.css +77 -0
- package/src/styles/components/sequence-input.css +184 -0
- package/src/styles/components/sequence-progress-bar.css +63 -0
- package/src/styles/components/settings-modal.css +76 -0
- package/src/styles/components/skeleton.css +49 -0
- package/src/styles/components/slider.css +74 -0
- package/src/styles/components/smart-group.css +734 -0
- package/src/styles/components/status-indicator.css +66 -0
- package/src/styles/components/step-wizard.css +192 -0
- package/src/styles/components/tabs.css +103 -0
- package/src/styles/components/tags-input.css +195 -0
- package/src/styles/components/textarea.css +81 -0
- package/src/styles/components/theme-toggle.css +6 -0
- package/src/styles/components/time-picker.css +171 -0
- package/src/styles/components/time-range-input.css +42 -0
- package/src/styles/components/toast.css +91 -0
- package/src/styles/components/toggle.css +226 -0
- package/src/styles/components/tooltip.css +91 -0
- package/src/styles/components/unit-input.css +123 -0
- package/src/styles/components/well-edit-popup.css +258 -0
- package/src/styles/components/well-plate.css +286 -0
- package/src/styles/index.css +93 -0
- package/src/styles/variables.css +1150 -0
- package/src/tailwind.preset.ts +66 -0
- package/src/templates/adapters.ts +137 -0
- package/src/templates/assayLookups.ts +33 -0
- package/src/templates/assayMatrixAdapters.ts +78 -0
- package/src/templates/assayMatrixBuilder.ts +59 -0
- package/src/templates/assayNormalizers.ts +34 -0
- package/src/templates/builderDefaults.ts +11 -0
- package/src/templates/builderIdUtils.ts +20 -0
- package/src/templates/builderPresetControls.ts +165 -0
- package/src/templates/builderReadUtils.ts +57 -0
- package/src/templates/builders.ts +122 -0
- package/src/templates/calibrationCurveAdapters.ts +59 -0
- package/src/templates/calibrationCurveBuilder.ts +99 -0
- package/src/templates/calibrationNormalizers.ts +60 -0
- package/src/templates/catalog.ts +245 -0
- package/src/templates/componentBindingCatalog.ts +90 -0
- package/src/templates/componentBindingHelpers.ts +93 -0
- package/src/templates/componentBindings.ts +253 -0
- package/src/templates/componentDoseResponseProps.ts +42 -0
- package/src/templates/componentGenericProps.ts +77 -0
- package/src/templates/componentPlateHelpers.ts +29 -0
- package/src/templates/componentPlateMapProps.ts +32 -0
- package/src/templates/componentPropsFactory.ts +21 -0
- package/src/templates/componentQpcrPlateProps.ts +28 -0
- package/src/templates/componentTargetResolvers.ts +69 -0
- package/src/templates/componentTemplateProps.ts +78 -0
- package/src/templates/controlSchemaClone.ts +32 -0
- package/src/templates/controlSchemaConstants.ts +11 -0
- package/src/templates/controlSchemaMerge.ts +40 -0
- package/src/templates/controlSchemaTargets.ts +87 -0
- package/src/templates/controlSchemaTypes.ts +20 -0
- package/src/templates/controlSchemas.ts +104 -0
- package/src/templates/defaultBioTemplateBuilder.ts +124 -0
- package/src/templates/doseResponseAdapters.ts +45 -0
- package/src/templates/doseResponseBuilder.ts +44 -0
- package/src/templates/elisaAssayCollectionBuilder.ts +62 -0
- package/src/templates/flowCytometryAssayCollectionBuilder.ts +41 -0
- package/src/templates/flowCytometryPanelBuilder.ts +53 -0
- package/src/templates/flowNormalizers.ts +58 -0
- package/src/templates/flowPanelAdapters.ts +58 -0
- package/src/templates/index.ts +326 -0
- package/src/templates/instrumentRunAdapterHelpers.ts +94 -0
- package/src/templates/instrumentRunAdapters.ts +163 -0
- package/src/templates/instrumentRunBuilder.ts +97 -0
- package/src/templates/lcmsBatchCollectionBuilder.ts +38 -0
- package/src/templates/lookup.ts +18 -0
- package/src/templates/packs.ts +162 -0
- package/src/templates/plateGeometry.ts +62 -0
- package/src/templates/plateMapAdapters.ts +36 -0
- package/src/templates/plateMapBuilder.ts +43 -0
- package/src/templates/presetControlSchemas.ts +258 -0
- package/src/templates/presets.ts +179 -0
- package/src/templates/protocolAdapters.ts +69 -0
- package/src/templates/protocolNormalizers.ts +37 -0
- package/src/templates/protocolStepsBuilder.ts +36 -0
- package/src/templates/qpcrAdapters.ts +104 -0
- package/src/templates/qpcrExpressionCollectionBuilder.ts +33 -0
- package/src/templates/qpcrPlateBuilder.ts +96 -0
- package/src/templates/reagentAdapters.ts +77 -0
- package/src/templates/reagentListBuilder.ts +30 -0
- package/src/templates/runNormalizers.ts +63 -0
- package/src/templates/sampleNormalizers.ts +58 -0
- package/src/templates/samplePrepAdapters.ts +63 -0
- package/src/templates/samplePrepBuilder.ts +51 -0
- package/src/templates/sampleSheetAdapters.ts +75 -0
- package/src/templates/sampleSheetBuilder.ts +23 -0
- package/src/templates/targetedMetabolomicsCollectionBuilder.ts +79 -0
- package/src/templates/targetedMetabolomicsHelpers.ts +102 -0
- package/src/templates/templateAdapterTypes.ts +58 -0
- package/src/templates/templateControlSchemas.ts +320 -0
- package/src/templates/templateCreateOptions.ts +208 -0
- package/src/templates/templateEnvelopes.ts +137 -0
- package/src/templates/templatePackCollectionBuilder.ts +23 -0
- package/src/templates/templatePresetCollectionBuilder.ts +139 -0
- package/src/templates/templateQpcrTypes.ts +48 -0
- package/src/templates/templateValidators.ts +414 -0
- package/src/templates/timeCourseAdapters.ts +73 -0
- package/src/templates/timeCourseBuilder.ts +64 -0
- package/src/templates/types.ts +493 -0
- package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
- package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
- package/src/types/analysisArtifactTypes.ts +176 -0
- package/src/types/auth.ts +59 -0
- package/src/types/auto-group.ts +157 -0
- package/src/types/componentLabTypes.ts +235 -0
- package/src/types/componentWorkflowTypes.ts +190 -0
- package/src/types/components.ts +527 -0
- package/src/types/form-builder.ts +207 -0
- package/src/types/generated-ui.ts +189 -0
- package/src/types/index.ts +299 -0
- package/src/types/instrument.ts +62 -0
- package/src/types/jobs.ts +70 -0
- package/src/types/platform.ts +132 -0
- package/src/utils/color.ts +96 -0
- package/src/utils/formModelSync.ts +52 -0
- package/src/utils/items.ts +28 -0
- package/src/utils/options.ts +23 -0
- package/src/utils/pluginIcon.ts +190 -0
- package/src/utils/rack.ts +209 -0
- package/src/utils/sampleGroupPath.ts +19 -0
- package/dist/ExperimentPopover-C1e0cd94.js +0 -3
- package/dist/ExperimentSelectorModal-DCWTFyos.js +0 -4
- package/dist/SettingsModal-Bpybht86.js +0 -5
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { d as resolveExperimentCode } from "./experiment-utils-CLnzPPq5.js";
|
|
2
2
|
import { r as useRequestSyncState } from "./EmptyState-p90quq8Z.js";
|
|
3
|
-
import { A as useConcentrationUnits, H as parseExperimentId, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, u as useControlWorkspace } from "./useControlSchema-
|
|
4
|
-
import { o as useSettingsStore, r as useApi } from "./useApi-
|
|
5
|
-
import { t as useExperimentStore } from "./experiment-
|
|
6
|
-
import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps$1, H as toBioTemplateComponentPropsById, Jt as getBioTemplatePresetInfo, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, U as toBioTemplateComponentSnippets, V as toBioTemplateComponentPropsByComponent$1, W as toBioTemplateComponentUsage, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, i as createBioTemplateControlToolkit, p as createBioTemplatePackCollection, sn as createTemplateCollection, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, z as toBioTemplateComponentImports } from "./templates-
|
|
3
|
+
import { A as useConcentrationUnits, H as parseExperimentId, J as isActiveJobStatus, Q as normalizeJobState, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, u as useControlWorkspace } from "./useControlSchema-CXhxTul7.js";
|
|
4
|
+
import { o as useSettingsStore, r as useApi } from "./useApi-CDBq6z23.js";
|
|
5
|
+
import { t as useExperimentStore } from "./experiment-Y9Iz7KYi.js";
|
|
6
|
+
import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps$1, H as toBioTemplateComponentPropsById, Jt as getBioTemplatePresetInfo, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, U as toBioTemplateComponentSnippets, V as toBioTemplateComponentPropsByComponent$1, W as toBioTemplateComponentUsage, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, i as createBioTemplateControlToolkit, p as createBioTemplatePackCollection, sn as createTemplateCollection, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, z as toBioTemplateComponentImports } from "./templates-BTJ9C9Kb.js";
|
|
7
7
|
import { computed, effectScope, getCurrentScope, inject, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowRef, toRaw, toValue, unref, watch } from "vue";
|
|
8
8
|
//#region src/composables/useSortedItems.ts
|
|
9
9
|
/** Shared sorting for SDK tables and lists with stable empty-value handling. */
|
|
@@ -528,32 +528,85 @@ function useMobileSupportGate(options = {}) {
|
|
|
528
528
|
};
|
|
529
529
|
}
|
|
530
530
|
//#endregion
|
|
531
|
-
//#region src/jobs.ts
|
|
532
|
-
var ACTIVE_JOB_STATUSES = new Set([
|
|
533
|
-
"awaiting_input",
|
|
534
|
-
"queued",
|
|
535
|
-
"running"
|
|
536
|
-
]);
|
|
537
|
-
/** Clamp invalid or out-of-range progress values for safe display. */
|
|
538
|
-
function normalizeJobPercent(value) {
|
|
539
|
-
if (!Number.isFinite(value)) return 0;
|
|
540
|
-
return Math.min(100, Math.max(0, value));
|
|
541
|
-
}
|
|
542
|
-
function isActiveJobStatus(status) {
|
|
543
|
-
return ACTIVE_JOB_STATUSES.has(status);
|
|
544
|
-
}
|
|
545
|
-
function jobStatusLabel(status) {
|
|
546
|
-
return {
|
|
547
|
-
awaiting_input: "Waiting for input",
|
|
548
|
-
queued: "Queued",
|
|
549
|
-
running: "Running",
|
|
550
|
-
completed: "Completed",
|
|
551
|
-
failed: "Failed",
|
|
552
|
-
cancelled: "Cancelled"
|
|
553
|
-
}[status];
|
|
554
|
-
}
|
|
555
|
-
//#endregion
|
|
556
531
|
//#region src/composables/useJobsStatusTray.ts
|
|
532
|
+
/**
|
|
533
|
+
* Combines independent job runtimes without copying their reactive state.
|
|
534
|
+
*
|
|
535
|
+
* Job ids must be globally unique across the sources. A duplicate id throws
|
|
536
|
+
* when jobs are read or an id-routed action is requested, rather than silently
|
|
537
|
+
* dispatching a mutation to the wrong owner.
|
|
538
|
+
*/
|
|
539
|
+
function combinePluginJobSources(sources) {
|
|
540
|
+
const jobs = computed(() => {
|
|
541
|
+
const combined = [];
|
|
542
|
+
const owners = /* @__PURE__ */ new Set();
|
|
543
|
+
for (const source of sources) for (const job of toValue(source.jobs)) {
|
|
544
|
+
if (owners.has(job.job_id)) throw duplicatePluginJobId(job.job_id);
|
|
545
|
+
owners.add(job.job_id);
|
|
546
|
+
combined.push(job);
|
|
547
|
+
}
|
|
548
|
+
return combined;
|
|
549
|
+
});
|
|
550
|
+
function ownerFor(jobId) {
|
|
551
|
+
let owner;
|
|
552
|
+
for (const source of sources) {
|
|
553
|
+
if (!toValue(source.jobs).some((job) => job.job_id === jobId)) continue;
|
|
554
|
+
if (owner) throw duplicatePluginJobId(jobId);
|
|
555
|
+
owner = source;
|
|
556
|
+
}
|
|
557
|
+
if (!owner) throw new Error(`Unknown plugin job id: ${jobId}`);
|
|
558
|
+
return owner;
|
|
559
|
+
}
|
|
560
|
+
const combined = { jobs };
|
|
561
|
+
if (sources.some((source) => source.refreshJobs)) combined.refreshJobs = async () => {
|
|
562
|
+
await Promise.all(sources.map((source) => source.refreshJobs?.()));
|
|
563
|
+
return jobs.value;
|
|
564
|
+
};
|
|
565
|
+
if (sources.some((source) => source.cancelJob)) combined.cancelJob = async (jobId) => {
|
|
566
|
+
const owner = ownerFor(jobId);
|
|
567
|
+
if (!owner.cancelJob) throw new Error(`Job ${jobId} cannot be cancelled by its source`);
|
|
568
|
+
return owner.cancelJob(jobId);
|
|
569
|
+
};
|
|
570
|
+
if (sources.length > 0 && sources.every((source) => source.deleteJob)) combined.deleteJob = async (jobId) => {
|
|
571
|
+
const owner = ownerFor(jobId);
|
|
572
|
+
if (!owner.deleteJob) throw new Error(`Job ${jobId} cannot be deleted by its source`);
|
|
573
|
+
return owner.deleteJob(jobId);
|
|
574
|
+
};
|
|
575
|
+
if (sources.length > 0 && sources.every((source) => source.clearFinishedJobs)) combined.clearFinishedJobs = async () => {
|
|
576
|
+
const results = await Promise.all(sources.map((source) => source.clearFinishedJobs()));
|
|
577
|
+
return results.every((result) => typeof result === "number") ? results.reduce((total, result) => total + result, 0) : void 0;
|
|
578
|
+
};
|
|
579
|
+
if (sources.some((source) => source.dispose)) combined.dispose = () => {
|
|
580
|
+
const errors = [];
|
|
581
|
+
for (const source of sources) try {
|
|
582
|
+
source.dispose?.();
|
|
583
|
+
} catch (cause) {
|
|
584
|
+
errors.push(cause);
|
|
585
|
+
}
|
|
586
|
+
if (errors.length === 1) throw errors[0];
|
|
587
|
+
if (errors.length > 1) throw new PluginJobSourceDisposeError(errors);
|
|
588
|
+
};
|
|
589
|
+
return combined;
|
|
590
|
+
}
|
|
591
|
+
var PluginJobSourceDisposeError = class extends Error {
|
|
592
|
+
cause;
|
|
593
|
+
errors;
|
|
594
|
+
constructor(errors) {
|
|
595
|
+
super("Failed to dispose plugin job sources");
|
|
596
|
+
this.name = "PluginJobSourceDisposeError";
|
|
597
|
+
this.cause = errors[0];
|
|
598
|
+
this.errors = Object.freeze([...errors]);
|
|
599
|
+
}
|
|
600
|
+
};
|
|
601
|
+
function duplicatePluginJobId(jobId) {
|
|
602
|
+
return /* @__PURE__ */ new Error(`Duplicate plugin job id across combined sources: ${jobId}`);
|
|
603
|
+
}
|
|
604
|
+
function responseJobs(response) {
|
|
605
|
+
return "jobs" in response ? response.jobs : response;
|
|
606
|
+
}
|
|
607
|
+
function isSnapshotPayload(data) {
|
|
608
|
+
return "jobs" in data && Array.isArray(data.jobs);
|
|
609
|
+
}
|
|
557
610
|
function errorMessage(error, fallback) {
|
|
558
611
|
return error instanceof Error ? error.message : fallback;
|
|
559
612
|
}
|
|
@@ -564,38 +617,94 @@ function errorMessage(error, fallback) {
|
|
|
564
617
|
* source. The controller never mirrors source jobs into another ref.
|
|
565
618
|
*/
|
|
566
619
|
function usePluginJobCenter(options = {}) {
|
|
620
|
+
const legacyOverride = shallowRef(null);
|
|
567
621
|
const isOpen = ref(false);
|
|
568
622
|
const activeTab = ref("active");
|
|
569
623
|
const isLoading = ref(false);
|
|
570
624
|
const error = shallowRef(null);
|
|
571
625
|
const pendingJobIds = ref(/* @__PURE__ */ new Set());
|
|
626
|
+
const jobRevisions = /* @__PURE__ */ new Map();
|
|
627
|
+
let stateRevision = 0;
|
|
572
628
|
let requestGeneration = 0;
|
|
573
629
|
let active = true;
|
|
574
630
|
const source = computed(() => toValue(options.source));
|
|
575
|
-
const
|
|
631
|
+
const adapter = computed(() => toValue(options.adapter));
|
|
632
|
+
const jobs = computed(() => {
|
|
633
|
+
const currentSource = source.value;
|
|
634
|
+
if (currentSource) return [...toValue(currentSource.jobs)].map(normalizeJobState);
|
|
635
|
+
const input = toValue(options.jobs);
|
|
636
|
+
const override = legacyOverride.value;
|
|
637
|
+
if (override && override.input === input) return override.jobs;
|
|
638
|
+
return input ? [...input].map(normalizeJobState) : [];
|
|
639
|
+
});
|
|
576
640
|
const activeJobs = computed(() => jobs.value.filter((job) => isActiveJobStatus(job.status)));
|
|
577
641
|
const historyJobs = computed(() => jobs.value.filter((job) => !isActiveJobStatus(job.status)));
|
|
578
642
|
const deletableJobs = computed(() => historyJobs.value.filter((job) => job.can_delete));
|
|
579
643
|
const featuredJob = computed(() => activeJobs.value[0] ?? historyJobs.value[0] ?? null);
|
|
580
|
-
const canRefresh = computed(() => Boolean(source.value?.refreshJobs));
|
|
581
|
-
const canCancel = computed(() => Boolean(source.value?.cancelJob));
|
|
582
|
-
const canDelete = computed(() => Boolean(source.value?.deleteJob));
|
|
583
|
-
const canClearFinished = computed(() => Boolean(source.value?.clearFinishedJobs || source.value?.deleteJob));
|
|
644
|
+
const canRefresh = computed(() => Boolean(source.value?.refreshJobs || adapter.value?.listJobs));
|
|
645
|
+
const canCancel = computed(() => Boolean(source.value?.cancelJob || adapter.value?.cancelJob));
|
|
646
|
+
const canDelete = computed(() => Boolean(source.value?.deleteJob || adapter.value?.deleteJob));
|
|
647
|
+
const canClearFinished = computed(() => Boolean(source.value?.clearFinishedJobs || source.value?.deleteJob || adapter.value?.clearFinishedJobs || adapter.value?.deleteJob));
|
|
648
|
+
function bumpJobRevision(jobId) {
|
|
649
|
+
jobRevisions.set(jobId, (jobRevisions.get(jobId) ?? 0) + 1);
|
|
650
|
+
}
|
|
651
|
+
function replaceLegacyJobs(nextJobs) {
|
|
652
|
+
const normalized = nextJobs.map(normalizeJobState);
|
|
653
|
+
new Set([...jobs.value.map((job) => job.job_id), ...normalized.map((job) => job.job_id)]).forEach(bumpJobRevision);
|
|
654
|
+
legacyOverride.value = {
|
|
655
|
+
input: toValue(options.jobs),
|
|
656
|
+
jobs: normalized
|
|
657
|
+
};
|
|
658
|
+
stateRevision += 1;
|
|
659
|
+
}
|
|
660
|
+
function upsertLegacyJob(nextJob) {
|
|
661
|
+
const normalized = normalizeJobState(nextJob);
|
|
662
|
+
const existingIndex = jobs.value.findIndex((job) => job.job_id === normalized.job_id);
|
|
663
|
+
const nextJobs = [...jobs.value];
|
|
664
|
+
if (existingIndex === -1) nextJobs.unshift(normalized);
|
|
665
|
+
else nextJobs[existingIndex] = normalized;
|
|
666
|
+
legacyOverride.value = {
|
|
667
|
+
input: toValue(options.jobs),
|
|
668
|
+
jobs: nextJobs
|
|
669
|
+
};
|
|
670
|
+
bumpJobRevision(normalized.job_id);
|
|
671
|
+
stateRevision += 1;
|
|
672
|
+
}
|
|
673
|
+
function removeLegacyJobs(jobIds) {
|
|
674
|
+
legacyOverride.value = {
|
|
675
|
+
input: toValue(options.jobs),
|
|
676
|
+
jobs: jobs.value.filter((job) => !jobIds.has(job.job_id))
|
|
677
|
+
};
|
|
678
|
+
jobIds.forEach(bumpJobRevision);
|
|
679
|
+
stateRevision += 1;
|
|
680
|
+
}
|
|
584
681
|
function setPending(jobId, pending) {
|
|
585
682
|
const next = new Set(pendingJobIds.value);
|
|
586
683
|
if (pending) next.add(jobId);
|
|
587
684
|
else next.delete(jobId);
|
|
588
685
|
pendingJobIds.value = next;
|
|
589
686
|
}
|
|
687
|
+
function applyStreamMessage(message) {
|
|
688
|
+
if (!active || source.value) return;
|
|
689
|
+
if (message.event === "snapshot" && isSnapshotPayload(message.data)) {
|
|
690
|
+
replaceLegacyJobs(message.data.jobs);
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
if ((message.event === "job" || message.event === "terminal") && !isSnapshotPayload(message.data)) upsertLegacyJob(message.data);
|
|
694
|
+
}
|
|
590
695
|
async function refresh() {
|
|
591
|
-
const
|
|
592
|
-
|
|
696
|
+
const currentSource = source.value;
|
|
697
|
+
const listJobs = currentSource?.refreshJobs ?? adapter.value?.listJobs;
|
|
698
|
+
if (!listJobs) return false;
|
|
593
699
|
const generation = ++requestGeneration;
|
|
700
|
+
const revision = stateRevision;
|
|
594
701
|
isLoading.value = true;
|
|
595
702
|
error.value = null;
|
|
596
703
|
try {
|
|
597
|
-
await
|
|
598
|
-
|
|
704
|
+
const response = await listJobs();
|
|
705
|
+
if (!active || generation !== requestGeneration || revision !== stateRevision) return false;
|
|
706
|
+
if (!currentSource && response) replaceLegacyJobs(responseJobs(response));
|
|
707
|
+
return true;
|
|
599
708
|
} catch (cause) {
|
|
600
709
|
if (active && generation === requestGeneration) error.value = errorMessage(cause, "Failed to load jobs");
|
|
601
710
|
return false;
|
|
@@ -605,12 +714,17 @@ function usePluginJobCenter(options = {}) {
|
|
|
605
714
|
}
|
|
606
715
|
async function cancelJob(job) {
|
|
607
716
|
const sourceCancel = source.value?.cancelJob;
|
|
608
|
-
|
|
717
|
+
const adapterCancel = adapter.value?.cancelJob;
|
|
718
|
+
if (!job.can_cancel || !sourceCancel && !adapterCancel || pendingJobIds.value.has(job.job_id)) return false;
|
|
719
|
+
const revision = jobRevisions.get(job.job_id) ?? 0;
|
|
609
720
|
setPending(job.job_id, true);
|
|
610
721
|
error.value = null;
|
|
611
722
|
try {
|
|
612
|
-
await sourceCancel(job.job_id);
|
|
613
|
-
return
|
|
723
|
+
const updated = sourceCancel ? await sourceCancel(job.job_id) : await adapterCancel(job);
|
|
724
|
+
if (!active) return false;
|
|
725
|
+
if (!sourceCancel && revision === (jobRevisions.get(job.job_id) ?? 0)) if (updated) upsertLegacyJob(updated);
|
|
726
|
+
else await refresh();
|
|
727
|
+
return true;
|
|
614
728
|
} catch (cause) {
|
|
615
729
|
if (active) error.value = errorMessage(cause, "Failed to cancel job");
|
|
616
730
|
return false;
|
|
@@ -620,12 +734,16 @@ function usePluginJobCenter(options = {}) {
|
|
|
620
734
|
}
|
|
621
735
|
async function deleteJob(job) {
|
|
622
736
|
const sourceDelete = source.value?.deleteJob;
|
|
623
|
-
|
|
737
|
+
const adapterDelete = adapter.value?.deleteJob;
|
|
738
|
+
if (!job.can_delete || !sourceDelete && !adapterDelete || pendingJobIds.value.has(job.job_id)) return false;
|
|
624
739
|
setPending(job.job_id, true);
|
|
625
740
|
error.value = null;
|
|
626
741
|
try {
|
|
627
|
-
const deleted = await sourceDelete(job.job_id);
|
|
628
|
-
|
|
742
|
+
const deleted = sourceDelete ? await sourceDelete(job.job_id) : await adapterDelete(job);
|
|
743
|
+
if (!active) return false;
|
|
744
|
+
if (!sourceDelete) if (deleted === false) await refresh();
|
|
745
|
+
else removeLegacyJobs(new Set([job.job_id]));
|
|
746
|
+
return deleted !== false;
|
|
629
747
|
} catch (cause) {
|
|
630
748
|
if (active) error.value = errorMessage(cause, "Failed to delete job");
|
|
631
749
|
return false;
|
|
@@ -645,12 +763,30 @@ function usePluginJobCenter(options = {}) {
|
|
|
645
763
|
return typeof deleted !== "number" || deleted === targets.length;
|
|
646
764
|
}
|
|
647
765
|
if (currentSource?.deleteJob) return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
|
|
648
|
-
|
|
766
|
+
const currentAdapter = adapter.value;
|
|
767
|
+
if (currentAdapter?.clearFinishedJobs) {
|
|
768
|
+
const deleted = await currentAdapter.clearFinishedJobs(targets);
|
|
769
|
+
if (!active) return false;
|
|
770
|
+
if (typeof deleted === "number" && deleted !== targets.length) {
|
|
771
|
+
await refresh();
|
|
772
|
+
return false;
|
|
773
|
+
}
|
|
774
|
+
removeLegacyJobs(new Set(targets.map((job) => job.job_id)));
|
|
775
|
+
return true;
|
|
776
|
+
}
|
|
777
|
+
if (!currentAdapter?.deleteJob) return false;
|
|
778
|
+
return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
|
|
649
779
|
} catch (cause) {
|
|
650
780
|
if (active) error.value = errorMessage(cause, "Failed to clear jobs");
|
|
651
781
|
return false;
|
|
652
782
|
}
|
|
653
783
|
}
|
|
784
|
+
if (options.eventStream !== void 0) watch(() => toValue(options.eventStream)?.lastMessage.value ?? null, (message) => {
|
|
785
|
+
if (message) applyStreamMessage(message);
|
|
786
|
+
}, { immediate: true });
|
|
787
|
+
onMounted(() => {
|
|
788
|
+
if (options.loadOnMount !== false) refresh();
|
|
789
|
+
});
|
|
654
790
|
onUnmounted(() => {
|
|
655
791
|
active = false;
|
|
656
792
|
requestGeneration += 1;
|
|
@@ -680,12 +816,17 @@ function usePluginJobCenter(options = {}) {
|
|
|
680
816
|
isOpen.value = !isOpen.value;
|
|
681
817
|
},
|
|
682
818
|
refresh,
|
|
819
|
+
applyStreamMessage,
|
|
683
820
|
cancelJob,
|
|
684
821
|
deleteJob,
|
|
685
822
|
clearFinished,
|
|
686
823
|
isPending: (job) => pendingJobIds.value.has(job.job_id)
|
|
687
824
|
};
|
|
688
825
|
}
|
|
826
|
+
/** @deprecated Use `usePluginJobCenter()` for the plugin job-center controller. */
|
|
827
|
+
function useJobsStatusTray(options = {}) {
|
|
828
|
+
return usePluginJobCenter(options);
|
|
829
|
+
}
|
|
689
830
|
//#endregion
|
|
690
831
|
//#region src/composables/useDoseCalculator.ts
|
|
691
832
|
var VOLUME_UNITS = [
|
|
@@ -2285,6 +2426,14 @@ function parseCSV(text) {
|
|
|
2285
2426
|
//#endregion
|
|
2286
2427
|
//#region src/composables/useAutoGroup.ts
|
|
2287
2428
|
var STRUCTURED_MISSING_GROUP = "Outlier";
|
|
2429
|
+
var deprecationWarned = false;
|
|
2430
|
+
var outlierDeprecationWarned = false;
|
|
2431
|
+
function warnDeprecated(api) {
|
|
2432
|
+
if (deprecationWarned) return;
|
|
2433
|
+
if (typeof process !== "undefined" && process.env.NODE_ENV === "production") return;
|
|
2434
|
+
console.warn(`[useAutoGroup] ${api} is deprecated; use the new class-first API (setClassDisposition / toggleGroupBy / setValueOps).`);
|
|
2435
|
+
deprecationWarned = true;
|
|
2436
|
+
}
|
|
2288
2437
|
function useAutoGroup() {
|
|
2289
2438
|
const inputMode = ref("paste");
|
|
2290
2439
|
const rawText = ref("");
|
|
@@ -2617,6 +2766,54 @@ function useAutoGroup() {
|
|
|
2617
2766
|
document.body.removeChild(a);
|
|
2618
2767
|
URL.revokeObjectURL(url);
|
|
2619
2768
|
}
|
|
2769
|
+
/** Test seam — exposes the template content/filename without triggering a browser download. */
|
|
2770
|
+
function composeTemplateForTest(opts) {
|
|
2771
|
+
return composeTemplate(samples.value, opts.mode === "prefilled" ? Object.values(schemas.value) : null, opts.mode === "prefilled" ? classes.value : null, {
|
|
2772
|
+
...opts,
|
|
2773
|
+
tokenizedSamples: tokenized.value
|
|
2774
|
+
});
|
|
2775
|
+
}
|
|
2776
|
+
const outliers = ref([]);
|
|
2777
|
+
const hasOutliers = computed(() => outliers.value.length > 0);
|
|
2778
|
+
const conformingSamples = computed(() => samples.value);
|
|
2779
|
+
const dominantFieldCount = computed(() => tokenized.value[0]?.length ?? 0);
|
|
2780
|
+
const minFieldCount = computed(() => {
|
|
2781
|
+
if (tokenized.value.length === 0) return 0;
|
|
2782
|
+
return Math.min(...tokenized.value.map((t) => t.length));
|
|
2783
|
+
});
|
|
2784
|
+
const fields = computed(() => activeSchema.value?.columns ?? []);
|
|
2785
|
+
const fieldNames = computed(() => {
|
|
2786
|
+
const out = {};
|
|
2787
|
+
for (const c of fields.value) out[c.index] = c.displayName ?? c.name;
|
|
2788
|
+
return out;
|
|
2789
|
+
});
|
|
2790
|
+
const enabledFields = computed(() => activeSchema.value ? new Set(activeSchema.value.groupBy) : /* @__PURE__ */ new Set());
|
|
2791
|
+
const effectiveColumns = fields;
|
|
2792
|
+
const allSingletons = computed(() => groups.value.length > 1 && groups.value.every((g) => g.samples.length === 1));
|
|
2793
|
+
function setOutlierAction(_, __) {
|
|
2794
|
+
if (!outlierDeprecationWarned) {
|
|
2795
|
+
if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
|
|
2796
|
+
console.warn("[useAutoGroup] setOutlierAction is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
|
|
2797
|
+
outlierDeprecationWarned = true;
|
|
2798
|
+
}
|
|
2799
|
+
}
|
|
2800
|
+
}
|
|
2801
|
+
function setAllOutlierActions(__) {
|
|
2802
|
+
if (!outlierDeprecationWarned) {
|
|
2803
|
+
if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
|
|
2804
|
+
console.warn("[useAutoGroup] setAllOutlierActions is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
|
|
2805
|
+
outlierDeprecationWarned = true;
|
|
2806
|
+
}
|
|
2807
|
+
}
|
|
2808
|
+
}
|
|
2809
|
+
function toggleField(index) {
|
|
2810
|
+
warnDeprecated("toggleField");
|
|
2811
|
+
if (activeClassKey.value) toggleGroupBy(activeClassKey.value, index);
|
|
2812
|
+
}
|
|
2813
|
+
function renameField(index, name) {
|
|
2814
|
+
warnDeprecated("renameField");
|
|
2815
|
+
if (activeClassKey.value) setColumnName(activeClassKey.value, index, name);
|
|
2816
|
+
}
|
|
2620
2817
|
function loadExperimentData(rawData, options = {}) {
|
|
2621
2818
|
const parsed = extractSamplesFromDesignData(rawData, options);
|
|
2622
2819
|
if (!parsed) return false;
|
|
@@ -2633,6 +2830,7 @@ function useAutoGroup() {
|
|
|
2633
2830
|
schemas.value = {};
|
|
2634
2831
|
activeClassKey.value = "";
|
|
2635
2832
|
tokenized.value = [];
|
|
2833
|
+
outliers.value = [];
|
|
2636
2834
|
sampleTypeHints.value = [];
|
|
2637
2835
|
}
|
|
2638
2836
|
return {
|
|
@@ -2644,6 +2842,8 @@ function useAutoGroup() {
|
|
|
2644
2842
|
schemas,
|
|
2645
2843
|
activeClassKey,
|
|
2646
2844
|
delimiter,
|
|
2845
|
+
dominantFieldCount,
|
|
2846
|
+
minFieldCount,
|
|
2647
2847
|
samples,
|
|
2648
2848
|
tokenized,
|
|
2649
2849
|
activeSchema,
|
|
@@ -2654,6 +2854,14 @@ function useAutoGroup() {
|
|
|
2654
2854
|
excludedSamples,
|
|
2655
2855
|
result,
|
|
2656
2856
|
fingerprint,
|
|
2857
|
+
fields,
|
|
2858
|
+
fieldNames,
|
|
2859
|
+
enabledFields,
|
|
2860
|
+
effectiveColumns,
|
|
2861
|
+
hasOutliers,
|
|
2862
|
+
outliers,
|
|
2863
|
+
conformingSamples,
|
|
2864
|
+
allSingletons,
|
|
2657
2865
|
canDownloadTemplate,
|
|
2658
2866
|
setClassDisposition,
|
|
2659
2867
|
setClassDispositions,
|
|
@@ -2669,8 +2877,13 @@ function useAutoGroup() {
|
|
|
2669
2877
|
loadFingerprint,
|
|
2670
2878
|
parseInput,
|
|
2671
2879
|
downloadTemplate,
|
|
2880
|
+
composeTemplateForTest,
|
|
2672
2881
|
loadExperimentData,
|
|
2673
|
-
reset
|
|
2882
|
+
reset,
|
|
2883
|
+
setOutlierAction,
|
|
2884
|
+
setAllOutlierActions,
|
|
2885
|
+
toggleField,
|
|
2886
|
+
renameField
|
|
2674
2887
|
};
|
|
2675
2888
|
}
|
|
2676
2889
|
function extractSamplesFromDesignData(rawData, options = {}) {
|
|
@@ -4147,6 +4360,328 @@ function mergeInitialValues(controlOptions, initialValues) {
|
|
|
4147
4360
|
};
|
|
4148
4361
|
}
|
|
4149
4362
|
//#endregion
|
|
4363
|
+
//#region src/composables/useRackEditor.ts
|
|
4364
|
+
var SLOT_CYCLE = [
|
|
4365
|
+
"R",
|
|
4366
|
+
"G",
|
|
4367
|
+
"B",
|
|
4368
|
+
"Y"
|
|
4369
|
+
];
|
|
4370
|
+
var PLATE_CONFIGS = {
|
|
4371
|
+
6: {
|
|
4372
|
+
rows: 2,
|
|
4373
|
+
cols: 3
|
|
4374
|
+
},
|
|
4375
|
+
12: {
|
|
4376
|
+
rows: 3,
|
|
4377
|
+
cols: 4
|
|
4378
|
+
},
|
|
4379
|
+
24: {
|
|
4380
|
+
rows: 4,
|
|
4381
|
+
cols: 6
|
|
4382
|
+
},
|
|
4383
|
+
48: {
|
|
4384
|
+
rows: 6,
|
|
4385
|
+
cols: 8
|
|
4386
|
+
},
|
|
4387
|
+
54: {
|
|
4388
|
+
rows: 6,
|
|
4389
|
+
cols: 9
|
|
4390
|
+
},
|
|
4391
|
+
96: {
|
|
4392
|
+
rows: 8,
|
|
4393
|
+
cols: 12
|
|
4394
|
+
},
|
|
4395
|
+
384: {
|
|
4396
|
+
rows: 16,
|
|
4397
|
+
cols: 24
|
|
4398
|
+
}
|
|
4399
|
+
};
|
|
4400
|
+
var globalIdCounter = 0;
|
|
4401
|
+
function generateId() {
|
|
4402
|
+
globalIdCounter++;
|
|
4403
|
+
return `rack-${Date.now()}-${globalIdCounter}`;
|
|
4404
|
+
}
|
|
4405
|
+
/** Manages a set of sample racks with well-level assignment, series fill, and multi-rack reordering. */
|
|
4406
|
+
function useRackEditor(initialRacks, options) {
|
|
4407
|
+
const defaultFormat = options?.defaultFormat ?? 54;
|
|
4408
|
+
const defaultInjVol = options?.defaultInjectionVolume ?? 5;
|
|
4409
|
+
const maxRacks = options?.maxRacks ?? 10;
|
|
4410
|
+
const minRacks = options?.minRacks ?? 1;
|
|
4411
|
+
function createDefaultRack(name, slotIndex) {
|
|
4412
|
+
const slot = SLOT_CYCLE[(slotIndex ?? 0) % SLOT_CYCLE.length];
|
|
4413
|
+
return {
|
|
4414
|
+
id: generateId(),
|
|
4415
|
+
name: name ?? `Rack ${racks.value.length + 1}`,
|
|
4416
|
+
format: defaultFormat,
|
|
4417
|
+
slot,
|
|
4418
|
+
injectionVolume: defaultInjVol,
|
|
4419
|
+
wells: {}
|
|
4420
|
+
};
|
|
4421
|
+
}
|
|
4422
|
+
const racks = ref(initialRacks && initialRacks.length > 0 ? initialRacks.map((r) => ({ ...r })) : [createDefaultRack("Rack 1", 0)]);
|
|
4423
|
+
const activeRackId = ref(racks.value[0]?.id ?? "");
|
|
4424
|
+
const activeRack = computed(() => racks.value.find((r) => r.id === activeRackId.value) ?? racks.value[0]);
|
|
4425
|
+
function addRack(name) {
|
|
4426
|
+
if (racks.value.length >= maxRacks) return racks.value[racks.value.length - 1];
|
|
4427
|
+
const rack = createDefaultRack(name, racks.value.length);
|
|
4428
|
+
racks.value.push(rack);
|
|
4429
|
+
activeRackId.value = rack.id;
|
|
4430
|
+
return rack;
|
|
4431
|
+
}
|
|
4432
|
+
function removeRack(rackId) {
|
|
4433
|
+
if (racks.value.length <= minRacks) return;
|
|
4434
|
+
const index = racks.value.findIndex((r) => r.id === rackId);
|
|
4435
|
+
if (index === -1) return;
|
|
4436
|
+
racks.value.splice(index, 1);
|
|
4437
|
+
if (activeRackId.value === rackId && racks.value[0]) activeRackId.value = racks.value[0].id;
|
|
4438
|
+
}
|
|
4439
|
+
function reorderRacks(fromIndex, toIndex) {
|
|
4440
|
+
if (fromIndex < 0 || fromIndex >= racks.value.length) return;
|
|
4441
|
+
if (toIndex < 0 || toIndex >= racks.value.length) return;
|
|
4442
|
+
if (fromIndex === toIndex) return;
|
|
4443
|
+
const [moved] = racks.value.splice(fromIndex, 1);
|
|
4444
|
+
if (moved) racks.value.splice(toIndex, 0, moved);
|
|
4445
|
+
}
|
|
4446
|
+
function updateRack(rackId, data) {
|
|
4447
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4448
|
+
if (!rack) return;
|
|
4449
|
+
if (data.name !== void 0) rack.name = data.name;
|
|
4450
|
+
if (data.format !== void 0) rack.format = data.format;
|
|
4451
|
+
if (data.slot !== void 0) rack.slot = data.slot;
|
|
4452
|
+
if (data.injectionVolume !== void 0) rack.injectionVolume = data.injectionVolume;
|
|
4453
|
+
if (data.wells !== void 0) rack.wells = data.wells;
|
|
4454
|
+
}
|
|
4455
|
+
function setActiveRack(rackId) {
|
|
4456
|
+
if (racks.value.some((r) => r.id === rackId)) activeRackId.value = rackId;
|
|
4457
|
+
}
|
|
4458
|
+
function setWellData(rackId, wellId, data) {
|
|
4459
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4460
|
+
if (!rack) return;
|
|
4461
|
+
rack.wells[wellId] = {
|
|
4462
|
+
...rack.wells[wellId],
|
|
4463
|
+
...data
|
|
4464
|
+
};
|
|
4465
|
+
}
|
|
4466
|
+
function clearWell(rackId, wellId) {
|
|
4467
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4468
|
+
if (!rack) return;
|
|
4469
|
+
delete rack.wells[wellId];
|
|
4470
|
+
}
|
|
4471
|
+
function clearAllWells(rackId) {
|
|
4472
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4473
|
+
if (!rack) return;
|
|
4474
|
+
rack.wells = {};
|
|
4475
|
+
}
|
|
4476
|
+
function fillSeries(rackId, prefix = "S") {
|
|
4477
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4478
|
+
if (!rack) return;
|
|
4479
|
+
const config = PLATE_CONFIGS[rack.format];
|
|
4480
|
+
if (!config) return;
|
|
4481
|
+
let counter = 1;
|
|
4482
|
+
for (let row = 0; row < config.rows; row++) for (let col = 0; col < config.cols; col++) {
|
|
4483
|
+
const wellId = `${String.fromCharCode(65 + row)}${col + 1}`;
|
|
4484
|
+
if (!rack.wells[wellId]?.sampleType) {
|
|
4485
|
+
const paddedNum = String(counter).padStart(3, "0");
|
|
4486
|
+
rack.wells[wellId] = {
|
|
4487
|
+
id: wellId,
|
|
4488
|
+
row,
|
|
4489
|
+
col,
|
|
4490
|
+
state: "filled",
|
|
4491
|
+
sampleType: "sample",
|
|
4492
|
+
metadata: {
|
|
4493
|
+
label: `${prefix}${paddedNum}`,
|
|
4494
|
+
injectionVolume: rack.injectionVolume,
|
|
4495
|
+
injectionCount: 1
|
|
4496
|
+
}
|
|
4497
|
+
};
|
|
4498
|
+
}
|
|
4499
|
+
counter++;
|
|
4500
|
+
}
|
|
4501
|
+
}
|
|
4502
|
+
function getAllWells() {
|
|
4503
|
+
const result = [];
|
|
4504
|
+
for (const rack of racks.value) for (const [wellId, well] of Object.entries(rack.wells)) result.push({
|
|
4505
|
+
rackId: rack.id,
|
|
4506
|
+
wellId,
|
|
4507
|
+
well
|
|
4508
|
+
});
|
|
4509
|
+
return result;
|
|
4510
|
+
}
|
|
4511
|
+
const totalSampleCount = computed(() => {
|
|
4512
|
+
let count = 0;
|
|
4513
|
+
for (const rack of racks.value) count += Object.keys(rack.wells).length;
|
|
4514
|
+
return count;
|
|
4515
|
+
});
|
|
4516
|
+
function reset() {
|
|
4517
|
+
const rack = createDefaultRack("Rack 1", 0);
|
|
4518
|
+
racks.value = [rack];
|
|
4519
|
+
activeRackId.value = rack.id;
|
|
4520
|
+
}
|
|
4521
|
+
return {
|
|
4522
|
+
racks,
|
|
4523
|
+
activeRack,
|
|
4524
|
+
activeRackId,
|
|
4525
|
+
addRack,
|
|
4526
|
+
removeRack,
|
|
4527
|
+
reorderRacks,
|
|
4528
|
+
updateRack,
|
|
4529
|
+
setActiveRack,
|
|
4530
|
+
setWellData,
|
|
4531
|
+
clearWell,
|
|
4532
|
+
clearAllWells,
|
|
4533
|
+
fillSeries,
|
|
4534
|
+
getAllWells,
|
|
4535
|
+
totalSampleCount,
|
|
4536
|
+
reset
|
|
4537
|
+
};
|
|
4538
|
+
}
|
|
4539
|
+
//#endregion
|
|
4540
|
+
//#region src/composables/useGroupAssignment.ts
|
|
4541
|
+
/** Shared two-zone group assignment model for control/treatment style workflows. */
|
|
4542
|
+
function useGroupAssignment(options) {
|
|
4543
|
+
const groups = computed(() => [...toValue(options.groups)]);
|
|
4544
|
+
const group1 = computed(() => [...toValue(options.group1)]);
|
|
4545
|
+
const group2 = computed(() => [...toValue(options.group2)]);
|
|
4546
|
+
const label1 = computed(() => toValue(options.label1) || "Control");
|
|
4547
|
+
const label2 = computed(() => toValue(options.label2) || "Treatment");
|
|
4548
|
+
const minPerGroup = computed(() => normalizeMinimum(toValue(options.minPerGroup)));
|
|
4549
|
+
const group1Set = computed(() => new Set(group1.value));
|
|
4550
|
+
const group2Set = computed(() => new Set(group2.value));
|
|
4551
|
+
const unassignedGroups = computed(() => groups.value.filter((group) => !group1Set.value.has(group.name) && !group2Set.value.has(group.name)));
|
|
4552
|
+
const zone1Groups = computed(() => groups.value.filter((group) => group1Set.value.has(group.name)));
|
|
4553
|
+
const zone2Groups = computed(() => groups.value.filter((group) => group2Set.value.has(group.name)));
|
|
4554
|
+
const zone1Count = computed(() => zone1Groups.value.reduce((sum, group) => sum + group.count, 0));
|
|
4555
|
+
const zone2Count = computed(() => zone2Groups.value.reduce((sum, group) => sum + group.count, 0));
|
|
4556
|
+
const isValid = computed(() => group1.value.length >= minPerGroup.value && group2.value.length >= minPerGroup.value);
|
|
4557
|
+
const validationMessage = computed(() => {
|
|
4558
|
+
if (isValid.value) return null;
|
|
4559
|
+
const missing1 = Math.max(0, minPerGroup.value - group1.value.length);
|
|
4560
|
+
const missing2 = Math.max(0, minPerGroup.value - group2.value.length);
|
|
4561
|
+
const parts = [];
|
|
4562
|
+
if (missing1 > 0) parts.push(`${missing1} more to ${label1.value}`);
|
|
4563
|
+
if (missing2 > 0) parts.push(`${missing2} more to ${label2.value}`);
|
|
4564
|
+
return `Add ${parts.join(" and ")}`;
|
|
4565
|
+
});
|
|
4566
|
+
function getZoneForGroup(groupName) {
|
|
4567
|
+
if (group1Set.value.has(groupName)) return "zone1";
|
|
4568
|
+
if (group2Set.value.has(groupName)) return "zone2";
|
|
4569
|
+
return null;
|
|
4570
|
+
}
|
|
4571
|
+
function assignToZone(groupName, zone) {
|
|
4572
|
+
const next = removeFromBoth(groupName);
|
|
4573
|
+
if (zone === "zone1") return {
|
|
4574
|
+
group1: [...next.group1, groupName],
|
|
4575
|
+
group2: next.group2
|
|
4576
|
+
};
|
|
4577
|
+
return {
|
|
4578
|
+
group1: next.group1,
|
|
4579
|
+
group2: [...next.group2, groupName]
|
|
4580
|
+
};
|
|
4581
|
+
}
|
|
4582
|
+
function removeFromZone(groupName, zone) {
|
|
4583
|
+
if (zone === "zone1") return {
|
|
4584
|
+
group1: group1.value.filter((name) => name !== groupName),
|
|
4585
|
+
group2: group2.value
|
|
4586
|
+
};
|
|
4587
|
+
return {
|
|
4588
|
+
group1: group1.value,
|
|
4589
|
+
group2: group2.value.filter((name) => name !== groupName)
|
|
4590
|
+
};
|
|
4591
|
+
}
|
|
4592
|
+
function clearAll() {
|
|
4593
|
+
return {
|
|
4594
|
+
group1: [],
|
|
4595
|
+
group2: []
|
|
4596
|
+
};
|
|
4597
|
+
}
|
|
4598
|
+
function removeFromBoth(groupName) {
|
|
4599
|
+
return {
|
|
4600
|
+
group1: group1.value.filter((name) => name !== groupName),
|
|
4601
|
+
group2: group2.value.filter((name) => name !== groupName)
|
|
4602
|
+
};
|
|
4603
|
+
}
|
|
4604
|
+
return {
|
|
4605
|
+
unassignedGroups,
|
|
4606
|
+
zone1Groups,
|
|
4607
|
+
zone2Groups,
|
|
4608
|
+
zone1Count,
|
|
4609
|
+
zone2Count,
|
|
4610
|
+
isValid,
|
|
4611
|
+
validationMessage,
|
|
4612
|
+
getZoneForGroup,
|
|
4613
|
+
assignToZone,
|
|
4614
|
+
removeFromZone,
|
|
4615
|
+
clearAll
|
|
4616
|
+
};
|
|
4617
|
+
}
|
|
4618
|
+
function normalizeMinimum(value) {
|
|
4619
|
+
if (value === null || value === void 0 || !Number.isFinite(value)) return 1;
|
|
4620
|
+
return Math.max(0, Math.floor(value));
|
|
4621
|
+
}
|
|
4622
|
+
//#endregion
|
|
4623
|
+
//#region src/composables/useReagentSeries.ts
|
|
4624
|
+
var DEFAULT_PRESETS = [
|
|
4625
|
+
{
|
|
4626
|
+
label: "2x",
|
|
4627
|
+
factor: 2
|
|
4628
|
+
},
|
|
4629
|
+
{
|
|
4630
|
+
label: "3x",
|
|
4631
|
+
factor: 3
|
|
4632
|
+
},
|
|
4633
|
+
{
|
|
4634
|
+
label: "½ log",
|
|
4635
|
+
factor: "half-log"
|
|
4636
|
+
},
|
|
4637
|
+
{
|
|
4638
|
+
label: "10x",
|
|
4639
|
+
factor: 10
|
|
4640
|
+
}
|
|
4641
|
+
];
|
|
4642
|
+
var DEFAULT_UNITS = [
|
|
4643
|
+
"µM",
|
|
4644
|
+
"nM",
|
|
4645
|
+
"mM",
|
|
4646
|
+
"pM"
|
|
4647
|
+
];
|
|
4648
|
+
function resolveFactor(factor) {
|
|
4649
|
+
return factor === "half-log" ? Math.sqrt(10) : factor;
|
|
4650
|
+
}
|
|
4651
|
+
function roundToSignificant(value, digits = 4) {
|
|
4652
|
+
if (value === 0) return 0;
|
|
4653
|
+
const magnitude = Math.floor(Math.log10(Math.abs(value))) + 1;
|
|
4654
|
+
const factor = Math.pow(10, digits - magnitude);
|
|
4655
|
+
return Math.round(value * factor) / factor;
|
|
4656
|
+
}
|
|
4657
|
+
function generateDilutionSeries(startConcentration, count, factor, defaultReplicates = 1) {
|
|
4658
|
+
if (count < 1 || startConcentration <= 0) return [];
|
|
4659
|
+
const divisor = resolveFactor(factor);
|
|
4660
|
+
const levels = [];
|
|
4661
|
+
for (let i = 0; i < count; i++) levels.push({
|
|
4662
|
+
value: roundToSignificant(startConcentration / Math.pow(divisor, i)),
|
|
4663
|
+
replicates: defaultReplicates
|
|
4664
|
+
});
|
|
4665
|
+
return levels;
|
|
4666
|
+
}
|
|
4667
|
+
/** Generates and sorts geometric dilution series (2x, 3x, ½ log, 10x) for plate-based experiments. */
|
|
4668
|
+
function useReagentSeries() {
|
|
4669
|
+
function generateSeries(start, count, factor, defaultReplicates = 1) {
|
|
4670
|
+
return generateDilutionSeries(start, count, factor, defaultReplicates);
|
|
4671
|
+
}
|
|
4672
|
+
function sortLevels(levels, order = "desc") {
|
|
4673
|
+
return [...levels].sort((a, b) => order === "desc" ? b.value - a.value : a.value - b.value);
|
|
4674
|
+
}
|
|
4675
|
+
function totalPositions(levels) {
|
|
4676
|
+
return levels.reduce((sum, l) => sum + l.replicates, 0);
|
|
4677
|
+
}
|
|
4678
|
+
return {
|
|
4679
|
+
generateSeries,
|
|
4680
|
+
sortLevels,
|
|
4681
|
+
totalPositions
|
|
4682
|
+
};
|
|
4683
|
+
}
|
|
4684
|
+
//#endregion
|
|
4150
4685
|
//#region src/composables/protocolTemplateCatalog.ts
|
|
4151
4686
|
var BUILT_IN_PROTOCOL_TEMPLATES = [
|
|
4152
4687
|
{
|
|
@@ -4609,4 +5144,6 @@ function useProtocolTemplates() {
|
|
|
4609
5144
|
};
|
|
4610
5145
|
}
|
|
4611
5146
|
//#endregion
|
|
4612
|
-
export {
|
|
5147
|
+
export { useToast as $, useFileImport as A, useDoseCalculator as B, getSampleGroupParentPath as C, detectDelimiter as D, hslToHex as E, extractSampleNamesFromDesignData as F, useMobileSupportGate as G, useJobsStatusTray as H, extractSampleOptionsFromDesignData as I, getInjectedFrontendRevision as J, APP_EXPERIMENT_KEY as K, unwrapExperimentDesignData as L, extractSamplesFromDesignData as M, useAutoGroup as N, parseDelimitedText as O, parseCSV as P, useTheme as Q, DEFAULT_COLORS as R, getSampleGroupMajorPrefix as S, hexToHsl as T, usePluginJobCenter as U, combinePluginJobSources as V, DEFAULT_MOBILE_VIEWPORT_QUERY as W, getPresenceClientId as X, useRuntimeAlignment as Y, usePresenceHeartbeat as Z, useScheduleDrag as _, useReagentSeries as a, useExpansionSet as b, useBioTemplatePresetWorkspace as c, getBioTemplateComponentProps as d, candidateMatchesSearch as et, toBioTemplateComponentPropsByComponent as f, useExperimentSave as g, useTemplateCollection as h, generateDilutionSeries as i, useSortedItems as it, validateImportFile as j, readFileAsText as k, useBioTemplatePackWorkspace as l, useBioTemplateControls as m, DEFAULT_PRESETS as n, useTextSearch as nt, useGroupAssignment as o, useBioTemplateComponents as p, useAppExperiment as q, DEFAULT_UNITS as r, compareSortValues as rt, useRackEditor as s, useProtocolTemplates as t, normalizeSearchQuery as tt, useBioTemplateWorkspace as u, useExperimentSamples as v, deriveShade as w, useSampleGroups as x, useExperimentData as y, useWellPlateEditor as z };
|
|
5148
|
+
|
|
5149
|
+
//# sourceMappingURL=useProtocolTemplates-BWhQIWV5.js.map
|