@morscherlab/mint-sdk 1.2.10 → 1.3.0-beta.10
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 +45 -137
- package/dist/ResourcePickerListInternal-CFAw4vTZ.js +605 -0
- package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
- package/dist/__stories__/experiment-helpers.d.ts +12 -1
- package/dist/__tests__/components/ScientificNumber.test.d.ts +1 -0
- package/dist/__tests__/components/SequenceInput.test.d.ts +1 -0
- package/dist/__tests__/components/Skeleton.test.d.ts +1 -0
- package/dist/__tests__/components/SmartGroupFieldRecipe.test.d.ts +1 -0
- package/dist/__tests__/components/SmartGroupModal.test.d.ts +1 -0
- package/dist/__tests__/components/StepWizard.test.d.ts +1 -0
- package/dist/__tests__/components/TimeRangeInput.test.d.ts +1 -0
- package/dist/__tests__/components/UnitInput.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.keyboard.test.d.ts +1 -0
- package/dist/__tests__/components/WellPlate.sampleTypeIndicator.test.d.ts +1 -0
- package/dist/__tests__/composables/useChemicalFormula.test.d.ts +1 -0
- package/dist/__tests__/composables/useRackEditor.test.d.ts +1 -0
- package/dist/__tests__/composables/useSequenceUtils.test.d.ts +1 -0
- package/dist/__tests__/styles/baseControlsRules.test.d.ts +1 -0
- package/dist/__tests__/styles/controlRefreshRules.test.d.ts +1 -0
- package/dist/__tests__/styles/darkModeRules.test.d.ts +1 -0
- package/dist/__tests__/styles/menusShellRefresh.test.d.ts +1 -0
- package/dist/__tests__/templates/templatesDeprecation.test.d.ts +1 -0
- package/dist/__tests__/utils/plotlyTemplate.test.d.ts +1 -0
- package/dist/__tests__/utils/sampleTypeMarker.test.d.ts +1 -0
- package/dist/{analysisArtifactTypes-DQ0MjwHZ.js → analysisArtifactTypes-Cy3D0Ipg.js} +1 -1
- package/dist/{analysisArtifactTypes-DQ0MjwHZ.js.map → analysisArtifactTypes-Cy3D0Ipg.js.map} +1 -1
- package/dist/components/ActionMenu.vue.d.ts +17 -5
- package/dist/components/AdductText.vue.d.ts +3 -2
- package/dist/components/AlertBox.vue.d.ts +11 -14
- package/dist/components/AppAvatarMenu.vue.d.ts +18 -28
- package/dist/components/AppContainer.vue.d.ts +7 -11
- package/dist/components/AppLayout.vue.d.ts +11 -13
- package/dist/components/AppSidebar.vue.d.ts +30 -28
- package/dist/components/AppToastContainer.vue.d.ts +2 -1
- package/dist/components/AppTopBar.vue.d.ts +45 -44
- package/dist/components/ArtifactSaveDialog.vue.d.ts +3 -2
- package/dist/components/ArtifactSelectorModal.vue.d.ts +5 -6
- package/dist/components/AuditTrail.vue.d.ts +17 -18
- package/dist/components/AutoGroupModal.vue.d.ts +4 -3
- package/dist/components/Avatar.vue.d.ts +2 -1
- package/dist/components/BaseButton.vue.d.ts +11 -13
- package/dist/components/BaseCheckbox.vue.d.ts +7 -1
- package/dist/components/BaseInput.vue.d.ts +15 -2
- package/dist/components/BaseModal.vue.d.ts +20 -23
- package/dist/components/BasePill.vue.d.ts +10 -13
- package/dist/components/BaseRadioGroup.vue.d.ts +2 -1
- package/dist/components/BaseSelect.vue.d.ts +3 -2
- package/dist/components/BaseSlider.vue.d.ts +18 -1
- package/dist/components/BaseTabs.vue.d.ts +2 -1
- package/dist/components/BaseTextarea.vue.d.ts +2 -1
- package/dist/components/BaseToggle.vue.d.ts +2 -1
- package/dist/components/BatchProgressList.vue.d.ts +22 -26
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +7 -14
- package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +6 -13
- package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +7 -14
- package/dist/components/BioTemplateRenderer.vue.d.ts +2 -1
- package/dist/components/Breadcrumb.vue.d.ts +13 -16
- package/dist/components/Calendar.vue.d.ts +21 -23
- package/dist/components/ChartContainer.vue.d.ts +19 -25
- package/dist/components/ChemicalFormula.vue.d.ts +7 -11
- package/dist/components/CollapsibleCard.vue.d.ts +7 -11
- package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -1
- package/dist/components/ConcentrationInput.vue.d.ts +2 -1
- package/dist/components/ConfirmDialog.vue.d.ts +10 -13
- package/dist/components/ControlWorkspaceView.vue.d.ts +9 -18
- package/dist/components/DataFrame.vue.d.ts +27 -24
- package/dist/components/DatePicker.vue.d.ts +3 -6
- package/dist/components/DateTimePicker.vue.d.ts +3 -6
- package/dist/components/Divider.vue.d.ts +3 -2
- package/dist/components/DoseCalculator.vue.d.ts +2 -1
- package/dist/components/DoseCalculatorVolumeField.vue.d.ts +2 -1
- package/dist/components/DoseDesignWorkspaceView.vue.d.ts +9 -18
- package/dist/components/EmptyState.vue.d.ts +9 -12
- package/dist/components/ExperimentCodeBadge.vue.d.ts +2 -1
- package/dist/components/ExperimentDataViewer.vue.d.ts +13 -15
- package/dist/components/ExperimentPopover.vue.d.ts +3 -5
- package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -4
- package/dist/components/ExperimentTimeline.vue.d.ts +13 -15
- package/dist/components/FilePicker.vue.d.ts +10 -5
- package/dist/components/FileUploader.vue.d.ts +8 -16
- package/dist/components/FitPanel.vue.d.ts +26 -16
- package/dist/components/FormActions.vue.d.ts +2 -1
- package/dist/components/FormBuilder.vue.d.ts +54 -250
- package/dist/components/FormField.vue.d.ts +14 -16
- package/dist/components/FormulaInput.vue.d.ts +2 -1
- package/dist/components/GeneratedPathInput.vue.d.ts +6 -5
- package/dist/components/GeneratedPlotlyResult.vue.d.ts +2 -1
- package/dist/components/GeneratedPluginView.vue.d.ts +2 -1
- package/dist/components/GeneratedResultRenderer.vue.d.ts +2 -1
- package/dist/components/GroupAssigner.vue.d.ts +2 -1
- package/dist/components/IconButton.vue.d.ts +7 -11
- package/dist/components/InstrumentStateBadge.vue.d.ts +4 -3
- package/dist/components/JobsStatusTray.vue.d.ts +13 -29
- package/dist/components/LayoutResizeHandle.vue.d.ts +2 -1
- package/dist/components/LoadingSpinner.vue.d.ts +2 -1
- package/dist/components/MobileSupportGate.vue.d.ts +5 -13
- package/dist/components/MoleculeInput.vue.d.ts +3 -4
- package/dist/components/MultiSelect.vue.d.ts +2 -1
- package/dist/components/NumberInput.vue.d.ts +2 -1
- package/dist/components/PlateEditor.vue.d.ts +147 -0
- package/dist/components/PlotlyChart.vue.d.ts +21 -31
- package/dist/components/PluginIcon.vue.d.ts +2 -1
- package/dist/components/PluginWorkspaceView.props.d.ts +2 -6
- package/dist/components/PluginWorkspaceView.vue.d.ts +23 -51
- package/dist/components/ProgressBar.vue.d.ts +4 -9
- package/dist/components/ProtocolStepEditor.vue.d.ts +7 -5
- package/dist/components/ProtocolStepParameterField.vue.d.ts +2 -1
- package/dist/components/ReagentEditor.vue.d.ts +2 -1
- package/dist/components/ReagentList.presentation.d.ts +2 -1
- package/dist/components/ReagentList.vue.d.ts +15 -17
- package/dist/components/ResourceCard.vue.d.ts +18 -17
- package/dist/components/RuntimeUpdateNotice.vue.d.ts +3 -2
- package/dist/components/SampleHierarchyTree.vue.d.ts +21 -15
- package/dist/components/SampleLegend.vue.d.ts +2 -1
- package/dist/components/SampleSelector.vue.d.ts +15 -21
- package/dist/components/SampleSelectorGroupNode.vue.d.ts +2 -1
- package/dist/components/SampleSelectorSampleRow.vue.d.ts +2 -5
- package/dist/components/ScheduleCalendar.vue.d.ts +34 -36
- package/dist/components/ScientificNumber.vue.d.ts +3 -2
- package/dist/components/SearchableSelect.vue.d.ts +14 -32
- package/dist/components/SecretInput.vue.d.ts +2 -1
- package/dist/components/SectionCard.vue.d.ts +13 -14
- package/dist/components/SegmentedControl.vue.d.ts +2 -1
- package/dist/components/SequenceInput.vue.d.ts +10 -21
- package/dist/components/SequenceProgressBar.vue.d.ts +2 -1
- package/dist/components/SettingsModal.schema.d.ts +1 -1
- package/dist/components/SettingsModal.vue.d.ts +28 -25
- package/dist/components/Skeleton.vue.d.ts +2 -1
- package/dist/components/SmartGroup.types.d.ts +2 -2
- package/dist/components/SmartGroupFieldRecipe.groups.d.ts +2 -0
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +4 -7
- package/dist/components/SmartGroupManual.vue.d.ts +3 -2
- package/dist/components/SmartGroupModal.vue.d.ts +6 -4
- package/dist/components/StatusIndicator.vue.d.ts +2 -1
- package/dist/components/StepWizard.vue.d.ts +26 -27
- package/dist/components/TagsInput.vue.d.ts +3 -5
- package/dist/components/ThemeToggle.vue.d.ts +2 -1
- package/dist/components/TimePicker.vue.d.ts +6 -6
- package/dist/components/TimeRangeInput.vue.d.ts +9 -2
- package/dist/components/Tooltip.vue.d.ts +8 -18
- package/dist/components/UnitInput.vue.d.ts +2 -1
- package/dist/components/WellPlate.colors.d.ts +2 -4
- package/dist/components/WellPlate.rendering.d.ts +7 -1
- package/dist/components/WellPlate.sampleDrop.d.ts +2 -0
- package/dist/components/WellPlate.vue.d.ts +22 -39
- package/dist/components/index.d.ts +34 -31
- package/dist/components/index.js +5 -8
- package/dist/components/internal/ActionItemInternal.vue.d.ts +11 -13
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +14 -23
- package/dist/components/internal/AppTopBarPillNavInternal.vue.d.ts +2 -1
- package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +2 -1
- package/dist/components/internal/DataStateInternal.vue.d.ts +7 -11
- package/dist/components/internal/{FilePickerTreeInternal.vue.d.ts → FilePickerListInternal.vue.d.ts} +9 -6
- package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +4 -3
- package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +16 -18
- package/dist/components/internal/FormSectionRenderer.vue.d.ts +36 -32
- package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +8 -0
- package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +65 -0
- package/dist/components/internal/SettingsPaneHeadInternal.vue.d.ts +15 -0
- package/dist/components/internal/WellEditPopupInternal.vue.d.ts +12 -4
- package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +6 -13
- package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +19 -42
- package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +9 -19
- package/dist/components/internal/filePickerPresentation.d.ts +8 -0
- package/dist/components/internal/generatedJobsApi.d.ts +9 -0
- package/dist/{components-Bbg_gtzF.js → components-GDDvof8D.js} +7088 -5955
- package/dist/components-GDDvof8D.js.map +1 -0
- package/dist/composables/controlSchemaTypes.d.ts +4 -43
- package/dist/composables/createFilePickerAdapter.d.ts +5 -1
- package/dist/composables/filePicker/usePickerNavigation.d.ts +7 -2
- package/dist/composables/index.d.ts +2 -13
- package/dist/composables/index.js +7 -11
- package/dist/composables/pluginWorkspaceModel.d.ts +1 -3
- package/dist/composables/useAutoGroup.d.ts +10 -0
- package/dist/composables/useBioTemplateComponents.d.ts +15 -3
- package/dist/composables/useBioTemplateControls.d.ts +5 -1
- package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
- package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
- package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
- package/dist/composables/useChemicalFormula.d.ts +2 -1
- package/dist/composables/useDropdownState.d.ts +5 -0
- package/dist/composables/useExperimentSave.d.ts +5 -1
- package/dist/composables/useFileBrowser.d.ts +3 -2
- package/dist/composables/useFilePicker.d.ts +25 -13
- package/dist/composables/useFocusTrap.d.ts +2 -1
- package/dist/composables/useGroupAssignment.d.ts +5 -1
- package/dist/composables/useJobsStatusTray.d.ts +5 -5
- package/dist/composables/useMenuKeyboard.d.ts +3 -3
- package/dist/composables/usePlatformContext.d.ts +3 -0
- package/dist/composables/usePluginClient.d.ts +1 -1
- package/dist/composables/useRackEditor.d.ts +36 -1
- package/dist/composables/useSequenceUtils.d.ts +8 -0
- package/dist/composables/useTemplateCollection.d.ts +5 -1
- package/dist/composables/workspaceRecipes.d.ts +1 -0
- package/dist/composables-D6uqp0UF.js +591 -0
- package/dist/composables-D6uqp0UF.js.map +1 -0
- package/dist/{errors-BLuqMee5.js → experiment-DgllIc3I.js} +89 -333
- package/dist/experiment-DgllIc3I.js.map +1 -0
- package/dist/{experiment-utils-CV2Wza3z.js → experiment-utils-DTANyVKV.js} +68 -37
- package/dist/experiment-utils-DTANyVKV.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +122 -17
- package/dist/index.js.map +1 -1
- package/dist/install.js +1 -2
- package/dist/install.js.map +1 -1
- package/dist/instrument.d.ts +6 -0
- package/dist/lcms.d.ts +11 -0
- package/dist/permissions.d.ts +2 -47
- package/dist/permissions.js +2 -26
- package/dist/permissions.js.map +1 -1
- package/dist/settings-BLr8lzw6.js +341 -0
- package/dist/settings-BLr8lzw6.js.map +1 -0
- package/dist/stores/auth.d.ts +2 -150
- package/dist/stores/experiment.d.ts +2 -106
- package/dist/stores/index.js +2 -2
- package/dist/stores/settings.d.ts +2 -44
- package/dist/styles.css +8608 -6950
- package/dist/tailwind.preset.js.map +1 -1
- package/dist/templates/adapters.d.ts +3 -0
- package/dist/templates/assayMatrixAdapters.d.ts +8 -1
- package/dist/templates/assayMatrixBuilder.d.ts +1 -0
- package/dist/templates/builderPresetControls.d.ts +1 -0
- package/dist/templates/calibrationCurveAdapters.d.ts +3 -0
- package/dist/templates/calibrationCurveBuilder.d.ts +1 -0
- package/dist/templates/catalog.d.ts +6 -2
- package/dist/templates/componentBindings.d.ts +31 -5
- package/dist/templates/componentPlateHelpers.d.ts +7 -1
- package/dist/templates/controlSchemas.d.ts +9 -0
- package/dist/templates/defaultBioTemplateBuilder.d.ts +1 -0
- package/dist/templates/doseResponseAdapters.d.ts +2 -0
- package/dist/templates/doseResponseBuilder.d.ts +1 -0
- package/dist/templates/elisaAssayCollectionBuilder.d.ts +1 -0
- package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +1 -0
- package/dist/templates/flowCytometryPanelBuilder.d.ts +1 -0
- package/dist/templates/flowPanelAdapters.d.ts +3 -0
- package/dist/templates/index.d.ts +1 -1
- package/dist/templates/index.js +2 -3
- package/dist/templates/instrumentRunAdapters.d.ts +13 -2
- package/dist/templates/instrumentRunBuilder.d.ts +1 -0
- package/dist/templates/lcmsBatchCollectionBuilder.d.ts +1 -0
- package/dist/templates/packs.d.ts +4 -0
- package/dist/templates/plateMapAdapters.d.ts +2 -0
- package/dist/templates/plateMapBuilder.d.ts +1 -0
- package/dist/templates/presets.d.ts +6 -2
- package/dist/templates/protocolAdapters.d.ts +4 -0
- package/dist/templates/protocolStepsBuilder.d.ts +1 -0
- package/dist/templates/qpcrAdapters.d.ts +4 -0
- package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +1 -0
- package/dist/templates/qpcrPlateBuilder.d.ts +1 -0
- package/dist/templates/reagentAdapters.d.ts +4 -0
- package/dist/templates/reagentListBuilder.d.ts +1 -0
- package/dist/templates/samplePrepAdapters.d.ts +3 -0
- package/dist/templates/samplePrepBuilder.d.ts +1 -0
- package/dist/templates/sampleSheetAdapters.d.ts +4 -0
- package/dist/templates/sampleSheetBuilder.d.ts +1 -0
- package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +1 -0
- package/dist/templates/templateEnvelopes.d.ts +8 -0
- package/dist/templates/templatePackCollectionBuilder.d.ts +1 -0
- package/dist/templates/templatePresetCollectionBuilder.d.ts +2 -0
- package/dist/templates/templateValidators.d.ts +12 -0
- package/dist/templates/timeCourseAdapters.d.ts +4 -0
- package/dist/templates/timeCourseBuilder.d.ts +1 -0
- package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +1 -0
- package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +1 -0
- package/dist/templates-BU1pet28.js +12304 -0
- package/dist/templates-BU1pet28.js.map +1 -0
- package/dist/types/auth.d.ts +0 -27
- package/dist/types/componentLabTypes.d.ts +14 -7
- package/dist/types/componentWorkflowTypes.d.ts +26 -0
- package/dist/types/components.d.ts +40 -17
- package/dist/types/fileBrowserTypes.d.ts +13 -0
- package/dist/types/filePicker.d.ts +19 -1
- package/dist/types/generated-ui.d.ts +13 -0
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.js +1 -1
- package/dist/types/instrument.d.ts +43 -15
- package/dist/types/platform.d.ts +2 -0
- package/dist/utils/color.d.ts +6 -1
- package/dist/utils/formModelSync.d.ts +1 -0
- package/dist/utils/plotlyTemplate.d.ts +3 -0
- package/dist/utils/rack.d.ts +16 -0
- package/dist/utils/sampleTypeMarker.d.ts +23 -0
- package/dist/{validation-ChMyixAf.js → validation-Dmp9Q5W0.js} +3032 -838
- package/dist/validation-Dmp9Q5W0.js.map +1 -0
- package/package.json +17 -23
- package/src/__stories__/experiment-helpers.ts +8 -4
- package/src/__tests__/components/ActionMenu.test.ts +66 -0
- package/src/__tests__/components/AlertBox.test.ts +21 -0
- package/src/__tests__/components/AppAvatarMenu.test.ts +25 -0
- package/src/__tests__/components/AppTopBar.test.ts +79 -0
- package/src/__tests__/components/AppTopBarPageSelector.test.ts +20 -0
- package/src/__tests__/components/AppTopBarPillNav.test.ts +74 -0
- package/src/__tests__/components/ArtifactSelectorModal.test.ts +20 -6
- package/src/__tests__/components/AuditTrail.test.ts +38 -0
- package/src/__tests__/components/BaseCheckbox.test.ts +43 -0
- package/src/__tests__/components/BaseInput.test.ts +43 -0
- package/src/__tests__/components/BaseModal.test.ts +90 -0
- package/src/__tests__/components/BaseRadioGroup.test.ts +8 -0
- package/src/__tests__/components/BaseSlider.test.ts +116 -0
- package/src/__tests__/components/BaseToggle.test.ts +7 -0
- package/src/__tests__/components/BatchProgressList.test.ts +22 -14
- package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +4 -4
- package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +1 -1
- package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +8 -8
- package/src/__tests__/components/BioTemplateRenderer.test.ts +2 -2
- package/src/__tests__/components/Breadcrumb.test.ts +45 -0
- package/src/__tests__/components/CalendarGridPanel.test.ts +14 -0
- package/src/__tests__/components/ChartContainer.test.ts +23 -0
- package/src/__tests__/components/ChemicalFormula.test.ts +15 -0
- package/src/__tests__/components/CollapsibleCard.test.ts +12 -9
- package/src/__tests__/components/ComponentBindingRenderer.test.ts +45 -17
- package/src/__tests__/components/ConcentrationInput.test.ts +17 -2
- package/src/__tests__/components/DataFrame.test.ts +107 -4
- package/src/__tests__/components/DataStates.test.ts +0 -16
- package/src/__tests__/components/DatePicker.test.ts +10 -0
- package/src/__tests__/components/DoseCalculator.test.ts +47 -0
- package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +37 -34
- package/src/__tests__/components/EmptyState.test.ts +16 -1
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +31 -3
- package/src/__tests__/components/ExperimentTimeline.test.ts +45 -0
- package/src/__tests__/components/FilePicker.state.test.ts +2 -2
- package/src/__tests__/components/FilePicker.test.ts +360 -13
- package/src/__tests__/components/FileUploader.test.ts +15 -0
- package/src/__tests__/components/FitPanel.test.ts +96 -0
- package/src/__tests__/components/FormulaInput.test.ts +97 -0
- package/src/__tests__/components/GeneratedPathInput.test.ts +168 -41
- package/src/__tests__/components/GeneratedPlotlyResult.test.ts +1 -1
- package/src/__tests__/components/GeneratedResultRenderer.test.ts +47 -2
- package/src/__tests__/components/InstrumentStateBadge.test.ts +50 -0
- package/src/__tests__/components/JobsStatusTray.test.ts +27 -0
- package/src/__tests__/components/MoleculeInput.test.ts +78 -0
- package/src/__tests__/components/MultiSelect.test.ts +6 -0
- package/src/__tests__/components/PlateEditor.test.ts +1134 -0
- package/src/__tests__/components/PlateEditorBindingInternal.test.ts +64 -0
- package/src/__tests__/components/PlotlyChart.test.ts +147 -1
- package/src/__tests__/components/ProgressBar.test.ts +18 -0
- package/src/__tests__/components/ProtocolStepEditor.test.ts +106 -18
- package/src/__tests__/components/ProtocolStepParameterField.test.ts +74 -29
- package/src/__tests__/components/ReagentList.presentation.test.ts +10 -5
- package/src/__tests__/components/ReagentList.test.ts +23 -0
- package/src/__tests__/components/ResourcePickerListInternal.test.ts +141 -0
- package/src/__tests__/components/RetiredStyles.test.ts +0 -6
- package/src/__tests__/components/SampleHierarchyTree.test.ts +102 -0
- package/src/__tests__/components/SampleLegend.test.ts +18 -0
- package/src/__tests__/components/SampleSelector.test.ts +92 -1
- package/src/__tests__/components/SampleSelectorSampleRow.test.ts +5 -2
- package/src/__tests__/components/ScheduleCalendar.test.ts +32 -0
- package/src/__tests__/components/ScientificNumber.test.ts +113 -0
- package/src/__tests__/components/SearchableSelect.test.ts +21 -0
- package/src/__tests__/components/SecretInput.test.ts +6 -0
- package/src/__tests__/components/SegmentedControl.test.ts +14 -0
- package/src/__tests__/components/SequenceInput.test.ts +81 -0
- package/src/__tests__/components/SettingsModal.schema.test.ts +5 -5
- package/src/__tests__/components/SettingsModal.test.ts +371 -23
- package/src/__tests__/components/Skeleton.test.ts +23 -0
- package/src/__tests__/components/SmartGroupFieldRecipe.test.ts +12 -0
- package/src/__tests__/components/SmartGroupModal.test.ts +69 -0
- package/src/__tests__/components/StepWizard.test.ts +75 -0
- package/src/__tests__/components/TagsInput.test.ts +16 -0
- package/src/__tests__/components/TimePicker.test.ts +66 -0
- package/src/__tests__/components/TimeRangeInput.test.ts +83 -0
- package/src/__tests__/components/UnitInput.test.ts +147 -0
- package/src/__tests__/components/WellEditPopupInternal.test.ts +434 -2
- package/src/__tests__/components/WellPlate.decoration.test.ts +18 -0
- package/src/__tests__/components/WellPlate.geometry.test.ts +13 -0
- package/src/__tests__/components/WellPlate.interaction.test.ts +213 -0
- package/src/__tests__/components/WellPlate.keyboard.test.ts +24 -0
- package/src/__tests__/components/WellPlate.rendering.test.ts +38 -19
- package/src/__tests__/components/WellPlate.sampleDrop.test.ts +19 -0
- package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +58 -0
- package/src/__tests__/composables/createFilePickerAdapter.test.ts +114 -1
- package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +1 -1
- package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +1 -1
- package/src/__tests__/composables/useChemicalFormula.test.ts +60 -0
- package/src/__tests__/composables/useControlSchema.test.ts +15 -5
- package/src/__tests__/composables/useDropdownState.test.ts +20 -1
- package/src/__tests__/composables/useGeneratedAnalysis.test.ts +52 -0
- package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
- package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
- package/src/__tests__/composables/useRackEditor.test.ts +270 -0
- package/src/__tests__/composables/useSequenceUtils.test.ts +28 -0
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +44 -9
- package/src/__tests__/styles/baseControlsRules.test.ts +115 -0
- package/src/__tests__/styles/controlRefreshRules.test.ts +218 -0
- package/src/__tests__/styles/cssTokens.test.ts +7 -5
- package/src/__tests__/styles/darkModeRules.test.ts +47 -0
- package/src/__tests__/styles/menusShellRefresh.test.ts +75 -0
- package/src/__tests__/templates/templates.test.ts +65 -15
- package/src/__tests__/templates/templatesDeprecation.test.ts +78 -0
- package/src/__tests__/utils/permissions.test.ts +0 -68
- package/src/__tests__/utils/plotlyTemplate.test.ts +69 -0
- package/src/__tests__/utils/sampleTypeMarker.test.ts +54 -0
- package/src/components/ActionMenu.vue +44 -23
- package/src/components/AdductText.story.vue +18 -0
- package/src/components/AdductText.vue +7 -1
- package/src/components/AlertBox.vue +3 -7
- package/src/components/AppAvatarMenu.vue +12 -10
- package/src/components/AppSidebar.vue +1 -1
- package/src/components/AppTopBar.story.vue +47 -4
- package/src/components/AppTopBar.vue +16 -22
- package/src/components/ArtifactSelectorModal.story.vue +1 -1
- package/src/components/ArtifactSelectorModal.vue +48 -160
- package/src/components/AuditTrail.vue +26 -12
- package/src/components/AutoGroupModal.vue +1 -1
- package/src/components/BaseCheckbox.story.vue +58 -2
- package/src/components/BaseCheckbox.vue +21 -3
- package/src/components/BaseInput.story.vue +51 -0
- package/src/components/BaseInput.vue +62 -1
- package/src/components/BaseModal.story.vue +55 -0
- package/src/components/BaseModal.vue +83 -50
- package/src/components/BaseRadioGroup.vue +1 -1
- package/src/components/BaseSlider.story.vue +36 -0
- package/src/components/BaseSlider.vue +56 -8
- package/src/components/BaseToggle.vue +1 -7
- package/src/components/BatchProgressList.vue +50 -52
- package/src/components/BioTemplatePresetWorkspaceView.vue +1 -1
- package/src/components/Breadcrumb.story.vue +1 -1
- package/src/components/Breadcrumb.vue +50 -15
- package/src/components/ChartContainer.story.vue +42 -0
- package/src/components/ChartContainer.vue +22 -1
- package/src/components/ChemicalFormula.story.vue +11 -11
- package/src/components/ChemicalFormula.vue +1 -0
- package/src/components/CollapsibleCard.vue +12 -32
- package/src/components/ComponentBindingRenderer.vue +6 -8
- package/src/components/ConcentrationInput.story.vue +1 -1
- package/src/components/ConcentrationInput.vue +8 -14
- package/src/components/ControlWorkspaceView.vue +1 -1
- package/src/components/DataFrame.story.vue +45 -2
- package/src/components/DataFrame.vue +28 -13
- package/src/components/DatePicker.story.vue +11 -0
- package/src/components/DatePicker.vue +5 -5
- package/src/components/DateTimePicker.story.vue +1 -1
- package/src/components/DateTimePicker.vue +8 -5
- package/src/components/Divider.story.vue +1 -1
- package/src/components/DoseCalculator.vue +44 -51
- package/src/components/DoseCalculatorVolumeField.vue +22 -35
- package/src/components/DoseDesignWorkspaceView.vue +1 -1
- package/src/components/EmptyState.story.vue +4 -4
- package/src/components/EmptyState.vue +4 -2
- package/src/components/ExperimentPopover.story.vue +2 -2
- package/src/components/ExperimentPopover.vue +6 -4
- package/src/components/ExperimentSelectorModal.story.vue +2 -1
- package/src/components/ExperimentSelectorModal.vue +91 -261
- package/src/components/ExperimentTimeline.story.vue +29 -0
- package/src/components/ExperimentTimeline.vue +20 -0
- package/src/components/FilePicker.story.vue +65 -10
- package/src/components/FilePicker.vue +203 -121
- package/src/components/FitPanel.story.vue +72 -6
- package/src/components/FitPanel.vue +70 -18
- package/src/components/FormField.vue +2 -0
- package/src/components/FormulaInput.story.vue +6 -0
- package/src/components/FormulaInput.vue +49 -70
- package/src/components/GeneratedPathInput.story.vue +121 -8
- package/src/components/GeneratedPathInput.vue +155 -86
- package/src/components/GeneratedPlotlyResult.vue +1 -1
- package/src/components/GeneratedPluginView.vue +4 -4
- package/src/components/GeneratedResultRenderer.vue +19 -0
- package/src/components/InstrumentStateBadge.story.vue +41 -0
- package/src/components/InstrumentStateBadge.vue +24 -14
- package/src/components/JobsStatusTray.vue +30 -8
- package/src/components/MoleculeInput.vue +12 -7
- package/src/components/MultiSelect.vue +3 -3
- package/src/components/PlateEditor.story.vue +333 -0
- package/src/components/PlateEditor.vue +793 -0
- package/src/components/PlotlyChart.story.vue +37 -1
- package/src/components/PlotlyChart.vue +86 -16
- package/src/components/PluginWorkspaceView.props.ts +1 -7
- package/src/components/PluginWorkspaceView.vue +0 -4
- package/src/components/ProgressBar.story.vue +0 -30
- package/src/components/ProgressBar.vue +3 -53
- package/src/components/ProtocolStepEditor.story.vue +8 -0
- package/src/components/ProtocolStepEditor.vue +55 -145
- package/src/components/ProtocolStepParameterField.vue +55 -93
- package/src/components/ReagentList.presentation.ts +7 -6
- package/src/components/ReagentList.vue +18 -17
- package/src/components/SampleHierarchyTree.story.vue +19 -0
- package/src/components/SampleHierarchyTree.vue +47 -14
- package/src/components/SampleLegend.vue +12 -4
- package/src/components/SampleSelector.story.vue +5 -1
- package/src/components/SampleSelector.vue +25 -15
- package/src/components/SampleSelectorGroupNode.vue +10 -20
- package/src/components/SampleSelectorSampleRow.vue +7 -18
- package/src/components/ScheduleCalendar.story.vue +14 -0
- package/src/components/ScheduleCalendar.vue +13 -1
- package/src/components/ScientificNumber.story.vue +15 -2
- package/src/components/ScientificNumber.vue +22 -26
- package/src/components/SearchableSelect.vue +14 -9
- package/src/components/SecretInput.vue +1 -1
- package/src/components/SegmentedControl.story.vue +23 -0
- package/src/components/SegmentedControl.vue +6 -1
- package/src/components/SequenceInput.story.vue +27 -5
- package/src/components/SequenceInput.vue +74 -29
- package/src/components/SequenceProgressBar.vue +0 -1
- package/src/components/SettingsModal.schema.ts +4 -2
- package/src/components/SettingsModal.story.vue +83 -22
- package/src/components/SettingsModal.vue +338 -79
- package/src/components/Skeleton.vue +6 -35
- package/src/components/SmartGroup.types.ts +2 -2
- package/src/components/SmartGroupFieldRecipe.groups.ts +4 -1
- package/src/components/SmartGroupFieldRecipe.vue +14 -8
- package/src/components/SmartGroupManual.vue +14 -11
- package/src/components/StepWizard.vue +16 -19
- package/src/components/TagsInput.story.vue +16 -11
- package/src/components/TagsInput.vue +20 -3
- package/src/components/TimePicker.story.vue +38 -3
- package/src/components/TimePicker.vue +26 -11
- package/src/components/TimeRangeInput.story.vue +50 -1
- package/src/components/TimeRangeInput.vue +36 -17
- package/src/components/UnitInput.story.vue +1 -1
- package/src/components/UnitInput.vue +173 -107
- package/src/components/WellPlate.colors.ts +7 -6
- package/src/components/WellPlate.geometry.ts +3 -0
- package/src/components/WellPlate.interaction.ts +39 -5
- package/src/components/WellPlate.rendering.ts +21 -27
- package/src/components/WellPlate.sampleDrop.ts +20 -12
- package/src/components/WellPlate.story.vue +18 -7
- package/src/components/WellPlate.vue +28 -22
- package/src/components/index.ts +34 -31
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +13 -7
- package/src/components/internal/AppTopBarPillNavInternal.vue +12 -7
- package/src/components/internal/CalendarGridPanelInternal.vue +1 -1
- package/src/components/internal/FilePickerListInternal.vue +318 -0
- package/src/components/internal/FilePickerPreviewInternal.vue +54 -52
- package/src/components/internal/PlateEditorBindingInternal.vue +37 -0
- package/src/components/internal/ResourcePickerListInternal.vue +237 -0
- package/src/components/internal/SettingsPaneHeadInternal.vue +41 -0
- package/src/components/internal/WellEditPopupInternal.vue +219 -146
- package/src/components/internal/WorkspaceShellInternal.vue +0 -6
- package/src/components/internal/filePickerPresentation.ts +30 -0
- package/src/components/internal/generatedJobsApi.ts +12 -0
- package/src/composables/autoGroup/index.ts +3 -0
- package/src/composables/controlSchemaAdapters.ts +0 -4
- package/src/composables/controlSchemaFormFields.ts +0 -4
- package/src/composables/controlSchemaTypes.ts +4 -43
- package/src/composables/createFilePickerAdapter.ts +90 -22
- package/src/composables/filePicker/localFiles.ts +1 -0
- package/src/composables/filePicker/usePickerNavigation.ts +29 -2
- package/src/composables/index.ts +2 -71
- package/src/composables/pluginWorkspaceModel.ts +0 -3
- package/src/composables/useAutoGroup.ts +10 -0
- package/src/composables/useBioTemplateComponents.ts +15 -3
- package/src/composables/useBioTemplateControls.ts +5 -1
- package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
- package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
- package/src/composables/useBioTemplateWorkspace.ts +5 -1
- package/src/composables/useChemicalFormula.ts +39 -13
- package/src/composables/useDropdownState.ts +6 -1
- package/src/composables/useExperimentSave.ts +5 -1
- package/src/composables/useFileBrowser.ts +3 -2
- package/src/composables/useFilePicker.ts +98 -13
- package/src/composables/useFocusTrap.ts +9 -6
- package/src/composables/useGeneratedAnalysis.ts +38 -0
- package/src/composables/useGroupAssignment.ts +5 -1
- package/src/composables/useJobsStatusTray.ts +5 -5
- package/src/composables/useMenuKeyboard.ts +5 -3
- package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
- package/src/composables/usePluginClient.ts +1 -1
- package/src/composables/usePluginWorkspace.ts +0 -1
- package/src/composables/useRackEditor.ts +202 -12
- package/src/composables/useSequenceUtils.ts +20 -2
- package/src/composables/useTemplateCollection.ts +5 -1
- package/src/composables/workspaceRecipes.ts +1 -0
- package/src/index.ts +9 -3
- package/src/instrument.ts +6 -0
- package/src/lcms.ts +11 -0
- package/src/permissions.ts +2 -59
- package/src/styles/components/action-menu.css +9 -38
- package/src/styles/components/adduct-text.css +15 -3
- package/src/styles/components/alert-box.css +19 -70
- package/src/styles/components/app-avatar-menu.css +22 -57
- package/src/styles/components/app-container.css +4 -4
- package/src/styles/components/app-layout.css +18 -18
- package/src/styles/components/app-page-selector.css +50 -105
- package/src/styles/components/app-pill-nav.css +24 -42
- package/src/styles/components/app-sidebar.css +2 -2
- package/src/styles/components/app-top-bar.css +78 -55
- package/src/styles/components/artifact-selector-modal.css +1 -211
- package/src/styles/components/audit-trail.css +45 -38
- package/src/styles/components/avatar.css +1 -1
- package/src/styles/components/batch-progress-list.css +179 -95
- package/src/styles/components/breadcrumb.css +34 -15
- package/src/styles/components/calendar.css +2 -8
- package/src/styles/components/chart-container.css +81 -38
- package/src/styles/components/checkbox.css +8 -6
- package/src/styles/components/chemical-formula.css +8 -6
- package/src/styles/components/collapsible-card.css +6 -46
- package/src/styles/components/concentration-input.css +1 -10
- package/src/styles/components/dataframe.css +48 -67
- package/src/styles/components/date-picker.css +124 -62
- package/src/styles/components/datetime-picker.css +81 -47
- package/src/styles/components/divider.css +2 -4
- package/src/styles/components/dose-calculator.css +9 -135
- package/src/styles/components/empty-state.css +26 -35
- package/src/styles/components/experiment-code-badge.css +1 -1
- package/src/styles/components/experiment-popover.css +16 -83
- package/src/styles/components/experiment-selector-modal.css +9 -226
- package/src/styles/components/experiment-timeline.css +120 -50
- package/src/styles/components/file-picker.css +323 -299
- package/src/styles/components/file-uploader.css +4 -6
- package/src/styles/components/fit-panel.css +108 -22
- package/src/styles/components/form-field.css +6 -4
- package/src/styles/components/formula-input.css +121 -48
- package/src/styles/components/group-assigner.css +1 -3
- package/src/styles/components/icon-button.css +15 -37
- package/src/styles/components/input.css +91 -2
- package/src/styles/components/instrument-monitor.css +37 -447
- package/src/styles/components/jobs-status-tray.css +82 -61
- package/src/styles/components/loading-spinner.css +18 -0
- package/src/styles/components/mobile-support-gate.css +15 -17
- package/src/styles/components/modal.css +44 -33
- package/src/styles/components/molecule-input.css +31 -16
- package/src/styles/components/multi-select.css +33 -29
- package/src/styles/components/number-input.css +1 -1
- package/src/styles/components/plate-editor.css +497 -0
- package/src/styles/components/popover.css +162 -0
- package/src/styles/components/progress-bar.css +1 -70
- package/src/styles/components/protocol-step-editor.css +21 -333
- package/src/styles/components/radio-group.css +9 -18
- package/src/styles/components/reagent-editor.css +3 -7
- package/src/styles/components/reagent-list.css +63 -69
- package/src/styles/components/resource-card.css +4 -6
- package/src/styles/components/resource-picker-list.css +212 -0
- package/src/styles/components/sample-hierarchy-tree.css +83 -65
- package/src/styles/components/sample-legend.css +18 -7
- package/src/styles/components/sample-selector.css +41 -68
- package/src/styles/components/schedule-calendar.css +59 -54
- package/src/styles/components/scientific-number.css +72 -18
- package/src/styles/components/searchable-select.css +17 -26
- package/src/styles/components/secret-input.css +20 -23
- package/src/styles/components/section-card.css +3 -5
- package/src/styles/components/segmented-control.css +14 -1
- package/src/styles/components/select.css +19 -8
- package/src/styles/components/sequence-input.css +85 -37
- package/src/styles/components/sequence-progress-bar.css +18 -37
- package/src/styles/components/settings-modal.css +683 -34
- package/src/styles/components/skeleton.css +24 -23
- package/src/styles/components/slider.css +74 -8
- package/src/styles/components/smart-group.css +27 -39
- package/src/styles/components/status-indicator.css +1 -1
- package/src/styles/components/step-wizard.css +62 -99
- package/src/styles/components/tabs.css +2 -6
- package/src/styles/components/tags-input.css +64 -54
- package/src/styles/components/textarea.css +2 -2
- package/src/styles/components/time-picker.css +67 -38
- package/src/styles/components/time-range-input.css +16 -18
- package/src/styles/components/toast.css +1 -1
- package/src/styles/components/toggle.css +21 -31
- package/src/styles/components/tooltip.css +13 -15
- package/src/styles/components/unit-input.css +86 -36
- package/src/styles/components/well-edit-popup.css +111 -189
- package/src/styles/components/well-plate.css +7 -7
- package/src/styles/index.css +5 -7
- package/src/styles/variables.css +35 -7
- package/src/templates/adapters.ts +4 -0
- package/src/templates/assayMatrixAdapters.ts +8 -1
- package/src/templates/assayMatrixBuilder.ts +1 -0
- package/src/templates/builderPresetControls.ts +1 -0
- package/src/templates/calibrationCurveAdapters.ts +3 -0
- package/src/templates/calibrationCurveBuilder.ts +1 -0
- package/src/templates/catalog.ts +6 -2
- package/src/templates/componentBindingCatalog.ts +1 -1
- package/src/templates/componentBindings.ts +31 -5
- package/src/templates/componentDoseResponseProps.ts +0 -1
- package/src/templates/componentPlateHelpers.ts +22 -1
- package/src/templates/componentPlateMapProps.ts +7 -5
- package/src/templates/componentQpcrPlateProps.ts +0 -1
- package/src/templates/controlSchemas.ts +9 -0
- package/src/templates/defaultBioTemplateBuilder.ts +1 -0
- package/src/templates/doseResponseAdapters.ts +2 -0
- package/src/templates/doseResponseBuilder.ts +1 -0
- package/src/templates/elisaAssayCollectionBuilder.ts +1 -0
- package/src/templates/flowCytometryAssayCollectionBuilder.ts +1 -0
- package/src/templates/flowCytometryPanelBuilder.ts +1 -0
- package/src/templates/flowPanelAdapters.ts +3 -0
- package/src/templates/index.ts +4 -0
- package/src/templates/instrumentRunAdapters.ts +13 -2
- package/src/templates/instrumentRunBuilder.ts +1 -0
- package/src/templates/lcmsBatchCollectionBuilder.ts +1 -0
- package/src/templates/packs.ts +4 -0
- package/src/templates/plateMapAdapters.ts +2 -0
- package/src/templates/plateMapBuilder.ts +1 -0
- package/src/templates/presets.ts +6 -2
- package/src/templates/protocolAdapters.ts +4 -0
- package/src/templates/protocolStepsBuilder.ts +1 -0
- package/src/templates/qpcrAdapters.ts +4 -0
- package/src/templates/qpcrExpressionCollectionBuilder.ts +1 -0
- package/src/templates/qpcrPlateBuilder.ts +1 -0
- package/src/templates/reagentAdapters.ts +4 -0
- package/src/templates/reagentListBuilder.ts +1 -0
- package/src/templates/samplePrepAdapters.ts +3 -0
- package/src/templates/samplePrepBuilder.ts +1 -0
- package/src/templates/sampleSheetAdapters.ts +4 -0
- package/src/templates/sampleSheetBuilder.ts +1 -0
- package/src/templates/targetedMetabolomicsCollectionBuilder.ts +1 -0
- package/src/templates/templateEnvelopes.ts +8 -0
- package/src/templates/templatePackCollectionBuilder.ts +1 -0
- package/src/templates/templatePresetCollectionBuilder.ts +2 -0
- package/src/templates/templateValidators.ts +12 -0
- package/src/templates/timeCourseAdapters.ts +4 -0
- package/src/templates/timeCourseBuilder.ts +1 -0
- package/src/templates/wellPlateScreenCollectionBuilder.ts +1 -0
- package/src/templates/westernBlotAssayCollectionBuilder.ts +1 -0
- package/src/types/auth.ts +0 -37
- package/src/types/componentLabTypes.ts +16 -13
- package/src/types/componentWorkflowTypes.ts +29 -0
- package/src/types/components.ts +43 -20
- package/src/types/fileBrowserTypes.ts +15 -0
- package/src/types/filePicker.ts +19 -1
- package/src/types/generated-ui.ts +15 -0
- package/src/types/index.ts +12 -11
- package/src/types/instrument.ts +47 -15
- package/src/types/platform.ts +2 -0
- package/src/utils/color.ts +16 -1
- package/src/utils/formModelSync.ts +1 -1
- package/src/utils/plotlyTemplate.ts +39 -0
- package/src/utils/rack.ts +16 -0
- package/src/utils/sampleTypeMarker.ts +44 -0
- package/dist/ExperimentPopover-CJdNlCZb.js +0 -451
- package/dist/ExperimentPopover-CJdNlCZb.js.map +0 -1
- package/dist/ExperimentSelectorModal-DHE9k8TP.js +0 -507
- package/dist/ExperimentSelectorModal-DHE9k8TP.js.map +0 -1
- package/dist/SettingsModal-DELMkUFR.js +0 -492
- package/dist/SettingsModal-DELMkUFR.js.map +0 -1
- package/dist/Skeleton-jhF9wUkU.js +0 -485
- package/dist/Skeleton-jhF9wUkU.js.map +0 -1
- package/dist/__tests__/composables/usePluginConfig.test.d.ts +0 -15
- package/dist/chunk-BoAXSpZd.js +0 -33
- package/dist/components/AppPluginSwitcher.vue.d.ts +0 -40
- package/dist/components/ColorSlider.vue.d.ts +0 -34
- package/dist/components/DropdownButton.vue.d.ts +0 -49
- package/dist/components/FileBrowserModal.vue.d.ts +0 -99
- package/dist/components/InstrumentAlertLog.vue.d.ts +0 -22
- package/dist/components/InstrumentStatusCard.vue.d.ts +0 -13
- package/dist/components/LcmsSequenceTable.vue.d.ts +0 -54
- package/dist/components/PlateMapEditor.vue.d.ts +0 -50
- package/dist/components/RackEditor.vue.d.ts +0 -78
- package/dist/components/fileBrowserPresentation.d.ts +0 -10
- package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +0 -34
- package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +0 -25
- package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +0 -26
- package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +0 -28
- package/dist/components-Bbg_gtzF.js.map +0 -1
- package/dist/composables/useAsync.d.ts +0 -132
- package/dist/composables/useAuth.d.ts +0 -47
- package/dist/composables/useCommandHistory.d.ts +0 -33
- package/dist/composables/useOptimisticMutation.d.ts +0 -32
- package/dist/composables/usePasskey.d.ts +0 -10
- package/dist/composables/usePluginConfig.d.ts +0 -27
- package/dist/composables/useResourceCrud.d.ts +0 -44
- package/dist/composables/useWellPainting.d.ts +0 -39
- package/dist/composables/useWellPlateAdapter.d.ts +0 -40
- package/dist/composables/useWellPlateEditor.d.ts +0 -33
- package/dist/composables/useWellPlateValidation.d.ts +0 -31
- package/dist/composables-BCbYb2lA.js +0 -2356
- package/dist/composables-BCbYb2lA.js.map +0 -1
- package/dist/errors-BLuqMee5.js.map +0 -1
- package/dist/experiment-CVDRAnqp.js +0 -90
- package/dist/experiment-CVDRAnqp.js.map +0 -1
- package/dist/experiment-utils-CV2Wza3z.js.map +0 -1
- package/dist/plotly.min-c2Sez60c.js +0 -180634
- package/dist/plotly.min-c2Sez60c.js.map +0 -1
- package/dist/templates-NuaNHohp.js +0 -5260
- package/dist/templates-NuaNHohp.js.map +0 -1
- package/dist/useControlSchema-vLiRPUmj.js +0 -7301
- package/dist/useControlSchema-vLiRPUmj.js.map +0 -1
- package/dist/useDropdownState-C7hRiVQf.js +0 -63
- package/dist/useDropdownState-C7hRiVQf.js.map +0 -1
- package/dist/useExperimentSelector-G_CAOFTX.js +0 -328
- package/dist/useExperimentSelector-G_CAOFTX.js.map +0 -1
- package/dist/useFormBuilder-D37ajgS8.js +0 -729
- package/dist/useFormBuilder-D37ajgS8.js.map +0 -1
- package/dist/validation-ChMyixAf.js.map +0 -1
- package/src/__tests__/components/AppPluginSwitcher.test.ts +0 -44
- package/src/__tests__/components/DropdownButton.test.ts +0 -628
- package/src/__tests__/components/FileBrowserModal.test.ts +0 -460
- package/src/__tests__/components/InstrumentAlertLog.test.ts +0 -59
- package/src/__tests__/components/LcmsSequenceTable.test.ts +0 -79
- package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +0 -54
- package/src/__tests__/components/RackEditor.test.ts +0 -169
- package/src/__tests__/composables/useAuth.test.ts +0 -233
- package/src/__tests__/composables/useCommandHistory.test.ts +0 -43
- package/src/__tests__/composables/useOptimisticMutation.test.ts +0 -40
- package/src/__tests__/composables/usePluginConfig.test.ts +0 -497
- package/src/__tests__/composables/useResourceCrud.test.ts +0 -56
- package/src/__tests__/composables/useWellPainting.test.ts +0 -52
- package/src/__tests__/composables/useWellPlateAdapter.test.ts +0 -50
- package/src/__tests__/composables/useWellPlateValidation.test.ts +0 -42
- package/src/components/AppPluginSwitcher.story.vue +0 -87
- package/src/components/AppPluginSwitcher.vue +0 -134
- package/src/components/ColorSlider.story.vue +0 -120
- package/src/components/ColorSlider.vue +0 -160
- package/src/components/DropdownButton.story.vue +0 -102
- package/src/components/DropdownButton.vue +0 -181
- package/src/components/FileBrowserModal.story.vue +0 -203
- package/src/components/FileBrowserModal.vue +0 -384
- package/src/components/InstrumentAlertLog.vue +0 -187
- package/src/components/InstrumentStatusCard.vue +0 -184
- package/src/components/LcmsSequenceTable.vue +0 -222
- package/src/components/PlateMapEditor.story.vue +0 -92
- package/src/components/PlateMapEditor.vue +0 -423
- package/src/components/RackEditor.story.vue +0 -100
- package/src/components/RackEditor.vue +0 -429
- package/src/components/fileBrowserPresentation.ts +0 -39
- package/src/components/internal/FileBrowserDialogInternal.vue +0 -75
- package/src/components/internal/FileBrowserListingInternal.vue +0 -197
- package/src/components/internal/FileBrowserToolbarInternal.vue +0 -136
- package/src/components/internal/FilePickerTreeInternal.vue +0 -238
- package/src/components/internal/PlateMapEditorToolbarInternal.vue +0 -128
- package/src/composables/useAsync.ts +0 -327
- package/src/composables/useAuth.ts +0 -458
- package/src/composables/useCommandHistory.ts +0 -117
- package/src/composables/useOptimisticMutation.ts +0 -97
- package/src/composables/usePasskey.ts +0 -216
- package/src/composables/usePluginConfig.ts +0 -252
- package/src/composables/useResourceCrud.ts +0 -235
- package/src/composables/useWellPainting.ts +0 -167
- package/src/composables/useWellPlateAdapter.ts +0 -151
- package/src/composables/useWellPlateEditor.ts +0 -415
- package/src/composables/useWellPlateValidation.ts +0 -89
- package/src/plotly-dist.d.ts +0 -3
- package/src/styles/components/app-plugin-switcher.css +0 -196
- package/src/styles/components/color-slider.css +0 -110
- package/src/styles/components/dropdown-button.css +0 -280
- package/src/styles/components/file-browser-modal.css +0 -489
- package/src/styles/components/lcms-sequence-table.css +0 -204
- package/src/styles/components/plate-map-editor.css +0 -464
- package/src/styles/components/rack-editor.css +0 -287
- /package/dist/__tests__/components/{AppPluginSwitcher.test.d.ts → AlertBox.test.d.ts} +0 -0
- /package/dist/__tests__/components/{DropdownButton.test.d.ts → AuditTrail.test.d.ts} +0 -0
- /package/dist/__tests__/components/{FileBrowserModal.test.d.ts → BaseCheckbox.test.d.ts} +0 -0
- /package/dist/__tests__/components/{InstrumentAlertLog.test.d.ts → BaseSlider.test.d.ts} +0 -0
- /package/dist/__tests__/components/{LcmsSequenceTable.test.d.ts → DoseCalculator.test.d.ts} +0 -0
- /package/dist/__tests__/components/{PlateMapEditorToolbarInternal.test.d.ts → FileUploader.test.d.ts} +0 -0
- /package/dist/__tests__/components/{RackEditor.test.d.ts → FitPanel.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useAuth.test.d.ts → components/FormulaInput.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useCommandHistory.test.d.ts → components/InstrumentStateBadge.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useOptimisticMutation.test.d.ts → components/MoleculeInput.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useResourceCrud.test.d.ts → components/PlateEditor.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useWellPainting.test.d.ts → components/PlateEditorBindingInternal.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useWellPlateAdapter.test.d.ts → components/ResourcePickerListInternal.test.d.ts} +0 -0
- /package/dist/__tests__/{composables/useWellPlateValidation.test.d.ts → components/SampleLegend.test.d.ts} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ref, computed, type Ref, type ComputedRef } from 'vue'
|
|
2
|
-
import type { Rack, SlotPosition, WellPlateFormat, Well } from '../types'
|
|
3
|
-
import { PLATE_CONFIGS, rowLabel as plateRowLabel } from '../components/WellPlate.geometry'
|
|
1
|
+
import { ref, computed, watch, type Ref, type ComputedRef } from 'vue'
|
|
2
|
+
import type { Rack, SlotPosition, WellEditData, WellPlateFormat, WellSampleDropData, Well } from '../types'
|
|
3
|
+
import { PLATE_CONFIGS, rowIndex, rowLabel as plateRowLabel } from '../components/WellPlate.geometry'
|
|
4
4
|
|
|
5
5
|
export interface UseRackEditorOptions {
|
|
6
6
|
defaultFormat?: WellPlateFormat
|
|
@@ -24,14 +24,82 @@ export interface UseRackEditorReturn {
|
|
|
24
24
|
clearWell(rackId: string, wellId: string): void
|
|
25
25
|
clearAllWells(rackId: string): void
|
|
26
26
|
fillSeries(rackId: string, prefix?: string): void
|
|
27
|
+
/** Swaps two wells (a move when the target is empty). */
|
|
28
|
+
moveWell(rackId: string, sourceWellId: string, targetWellId: string): void
|
|
29
|
+
/** Puts every well in group `groupId` (an empty well becomes a sample); `undefined` empties them. */
|
|
30
|
+
assignWells(rackId: string, wellIds: string[], groupId: string | undefined): void
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Applies every PlateEditor intent to this state, so the component can hold
|
|
34
|
+
* data it never mutates itself:
|
|
35
|
+
* `<PlateEditor :model-value="racks" :active-rack-id="activeRackId" v-on="plateEditorListeners" />`
|
|
36
|
+
*/
|
|
37
|
+
plateEditorListeners: PlateEditorListeners
|
|
38
|
+
|
|
39
|
+
/** Steps back through every change to `racks` (at most 50), restoring the plate that was showing. */
|
|
40
|
+
undo(): void
|
|
41
|
+
redo(): void
|
|
42
|
+
canUndo: ComputedRef<boolean>
|
|
43
|
+
canRedo: ComputedRef<boolean>
|
|
44
|
+
/** Forgets every undo and redo step, e.g. after loading unrelated plates. */
|
|
45
|
+
clearHistory(): void
|
|
27
46
|
|
|
28
47
|
getAllWells(): Array<{ rackId: string; wellId: string; well: Partial<Well> }>
|
|
29
48
|
totalSampleCount: ComputedRef<number>
|
|
30
49
|
reset(): void
|
|
31
50
|
}
|
|
32
51
|
|
|
52
|
+
/** Handlers for PlateEditor's intent events, keyed by event name (bind with `v-on`). */
|
|
53
|
+
export interface PlateEditorListeners {
|
|
54
|
+
'update:activeRackId': (rackId: string) => void
|
|
55
|
+
'rack-add': () => void
|
|
56
|
+
'rack-remove': (rackId: string) => void
|
|
57
|
+
'rack-reorder': (rackIds: string[]) => void
|
|
58
|
+
'update:format': (rackId: string, format: WellPlateFormat) => void
|
|
59
|
+
'update:slot': (rackId: string, slot: SlotPosition) => void
|
|
60
|
+
'well-edit': (rackId: string, wellId: string, data: WellEditData) => void
|
|
61
|
+
'well-clear': (rackId: string, wellId: string) => void
|
|
62
|
+
'well-move': (rackId: string, sourceWellId: string, targetWellId: string) => void
|
|
63
|
+
'sample-drop': (rackId: string, wellId: string, data: WellSampleDropData, event: DragEvent) => void
|
|
64
|
+
'assign': (rackId: string, wellIds: string[], groupId: string | undefined) => void
|
|
65
|
+
'clear': (rackId: string) => void
|
|
66
|
+
'fill-series': (rackId: string) => void
|
|
67
|
+
'undo': () => void
|
|
68
|
+
'redo': () => void
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const HISTORY_LIMIT = 50
|
|
72
|
+
|
|
33
73
|
const SLOT_CYCLE: SlotPosition[] = ['R', 'G', 'B', 'Y']
|
|
34
74
|
|
|
75
|
+
function wellFromEditData(data: WellEditData): Partial<Well> {
|
|
76
|
+
return {
|
|
77
|
+
state: 'filled',
|
|
78
|
+
sampleType: data.sampleType || undefined,
|
|
79
|
+
metadata: {
|
|
80
|
+
label: data.label,
|
|
81
|
+
injectionVolume: data.injectionVolume,
|
|
82
|
+
injectionCount: data.injectionCount,
|
|
83
|
+
customMethod: data.customMethod || null,
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function wellFromDrop(data: WellSampleDropData, rack: Rack): Partial<Well> | null {
|
|
89
|
+
const label = (data.label ?? data.sampleName ?? data.id ?? '').trim()
|
|
90
|
+
if (!label) return null
|
|
91
|
+
return {
|
|
92
|
+
state: 'filled',
|
|
93
|
+
sampleType: data.sampleType ?? 'sample',
|
|
94
|
+
metadata: {
|
|
95
|
+
label,
|
|
96
|
+
injectionVolume: data.injectionVolume ?? rack.injectionVolume,
|
|
97
|
+
injectionCount: data.injectionCount ?? 1,
|
|
98
|
+
customMethod: data.customMethod ?? null,
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
35
103
|
|
|
36
104
|
let globalIdCounter = 0
|
|
37
105
|
|
|
@@ -64,7 +132,7 @@ export function useRackEditor(
|
|
|
64
132
|
|
|
65
133
|
const racks = ref<Rack[]>(
|
|
66
134
|
initialRacks && initialRacks.length > 0
|
|
67
|
-
? initialRacks.map(r => ({ ...r }))
|
|
135
|
+
? initialRacks.map(r => ({ ...r, wells: { ...r.wells } }))
|
|
68
136
|
: [createDefaultRack('Rack 1', 0)]
|
|
69
137
|
) as Ref<Rack[]>
|
|
70
138
|
|
|
@@ -170,6 +238,118 @@ export function useRackEditor(
|
|
|
170
238
|
}
|
|
171
239
|
}
|
|
172
240
|
|
|
241
|
+
function moveWell(rackId: string, sourceWellId: string, targetWellId: string): void {
|
|
242
|
+
const rack = racks.value.find(r => r.id === rackId)
|
|
243
|
+
if (!rack) return
|
|
244
|
+
const { [sourceWellId]: source, [targetWellId]: target } = rack.wells
|
|
245
|
+
delete rack.wells[sourceWellId]
|
|
246
|
+
delete rack.wells[targetWellId]
|
|
247
|
+
if (target) rack.wells[sourceWellId] = placed(target, sourceWellId)
|
|
248
|
+
if (source) rack.wells[targetWellId] = placed(source, targetWellId)
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** A moved well keeps its position fields in step with its new key. */
|
|
252
|
+
function placed(well: Partial<Well>, wellId: string): Partial<Well> {
|
|
253
|
+
if (well.id === undefined) return well
|
|
254
|
+
const [, row = '', col = ''] = /^([A-Z]+)(\d+)$/.exec(wellId) ?? []
|
|
255
|
+
return { ...well, id: wellId, row: rowIndex(row), col: Number(col) - 1 }
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function assignWells(rackId: string, wellIds: string[], groupId: string | undefined): void {
|
|
259
|
+
const rack = racks.value.find(r => r.id === rackId)
|
|
260
|
+
for (const wellId of wellIds) {
|
|
261
|
+
const sampleType = rack?.wells[wellId]?.sampleType ?? 'sample'
|
|
262
|
+
if (groupId) setWellData(rackId, wellId, { state: 'filled', sampleType, group: groupId })
|
|
263
|
+
else clearWell(rackId, wellId)
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// History: the serialized racks before each change, with the plate that was showing.
|
|
268
|
+
// Every change counts, not just the intents: each public mutator call is its own step,
|
|
269
|
+
// and a change made outside them (an import assigning `racks`) becomes one at the next
|
|
270
|
+
// tick, so undo never skips past it.
|
|
271
|
+
interface Snapshot { racks: string; activeRackId: string }
|
|
272
|
+
const undoStack = ref<Snapshot[]>([])
|
|
273
|
+
const redoStack = ref<Snapshot[]>([])
|
|
274
|
+
const canUndo = computed(() => undoStack.value.length > 0)
|
|
275
|
+
const canRedo = computed(() => redoStack.value.length > 0)
|
|
276
|
+
/** The racks as the history last saw them. */
|
|
277
|
+
let known = JSON.stringify(racks.value)
|
|
278
|
+
|
|
279
|
+
function pushUndo(snapshot: Snapshot): void {
|
|
280
|
+
undoStack.value = [...undoStack.value, snapshot].slice(-HISTORY_LIMIT)
|
|
281
|
+
redoStack.value = []
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Records a change made since the history last looked, as its own step. */
|
|
285
|
+
function absorb(): void {
|
|
286
|
+
const now = JSON.stringify(racks.value)
|
|
287
|
+
if (now === known) return
|
|
288
|
+
pushUndo({ racks: known, activeRackId: activeRackId.value })
|
|
289
|
+
known = now
|
|
290
|
+
}
|
|
291
|
+
watch(racks, absorb, { deep: true })
|
|
292
|
+
|
|
293
|
+
function step(from: Ref<Snapshot[]>, to: Ref<Snapshot[]>): void {
|
|
294
|
+
absorb()
|
|
295
|
+
const snapshot = from.value.pop()
|
|
296
|
+
if (snapshot === undefined) return
|
|
297
|
+
to.value.push({ racks: known, activeRackId: activeRackId.value })
|
|
298
|
+
racks.value = JSON.parse(snapshot.racks) as Rack[]
|
|
299
|
+
known = snapshot.racks
|
|
300
|
+
activeRackId.value = racks.value.some(rack => rack.id === snapshot.activeRackId)
|
|
301
|
+
? snapshot.activeRackId
|
|
302
|
+
: racks.value[0]?.id ?? ''
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const undo = (): void => step(undoStack, redoStack)
|
|
306
|
+
const redo = (): void => step(redoStack, undoStack)
|
|
307
|
+
|
|
308
|
+
function clearHistory(): void {
|
|
309
|
+
undoStack.value = []
|
|
310
|
+
redoStack.value = []
|
|
311
|
+
known = JSON.stringify(racks.value)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/** Runs `apply` and records the prior state when it changed anything. */
|
|
315
|
+
function recorded<Args extends unknown[], Result>(apply: (...args: Args) => Result) {
|
|
316
|
+
return (...args: Args): Result => {
|
|
317
|
+
absorb()
|
|
318
|
+
const before = { racks: known, activeRackId: activeRackId.value }
|
|
319
|
+
const result = apply(...args)
|
|
320
|
+
const after = JSON.stringify(racks.value)
|
|
321
|
+
if (after !== known) {
|
|
322
|
+
pushUndo(before)
|
|
323
|
+
known = after
|
|
324
|
+
}
|
|
325
|
+
return result
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const plateEditorListeners: PlateEditorListeners = {
|
|
330
|
+
'update:activeRackId': setActiveRack,
|
|
331
|
+
'rack-add': recorded(() => { addRack() }),
|
|
332
|
+
'rack-remove': recorded(removeRack),
|
|
333
|
+
'rack-reorder': recorded((rackIds: string[]) => {
|
|
334
|
+
racks.value = rackIds.flatMap(id => racks.value.filter(rack => rack.id === id))
|
|
335
|
+
}),
|
|
336
|
+
'update:format': recorded((rackId: string, format: WellPlateFormat) => updateRack(rackId, { format })),
|
|
337
|
+
'update:slot': recorded((rackId: string, slot: SlotPosition) => updateRack(rackId, { slot })),
|
|
338
|
+
'well-edit': recorded((rackId: string, wellId: string, data: WellEditData) => setWellData(rackId, wellId, wellFromEditData(data))),
|
|
339
|
+
'well-clear': recorded(clearWell),
|
|
340
|
+
'well-move': recorded(moveWell),
|
|
341
|
+
'sample-drop': recorded((rackId: string, wellId: string, data: WellSampleDropData) => {
|
|
342
|
+
const rack = racks.value.find(r => r.id === rackId)
|
|
343
|
+
const well = rack && wellFromDrop(data, rack)
|
|
344
|
+
if (well) setWellData(rackId, wellId, well)
|
|
345
|
+
}),
|
|
346
|
+
'assign': recorded(assignWells),
|
|
347
|
+
'clear': recorded(clearAllWells),
|
|
348
|
+
'fill-series': recorded((rackId: string) => fillSeries(rackId)),
|
|
349
|
+
'undo': undo,
|
|
350
|
+
'redo': redo,
|
|
351
|
+
}
|
|
352
|
+
|
|
173
353
|
function getAllWells(): Array<{ rackId: string; wellId: string; well: Partial<Well> }> {
|
|
174
354
|
const result: Array<{ rackId: string; wellId: string; well: Partial<Well> }> = []
|
|
175
355
|
for (const rack of racks.value) {
|
|
@@ -192,21 +372,31 @@ export function useRackEditor(
|
|
|
192
372
|
const rack = createDefaultRack('Rack 1', 0)
|
|
193
373
|
racks.value = [rack]
|
|
194
374
|
activeRackId.value = rack.id
|
|
375
|
+
clearHistory()
|
|
195
376
|
}
|
|
196
377
|
|
|
197
378
|
return {
|
|
198
379
|
racks,
|
|
199
380
|
activeRack,
|
|
200
381
|
activeRackId,
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
382
|
+
// Wrapped here, not at the definitions, so assignWells' inner calls stay one step.
|
|
383
|
+
addRack: recorded(addRack),
|
|
384
|
+
removeRack: recorded(removeRack),
|
|
385
|
+
reorderRacks: recorded(reorderRacks),
|
|
386
|
+
updateRack: recorded(updateRack),
|
|
205
387
|
setActiveRack,
|
|
206
|
-
setWellData,
|
|
207
|
-
clearWell,
|
|
208
|
-
clearAllWells,
|
|
209
|
-
fillSeries,
|
|
388
|
+
setWellData: recorded(setWellData),
|
|
389
|
+
clearWell: recorded(clearWell),
|
|
390
|
+
clearAllWells: recorded(clearAllWells),
|
|
391
|
+
fillSeries: recorded(fillSeries),
|
|
392
|
+
moveWell: recorded(moveWell),
|
|
393
|
+
assignWells: recorded(assignWells),
|
|
394
|
+
plateEditorListeners,
|
|
395
|
+
undo,
|
|
396
|
+
redo,
|
|
397
|
+
canUndo,
|
|
398
|
+
canRedo,
|
|
399
|
+
clearHistory,
|
|
210
400
|
getAllWells,
|
|
211
401
|
totalSampleCount,
|
|
212
402
|
reset,
|
|
@@ -6,6 +6,14 @@ export interface SequenceStats {
|
|
|
6
6
|
molecularWeight?: number
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
/** What `validateSequence` would strip or flag, so a field can report it instead. */
|
|
10
|
+
export interface SequenceProblems {
|
|
11
|
+
/** Ambiguous `N` bases (DNA/RNA only; `N` is asparagine in protein). */
|
|
12
|
+
ambiguousBases: number
|
|
13
|
+
/** Unique characters outside the alphabet, upper-cased, in order of appearance. Whitespace is ignored. */
|
|
14
|
+
invalidCharacters: string[]
|
|
15
|
+
}
|
|
16
|
+
|
|
9
17
|
const DNA_CHARS = /[^ATCGNatcgn]/g
|
|
10
18
|
const RNA_CHARS = /[^AUCGNaucgn]/g
|
|
11
19
|
const PROTEIN_CHARS = /[^ACDEFGHIKLMNPQRSTVWYacdefghiklmnpqrstvwy]/g
|
|
@@ -35,8 +43,8 @@ export function useSequenceUtils() {
|
|
|
35
43
|
return 'rna'
|
|
36
44
|
}
|
|
37
45
|
|
|
38
|
-
// If only
|
|
39
|
-
if (/^[ATCGN]+$/i.test(seq)) {
|
|
46
|
+
// If its letters are only ATCGN, it's DNA (line breaks, spaces and digits don't count)
|
|
47
|
+
if (/^[ATCGN]+$/i.test(seq.replace(/[^a-z]/gi, ''))) {
|
|
40
48
|
return 'dna'
|
|
41
49
|
}
|
|
42
50
|
|
|
@@ -58,6 +66,15 @@ export function useSequenceUtils() {
|
|
|
58
66
|
}
|
|
59
67
|
}
|
|
60
68
|
|
|
69
|
+
function findSequenceProblems(seq: string, type: 'dna' | 'rna' | 'protein'): SequenceProblems {
|
|
70
|
+
const alphabet = { dna: DNA_CHARS, rna: RNA_CHARS, protein: PROTEIN_CHARS }[type]
|
|
71
|
+
const invalid = seq.replace(/\s/g, '').match(alphabet) ?? []
|
|
72
|
+
return {
|
|
73
|
+
ambiguousBases: type === 'protein' ? 0 : (seq.match(/n/gi) ?? []).length,
|
|
74
|
+
invalidCharacters: [...new Set(invalid.map(ch => ch.toUpperCase()))],
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
61
78
|
function reverseComplement(seq: string, type: 'dna' | 'rna'): string {
|
|
62
79
|
const complementMap = type === 'dna' ? DNA_COMPLEMENT : RNA_COMPLEMENT
|
|
63
80
|
|
|
@@ -98,6 +115,7 @@ export function useSequenceUtils() {
|
|
|
98
115
|
return {
|
|
99
116
|
detectSequenceType,
|
|
100
117
|
validateSequence,
|
|
118
|
+
findSequenceProblems,
|
|
101
119
|
reverseComplement,
|
|
102
120
|
calculateStats,
|
|
103
121
|
formatFasta,
|
|
@@ -72,7 +72,11 @@ export interface UseTemplateCollectionReturn {
|
|
|
72
72
|
requireCurrentExperimentId: () => number
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* Manages a biology template collection in the current experiment's design_data.
|
|
77
|
+
*
|
|
78
|
+
* @deprecated Scheduled for removal in MINT 1.4; no SDK replacement.
|
|
79
|
+
*/
|
|
76
80
|
export function useTemplateCollection(
|
|
77
81
|
options: UseTemplateCollectionOptions = {},
|
|
78
82
|
): UseTemplateCollectionReturn {
|
|
@@ -88,6 +88,7 @@ export interface DoseDesignWorkspacePassthroughProps {
|
|
|
88
88
|
subtitle?: string
|
|
89
89
|
topBarVariant?: TopBarVariant
|
|
90
90
|
sidebarWidth?: string
|
|
91
|
+
/** @deprecated No-op, removed in MINT 1.4. AppSidebar has one look now. */
|
|
91
92
|
sidebarVariant?: 'default' | 'analysis'
|
|
92
93
|
responsiveSidebar?: boolean
|
|
93
94
|
sidebarPosition?: 'left' | 'right'
|
package/src/index.ts
CHANGED
|
@@ -25,7 +25,7 @@ export * from './stores'
|
|
|
25
25
|
// Permissions
|
|
26
26
|
export * from './permissions'
|
|
27
27
|
|
|
28
|
-
// Instrument monitoring
|
|
28
|
+
// Instrument monitoring. Deprecated: scheduled for removal in MINT 1.4 (moves to the mld-ms plugins).
|
|
29
29
|
export * from './instrument'
|
|
30
30
|
|
|
31
31
|
// Job state helpers
|
|
@@ -34,7 +34,7 @@ export * from './jobs'
|
|
|
34
34
|
// Experimental generated analysis workspace
|
|
35
35
|
export * from './generated/schema'
|
|
36
36
|
|
|
37
|
-
// LCMS sequence helpers
|
|
37
|
+
// LCMS sequence helpers. Deprecated: scheduled for removal in MINT 1.4, no SDK replacement.
|
|
38
38
|
export * from './lcms'
|
|
39
39
|
|
|
40
40
|
// Utils
|
|
@@ -60,6 +60,12 @@ export {
|
|
|
60
60
|
type PluginSecretRef,
|
|
61
61
|
type PluginSecretState,
|
|
62
62
|
} from './utils/pluginSecrets'
|
|
63
|
+
export {
|
|
64
|
+
sampleTypeMarker,
|
|
65
|
+
type SampleMarkerType,
|
|
66
|
+
type SampleTypeMarker,
|
|
67
|
+
} from './utils/sampleTypeMarker'
|
|
68
|
+
export { mintPlotlyTemplate } from './utils/plotlyTemplate'
|
|
63
69
|
export {
|
|
64
70
|
LCMS_DEFAULT_CONTROL_POSITIONS,
|
|
65
71
|
createLcmsControlWellEditData,
|
|
@@ -79,7 +85,7 @@ export {
|
|
|
79
85
|
type LcmsPlateType,
|
|
80
86
|
} from './utils/rack'
|
|
81
87
|
|
|
82
|
-
// Biology data templates
|
|
88
|
+
// Biology data templates. Deprecated: scheduled for removal from the core SDK in MINT 1.4.
|
|
83
89
|
export * from './templates'
|
|
84
90
|
|
|
85
91
|
// Types
|
package/src/instrument.ts
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import type { SequenceProgress } from './types'
|
|
2
2
|
|
|
3
|
+
/** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
|
|
3
4
|
export function sequenceProgressPercent(progress: SequenceProgress | null | undefined): number {
|
|
4
5
|
if (!progress || progress.total_samples <= 0) return 0
|
|
5
6
|
return Math.round(clamp((progress.current_sample / progress.total_samples) * 100, 0, 100))
|
|
6
7
|
}
|
|
7
8
|
|
|
9
|
+
/** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
|
|
8
10
|
export function sequenceSamplesRemaining(progress: SequenceProgress | null | undefined): number {
|
|
9
11
|
if (!progress) return 0
|
|
10
12
|
return Math.max(0, progress.total_samples - progress.current_sample)
|
|
11
13
|
}
|
|
12
14
|
|
|
15
|
+
/** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
|
|
13
16
|
export function estimateSequenceRemainingSeconds(
|
|
14
17
|
progress: SequenceProgress | null | undefined,
|
|
15
18
|
): number | null {
|
|
@@ -31,6 +34,7 @@ export function estimateSequenceRemainingSeconds(
|
|
|
31
34
|
return null
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
/** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
|
|
34
38
|
export function estimateSequenceFinishDate(
|
|
35
39
|
progress: SequenceProgress | null | undefined,
|
|
36
40
|
now = new Date(),
|
|
@@ -45,6 +49,7 @@ export function estimateSequenceFinishDate(
|
|
|
45
49
|
return new Date(now.getTime() + remaining * 1000)
|
|
46
50
|
}
|
|
47
51
|
|
|
52
|
+
/** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
|
|
48
53
|
export function formatSequenceRemaining(progress: SequenceProgress | null | undefined): string | null {
|
|
49
54
|
const remaining = estimateSequenceRemainingSeconds(progress)
|
|
50
55
|
if (remaining == null || remaining <= 0) return null
|
|
@@ -58,6 +63,7 @@ export function formatSequenceRemaining(progress: SequenceProgress | null | unde
|
|
|
58
63
|
return mins > 0 ? `~${hours}h ${mins}m left` : `~${hours}h left`
|
|
59
64
|
}
|
|
60
65
|
|
|
66
|
+
/** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
|
|
61
67
|
export function formatSequenceEta(
|
|
62
68
|
progress: SequenceProgress | null | undefined,
|
|
63
69
|
locale?: Intl.LocalesArgument,
|
package/src/lcms.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { LcmsPlateCell, LcmsPlateType } from './utils/rack'
|
|
2
2
|
|
|
3
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
3
4
|
export type LcmsPolarity = 'POS' | 'NEG' | 'BOTH'
|
|
5
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
4
6
|
export type LcmsContainerType = 'VIAL' | 'PLATE'
|
|
5
7
|
|
|
8
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
6
9
|
export interface LcmsSequenceItem {
|
|
7
10
|
sample_type: string
|
|
8
11
|
file_name: string
|
|
@@ -13,12 +16,14 @@ export interface LcmsSequenceItem {
|
|
|
13
16
|
injection_volume: number
|
|
14
17
|
}
|
|
15
18
|
|
|
19
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
16
20
|
export interface LcmsSequenceTableColumn {
|
|
17
21
|
key: keyof LcmsSequenceItem | 'index' | 'actions'
|
|
18
22
|
label: string
|
|
19
23
|
align?: 'left' | 'right'
|
|
20
24
|
}
|
|
21
25
|
|
|
26
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
22
27
|
export const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[] = [
|
|
23
28
|
{ key: 'index', label: '#' },
|
|
24
29
|
{ key: 'sample_type', label: 'Type' },
|
|
@@ -28,6 +33,7 @@ export const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[] = [
|
|
|
28
33
|
{ key: 'injection_volume', label: 'Inj Vol', align: 'right' },
|
|
29
34
|
]
|
|
30
35
|
|
|
36
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
31
37
|
export function extractLcmsCommonPrefix(fileNames: readonly string[]): string {
|
|
32
38
|
if (fileNames.length === 0) return ''
|
|
33
39
|
const stripped = fileNames.map(fileName => fileName.replace(/_\d{3}$/, ''))
|
|
@@ -46,6 +52,7 @@ export function extractLcmsCommonPrefix(fileNames: readonly string[]): string {
|
|
|
46
52
|
return common
|
|
47
53
|
}
|
|
48
54
|
|
|
55
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
49
56
|
export function extractLcmsSampleName(fileName: string, prefix = ''): string {
|
|
50
57
|
let name = fileName.replace(/_\d{3}$/, '')
|
|
51
58
|
if (prefix && name.startsWith(prefix)) {
|
|
@@ -55,10 +62,12 @@ export function extractLcmsSampleName(fileName: string, prefix = ''): string {
|
|
|
55
62
|
return name || fileName
|
|
56
63
|
}
|
|
57
64
|
|
|
65
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
58
66
|
export function lcmsWellIdFromPosition(position: string): string {
|
|
59
67
|
return position.includes(':') ? position.split(':').pop() ?? position : position
|
|
60
68
|
}
|
|
61
69
|
|
|
70
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
62
71
|
export function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsPlateType | null {
|
|
63
72
|
let maxCol = 0
|
|
64
73
|
let maxRow = 0
|
|
@@ -72,6 +81,7 @@ export function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsP
|
|
|
72
81
|
return maxCol <= 9 && maxRow <= 6 ? '54vial' : '96well'
|
|
73
82
|
}
|
|
74
83
|
|
|
84
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
75
85
|
export function reconstructLcmsPlateCellsFromSequenceItems(
|
|
76
86
|
items: readonly LcmsSequenceItem[],
|
|
77
87
|
): { cells: LcmsPlateCell[]; plateType: LcmsPlateType } | null {
|
|
@@ -102,6 +112,7 @@ export function reconstructLcmsPlateCellsFromSequenceItems(
|
|
|
102
112
|
return { cells, plateType }
|
|
103
113
|
}
|
|
104
114
|
|
|
115
|
+
/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
105
116
|
export function basenameFromWindowsPath(path: string | null | undefined): string {
|
|
106
117
|
if (!path) return ''
|
|
107
118
|
return path.split(/[\\/]/).pop() ?? path
|
package/src/permissions.ts
CHANGED
|
@@ -40,37 +40,9 @@ export interface AccessPolicy {
|
|
|
40
40
|
plugin?: string
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
/**
|
|
44
|
-
* An object that carries an access rule.
|
|
45
|
-
*
|
|
46
|
-
* The nested `access` policy is the supported shape. The four flat fields are
|
|
47
|
-
* the pre-1.2 spelling of the same four `AccessPolicy` fields; they still work
|
|
48
|
-
* but are deprecated, and `normalizeAccessPolicy()` lets the nested policy win
|
|
49
|
-
* wherever both are given.
|
|
50
|
-
*/
|
|
43
|
+
/** An object that carries an access rule in its nested `access` policy. */
|
|
51
44
|
export interface AccessControlled {
|
|
52
|
-
/** The access policy. Preferred over the flat fields below. */
|
|
53
45
|
access?: AccessPolicy
|
|
54
|
-
/**
|
|
55
|
-
* @deprecated Since MINT 1.2; use `access.visibleFor` instead. The flat
|
|
56
|
-
* duplicate is removed in 1.3.
|
|
57
|
-
*/
|
|
58
|
-
visibleFor?: AccessAudienceInput
|
|
59
|
-
/**
|
|
60
|
-
* @deprecated Since MINT 1.2; use `access.requiresAdmin` instead. The flat
|
|
61
|
-
* duplicate is removed in 1.3.
|
|
62
|
-
*/
|
|
63
|
-
requiresAdmin?: boolean
|
|
64
|
-
/**
|
|
65
|
-
* @deprecated Since MINT 1.2; use `access.permissions` instead. The flat
|
|
66
|
-
* duplicate is removed in 1.3.
|
|
67
|
-
*/
|
|
68
|
-
permissions?: readonly string[]
|
|
69
|
-
/**
|
|
70
|
-
* @deprecated Since MINT 1.2; use `access.anyPermissions` instead. The flat
|
|
71
|
-
* duplicate is removed in 1.3.
|
|
72
|
-
*/
|
|
73
|
-
anyPermissions?: readonly string[]
|
|
74
46
|
}
|
|
75
47
|
|
|
76
48
|
export function getRoleInfo(user: PermissionUser | null | undefined): RoleInfo | null {
|
|
@@ -129,40 +101,11 @@ export function canAccessPlugin(
|
|
|
129
101
|
return Array.isArray(access) && access.includes(pluginName)
|
|
130
102
|
}
|
|
131
103
|
|
|
132
|
-
/**
|
|
133
|
-
* Flatten an access rule — either shape, or a mix of both — into one policy.
|
|
134
|
-
*
|
|
135
|
-
* ## Precedence
|
|
136
|
-
*
|
|
137
|
-
* 1. A defined field on the nested `access` policy wins. It is the supported
|
|
138
|
-
* spelling, so an object that carries both shapes is read as "the nested
|
|
139
|
-
* policy, with the deprecated flat fields as leftovers".
|
|
140
|
-
* 2. Otherwise the flat field on the rule itself is used.
|
|
141
|
-
* 3. A field set to `undefined` on either side counts as unset and never
|
|
142
|
-
* masks the other side.
|
|
143
|
-
*
|
|
144
|
-
* Only `AccessPolicy` fields the flat shape never had (`audience`,
|
|
145
|
-
* `requiresAuth`, `plugin`) can come from the nested policy alone; the four
|
|
146
|
-
* duplicated fields are the ones this ordering exists for.
|
|
147
|
-
*/
|
|
148
|
-
export function normalizeAccessPolicy(rule: AccessControlled | AccessPolicy | undefined): AccessPolicy {
|
|
149
|
-
if (!rule) return {}
|
|
150
|
-
const { access: nested, ...flat } = rule as AccessPolicy & { access?: AccessPolicy }
|
|
151
|
-
const policy = { ...flat } as Record<string, unknown>
|
|
152
|
-
|
|
153
|
-
for (const [field, value] of Object.entries(nested ?? {})) {
|
|
154
|
-
if (value !== undefined) policy[field] = value
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return policy as AccessPolicy
|
|
158
|
-
}
|
|
159
|
-
|
|
160
104
|
export function canAccessByPolicy(
|
|
161
105
|
user: PermissionUser | null | undefined,
|
|
162
|
-
|
|
106
|
+
policy: AccessPolicy = {},
|
|
163
107
|
isAuthenticated = user !== null && user !== undefined,
|
|
164
108
|
): boolean {
|
|
165
|
-
const policy = normalizeAccessPolicy(rule)
|
|
166
109
|
if (policy.requiresAuth && !isAuthenticated) return false
|
|
167
110
|
if (policy.requiresAdmin && !isAdminUser(user)) return false
|
|
168
111
|
if (!audienceAllowsUser(policy.visibleFor ?? policy.audience, user)) return false
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
/* ActionMenu — compact square trigger with a teleported, viewport-safe menu.
|
|
1
|
+
/* ActionMenu — compact square trigger with a teleported, viewport-safe menu.
|
|
2
|
+
Surface and rows come from .mint-popover / .mint-menu-item (popover.css, 2d);
|
|
3
|
+
__panel and __item stay as aliases and own only placement. */
|
|
2
4
|
|
|
3
5
|
.mint-action-menu {
|
|
4
6
|
display: inline-flex;
|
|
@@ -13,47 +15,16 @@
|
|
|
13
15
|
.mint-action-menu__panel {
|
|
14
16
|
position: fixed;
|
|
15
17
|
z-index: 1000;
|
|
16
|
-
display: flex;
|
|
17
18
|
min-width: 10rem;
|
|
18
19
|
max-width: min(18rem, calc(100vw - 1rem));
|
|
19
|
-
flex-direction: column;
|
|
20
|
-
padding: 0.25rem;
|
|
21
|
-
border: 1px solid var(--border-color);
|
|
22
|
-
border-radius: var(--radius-md);
|
|
23
|
-
background: var(--bg-secondary);
|
|
24
|
-
box-shadow: var(--shadow-md);
|
|
25
20
|
}
|
|
26
21
|
|
|
27
|
-
.mint-action-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
align-items: center;
|
|
31
|
-
padding: 0.4375rem 0.625rem;
|
|
32
|
-
border: 0;
|
|
33
|
-
border-radius: 0.375rem;
|
|
34
|
-
background: transparent;
|
|
35
|
-
color: var(--text-primary);
|
|
36
|
-
font-family: inherit;
|
|
37
|
-
font-size: 0.78125rem;
|
|
38
|
-
line-height: 1.25;
|
|
39
|
-
text-align: left;
|
|
40
|
-
text-decoration: none;
|
|
41
|
-
cursor: pointer;
|
|
42
|
-
transition: background-color var(--mint-transition);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.mint-action-menu__item:hover:not(:disabled),
|
|
46
|
-
.mint-action-menu__item:focus-visible {
|
|
47
|
-
outline: none;
|
|
48
|
-
background: var(--bg-hover);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.mint-action-menu__item--danger {
|
|
52
|
-
color: var(--mint-error);
|
|
22
|
+
.mint-action-menu__check {
|
|
23
|
+
flex-shrink: 0;
|
|
24
|
+
color: var(--color-primary);
|
|
53
25
|
}
|
|
54
26
|
|
|
55
|
-
.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
opacity: var(--mint-disabled-opacity);
|
|
27
|
+
/* Unchecked radio rows keep the check's width so labels stay aligned. */
|
|
28
|
+
.mint-action-menu__check--off {
|
|
29
|
+
visibility: hidden;
|
|
59
30
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
.mint-adduct-text--sans { font-family: var(--font-sans); font-feature-settings: 'liga' 1, 'calt' 1; font-weight: 650; }
|
|
17
17
|
|
|
18
18
|
.mint-adduct-text--xs {
|
|
19
|
-
font-size: 0.
|
|
19
|
+
font-size: 0.6875rem;
|
|
20
20
|
line-height: 1rem;
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -31,12 +31,24 @@
|
|
|
31
31
|
background: var(--bg-tertiary);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
/* On a filled surface the text inherits that surface's ink (9c: the old
|
|
35
|
+
white literal went white-on-white on light cards). */
|
|
34
36
|
.mint-adduct-text--on-primary {
|
|
35
|
-
color:
|
|
37
|
+
color: inherit;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
.mint-adduct-text--badge.mint-adduct-text--on-primary {
|
|
39
|
-
background:
|
|
41
|
+
background: color-mix(in srgb, currentColor 20%, transparent);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Charge as a superscript by relative offset, so the line box keeps its height. */
|
|
45
|
+
.mint-adduct-text__charge {
|
|
46
|
+
position: relative;
|
|
47
|
+
top: -0.5em;
|
|
48
|
+
font-size: 0.72em;
|
|
49
|
+
line-height: 0;
|
|
50
|
+
vertical-align: baseline;
|
|
51
|
+
color: inherit;
|
|
40
52
|
}
|
|
41
53
|
|
|
42
54
|
.mint-adduct-text--muted,
|