@morscherlab/mint-sdk 1.2.0-beta.3 → 1.2.0-beta.5
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 → EmptyState-NBqf2_8z.js} +3 -1
- package/dist/EmptyState-NBqf2_8z.js.map +1 -0
- package/dist/{ExperimentPopover-Bn6PIGHE.js → ExperimentPopover-CfOdh5Rm.js} +11 -6
- package/dist/ExperimentPopover-CfOdh5Rm.js.map +1 -0
- package/dist/{ExperimentSelectorModal-DGhrJSSV.js → ExperimentSelectorModal-DvIagrxY.js} +13 -8
- package/dist/ExperimentSelectorModal-DvIagrxY.js.map +1 -0
- package/dist/{SettingsModal-wF2btHu6.js → SettingsModal-W3TYfnP9.js} +13 -11
- package/dist/SettingsModal-W3TYfnP9.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.internal.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/SecretInput.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/WellEditPopupInternal.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/AppAvatarMenu.vue.d.ts +4 -0
- package/dist/components/AppSidebar.vue.d.ts +1 -1
- 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 +2 -2
- package/dist/components/ColorSlider.vue.d.ts +34 -0
- package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
- package/dist/components/DropdownButton.vue.d.ts +2 -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/PluginWorkspaceView.props.d.ts +29 -1
- package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
- 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/SecretInput.vue.d.ts +28 -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 +18 -0
- package/dist/components/index.js +8 -8
- package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
- package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
- package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
- package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
- package/dist/{components-DpyzaeIc.js → components-B80gV0P6.js} +3729 -1800
- package/dist/components-B80gV0P6.js.map +1 -0
- package/dist/composables/autoGroupConstants.d.ts +1 -0
- package/dist/composables/autoGroupGrouping.d.ts +3 -0
- package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
- package/dist/composables/index.d.ts +15 -2
- package/dist/composables/index.js +11 -11
- package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
- package/dist/composables/useAnalysisArtifacts.d.ts +2 -0
- package/dist/composables/useAsync.d.ts +132 -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/useBioTemplateWorkspace.d.ts +4 -20
- package/dist/composables/useCommandHistory.d.ts +33 -0
- package/dist/composables/useFocusTrap.d.ts +21 -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/useMenuKeyboard.d.ts +29 -0
- package/dist/composables/useOptimisticMutation.d.ts +5 -1
- package/dist/composables/usePluginClient.d.ts +4 -0
- package/dist/composables/usePluginConfig.d.ts +25 -0
- package/dist/composables/usePluginWorkspace.d.ts +51 -0
- package/dist/composables/useRackEditor.d.ts +31 -0
- package/dist/composables/useResourceCrud.d.ts +44 -0
- package/dist/composables/useRovingFocus.d.ts +24 -0
- package/dist/composables/useWellPainting.d.ts +39 -0
- package/dist/composables/useWellPlateAdapter.d.ts +40 -0
- package/dist/composables/useWellPlateValidation.d.ts +5 -1
- package/dist/composables/workspaceRecipes.d.ts +188 -0
- package/dist/{composables-yz8bTkEV.js → composables-C8mmD5ta.js} +821 -68
- package/dist/composables-C8mmD5ta.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 → experiment-utils-DV3DrvE_.js} +71 -50
- package/dist/experiment-utils-DV3DrvE_.js.map +1 -0
- package/dist/histoire.setup.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -35
- 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 +2917 -300
- package/dist/tailwind.preset.js +2 -0
- package/dist/tailwind.preset.js.map +1 -0
- package/dist/templates/builderReadUtils.d.ts +1 -1
- package/dist/templates/catalog.d.ts +4 -4
- package/dist/templates/index.js +4 -4
- package/dist/templates/presets.d.ts +2 -2
- package/dist/{templates-Pbxjdqlh.js → templates-CK72aKO1.js} +34 -26
- package/dist/templates-CK72aKO1.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/form-builder.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-_OVhavKq.js} +381 -69
- package/dist/useControlSchema-_OVhavKq.js.map +1 -0
- package/dist/{useDropdownState-WIGW6Rr-.js → useDropdownState-D5G4UvWd.js} +3 -1
- package/dist/useDropdownState-D5G4UvWd.js.map +1 -0
- package/dist/{useExperimentSelector-DXqsZuSk.js → useExperimentSelector-DSEckf_g.js} +5 -3
- package/dist/useExperimentSelector-DSEckf_g.js.map +1 -0
- package/dist/{useFormBuilder-1so6QSQL.js → useFormBuilder-Bd714C7y.js} +3 -1
- package/dist/useFormBuilder-Bd714C7y.js.map +1 -0
- package/dist/{useProtocolTemplates-Cv0ca1AM.js → useProtocolTemplates-Dq5Pzwyd.js} +1055 -83
- package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +1 -0
- package/dist/utils/pluginSecrets.d.ts +53 -0
- package/dist/utils/records.d.ts +4 -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 +161 -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 +107 -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 +628 -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.internal.test.ts +230 -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/SecretInput.test.ts +87 -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/WellEditPopupInternal.test.ts +108 -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 +1912 -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 +164 -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 +280 -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 +107 -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 +339 -0
- package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
- package/src/components/BioTemplatePackWorkspaceView.vue +180 -0
- package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
- package/src/components/BioTemplatePresetWorkspaceView.vue +403 -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 +322 -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 +370 -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 +243 -0
- package/src/components/DropdownButton.story.vue +102 -0
- package/src/components/DropdownButton.vue +193 -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 +207 -0
- package/src/components/PluginWorkspaceView.shell.ts +67 -0
- package/src/components/PluginWorkspaceView.story.vue +341 -0
- package/src/components/PluginWorkspaceView.vue +224 -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/SecretInput.story.vue +79 -0
- package/src/components/SecretInput.vue +150 -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 +148 -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 +249 -0
- package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
- package/src/components/internal/WorkspaceShellInternal.vue +125 -0
- package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
- package/src/composables/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 +180 -0
- package/src/composables/flattenWorkspaceBindings.ts +104 -0
- package/src/composables/formBuilderRegistry.ts +86 -0
- package/src/composables/formBuilderSchema.ts +153 -0
- package/src/composables/index.ts +556 -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/pluginWorkspaceModel.ts +182 -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 +327 -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 +199 -0
- package/src/composables/useBioTemplatePresetWorkspace.ts +325 -0
- package/src/composables/useBioTemplateWorkspace.ts +116 -0
- package/src/composables/useCalendarGrid.ts +140 -0
- package/src/composables/useChemicalFormula.ts +275 -0
- package/src/composables/useCommandHistory.ts +117 -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/useFocusTrap.ts +91 -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/useMenuKeyboard.ts +90 -0
- package/src/composables/useMobileSupportGate.ts +80 -0
- package/src/composables/useOptimisticMutation.ts +111 -0
- package/src/composables/usePasskey.ts +216 -0
- package/src/composables/usePlatformContext.ts +299 -0
- package/src/composables/usePluginClient.ts +1006 -0
- package/src/composables/usePluginConfig.ts +250 -0
- package/src/composables/usePluginWorkspace.ts +208 -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 +249 -0
- package/src/composables/useRovingFocus.ts +66 -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 +191 -0
- package/src/composables/useWellPlateAdapter.ts +151 -0
- package/src/composables/useWellPlateEditor.ts +425 -0
- package/src/composables/useWellPlateValidation.ts +89 -0
- package/src/composables/workspaceRecipes.ts +267 -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 +83 -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/secret-input.css +60 -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 +94 -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 +55 -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 +67 -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 +85 -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 +208 -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 +50 -0
- package/src/utils/items.ts +28 -0
- package/src/utils/options.ts +23 -0
- package/src/utils/pluginIcon.ts +188 -0
- package/src/utils/pluginSecrets.ts +102 -0
- package/src/utils/rack.ts +209 -0
- package/src/utils/records.ts +9 -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,10 +1,114 @@
|
|
|
1
|
-
import { d as resolveExperimentCode } from "./experiment-utils-
|
|
2
|
-
import { r as useRequestSyncState } from "./EmptyState-
|
|
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-
|
|
7
|
-
import { computed, effectScope, getCurrentScope, inject, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowRef, toRaw, toValue, unref, watch } from "vue";
|
|
1
|
+
import { d as resolveExperimentCode } from "./experiment-utils-DV3DrvE_.js";
|
|
2
|
+
import { r as useRequestSyncState } from "./EmptyState-NBqf2_8z.js";
|
|
3
|
+
import { A as useConcentrationUnits, H as parseExperimentId, J as isActiveJobStatus, Q as normalizeJobState, T as getDefaultControlView, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, f as resolveControlModel, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, m as controlValuesToComponentBindingsById, p as controlValuesToComponentBindings, r as getControlDefaults, rt as isRecord, u as useControlWorkspace, w as controlsToViewItems } from "./useControlSchema-_OVhavKq.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-CK72aKO1.js";
|
|
7
|
+
import { computed, effectScope, getCurrentScope, inject, nextTick, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowRef, toRaw, toValue, unref, watch } from "vue";
|
|
8
|
+
//#region src/composables/useRovingFocus.ts
|
|
9
|
+
/**
|
|
10
|
+
* WAI-ARIA roving-tabindex navigation with automatic activation (the tabs pattern):
|
|
11
|
+
* Left/Right (or Up/Down when `orientation` is `'vertical'`) move to the adjacent item
|
|
12
|
+
* and activate it immediately, wrapping past the ends; Home/End jump to the first/last
|
|
13
|
+
* item. Only the active item should carry `tabindex="0"`; give every other item
|
|
14
|
+
* `tabindex="-1"`. Used by BaseTabs.
|
|
15
|
+
*/
|
|
16
|
+
function useRovingFocus(options) {
|
|
17
|
+
const orientation = options.orientation ?? "horizontal";
|
|
18
|
+
const prevKey = orientation === "vertical" ? "ArrowUp" : "ArrowLeft";
|
|
19
|
+
const nextKey = orientation === "vertical" ? "ArrowDown" : "ArrowRight";
|
|
20
|
+
function moveTo(id) {
|
|
21
|
+
if (id === void 0) return;
|
|
22
|
+
options.activate(id);
|
|
23
|
+
nextTick(() => options.getElement(id)?.focus());
|
|
24
|
+
}
|
|
25
|
+
function handleKeydown(event) {
|
|
26
|
+
const ids = options.ids();
|
|
27
|
+
if (ids.length === 0) return;
|
|
28
|
+
const currentIndex = ids.indexOf(options.activeId() ?? "");
|
|
29
|
+
if (event.key === "Home") {
|
|
30
|
+
event.preventDefault();
|
|
31
|
+
moveTo(ids[0]);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (event.key === "End") {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
moveTo(ids[ids.length - 1]);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (event.key === prevKey) {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
moveTo(ids[currentIndex <= 0 ? ids.length - 1 : currentIndex - 1]);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (event.key === nextKey) {
|
|
45
|
+
event.preventDefault();
|
|
46
|
+
moveTo(ids[currentIndex === -1 || currentIndex >= ids.length - 1 ? 0 : currentIndex + 1]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { handleKeydown };
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/composables/useMenuKeyboard.ts
|
|
53
|
+
/**
|
|
54
|
+
* Shared keyboard contract for menu- and listbox-style disclosure panels (the
|
|
55
|
+
* WAI-ARIA menu button pattern). Used by AppAvatarMenu and DropdownButton; ActionMenu
|
|
56
|
+
* implements the same contract inline.
|
|
57
|
+
*/
|
|
58
|
+
function useMenuKeyboard(options) {
|
|
59
|
+
function focusItem(position) {
|
|
60
|
+
nextTick(() => {
|
|
61
|
+
const items = options.items();
|
|
62
|
+
(position === "first" ? items[0] : items[items.length - 1])?.focus();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function handleTriggerKeydown(event) {
|
|
66
|
+
if (options.isOpen()) return;
|
|
67
|
+
if (event.key === "ArrowDown" || event.key === "Enter" || event.key === " ") {
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
options.open();
|
|
70
|
+
focusItem("first");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (event.key === "ArrowUp") {
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
options.open();
|
|
76
|
+
focusItem("last");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function handlePanelKeydown(event) {
|
|
80
|
+
const items = options.items();
|
|
81
|
+
const currentIndex = items.indexOf(document.activeElement);
|
|
82
|
+
if (event.key === "Escape") {
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
options.close(true);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (event.key === "Tab") {
|
|
88
|
+
options.close();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (event.key === "Home") {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
items[0]?.focus();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (event.key === "End") {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
items[items.length - 1]?.focus();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return;
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
const direction = event.key === "ArrowDown" ? 1 : -1;
|
|
104
|
+
items[(Math.max(currentIndex, 0) + direction + items.length) % items.length]?.focus();
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
handleTriggerKeydown,
|
|
108
|
+
handlePanelKeydown
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
8
112
|
//#region src/composables/useSortedItems.ts
|
|
9
113
|
/** Shared sorting for SDK tables and lists with stable empty-value handling. */
|
|
10
114
|
function useSortedItems(options) {
|
|
@@ -528,32 +632,389 @@ function useMobileSupportGate(options = {}) {
|
|
|
528
632
|
};
|
|
529
633
|
}
|
|
530
634
|
//#endregion
|
|
531
|
-
//#region src/
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
635
|
+
//#region src/components/PluginWorkspaceView.controls.ts
|
|
636
|
+
function usePluginWorkspaceControls(options) {
|
|
637
|
+
const resolvedModel = computed(() => resolveControlModel(options.model()));
|
|
638
|
+
const resolvedControls = computed(() => options.controls() ?? resolvedModel.value?.controls);
|
|
639
|
+
const resolvedControlOptions = computed(() => mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, options.controlOptions()));
|
|
640
|
+
const externalControlValues = computed(() => options.modelValue() ?? options.values());
|
|
641
|
+
const internalControlValues = reactive({});
|
|
642
|
+
let syncingControlValues = false;
|
|
643
|
+
const generatedControlDefaults = computed(() => {
|
|
644
|
+
if (!resolvedControls.value) return {};
|
|
645
|
+
return {
|
|
646
|
+
...getControlDefaults(resolvedControls.value),
|
|
647
|
+
...resolvedControlOptions.value.initialValues ?? {}
|
|
648
|
+
};
|
|
649
|
+
});
|
|
650
|
+
function replaceControlValues(values) {
|
|
651
|
+
for (const key of Object.keys(internalControlValues)) if (!(key in values)) delete internalControlValues[key];
|
|
652
|
+
Object.assign(internalControlValues, values);
|
|
653
|
+
}
|
|
654
|
+
function emitControlValues() {
|
|
655
|
+
options.emitValues({ ...internalControlValues });
|
|
656
|
+
}
|
|
657
|
+
function syncResolvedControlValues() {
|
|
658
|
+
syncingControlValues = true;
|
|
659
|
+
replaceControlValues({
|
|
660
|
+
...generatedControlDefaults.value,
|
|
661
|
+
...externalControlValues.value === void 0 ? internalControlValues : externalControlValues.value
|
|
662
|
+
});
|
|
663
|
+
syncingControlValues = false;
|
|
664
|
+
}
|
|
665
|
+
function handleControlValuesUpdate(values) {
|
|
666
|
+
syncingControlValues = true;
|
|
667
|
+
replaceControlValues({
|
|
668
|
+
...generatedControlDefaults.value,
|
|
669
|
+
...values
|
|
670
|
+
});
|
|
671
|
+
syncingControlValues = false;
|
|
672
|
+
emitControlValues();
|
|
673
|
+
}
|
|
674
|
+
const resolvedComponentBindings = computed(() => controlValuesToComponentBindings(internalControlValues, options.componentBindings() ?? resolvedModel.value?.componentBindings));
|
|
675
|
+
const resolvedComponentBindingsById = computed(() => controlValuesToComponentBindingsById(internalControlValues, options.componentBindings() ?? resolvedModel.value?.componentBindings));
|
|
676
|
+
const resolvedComponentProps = computed(() => {
|
|
677
|
+
const mapping = options.componentProps() ?? resolvedModel.value?.componentProps;
|
|
678
|
+
return mapping === void 0 ? {} : controlValuesToComponentProps(internalControlValues, mapping);
|
|
679
|
+
});
|
|
680
|
+
const resolvedComponentPropsById = computed(() => {
|
|
681
|
+
const mappings = options.componentPropsById() ?? resolvedModel.value?.componentPropsById;
|
|
682
|
+
if (mappings === void 0) return {};
|
|
683
|
+
return Object.fromEntries(Object.entries(mappings).map(([id, mapping]) => [id, controlValuesToComponentProps(internalControlValues, mapping)]));
|
|
684
|
+
});
|
|
685
|
+
const generatedPillNav = computed(() => {
|
|
686
|
+
if (!resolvedControls.value) return [];
|
|
687
|
+
return controlsToViewItems(resolvedControls.value, resolvedControlOptions.value);
|
|
688
|
+
});
|
|
689
|
+
const generatedDefaultView = computed(() => {
|
|
690
|
+
if (!resolvedControls.value) return "";
|
|
691
|
+
return getDefaultControlView(resolvedControls.value, resolvedControlOptions.value);
|
|
692
|
+
});
|
|
693
|
+
syncResolvedControlValues();
|
|
694
|
+
watch([generatedControlDefaults, externalControlValues], syncResolvedControlValues, { deep: true });
|
|
695
|
+
watch(internalControlValues, () => {
|
|
696
|
+
if (syncingControlValues) return;
|
|
697
|
+
emitControlValues();
|
|
698
|
+
}, {
|
|
699
|
+
deep: true,
|
|
700
|
+
flush: "sync"
|
|
701
|
+
});
|
|
702
|
+
return {
|
|
703
|
+
resolvedModel,
|
|
704
|
+
resolvedControls,
|
|
705
|
+
resolvedControlOptions,
|
|
706
|
+
generatedPillNav,
|
|
707
|
+
generatedDefaultView,
|
|
708
|
+
internalControlValues,
|
|
709
|
+
resolvedComponentBindings,
|
|
710
|
+
resolvedComponentBindingsById,
|
|
711
|
+
resolvedComponentProps,
|
|
712
|
+
resolvedComponentPropsById,
|
|
713
|
+
handleControlValuesUpdate
|
|
714
|
+
};
|
|
715
|
+
}
|
|
716
|
+
//#endregion
|
|
717
|
+
//#region src/components/PluginWorkspaceView.navigation.ts
|
|
718
|
+
function usePluginWorkspaceNavigation(options) {
|
|
719
|
+
const internalActiveView = ref(options.defaultActiveView());
|
|
720
|
+
const resolvedPillNav = computed(() => {
|
|
721
|
+
if (options.pillNav() !== void 0) return options.pillNav();
|
|
722
|
+
return options.generatedPillNav.value.length > 0 ? [...options.generatedPillNav.value] : void 0;
|
|
723
|
+
});
|
|
724
|
+
const firstConfiguredViewId = computed(() => options.defaultActiveView() ?? firstItemId(options.pillNav()) ?? options.generatedDefaultView.value ?? firstItemId(options.pageSelector()) ?? options.panelIds()[0] ?? "");
|
|
725
|
+
const resolvedActiveView = computed({
|
|
726
|
+
get: () => options.activeView() ?? options.currentPillId() ?? options.currentPageSelectorId() ?? internalActiveView.value ?? firstConfiguredViewId.value,
|
|
727
|
+
set: (value) => {
|
|
728
|
+
internalActiveView.value = value;
|
|
729
|
+
options.emitActiveView(value);
|
|
730
|
+
}
|
|
731
|
+
});
|
|
732
|
+
const resolvedCurrentPillId = computed(() => options.currentPillId() ?? resolvedActiveView.value);
|
|
733
|
+
const resolvedCurrentPageSelectorId = computed(() => options.currentPageSelectorId() ?? resolvedActiveView.value);
|
|
734
|
+
function setActiveView(viewId) {
|
|
735
|
+
resolvedActiveView.value = viewId;
|
|
736
|
+
}
|
|
737
|
+
function handlePageSelectorSelect(page) {
|
|
738
|
+
setActiveView(page.id);
|
|
739
|
+
options.emitPageSelectorSelect(page);
|
|
740
|
+
}
|
|
741
|
+
function handlePillSelect(item) {
|
|
742
|
+
setActiveView(item.id);
|
|
743
|
+
options.emitPillSelect(item);
|
|
744
|
+
}
|
|
745
|
+
return {
|
|
746
|
+
resolvedPillNav,
|
|
747
|
+
firstConfiguredViewId,
|
|
748
|
+
resolvedActiveView,
|
|
749
|
+
resolvedCurrentPillId,
|
|
750
|
+
resolvedCurrentPageSelectorId,
|
|
751
|
+
setActiveView,
|
|
752
|
+
handlePageSelectorSelect,
|
|
753
|
+
handlePillSelect
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
function firstItemId(items) {
|
|
757
|
+
const item = items?.[0];
|
|
758
|
+
if (item === void 0) return void 0;
|
|
759
|
+
return typeof item === "string" ? item : item.id;
|
|
760
|
+
}
|
|
761
|
+
//#endregion
|
|
762
|
+
//#region src/components/PluginWorkspaceView.shell.ts
|
|
763
|
+
var topBarForwardedSlots = new Set([
|
|
764
|
+
"icon",
|
|
765
|
+
"logo",
|
|
766
|
+
"page-selector-icon",
|
|
767
|
+
"page-selector-item-icon",
|
|
768
|
+
"nav",
|
|
769
|
+
"center",
|
|
770
|
+
"actions",
|
|
771
|
+
"account-menu-items",
|
|
772
|
+
"account-menu-item-icon",
|
|
773
|
+
"settings-appearance"
|
|
774
|
+
]);
|
|
775
|
+
var sidebarForwardedSlots = new Set([
|
|
776
|
+
"header",
|
|
777
|
+
"collapsed",
|
|
778
|
+
"collapsed-footer",
|
|
779
|
+
"footer"
|
|
536
780
|
]);
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
if (!Number.isFinite(value)) return 0;
|
|
540
|
-
return Math.min(100, Math.max(0, value));
|
|
781
|
+
function getPluginWorkspaceTopBarSlotNames(slots) {
|
|
782
|
+
return Object.keys(slots).filter((name) => topBarForwardedSlots.has(name) || name.startsWith("settings-tab-"));
|
|
541
783
|
}
|
|
542
|
-
function
|
|
543
|
-
return
|
|
784
|
+
function getPluginWorkspaceSidebarSlotNames(slots) {
|
|
785
|
+
return Object.keys(slots).filter((name) => sidebarForwardedSlots.has(name) || name.startsWith("section-"));
|
|
544
786
|
}
|
|
545
|
-
function
|
|
787
|
+
function hasPluginWorkspaceSidebarSurface(options) {
|
|
788
|
+
if (!options.showSidebar) return false;
|
|
789
|
+
return Object.keys(options.panels).length > 0 || Object.keys(options.forms).length > 0 || options.model !== void 0 || options.controls !== void 0 || options.showSidebarWhenEmpty || options.sidebarContentId !== void 0 || options.sidebarTitle !== void 0 || options.sidebarSubtitle !== void 0 || options.sidebarBadge !== void 0 || options.hasSidebarSlot || options.sidebarSlotCount > 0;
|
|
790
|
+
}
|
|
791
|
+
//#endregion
|
|
792
|
+
//#region src/composables/usePluginWorkspace.ts
|
|
793
|
+
/**
|
|
794
|
+
* Maps PluginWorkspaceView's flat 72-prop surface into the three typed model objects
|
|
795
|
+
* (`shell`, `sidebar`, `controls`) rendered by its internal pieces
|
|
796
|
+
* (WorkspaceShellInternal, WorkspaceSidebarInternal, WorkspaceControlsInternal). Reuses the
|
|
797
|
+
* existing `usePluginWorkspaceControls` / `usePluginWorkspaceNavigation` composables and the
|
|
798
|
+
* PluginWorkspaceView.shell slot-detection helpers, so it changes only how that state is
|
|
799
|
+
* assembled and exposed, not the underlying behavior.
|
|
800
|
+
*
|
|
801
|
+
* @example Recommended
|
|
802
|
+
* ```ts
|
|
803
|
+
* const props = withDefaults(defineProps<PluginWorkspaceViewProps>(), { ... })
|
|
804
|
+
* const emit = defineEmits<PluginWorkspaceViewEmits>()
|
|
805
|
+
* const slots = useSlots()
|
|
806
|
+
* const { shell, sidebar, controls } = usePluginWorkspace({ props, slots, emit })
|
|
807
|
+
* ```
|
|
808
|
+
*/
|
|
809
|
+
function usePluginWorkspace(options) {
|
|
810
|
+
const { props, slots, emit } = options;
|
|
811
|
+
const controlsState = usePluginWorkspaceControls({
|
|
812
|
+
model: () => props.model,
|
|
813
|
+
controls: () => props.controls,
|
|
814
|
+
controlOptions: () => props.controlOptions ?? {},
|
|
815
|
+
modelValue: () => props.modelValue,
|
|
816
|
+
values: () => props.values,
|
|
817
|
+
componentBindings: () => props.componentBindings,
|
|
818
|
+
componentProps: () => props.componentProps,
|
|
819
|
+
componentPropsById: () => props.componentPropsById,
|
|
820
|
+
emitValues: (values) => {
|
|
821
|
+
emit("update:modelValue", values);
|
|
822
|
+
emit("update:values", values);
|
|
823
|
+
}
|
|
824
|
+
});
|
|
825
|
+
const navigationState = usePluginWorkspaceNavigation({
|
|
826
|
+
activeView: () => props.activeView,
|
|
827
|
+
defaultActiveView: () => props.defaultActiveView,
|
|
828
|
+
currentPillId: () => props.currentPillId,
|
|
829
|
+
currentPageSelectorId: () => props.currentPageSelectorId,
|
|
830
|
+
pillNav: () => props.pillNav,
|
|
831
|
+
pageSelector: () => props.pageSelector,
|
|
832
|
+
panelIds: () => Object.keys(props.panels ?? {}),
|
|
833
|
+
generatedPillNav: controlsState.generatedPillNav,
|
|
834
|
+
generatedDefaultView: controlsState.generatedDefaultView,
|
|
835
|
+
emitActiveView: (viewId) => emit("update:activeView", viewId),
|
|
836
|
+
emitPageSelectorSelect: (page) => emit("page-selector-select", page),
|
|
837
|
+
emitPillSelect: (item) => emit("pill-select", item)
|
|
838
|
+
});
|
|
839
|
+
const topBarSlotNames = computed(() => getPluginWorkspaceTopBarSlotNames(slots));
|
|
840
|
+
const sidebarSlotNames = computed(() => getPluginWorkspaceSidebarSlotNames(slots));
|
|
841
|
+
const hasSidebarSurface = computed(() => hasPluginWorkspaceSidebarSurface({
|
|
842
|
+
showSidebar: props.showSidebar ?? true,
|
|
843
|
+
panels: props.panels ?? {},
|
|
844
|
+
forms: props.forms ?? {},
|
|
845
|
+
model: props.model,
|
|
846
|
+
controls: props.controls,
|
|
847
|
+
showSidebarWhenEmpty: props.showSidebarWhenEmpty ?? false,
|
|
848
|
+
sidebarContentId: props.sidebarContentId,
|
|
849
|
+
sidebarTitle: props.sidebarTitle,
|
|
850
|
+
sidebarSubtitle: props.sidebarSubtitle,
|
|
851
|
+
sidebarBadge: props.sidebarBadge,
|
|
852
|
+
hasSidebarSlot: Boolean(slots.sidebar),
|
|
853
|
+
sidebarSlotCount: sidebarSlotNames.value.length
|
|
854
|
+
}));
|
|
855
|
+
const controls = computed(() => ({
|
|
856
|
+
activeView: navigationState.resolvedActiveView.value,
|
|
857
|
+
setActiveView: navigationState.setActiveView,
|
|
858
|
+
values: controlsState.internalControlValues,
|
|
859
|
+
componentBindings: controlsState.resolvedComponentBindings.value,
|
|
860
|
+
componentBindingsById: controlsState.resolvedComponentBindingsById.value,
|
|
861
|
+
componentProps: controlsState.resolvedComponentProps.value,
|
|
862
|
+
componentPropsById: controlsState.resolvedComponentPropsById.value
|
|
863
|
+
}));
|
|
546
864
|
return {
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
865
|
+
shell: computed(() => ({
|
|
866
|
+
sidebarPosition: props.sidebarPosition ?? "left",
|
|
867
|
+
sidebarWidth: props.sidebarWidth,
|
|
868
|
+
floating: props.floating ?? true,
|
|
869
|
+
responsiveSidebar: props.responsiveSidebar ?? true,
|
|
870
|
+
sidebarToggleLabel: props.sidebarToggleLabel ?? "Open workspace sidebar",
|
|
871
|
+
sidebarCloseLabel: props.sidebarCloseLabel ?? "Close workspace sidebar",
|
|
872
|
+
hasSidebarSurface: hasSidebarSurface.value,
|
|
873
|
+
title: props.title ?? "Workspace",
|
|
874
|
+
subtitle: props.subtitle,
|
|
875
|
+
topBarVariant: props.topBarVariant ?? "card",
|
|
876
|
+
homePath: props.homePath ?? "/",
|
|
877
|
+
showLogo: props.showLogo ?? true,
|
|
878
|
+
pageSelector: props.pageSelector,
|
|
879
|
+
currentPageSelectorId: navigationState.resolvedCurrentPageSelectorId.value,
|
|
880
|
+
pluginSwitcher: props.pluginSwitcher,
|
|
881
|
+
pillNav: navigationState.resolvedPillNav.value,
|
|
882
|
+
currentPillId: navigationState.resolvedCurrentPillId.value,
|
|
883
|
+
showThemeToggle: props.showThemeToggle ?? true,
|
|
884
|
+
showSettings: props.showSettings ?? true,
|
|
885
|
+
settingsConfig: props.settingsConfig,
|
|
886
|
+
showStandaloneLabel: props.showStandaloneLabel ?? false,
|
|
887
|
+
standaloneLabel: props.standaloneLabel ?? "Standalone",
|
|
888
|
+
accountMenu: props.accountMenu,
|
|
889
|
+
showNotifications: props.showNotifications ?? false,
|
|
890
|
+
hasNotificationDot: props.hasNotificationDot ?? false,
|
|
891
|
+
showAdmin: props.showAdmin ?? false,
|
|
892
|
+
adminPath: props.adminPath ?? "/admin",
|
|
893
|
+
userName: props.userName,
|
|
894
|
+
userInitial: props.userInitial,
|
|
895
|
+
userEmail: props.userEmail,
|
|
896
|
+
topBarSlotNames: topBarSlotNames.value,
|
|
897
|
+
controls: controls.value
|
|
898
|
+
})),
|
|
899
|
+
sidebar: computed(() => ({
|
|
900
|
+
title: props.sidebarTitle,
|
|
901
|
+
subtitle: props.sidebarSubtitle,
|
|
902
|
+
badge: props.sidebarBadge,
|
|
903
|
+
variant: props.sidebarVariant ?? "analysis",
|
|
904
|
+
panels: props.panels ?? {},
|
|
905
|
+
activeView: navigationState.resolvedActiveView.value,
|
|
906
|
+
floating: false,
|
|
907
|
+
dense: props.dense ?? true,
|
|
908
|
+
width: props.sidebarWidth,
|
|
909
|
+
side: props.sidebarPosition ?? "left",
|
|
910
|
+
forms: props.forms ?? {},
|
|
911
|
+
contentId: props.sidebarContentId,
|
|
912
|
+
showWhenEmpty: (props.showSidebarWhenEmpty ?? false) || props.sidebarContentId !== void 0,
|
|
913
|
+
model: props.model,
|
|
914
|
+
controlSchema: props.controls,
|
|
915
|
+
controlOptions: props.controlOptions ?? {},
|
|
916
|
+
values: controlsState.internalControlValues,
|
|
917
|
+
formEnhancements: props.formEnhancements,
|
|
918
|
+
showFormActions: props.showFormActions ?? false,
|
|
919
|
+
formLoading: props.formLoading ?? false,
|
|
920
|
+
formDisabled: props.formDisabled ?? false,
|
|
921
|
+
formReadonly: props.formReadonly ?? false,
|
|
922
|
+
formSize: props.formSize ?? "sm",
|
|
923
|
+
collapsible: props.sidebarCollapsible,
|
|
924
|
+
collapsed: props.sidebarCollapsed,
|
|
925
|
+
defaultCollapsed: props.defaultSidebarCollapsed ?? false,
|
|
926
|
+
collapsedWidth: props.sidebarCollapsedWidth ?? "3rem",
|
|
927
|
+
collapseButtonLabel: props.sidebarCollapseButtonLabel ?? "Collapse sidebar",
|
|
928
|
+
expandButtonLabel: props.sidebarExpandButtonLabel ?? "Expand sidebar",
|
|
929
|
+
slotNames: sidebarSlotNames.value
|
|
930
|
+
})),
|
|
931
|
+
controls,
|
|
932
|
+
hasSidebarSurface,
|
|
933
|
+
handleControlValuesUpdate: controlsState.handleControlValuesUpdate,
|
|
934
|
+
handlePageSelectorSelect: navigationState.handlePageSelectorSelect,
|
|
935
|
+
handlePillSelect: navigationState.handlePillSelect
|
|
936
|
+
};
|
|
554
937
|
}
|
|
555
938
|
//#endregion
|
|
556
939
|
//#region src/composables/useJobsStatusTray.ts
|
|
940
|
+
/**
|
|
941
|
+
* Combines independent job runtimes without copying their reactive state.
|
|
942
|
+
*
|
|
943
|
+
* Job ids must be globally unique across the sources. A duplicate id throws
|
|
944
|
+
* when jobs are read or an id-routed action is requested, rather than silently
|
|
945
|
+
* dispatching a mutation to the wrong owner.
|
|
946
|
+
*/
|
|
947
|
+
function combinePluginJobSources(sources) {
|
|
948
|
+
const jobs = computed(() => {
|
|
949
|
+
const combined = [];
|
|
950
|
+
const owners = /* @__PURE__ */ new Set();
|
|
951
|
+
for (const source of sources) for (const job of toValue(source.jobs)) {
|
|
952
|
+
if (owners.has(job.job_id)) throw duplicatePluginJobId(job.job_id);
|
|
953
|
+
owners.add(job.job_id);
|
|
954
|
+
combined.push(job);
|
|
955
|
+
}
|
|
956
|
+
return combined;
|
|
957
|
+
});
|
|
958
|
+
function ownerFor(jobId) {
|
|
959
|
+
let owner;
|
|
960
|
+
for (const source of sources) {
|
|
961
|
+
if (!toValue(source.jobs).some((job) => job.job_id === jobId)) continue;
|
|
962
|
+
if (owner) throw duplicatePluginJobId(jobId);
|
|
963
|
+
owner = source;
|
|
964
|
+
}
|
|
965
|
+
if (!owner) throw new Error(`Unknown plugin job id: ${jobId}`);
|
|
966
|
+
return owner;
|
|
967
|
+
}
|
|
968
|
+
const combined = { jobs };
|
|
969
|
+
if (sources.some((source) => source.refreshJobs)) combined.refreshJobs = async () => {
|
|
970
|
+
await Promise.all(sources.map((source) => source.refreshJobs?.()));
|
|
971
|
+
return jobs.value;
|
|
972
|
+
};
|
|
973
|
+
if (sources.some((source) => source.cancelJob)) combined.cancelJob = async (jobId) => {
|
|
974
|
+
const owner = ownerFor(jobId);
|
|
975
|
+
if (!owner.cancelJob) throw new Error(`Job ${jobId} cannot be cancelled by its source`);
|
|
976
|
+
return owner.cancelJob(jobId);
|
|
977
|
+
};
|
|
978
|
+
if (sources.length > 0 && sources.every((source) => source.deleteJob)) combined.deleteJob = async (jobId) => {
|
|
979
|
+
const owner = ownerFor(jobId);
|
|
980
|
+
if (!owner.deleteJob) throw new Error(`Job ${jobId} cannot be deleted by its source`);
|
|
981
|
+
return owner.deleteJob(jobId);
|
|
982
|
+
};
|
|
983
|
+
if (sources.length > 0 && sources.every((source) => source.clearFinishedJobs)) combined.clearFinishedJobs = async () => {
|
|
984
|
+
const results = await Promise.all(sources.map((source) => source.clearFinishedJobs()));
|
|
985
|
+
return results.every((result) => typeof result === "number") ? results.reduce((total, result) => total + result, 0) : void 0;
|
|
986
|
+
};
|
|
987
|
+
if (sources.some((source) => source.dispose)) combined.dispose = () => {
|
|
988
|
+
const errors = [];
|
|
989
|
+
for (const source of sources) try {
|
|
990
|
+
source.dispose?.();
|
|
991
|
+
} catch (cause) {
|
|
992
|
+
errors.push(cause);
|
|
993
|
+
}
|
|
994
|
+
if (errors.length === 1) throw errors[0];
|
|
995
|
+
if (errors.length > 1) throw new PluginJobSourceDisposeError(errors);
|
|
996
|
+
};
|
|
997
|
+
return combined;
|
|
998
|
+
}
|
|
999
|
+
var PluginJobSourceDisposeError = class extends Error {
|
|
1000
|
+
cause;
|
|
1001
|
+
errors;
|
|
1002
|
+
constructor(errors) {
|
|
1003
|
+
super("Failed to dispose plugin job sources");
|
|
1004
|
+
this.name = "PluginJobSourceDisposeError";
|
|
1005
|
+
this.cause = errors[0];
|
|
1006
|
+
this.errors = Object.freeze([...errors]);
|
|
1007
|
+
}
|
|
1008
|
+
};
|
|
1009
|
+
function duplicatePluginJobId(jobId) {
|
|
1010
|
+
return /* @__PURE__ */ new Error(`Duplicate plugin job id across combined sources: ${jobId}`);
|
|
1011
|
+
}
|
|
1012
|
+
function responseJobs(response) {
|
|
1013
|
+
return "jobs" in response ? response.jobs : response;
|
|
1014
|
+
}
|
|
1015
|
+
function isSnapshotPayload(data) {
|
|
1016
|
+
return "jobs" in data && Array.isArray(data.jobs);
|
|
1017
|
+
}
|
|
557
1018
|
function errorMessage(error, fallback) {
|
|
558
1019
|
return error instanceof Error ? error.message : fallback;
|
|
559
1020
|
}
|
|
@@ -564,38 +1025,94 @@ function errorMessage(error, fallback) {
|
|
|
564
1025
|
* source. The controller never mirrors source jobs into another ref.
|
|
565
1026
|
*/
|
|
566
1027
|
function usePluginJobCenter(options = {}) {
|
|
1028
|
+
const legacyOverride = shallowRef(null);
|
|
567
1029
|
const isOpen = ref(false);
|
|
568
1030
|
const activeTab = ref("active");
|
|
569
1031
|
const isLoading = ref(false);
|
|
570
1032
|
const error = shallowRef(null);
|
|
571
1033
|
const pendingJobIds = ref(/* @__PURE__ */ new Set());
|
|
1034
|
+
const jobRevisions = /* @__PURE__ */ new Map();
|
|
1035
|
+
let stateRevision = 0;
|
|
572
1036
|
let requestGeneration = 0;
|
|
573
1037
|
let active = true;
|
|
574
1038
|
const source = computed(() => toValue(options.source));
|
|
575
|
-
const
|
|
1039
|
+
const adapter = computed(() => toValue(options.adapter));
|
|
1040
|
+
const jobs = computed(() => {
|
|
1041
|
+
const currentSource = source.value;
|
|
1042
|
+
if (currentSource) return [...toValue(currentSource.jobs)].map(normalizeJobState);
|
|
1043
|
+
const input = toValue(options.jobs);
|
|
1044
|
+
const override = legacyOverride.value;
|
|
1045
|
+
if (override && override.input === input) return override.jobs;
|
|
1046
|
+
return input ? [...input].map(normalizeJobState) : [];
|
|
1047
|
+
});
|
|
576
1048
|
const activeJobs = computed(() => jobs.value.filter((job) => isActiveJobStatus(job.status)));
|
|
577
1049
|
const historyJobs = computed(() => jobs.value.filter((job) => !isActiveJobStatus(job.status)));
|
|
578
1050
|
const deletableJobs = computed(() => historyJobs.value.filter((job) => job.can_delete));
|
|
579
1051
|
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));
|
|
1052
|
+
const canRefresh = computed(() => Boolean(source.value?.refreshJobs || adapter.value?.listJobs));
|
|
1053
|
+
const canCancel = computed(() => Boolean(source.value?.cancelJob || adapter.value?.cancelJob));
|
|
1054
|
+
const canDelete = computed(() => Boolean(source.value?.deleteJob || adapter.value?.deleteJob));
|
|
1055
|
+
const canClearFinished = computed(() => Boolean(source.value?.clearFinishedJobs || source.value?.deleteJob || adapter.value?.clearFinishedJobs || adapter.value?.deleteJob));
|
|
1056
|
+
function bumpJobRevision(jobId) {
|
|
1057
|
+
jobRevisions.set(jobId, (jobRevisions.get(jobId) ?? 0) + 1);
|
|
1058
|
+
}
|
|
1059
|
+
function replaceLegacyJobs(nextJobs) {
|
|
1060
|
+
const normalized = nextJobs.map(normalizeJobState);
|
|
1061
|
+
new Set([...jobs.value.map((job) => job.job_id), ...normalized.map((job) => job.job_id)]).forEach(bumpJobRevision);
|
|
1062
|
+
legacyOverride.value = {
|
|
1063
|
+
input: toValue(options.jobs),
|
|
1064
|
+
jobs: normalized
|
|
1065
|
+
};
|
|
1066
|
+
stateRevision += 1;
|
|
1067
|
+
}
|
|
1068
|
+
function upsertLegacyJob(nextJob) {
|
|
1069
|
+
const normalized = normalizeJobState(nextJob);
|
|
1070
|
+
const existingIndex = jobs.value.findIndex((job) => job.job_id === normalized.job_id);
|
|
1071
|
+
const nextJobs = [...jobs.value];
|
|
1072
|
+
if (existingIndex === -1) nextJobs.unshift(normalized);
|
|
1073
|
+
else nextJobs[existingIndex] = normalized;
|
|
1074
|
+
legacyOverride.value = {
|
|
1075
|
+
input: toValue(options.jobs),
|
|
1076
|
+
jobs: nextJobs
|
|
1077
|
+
};
|
|
1078
|
+
bumpJobRevision(normalized.job_id);
|
|
1079
|
+
stateRevision += 1;
|
|
1080
|
+
}
|
|
1081
|
+
function removeLegacyJobs(jobIds) {
|
|
1082
|
+
legacyOverride.value = {
|
|
1083
|
+
input: toValue(options.jobs),
|
|
1084
|
+
jobs: jobs.value.filter((job) => !jobIds.has(job.job_id))
|
|
1085
|
+
};
|
|
1086
|
+
jobIds.forEach(bumpJobRevision);
|
|
1087
|
+
stateRevision += 1;
|
|
1088
|
+
}
|
|
584
1089
|
function setPending(jobId, pending) {
|
|
585
1090
|
const next = new Set(pendingJobIds.value);
|
|
586
1091
|
if (pending) next.add(jobId);
|
|
587
1092
|
else next.delete(jobId);
|
|
588
1093
|
pendingJobIds.value = next;
|
|
589
1094
|
}
|
|
1095
|
+
function applyStreamMessage(message) {
|
|
1096
|
+
if (!active || source.value) return;
|
|
1097
|
+
if (message.event === "snapshot" && isSnapshotPayload(message.data)) {
|
|
1098
|
+
replaceLegacyJobs(message.data.jobs);
|
|
1099
|
+
return;
|
|
1100
|
+
}
|
|
1101
|
+
if ((message.event === "job" || message.event === "terminal") && !isSnapshotPayload(message.data)) upsertLegacyJob(message.data);
|
|
1102
|
+
}
|
|
590
1103
|
async function refresh() {
|
|
591
|
-
const
|
|
592
|
-
|
|
1104
|
+
const currentSource = source.value;
|
|
1105
|
+
const listJobs = currentSource?.refreshJobs ?? adapter.value?.listJobs;
|
|
1106
|
+
if (!listJobs) return false;
|
|
593
1107
|
const generation = ++requestGeneration;
|
|
1108
|
+
const revision = stateRevision;
|
|
594
1109
|
isLoading.value = true;
|
|
595
1110
|
error.value = null;
|
|
596
1111
|
try {
|
|
597
|
-
await
|
|
598
|
-
|
|
1112
|
+
const response = await listJobs();
|
|
1113
|
+
if (!active || generation !== requestGeneration || revision !== stateRevision) return false;
|
|
1114
|
+
if (!currentSource && response) replaceLegacyJobs(responseJobs(response));
|
|
1115
|
+
return true;
|
|
599
1116
|
} catch (cause) {
|
|
600
1117
|
if (active && generation === requestGeneration) error.value = errorMessage(cause, "Failed to load jobs");
|
|
601
1118
|
return false;
|
|
@@ -605,12 +1122,17 @@ function usePluginJobCenter(options = {}) {
|
|
|
605
1122
|
}
|
|
606
1123
|
async function cancelJob(job) {
|
|
607
1124
|
const sourceCancel = source.value?.cancelJob;
|
|
608
|
-
|
|
1125
|
+
const adapterCancel = adapter.value?.cancelJob;
|
|
1126
|
+
if (!job.can_cancel || !sourceCancel && !adapterCancel || pendingJobIds.value.has(job.job_id)) return false;
|
|
1127
|
+
const revision = jobRevisions.get(job.job_id) ?? 0;
|
|
609
1128
|
setPending(job.job_id, true);
|
|
610
1129
|
error.value = null;
|
|
611
1130
|
try {
|
|
612
|
-
await sourceCancel(job.job_id);
|
|
613
|
-
return
|
|
1131
|
+
const updated = sourceCancel ? await sourceCancel(job.job_id) : await adapterCancel(job);
|
|
1132
|
+
if (!active) return false;
|
|
1133
|
+
if (!sourceCancel && revision === (jobRevisions.get(job.job_id) ?? 0)) if (updated) upsertLegacyJob(updated);
|
|
1134
|
+
else await refresh();
|
|
1135
|
+
return true;
|
|
614
1136
|
} catch (cause) {
|
|
615
1137
|
if (active) error.value = errorMessage(cause, "Failed to cancel job");
|
|
616
1138
|
return false;
|
|
@@ -620,12 +1142,16 @@ function usePluginJobCenter(options = {}) {
|
|
|
620
1142
|
}
|
|
621
1143
|
async function deleteJob(job) {
|
|
622
1144
|
const sourceDelete = source.value?.deleteJob;
|
|
623
|
-
|
|
1145
|
+
const adapterDelete = adapter.value?.deleteJob;
|
|
1146
|
+
if (!job.can_delete || !sourceDelete && !adapterDelete || pendingJobIds.value.has(job.job_id)) return false;
|
|
624
1147
|
setPending(job.job_id, true);
|
|
625
1148
|
error.value = null;
|
|
626
1149
|
try {
|
|
627
|
-
const deleted = await sourceDelete(job.job_id);
|
|
628
|
-
|
|
1150
|
+
const deleted = sourceDelete ? await sourceDelete(job.job_id) : await adapterDelete(job);
|
|
1151
|
+
if (!active) return false;
|
|
1152
|
+
if (!sourceDelete) if (deleted === false) await refresh();
|
|
1153
|
+
else removeLegacyJobs(new Set([job.job_id]));
|
|
1154
|
+
return deleted !== false;
|
|
629
1155
|
} catch (cause) {
|
|
630
1156
|
if (active) error.value = errorMessage(cause, "Failed to delete job");
|
|
631
1157
|
return false;
|
|
@@ -645,12 +1171,30 @@ function usePluginJobCenter(options = {}) {
|
|
|
645
1171
|
return typeof deleted !== "number" || deleted === targets.length;
|
|
646
1172
|
}
|
|
647
1173
|
if (currentSource?.deleteJob) return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
|
|
648
|
-
|
|
1174
|
+
const currentAdapter = adapter.value;
|
|
1175
|
+
if (currentAdapter?.clearFinishedJobs) {
|
|
1176
|
+
const deleted = await currentAdapter.clearFinishedJobs(targets);
|
|
1177
|
+
if (!active) return false;
|
|
1178
|
+
if (typeof deleted === "number" && deleted !== targets.length) {
|
|
1179
|
+
await refresh();
|
|
1180
|
+
return false;
|
|
1181
|
+
}
|
|
1182
|
+
removeLegacyJobs(new Set(targets.map((job) => job.job_id)));
|
|
1183
|
+
return true;
|
|
1184
|
+
}
|
|
1185
|
+
if (!currentAdapter?.deleteJob) return false;
|
|
1186
|
+
return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
|
|
649
1187
|
} catch (cause) {
|
|
650
1188
|
if (active) error.value = errorMessage(cause, "Failed to clear jobs");
|
|
651
1189
|
return false;
|
|
652
1190
|
}
|
|
653
1191
|
}
|
|
1192
|
+
if (options.eventStream !== void 0) watch(() => toValue(options.eventStream)?.lastMessage.value ?? null, (message) => {
|
|
1193
|
+
if (message) applyStreamMessage(message);
|
|
1194
|
+
}, { immediate: true });
|
|
1195
|
+
onMounted(() => {
|
|
1196
|
+
if (options.loadOnMount !== false) refresh();
|
|
1197
|
+
});
|
|
654
1198
|
onUnmounted(() => {
|
|
655
1199
|
active = false;
|
|
656
1200
|
requestGeneration += 1;
|
|
@@ -680,12 +1224,17 @@ function usePluginJobCenter(options = {}) {
|
|
|
680
1224
|
isOpen.value = !isOpen.value;
|
|
681
1225
|
},
|
|
682
1226
|
refresh,
|
|
1227
|
+
applyStreamMessage,
|
|
683
1228
|
cancelJob,
|
|
684
1229
|
deleteJob,
|
|
685
1230
|
clearFinished,
|
|
686
1231
|
isPending: (job) => pendingJobIds.value.has(job.job_id)
|
|
687
1232
|
};
|
|
688
1233
|
}
|
|
1234
|
+
/** @deprecated Use `usePluginJobCenter()` for the plugin job-center controller. */
|
|
1235
|
+
function useJobsStatusTray(options = {}) {
|
|
1236
|
+
return usePluginJobCenter(options);
|
|
1237
|
+
}
|
|
689
1238
|
//#endregion
|
|
690
1239
|
//#region src/composables/useDoseCalculator.ts
|
|
691
1240
|
var VOLUME_UNITS = [
|
|
@@ -2129,9 +2678,6 @@ function splitByTokenLength(classes, tokenized) {
|
|
|
2129
2678
|
}
|
|
2130
2679
|
//#endregion
|
|
2131
2680
|
//#region src/composables/experimentDesignData.ts
|
|
2132
|
-
function isRecord(value) {
|
|
2133
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2134
|
-
}
|
|
2135
2681
|
function isPlatformDesignDataResponse(value) {
|
|
2136
2682
|
return "data" in value && ("experiment_id" in value || "plugin_id" in value || "schema_version" in value || "updated_at" in value);
|
|
2137
2683
|
}
|
|
@@ -2285,6 +2831,14 @@ function parseCSV(text) {
|
|
|
2285
2831
|
//#endregion
|
|
2286
2832
|
//#region src/composables/useAutoGroup.ts
|
|
2287
2833
|
var STRUCTURED_MISSING_GROUP = "Outlier";
|
|
2834
|
+
var deprecationWarned = false;
|
|
2835
|
+
var outlierDeprecationWarned = false;
|
|
2836
|
+
function warnDeprecated(api) {
|
|
2837
|
+
if (deprecationWarned) return;
|
|
2838
|
+
if (typeof process !== "undefined" && process.env.NODE_ENV === "production") return;
|
|
2839
|
+
console.warn(`[useAutoGroup] ${api} is deprecated; use the new class-first API (setClassDisposition / toggleGroupBy / setValueOps).`);
|
|
2840
|
+
deprecationWarned = true;
|
|
2841
|
+
}
|
|
2288
2842
|
function useAutoGroup() {
|
|
2289
2843
|
const inputMode = ref("paste");
|
|
2290
2844
|
const rawText = ref("");
|
|
@@ -2617,6 +3171,54 @@ function useAutoGroup() {
|
|
|
2617
3171
|
document.body.removeChild(a);
|
|
2618
3172
|
URL.revokeObjectURL(url);
|
|
2619
3173
|
}
|
|
3174
|
+
/** Test seam — exposes the template content/filename without triggering a browser download. */
|
|
3175
|
+
function composeTemplateForTest(opts) {
|
|
3176
|
+
return composeTemplate(samples.value, opts.mode === "prefilled" ? Object.values(schemas.value) : null, opts.mode === "prefilled" ? classes.value : null, {
|
|
3177
|
+
...opts,
|
|
3178
|
+
tokenizedSamples: tokenized.value
|
|
3179
|
+
});
|
|
3180
|
+
}
|
|
3181
|
+
const outliers = ref([]);
|
|
3182
|
+
const hasOutliers = computed(() => outliers.value.length > 0);
|
|
3183
|
+
const conformingSamples = computed(() => samples.value);
|
|
3184
|
+
const dominantFieldCount = computed(() => tokenized.value[0]?.length ?? 0);
|
|
3185
|
+
const minFieldCount = computed(() => {
|
|
3186
|
+
if (tokenized.value.length === 0) return 0;
|
|
3187
|
+
return Math.min(...tokenized.value.map((t) => t.length));
|
|
3188
|
+
});
|
|
3189
|
+
const fields = computed(() => activeSchema.value?.columns ?? []);
|
|
3190
|
+
const fieldNames = computed(() => {
|
|
3191
|
+
const out = {};
|
|
3192
|
+
for (const c of fields.value) out[c.index] = c.displayName ?? c.name;
|
|
3193
|
+
return out;
|
|
3194
|
+
});
|
|
3195
|
+
const enabledFields = computed(() => activeSchema.value ? new Set(activeSchema.value.groupBy) : /* @__PURE__ */ new Set());
|
|
3196
|
+
const effectiveColumns = fields;
|
|
3197
|
+
const allSingletons = computed(() => groups.value.length > 1 && groups.value.every((g) => g.samples.length === 1));
|
|
3198
|
+
function setOutlierAction(_, __) {
|
|
3199
|
+
if (!outlierDeprecationWarned) {
|
|
3200
|
+
if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
|
|
3201
|
+
console.warn("[useAutoGroup] setOutlierAction is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
|
|
3202
|
+
outlierDeprecationWarned = true;
|
|
3203
|
+
}
|
|
3204
|
+
}
|
|
3205
|
+
}
|
|
3206
|
+
function setAllOutlierActions(__) {
|
|
3207
|
+
if (!outlierDeprecationWarned) {
|
|
3208
|
+
if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
|
|
3209
|
+
console.warn("[useAutoGroup] setAllOutlierActions is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
|
|
3210
|
+
outlierDeprecationWarned = true;
|
|
3211
|
+
}
|
|
3212
|
+
}
|
|
3213
|
+
}
|
|
3214
|
+
function toggleField(index) {
|
|
3215
|
+
warnDeprecated("toggleField");
|
|
3216
|
+
if (activeClassKey.value) toggleGroupBy(activeClassKey.value, index);
|
|
3217
|
+
}
|
|
3218
|
+
function renameField(index, name) {
|
|
3219
|
+
warnDeprecated("renameField");
|
|
3220
|
+
if (activeClassKey.value) setColumnName(activeClassKey.value, index, name);
|
|
3221
|
+
}
|
|
2620
3222
|
function loadExperimentData(rawData, options = {}) {
|
|
2621
3223
|
const parsed = extractSamplesFromDesignData(rawData, options);
|
|
2622
3224
|
if (!parsed) return false;
|
|
@@ -2633,6 +3235,7 @@ function useAutoGroup() {
|
|
|
2633
3235
|
schemas.value = {};
|
|
2634
3236
|
activeClassKey.value = "";
|
|
2635
3237
|
tokenized.value = [];
|
|
3238
|
+
outliers.value = [];
|
|
2636
3239
|
sampleTypeHints.value = [];
|
|
2637
3240
|
}
|
|
2638
3241
|
return {
|
|
@@ -2644,6 +3247,8 @@ function useAutoGroup() {
|
|
|
2644
3247
|
schemas,
|
|
2645
3248
|
activeClassKey,
|
|
2646
3249
|
delimiter,
|
|
3250
|
+
dominantFieldCount,
|
|
3251
|
+
minFieldCount,
|
|
2647
3252
|
samples,
|
|
2648
3253
|
tokenized,
|
|
2649
3254
|
activeSchema,
|
|
@@ -2654,6 +3259,14 @@ function useAutoGroup() {
|
|
|
2654
3259
|
excludedSamples,
|
|
2655
3260
|
result,
|
|
2656
3261
|
fingerprint,
|
|
3262
|
+
fields,
|
|
3263
|
+
fieldNames,
|
|
3264
|
+
enabledFields,
|
|
3265
|
+
effectiveColumns,
|
|
3266
|
+
hasOutliers,
|
|
3267
|
+
outliers,
|
|
3268
|
+
conformingSamples,
|
|
3269
|
+
allSingletons,
|
|
2657
3270
|
canDownloadTemplate,
|
|
2658
3271
|
setClassDisposition,
|
|
2659
3272
|
setClassDispositions,
|
|
@@ -2669,8 +3282,13 @@ function useAutoGroup() {
|
|
|
2669
3282
|
loadFingerprint,
|
|
2670
3283
|
parseInput,
|
|
2671
3284
|
downloadTemplate,
|
|
3285
|
+
composeTemplateForTest,
|
|
2672
3286
|
loadExperimentData,
|
|
2673
|
-
reset
|
|
3287
|
+
reset,
|
|
3288
|
+
setOutlierAction,
|
|
3289
|
+
setAllOutlierActions,
|
|
3290
|
+
toggleField,
|
|
3291
|
+
renameField
|
|
2674
3292
|
};
|
|
2675
3293
|
}
|
|
2676
3294
|
function extractSamplesFromDesignData(rawData, options = {}) {
|
|
@@ -3818,6 +4436,57 @@ function useBioTemplateComponents(target) {
|
|
|
3818
4436
|
};
|
|
3819
4437
|
}
|
|
3820
4438
|
//#endregion
|
|
4439
|
+
//#region src/composables/flattenWorkspaceBindings.ts
|
|
4440
|
+
/**
|
|
4441
|
+
* Pick the shared template-component binding keys off a resolved bio-template workspace
|
|
4442
|
+
* (or its `components` source directly), so composables that build on `useBioTemplateWorkspace`
|
|
4443
|
+
* spread one object instead of re-listing all 9 keys by hand.
|
|
4444
|
+
*
|
|
4445
|
+
* @example Recommended
|
|
4446
|
+
* ```ts
|
|
4447
|
+
* const bindings = { renderer, ...flattenWorkspaceComponentBindings(components) }
|
|
4448
|
+
* ```
|
|
4449
|
+
*/
|
|
4450
|
+
function flattenWorkspaceComponentBindings(source) {
|
|
4451
|
+
return {
|
|
4452
|
+
componentBindings: source.componentBindings,
|
|
4453
|
+
componentBindingsById: source.componentBindingsById,
|
|
4454
|
+
componentImports: source.componentImports,
|
|
4455
|
+
componentProps: source.componentProps,
|
|
4456
|
+
componentPropsById: source.componentPropsById,
|
|
4457
|
+
componentPropsByComponent: source.componentPropsByComponent,
|
|
4458
|
+
componentSnippets: source.componentSnippets,
|
|
4459
|
+
componentUsage: source.componentUsage,
|
|
4460
|
+
getComponentProps: source.getComponentProps
|
|
4461
|
+
};
|
|
4462
|
+
}
|
|
4463
|
+
/**
|
|
4464
|
+
* `computed()`-lifted version of {@link flattenWorkspaceComponentBindings} for composables
|
|
4465
|
+
* that hold their resolved workspace behind a `ComputedRef` (e.g. a regenerated workspace
|
|
4466
|
+
* swapped in via `shallowRef`/`effectScope`), so each key stays independently reactive
|
|
4467
|
+
* instead of forcing consumers to unwrap the whole workspace to read one field.
|
|
4468
|
+
* `getComponentProps` stays a plain callable function, matching the un-lifted composables.
|
|
4469
|
+
*
|
|
4470
|
+
* @example Recommended
|
|
4471
|
+
* ```ts
|
|
4472
|
+
* const workspace = computed(() => workspaceRef.value)
|
|
4473
|
+
* const { componentBindings, componentProps, getComponentProps } = liftWorkspaceComponentBindings(workspace)
|
|
4474
|
+
* ```
|
|
4475
|
+
*/
|
|
4476
|
+
function liftWorkspaceComponentBindings(workspace) {
|
|
4477
|
+
return {
|
|
4478
|
+
componentBindings: computed(() => workspace.value.componentBindings),
|
|
4479
|
+
componentBindingsById: computed(() => workspace.value.componentBindingsById),
|
|
4480
|
+
componentImports: computed(() => workspace.value.componentImports),
|
|
4481
|
+
componentProps: computed(() => workspace.value.componentProps),
|
|
4482
|
+
componentPropsById: computed(() => workspace.value.componentPropsById),
|
|
4483
|
+
componentPropsByComponent: computed(() => workspace.value.componentPropsByComponent),
|
|
4484
|
+
componentSnippets: computed(() => workspace.value.componentSnippets),
|
|
4485
|
+
componentUsage: computed(() => workspace.value.componentUsage),
|
|
4486
|
+
getComponentProps: (component, options) => workspace.value.getComponentProps(component, options)
|
|
4487
|
+
};
|
|
4488
|
+
}
|
|
4489
|
+
//#endregion
|
|
3821
4490
|
//#region src/composables/useBioTemplateWorkspace.ts
|
|
3822
4491
|
/** One-stop wiring for BioTemplateRenderer, FormBuilder, AppSidebar, and template-aware SDK components. */
|
|
3823
4492
|
function useBioTemplateWorkspace(target, options = {}) {
|
|
@@ -3825,21 +4494,25 @@ function useBioTemplateWorkspace(target, options = {}) {
|
|
|
3825
4494
|
const workspace = useControlWorkspace(controls.controls, options);
|
|
3826
4495
|
const components = useBioTemplateComponents(target);
|
|
3827
4496
|
const renderer = isTemplateObjectTarget(target) ? { target } : null;
|
|
3828
|
-
const
|
|
3829
|
-
renderer,
|
|
3830
|
-
form: workspace.bindings.form,
|
|
3831
|
-
sidebar: workspace.bindings.sidebar,
|
|
3832
|
-
topBar: workspace.bindings.topBar,
|
|
3833
|
-
topBarSettings: workspace.bindings.topBarSettings,
|
|
3834
|
-
pillNav: workspace.bindings.pillNav,
|
|
4497
|
+
const componentBindings = flattenWorkspaceComponentBindings({
|
|
3835
4498
|
componentBindings: components.bindings,
|
|
3836
4499
|
componentBindingsById: components.componentBindingsById,
|
|
4500
|
+
componentImports: components.imports,
|
|
3837
4501
|
componentProps: components.componentProps,
|
|
3838
4502
|
componentPropsById: components.componentPropsById,
|
|
3839
4503
|
componentPropsByComponent: components.componentPropsByComponent,
|
|
3840
4504
|
componentSnippets: components.snippets,
|
|
3841
4505
|
componentUsage: components.usage,
|
|
3842
4506
|
getComponentProps: components.getComponentProps
|
|
4507
|
+
});
|
|
4508
|
+
const bindings = {
|
|
4509
|
+
renderer,
|
|
4510
|
+
form: workspace.bindings.form,
|
|
4511
|
+
sidebar: workspace.bindings.sidebar,
|
|
4512
|
+
topBar: workspace.bindings.topBar,
|
|
4513
|
+
topBarSettings: workspace.bindings.topBarSettings,
|
|
4514
|
+
pillNav: workspace.bindings.pillNav,
|
|
4515
|
+
...componentBindings
|
|
3843
4516
|
};
|
|
3844
4517
|
return {
|
|
3845
4518
|
target,
|
|
@@ -3856,15 +4529,7 @@ function useBioTemplateWorkspace(target, options = {}) {
|
|
|
3856
4529
|
topBarSettings: workspace.topBarSettings,
|
|
3857
4530
|
bindings,
|
|
3858
4531
|
renderer,
|
|
3859
|
-
componentBindings
|
|
3860
|
-
componentBindingsById: components.componentBindingsById,
|
|
3861
|
-
componentImports: components.imports,
|
|
3862
|
-
componentProps: components.componentProps,
|
|
3863
|
-
componentPropsById: components.componentPropsById,
|
|
3864
|
-
componentPropsByComponent: components.componentPropsByComponent,
|
|
3865
|
-
componentSnippets: components.snippets,
|
|
3866
|
-
componentUsage: components.usage,
|
|
3867
|
-
getComponentProps: components.getComponentProps
|
|
4532
|
+
...componentBindings
|
|
3868
4533
|
};
|
|
3869
4534
|
}
|
|
3870
4535
|
function isTemplateObjectTarget(target) {
|
|
@@ -3905,14 +4570,7 @@ function useBioTemplatePackWorkspace(packId, options = {}) {
|
|
|
3905
4570
|
const pillNav = computed(() => workspace.value.pillNav);
|
|
3906
4571
|
const topBarSettings = computed(() => workspace.value.topBarSettings);
|
|
3907
4572
|
const bindings = computed(() => workspace.value.bindings);
|
|
3908
|
-
const componentBindings =
|
|
3909
|
-
const componentBindingsById = computed(() => workspace.value.componentBindingsById);
|
|
3910
|
-
const componentImports = computed(() => workspace.value.componentImports);
|
|
3911
|
-
const componentProps = computed(() => workspace.value.componentProps);
|
|
3912
|
-
const componentPropsById = computed(() => workspace.value.componentPropsById);
|
|
3913
|
-
const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent);
|
|
3914
|
-
const componentSnippets = computed(() => workspace.value.componentSnippets);
|
|
3915
|
-
const componentUsage = computed(() => workspace.value.componentUsage);
|
|
4573
|
+
const { componentBindings, componentBindingsById, componentImports, componentProps, componentPropsById, componentPropsByComponent, componentSnippets, componentUsage, getComponentProps: getWorkspaceComponentProps } = liftWorkspaceComponentBindings(workspace);
|
|
3916
4574
|
watch(collection, (value) => {
|
|
3917
4575
|
workspaceRef.value = createWorkspace(value);
|
|
3918
4576
|
});
|
|
@@ -3955,7 +4613,7 @@ function useBioTemplatePackWorkspace(packId, options = {}) {
|
|
|
3955
4613
|
componentPropsByComponent,
|
|
3956
4614
|
componentSnippets,
|
|
3957
4615
|
componentUsage,
|
|
3958
|
-
getComponentProps:
|
|
4616
|
+
getComponentProps: getWorkspaceComponentProps,
|
|
3959
4617
|
applyCollection,
|
|
3960
4618
|
resetToDefaultCollection,
|
|
3961
4619
|
save: templateCollection.save,
|
|
@@ -3986,14 +4644,7 @@ function useBioTemplatePresetWorkspace(presetId, options = {}) {
|
|
|
3986
4644
|
const collection = templateCollection.templateCollection;
|
|
3987
4645
|
const workspace = computed(() => useBioTemplateWorkspace(collection.value, resolvedControlOptions));
|
|
3988
4646
|
const renderer = computed(() => ({ target: collection.value }));
|
|
3989
|
-
const componentBindings =
|
|
3990
|
-
const componentBindingsById = computed(() => workspace.value.componentBindingsById);
|
|
3991
|
-
const componentImports = computed(() => workspace.value.componentImports);
|
|
3992
|
-
const componentProps = computed(() => workspace.value.componentProps);
|
|
3993
|
-
const componentPropsById = computed(() => workspace.value.componentPropsById);
|
|
3994
|
-
const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent);
|
|
3995
|
-
const componentSnippets = computed(() => workspace.value.componentSnippets);
|
|
3996
|
-
const componentUsage = computed(() => workspace.value.componentUsage);
|
|
4647
|
+
const { componentBindings, componentBindingsById, componentImports, componentProps, componentPropsById, componentPropsByComponent, componentSnippets, componentUsage, getComponentProps } = liftWorkspaceComponentBindings(workspace);
|
|
3997
4648
|
const form = reactive({
|
|
3998
4649
|
...controls.form,
|
|
3999
4650
|
modelValue: controlValues.value,
|
|
@@ -4026,9 +4677,6 @@ function useBioTemplatePresetWorkspace(presetId, options = {}) {
|
|
|
4026
4677
|
onPillSelect: pillNav.onSelect,
|
|
4027
4678
|
...topBarSettings
|
|
4028
4679
|
}));
|
|
4029
|
-
function getComponentProps(component, options) {
|
|
4030
|
-
return workspace.value.getComponentProps(component, options);
|
|
4031
|
-
}
|
|
4032
4680
|
const bindings = {
|
|
4033
4681
|
renderer,
|
|
4034
4682
|
form,
|
|
@@ -4147,6 +4795,328 @@ function mergeInitialValues(controlOptions, initialValues) {
|
|
|
4147
4795
|
};
|
|
4148
4796
|
}
|
|
4149
4797
|
//#endregion
|
|
4798
|
+
//#region src/composables/useRackEditor.ts
|
|
4799
|
+
var SLOT_CYCLE = [
|
|
4800
|
+
"R",
|
|
4801
|
+
"G",
|
|
4802
|
+
"B",
|
|
4803
|
+
"Y"
|
|
4804
|
+
];
|
|
4805
|
+
var PLATE_CONFIGS = {
|
|
4806
|
+
6: {
|
|
4807
|
+
rows: 2,
|
|
4808
|
+
cols: 3
|
|
4809
|
+
},
|
|
4810
|
+
12: {
|
|
4811
|
+
rows: 3,
|
|
4812
|
+
cols: 4
|
|
4813
|
+
},
|
|
4814
|
+
24: {
|
|
4815
|
+
rows: 4,
|
|
4816
|
+
cols: 6
|
|
4817
|
+
},
|
|
4818
|
+
48: {
|
|
4819
|
+
rows: 6,
|
|
4820
|
+
cols: 8
|
|
4821
|
+
},
|
|
4822
|
+
54: {
|
|
4823
|
+
rows: 6,
|
|
4824
|
+
cols: 9
|
|
4825
|
+
},
|
|
4826
|
+
96: {
|
|
4827
|
+
rows: 8,
|
|
4828
|
+
cols: 12
|
|
4829
|
+
},
|
|
4830
|
+
384: {
|
|
4831
|
+
rows: 16,
|
|
4832
|
+
cols: 24
|
|
4833
|
+
}
|
|
4834
|
+
};
|
|
4835
|
+
var globalIdCounter = 0;
|
|
4836
|
+
function generateId() {
|
|
4837
|
+
globalIdCounter++;
|
|
4838
|
+
return `rack-${Date.now()}-${globalIdCounter}`;
|
|
4839
|
+
}
|
|
4840
|
+
/** Manages a set of sample racks with well-level assignment, series fill, and multi-rack reordering. */
|
|
4841
|
+
function useRackEditor(initialRacks, options) {
|
|
4842
|
+
const defaultFormat = options?.defaultFormat ?? 54;
|
|
4843
|
+
const defaultInjVol = options?.defaultInjectionVolume ?? 5;
|
|
4844
|
+
const maxRacks = options?.maxRacks ?? 10;
|
|
4845
|
+
const minRacks = options?.minRacks ?? 1;
|
|
4846
|
+
function createDefaultRack(name, slotIndex) {
|
|
4847
|
+
const slot = SLOT_CYCLE[(slotIndex ?? 0) % SLOT_CYCLE.length];
|
|
4848
|
+
return {
|
|
4849
|
+
id: generateId(),
|
|
4850
|
+
name: name ?? `Rack ${racks.value.length + 1}`,
|
|
4851
|
+
format: defaultFormat,
|
|
4852
|
+
slot,
|
|
4853
|
+
injectionVolume: defaultInjVol,
|
|
4854
|
+
wells: {}
|
|
4855
|
+
};
|
|
4856
|
+
}
|
|
4857
|
+
const racks = ref(initialRacks && initialRacks.length > 0 ? initialRacks.map((r) => ({ ...r })) : [createDefaultRack("Rack 1", 0)]);
|
|
4858
|
+
const activeRackId = ref(racks.value[0]?.id ?? "");
|
|
4859
|
+
const activeRack = computed(() => racks.value.find((r) => r.id === activeRackId.value) ?? racks.value[0]);
|
|
4860
|
+
function addRack(name) {
|
|
4861
|
+
if (racks.value.length >= maxRacks) return racks.value[racks.value.length - 1];
|
|
4862
|
+
const rack = createDefaultRack(name, racks.value.length);
|
|
4863
|
+
racks.value.push(rack);
|
|
4864
|
+
activeRackId.value = rack.id;
|
|
4865
|
+
return rack;
|
|
4866
|
+
}
|
|
4867
|
+
function removeRack(rackId) {
|
|
4868
|
+
if (racks.value.length <= minRacks) return;
|
|
4869
|
+
const index = racks.value.findIndex((r) => r.id === rackId);
|
|
4870
|
+
if (index === -1) return;
|
|
4871
|
+
racks.value.splice(index, 1);
|
|
4872
|
+
if (activeRackId.value === rackId && racks.value[0]) activeRackId.value = racks.value[0].id;
|
|
4873
|
+
}
|
|
4874
|
+
function reorderRacks(fromIndex, toIndex) {
|
|
4875
|
+
if (fromIndex < 0 || fromIndex >= racks.value.length) return;
|
|
4876
|
+
if (toIndex < 0 || toIndex >= racks.value.length) return;
|
|
4877
|
+
if (fromIndex === toIndex) return;
|
|
4878
|
+
const [moved] = racks.value.splice(fromIndex, 1);
|
|
4879
|
+
if (moved) racks.value.splice(toIndex, 0, moved);
|
|
4880
|
+
}
|
|
4881
|
+
function updateRack(rackId, data) {
|
|
4882
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4883
|
+
if (!rack) return;
|
|
4884
|
+
if (data.name !== void 0) rack.name = data.name;
|
|
4885
|
+
if (data.format !== void 0) rack.format = data.format;
|
|
4886
|
+
if (data.slot !== void 0) rack.slot = data.slot;
|
|
4887
|
+
if (data.injectionVolume !== void 0) rack.injectionVolume = data.injectionVolume;
|
|
4888
|
+
if (data.wells !== void 0) rack.wells = data.wells;
|
|
4889
|
+
}
|
|
4890
|
+
function setActiveRack(rackId) {
|
|
4891
|
+
if (racks.value.some((r) => r.id === rackId)) activeRackId.value = rackId;
|
|
4892
|
+
}
|
|
4893
|
+
function setWellData(rackId, wellId, data) {
|
|
4894
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4895
|
+
if (!rack) return;
|
|
4896
|
+
rack.wells[wellId] = {
|
|
4897
|
+
...rack.wells[wellId],
|
|
4898
|
+
...data
|
|
4899
|
+
};
|
|
4900
|
+
}
|
|
4901
|
+
function clearWell(rackId, wellId) {
|
|
4902
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4903
|
+
if (!rack) return;
|
|
4904
|
+
delete rack.wells[wellId];
|
|
4905
|
+
}
|
|
4906
|
+
function clearAllWells(rackId) {
|
|
4907
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4908
|
+
if (!rack) return;
|
|
4909
|
+
rack.wells = {};
|
|
4910
|
+
}
|
|
4911
|
+
function fillSeries(rackId, prefix = "S") {
|
|
4912
|
+
const rack = racks.value.find((r) => r.id === rackId);
|
|
4913
|
+
if (!rack) return;
|
|
4914
|
+
const config = PLATE_CONFIGS[rack.format];
|
|
4915
|
+
if (!config) return;
|
|
4916
|
+
let counter = 1;
|
|
4917
|
+
for (let row = 0; row < config.rows; row++) for (let col = 0; col < config.cols; col++) {
|
|
4918
|
+
const wellId = `${String.fromCharCode(65 + row)}${col + 1}`;
|
|
4919
|
+
if (!rack.wells[wellId]?.sampleType) {
|
|
4920
|
+
const paddedNum = String(counter).padStart(3, "0");
|
|
4921
|
+
rack.wells[wellId] = {
|
|
4922
|
+
id: wellId,
|
|
4923
|
+
row,
|
|
4924
|
+
col,
|
|
4925
|
+
state: "filled",
|
|
4926
|
+
sampleType: "sample",
|
|
4927
|
+
metadata: {
|
|
4928
|
+
label: `${prefix}${paddedNum}`,
|
|
4929
|
+
injectionVolume: rack.injectionVolume,
|
|
4930
|
+
injectionCount: 1
|
|
4931
|
+
}
|
|
4932
|
+
};
|
|
4933
|
+
}
|
|
4934
|
+
counter++;
|
|
4935
|
+
}
|
|
4936
|
+
}
|
|
4937
|
+
function getAllWells() {
|
|
4938
|
+
const result = [];
|
|
4939
|
+
for (const rack of racks.value) for (const [wellId, well] of Object.entries(rack.wells)) result.push({
|
|
4940
|
+
rackId: rack.id,
|
|
4941
|
+
wellId,
|
|
4942
|
+
well
|
|
4943
|
+
});
|
|
4944
|
+
return result;
|
|
4945
|
+
}
|
|
4946
|
+
const totalSampleCount = computed(() => {
|
|
4947
|
+
let count = 0;
|
|
4948
|
+
for (const rack of racks.value) count += Object.keys(rack.wells).length;
|
|
4949
|
+
return count;
|
|
4950
|
+
});
|
|
4951
|
+
function reset() {
|
|
4952
|
+
const rack = createDefaultRack("Rack 1", 0);
|
|
4953
|
+
racks.value = [rack];
|
|
4954
|
+
activeRackId.value = rack.id;
|
|
4955
|
+
}
|
|
4956
|
+
return {
|
|
4957
|
+
racks,
|
|
4958
|
+
activeRack,
|
|
4959
|
+
activeRackId,
|
|
4960
|
+
addRack,
|
|
4961
|
+
removeRack,
|
|
4962
|
+
reorderRacks,
|
|
4963
|
+
updateRack,
|
|
4964
|
+
setActiveRack,
|
|
4965
|
+
setWellData,
|
|
4966
|
+
clearWell,
|
|
4967
|
+
clearAllWells,
|
|
4968
|
+
fillSeries,
|
|
4969
|
+
getAllWells,
|
|
4970
|
+
totalSampleCount,
|
|
4971
|
+
reset
|
|
4972
|
+
};
|
|
4973
|
+
}
|
|
4974
|
+
//#endregion
|
|
4975
|
+
//#region src/composables/useGroupAssignment.ts
|
|
4976
|
+
/** Shared two-zone group assignment model for control/treatment style workflows. */
|
|
4977
|
+
function useGroupAssignment(options) {
|
|
4978
|
+
const groups = computed(() => [...toValue(options.groups)]);
|
|
4979
|
+
const group1 = computed(() => [...toValue(options.group1)]);
|
|
4980
|
+
const group2 = computed(() => [...toValue(options.group2)]);
|
|
4981
|
+
const label1 = computed(() => toValue(options.label1) || "Control");
|
|
4982
|
+
const label2 = computed(() => toValue(options.label2) || "Treatment");
|
|
4983
|
+
const minPerGroup = computed(() => normalizeMinimum(toValue(options.minPerGroup)));
|
|
4984
|
+
const group1Set = computed(() => new Set(group1.value));
|
|
4985
|
+
const group2Set = computed(() => new Set(group2.value));
|
|
4986
|
+
const unassignedGroups = computed(() => groups.value.filter((group) => !group1Set.value.has(group.name) && !group2Set.value.has(group.name)));
|
|
4987
|
+
const zone1Groups = computed(() => groups.value.filter((group) => group1Set.value.has(group.name)));
|
|
4988
|
+
const zone2Groups = computed(() => groups.value.filter((group) => group2Set.value.has(group.name)));
|
|
4989
|
+
const zone1Count = computed(() => zone1Groups.value.reduce((sum, group) => sum + group.count, 0));
|
|
4990
|
+
const zone2Count = computed(() => zone2Groups.value.reduce((sum, group) => sum + group.count, 0));
|
|
4991
|
+
const isValid = computed(() => group1.value.length >= minPerGroup.value && group2.value.length >= minPerGroup.value);
|
|
4992
|
+
const validationMessage = computed(() => {
|
|
4993
|
+
if (isValid.value) return null;
|
|
4994
|
+
const missing1 = Math.max(0, minPerGroup.value - group1.value.length);
|
|
4995
|
+
const missing2 = Math.max(0, minPerGroup.value - group2.value.length);
|
|
4996
|
+
const parts = [];
|
|
4997
|
+
if (missing1 > 0) parts.push(`${missing1} more to ${label1.value}`);
|
|
4998
|
+
if (missing2 > 0) parts.push(`${missing2} more to ${label2.value}`);
|
|
4999
|
+
return `Add ${parts.join(" and ")}`;
|
|
5000
|
+
});
|
|
5001
|
+
function getZoneForGroup(groupName) {
|
|
5002
|
+
if (group1Set.value.has(groupName)) return "zone1";
|
|
5003
|
+
if (group2Set.value.has(groupName)) return "zone2";
|
|
5004
|
+
return null;
|
|
5005
|
+
}
|
|
5006
|
+
function assignToZone(groupName, zone) {
|
|
5007
|
+
const next = removeFromBoth(groupName);
|
|
5008
|
+
if (zone === "zone1") return {
|
|
5009
|
+
group1: [...next.group1, groupName],
|
|
5010
|
+
group2: next.group2
|
|
5011
|
+
};
|
|
5012
|
+
return {
|
|
5013
|
+
group1: next.group1,
|
|
5014
|
+
group2: [...next.group2, groupName]
|
|
5015
|
+
};
|
|
5016
|
+
}
|
|
5017
|
+
function removeFromZone(groupName, zone) {
|
|
5018
|
+
if (zone === "zone1") return {
|
|
5019
|
+
group1: group1.value.filter((name) => name !== groupName),
|
|
5020
|
+
group2: group2.value
|
|
5021
|
+
};
|
|
5022
|
+
return {
|
|
5023
|
+
group1: group1.value,
|
|
5024
|
+
group2: group2.value.filter((name) => name !== groupName)
|
|
5025
|
+
};
|
|
5026
|
+
}
|
|
5027
|
+
function clearAll() {
|
|
5028
|
+
return {
|
|
5029
|
+
group1: [],
|
|
5030
|
+
group2: []
|
|
5031
|
+
};
|
|
5032
|
+
}
|
|
5033
|
+
function removeFromBoth(groupName) {
|
|
5034
|
+
return {
|
|
5035
|
+
group1: group1.value.filter((name) => name !== groupName),
|
|
5036
|
+
group2: group2.value.filter((name) => name !== groupName)
|
|
5037
|
+
};
|
|
5038
|
+
}
|
|
5039
|
+
return {
|
|
5040
|
+
unassignedGroups,
|
|
5041
|
+
zone1Groups,
|
|
5042
|
+
zone2Groups,
|
|
5043
|
+
zone1Count,
|
|
5044
|
+
zone2Count,
|
|
5045
|
+
isValid,
|
|
5046
|
+
validationMessage,
|
|
5047
|
+
getZoneForGroup,
|
|
5048
|
+
assignToZone,
|
|
5049
|
+
removeFromZone,
|
|
5050
|
+
clearAll
|
|
5051
|
+
};
|
|
5052
|
+
}
|
|
5053
|
+
function normalizeMinimum(value) {
|
|
5054
|
+
if (value === null || value === void 0 || !Number.isFinite(value)) return 1;
|
|
5055
|
+
return Math.max(0, Math.floor(value));
|
|
5056
|
+
}
|
|
5057
|
+
//#endregion
|
|
5058
|
+
//#region src/composables/useReagentSeries.ts
|
|
5059
|
+
var DEFAULT_PRESETS = [
|
|
5060
|
+
{
|
|
5061
|
+
label: "2x",
|
|
5062
|
+
factor: 2
|
|
5063
|
+
},
|
|
5064
|
+
{
|
|
5065
|
+
label: "3x",
|
|
5066
|
+
factor: 3
|
|
5067
|
+
},
|
|
5068
|
+
{
|
|
5069
|
+
label: "½ log",
|
|
5070
|
+
factor: "half-log"
|
|
5071
|
+
},
|
|
5072
|
+
{
|
|
5073
|
+
label: "10x",
|
|
5074
|
+
factor: 10
|
|
5075
|
+
}
|
|
5076
|
+
];
|
|
5077
|
+
var DEFAULT_UNITS = [
|
|
5078
|
+
"µM",
|
|
5079
|
+
"nM",
|
|
5080
|
+
"mM",
|
|
5081
|
+
"pM"
|
|
5082
|
+
];
|
|
5083
|
+
function resolveFactor(factor) {
|
|
5084
|
+
return factor === "half-log" ? Math.sqrt(10) : factor;
|
|
5085
|
+
}
|
|
5086
|
+
function roundToSignificant(value, digits = 4) {
|
|
5087
|
+
if (value === 0) return 0;
|
|
5088
|
+
const magnitude = Math.floor(Math.log10(Math.abs(value))) + 1;
|
|
5089
|
+
const factor = Math.pow(10, digits - magnitude);
|
|
5090
|
+
return Math.round(value * factor) / factor;
|
|
5091
|
+
}
|
|
5092
|
+
function generateDilutionSeries(startConcentration, count, factor, defaultReplicates = 1) {
|
|
5093
|
+
if (count < 1 || startConcentration <= 0) return [];
|
|
5094
|
+
const divisor = resolveFactor(factor);
|
|
5095
|
+
const levels = [];
|
|
5096
|
+
for (let i = 0; i < count; i++) levels.push({
|
|
5097
|
+
value: roundToSignificant(startConcentration / Math.pow(divisor, i)),
|
|
5098
|
+
replicates: defaultReplicates
|
|
5099
|
+
});
|
|
5100
|
+
return levels;
|
|
5101
|
+
}
|
|
5102
|
+
/** Generates and sorts geometric dilution series (2x, 3x, ½ log, 10x) for plate-based experiments. */
|
|
5103
|
+
function useReagentSeries() {
|
|
5104
|
+
function generateSeries(start, count, factor, defaultReplicates = 1) {
|
|
5105
|
+
return generateDilutionSeries(start, count, factor, defaultReplicates);
|
|
5106
|
+
}
|
|
5107
|
+
function sortLevels(levels, order = "desc") {
|
|
5108
|
+
return [...levels].sort((a, b) => order === "desc" ? b.value - a.value : a.value - b.value);
|
|
5109
|
+
}
|
|
5110
|
+
function totalPositions(levels) {
|
|
5111
|
+
return levels.reduce((sum, l) => sum + l.replicates, 0);
|
|
5112
|
+
}
|
|
5113
|
+
return {
|
|
5114
|
+
generateSeries,
|
|
5115
|
+
sortLevels,
|
|
5116
|
+
totalPositions
|
|
5117
|
+
};
|
|
5118
|
+
}
|
|
5119
|
+
//#endregion
|
|
4150
5120
|
//#region src/composables/protocolTemplateCatalog.ts
|
|
4151
5121
|
var BUILT_IN_PROTOCOL_TEMPLATES = [
|
|
4152
5122
|
{
|
|
@@ -4609,4 +5579,6 @@ function useProtocolTemplates() {
|
|
|
4609
5579
|
};
|
|
4610
5580
|
}
|
|
4611
5581
|
//#endregion
|
|
4612
|
-
export {
|
|
5582
|
+
export { useTheme as $, useFileImport as A, useDoseCalculator as B, getSampleGroupParentPath as C, detectDelimiter as D, hslToHex as E, extractSampleNamesFromDesignData as F, DEFAULT_MOBILE_VIEWPORT_QUERY as G, useJobsStatusTray as H, extractSampleOptionsFromDesignData as I, useAppExperiment as J, useMobileSupportGate as K, unwrapExperimentDesignData as L, extractSamplesFromDesignData as M, useAutoGroup as N, parseDelimitedText as O, parseCSV as P, usePresenceHeartbeat as Q, DEFAULT_COLORS as R, getSampleGroupMajorPrefix as S, hexToHsl as T, usePluginJobCenter as U, combinePluginJobSources as V, usePluginWorkspace as W, useRuntimeAlignment as X, getInjectedFrontendRevision as Y, getPresenceClientId as Z, useScheduleDrag as _, useReagentSeries as a, useSortedItems as at, useExpansionSet as b, useBioTemplatePresetWorkspace as c, getBioTemplateComponentProps as d, useToast as et, toBioTemplateComponentPropsByComponent as f, useExperimentSave as g, useTemplateCollection as h, generateDilutionSeries as i, compareSortValues as it, validateImportFile as j, readFileAsText as k, useBioTemplatePackWorkspace as l, useBioTemplateControls as m, DEFAULT_PRESETS as n, normalizeSearchQuery as nt, useGroupAssignment as o, useMenuKeyboard as ot, useBioTemplateComponents as p, APP_EXPERIMENT_KEY as q, DEFAULT_UNITS as r, useTextSearch as rt, useRackEditor as s, useRovingFocus as st, useProtocolTemplates as t, candidateMatchesSearch as tt, useBioTemplateWorkspace as u, useExperimentSamples as v, deriveShade as w, useSampleGroups as x, useExperimentData as y, useWellPlateEditor as z };
|
|
5583
|
+
|
|
5584
|
+
//# sourceMappingURL=useProtocolTemplates-Dq5Pzwyd.js.map
|