@morscherlab/mint-sdk 1.0.0-rc.2 → 1.0.0-rc.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/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
- package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
- package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
- package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
- package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
- package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
- package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
- package/dist/__tests__/components/ReagentList.presentation.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/SampleSelectorSampleRow.test.d.ts +1 -0
- package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
- package/dist/__tests__/components/SettingsModal.schema.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/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/integration.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
- package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
- package/dist/__tests__/composables/useScheduleCalendarLayout.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/components/AppTopBar.navigation.d.ts +11 -0
- package/dist/components/BaseButton.vue.d.ts +1 -1
- package/dist/components/BaseCheckbox.vue.d.ts +1 -1
- package/dist/components/BaseInput.vue.d.ts +2 -2
- package/dist/components/BasePill.vue.d.ts +1 -1
- package/dist/components/BaseRadioGroup.vue.d.ts +1 -1
- package/dist/components/BaseSelect.vue.d.ts +1 -1
- package/dist/components/BaseSlider.vue.d.ts +2 -2
- package/dist/components/BaseTextarea.vue.d.ts +2 -2
- package/dist/components/BaseToggle.vue.d.ts +1 -1
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
- package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
- package/dist/components/ColorSlider.vue.d.ts +2 -2
- package/dist/components/ConcentrationInput.vue.d.ts +2 -2
- package/dist/components/DatePicker.vue.d.ts +1 -1
- package/dist/components/DateTimePicker.vue.d.ts +2 -2
- package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
- package/dist/components/DropdownButton.vue.d.ts +1 -1
- package/dist/components/FileUploader.vue.d.ts +2 -2
- package/dist/components/FormulaInput.vue.d.ts +2 -2
- package/dist/components/IconButton.vue.d.ts +1 -1
- package/dist/components/LoadingSpinner.vue.d.ts +1 -1
- package/dist/components/MoleculeInput.vue.d.ts +2 -2
- package/dist/components/MultiSelect.vue.d.ts +1 -1
- package/dist/components/NumberInput.vue.d.ts +1 -1
- package/dist/components/PlateMapEditor.vue.d.ts +6 -6
- package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
- package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
- package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
- package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
- package/dist/components/PluginWorkspaceView.vue.d.ts +46 -195
- package/dist/components/ProgressBar.vue.d.ts +1 -1
- package/dist/components/ProtocolStep.presentation.d.ts +4 -0
- package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
- package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
- package/dist/components/ReagentList.presentation.d.ts +16 -0
- package/dist/components/ResourceCard.vue.d.ts +1 -1
- package/dist/components/SampleSelector.colors.d.ts +13 -0
- package/dist/components/SampleSelector.drag.d.ts +24 -0
- package/dist/components/SampleSelector.groups.d.ts +15 -0
- package/dist/components/SampleSelector.selection.d.ts +26 -0
- package/dist/components/SampleSelector.vue.d.ts +4 -1
- package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
- package/dist/components/SegmentedControl.vue.d.ts +1 -1
- package/dist/components/SequenceInput.vue.d.ts +2 -2
- package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
- package/dist/components/SettingsModal.schema.d.ts +9 -0
- package/dist/components/StatusIndicator.vue.d.ts +1 -1
- package/dist/components/TagsInput.vue.d.ts +2 -2
- package/dist/components/TimePicker.vue.d.ts +2 -2
- package/dist/components/TimeRangeInput.vue.d.ts +1 -1
- package/dist/components/UnitInput.vue.d.ts +2 -2
- package/dist/components/WellPlate.colors.d.ts +9 -0
- package/dist/components/WellPlate.conditions.d.ts +26 -0
- package/dist/components/WellPlate.geometry.d.ts +23 -0
- package/dist/components/WellPlate.interaction.d.ts +71 -0
- package/dist/components/WellPlate.legend.d.ts +2 -0
- package/dist/components/WellPlate.rendering.d.ts +24 -0
- package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
- package/dist/components/WellPlate.vue.d.ts +1 -1
- package/dist/components/index.js +2 -2
- package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
- package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
- package/dist/{components-BhK-dW99.js → components-DtHA2bgp.js} +3754 -2991
- package/dist/components-DtHA2bgp.js.map +1 -0
- package/dist/composables/autoGroup/classKey.d.ts +4 -0
- package/dist/composables/autoGroup/classify.d.ts +28 -0
- package/dist/composables/autoGroup/colors.d.ts +2 -0
- package/dist/composables/autoGroup/columns.d.ts +10 -0
- package/dist/composables/autoGroup/compose.d.ts +8 -0
- package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
- package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
- package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
- package/dist/composables/autoGroup/index.d.ts +16 -0
- package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
- package/dist/composables/autoGroup/template.d.ts +15 -0
- package/dist/composables/autoGroup/tokenize.d.ts +8 -0
- package/dist/composables/autoGroupConstants.d.ts +1 -0
- package/dist/composables/autoGroupGrouping.d.ts +3 -0
- package/dist/composables/controlComponentBindings.d.ts +7 -0
- package/dist/composables/controlSchemaAdapters.d.ts +20 -0
- package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
- package/dist/composables/controlSchemaFormFields.d.ts +3 -0
- package/dist/composables/controlSchemaLayout.d.ts +7 -0
- package/dist/composables/controlSchemaModel.d.ts +5 -0
- package/dist/composables/controlSchemaNormalize.d.ts +15 -0
- package/dist/composables/controlSchemaTypes.d.ts +305 -0
- package/dist/composables/controlSchemaUtils.d.ts +9 -0
- package/dist/composables/controlWorkspaceOptions.d.ts +2 -0
- package/dist/composables/formBuilderSchema.d.ts +18 -0
- package/dist/composables/index.js +3 -3
- package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
- package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
- package/dist/composables/useAutoGroup.d.ts +61 -74
- package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
- package/dist/composables/useBioTemplateControls.d.ts +1 -1
- package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
- package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
- package/dist/composables/useControlSchema.d.ts +8 -346
- package/dist/composables/useControlWorkspace.d.ts +5 -0
- package/dist/composables/useForm.d.ts +2 -33
- package/dist/composables/useFormBuilder.d.ts +2 -9
- package/dist/composables/useFormValidation.d.ts +34 -0
- package/dist/composables/usePluginClient.d.ts +1 -4
- package/dist/composables/useProtocolTemplates.d.ts +2 -24
- package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
- package/dist/{composables-Bg7CFuNz.js → composables-Dlg8jenH.js} +33 -31
- package/dist/composables-Dlg8jenH.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/install.js +2 -2
- package/dist/styles.css +547 -516
- package/dist/templates/adapters.d.ts +14 -47
- package/dist/templates/assayLookups.d.ts +3 -0
- package/dist/templates/assayMatrixAdapters.d.ts +6 -0
- package/dist/templates/assayMatrixBuilder.d.ts +2 -0
- package/dist/templates/assayNormalizers.d.ts +4 -0
- package/dist/templates/builderDefaults.d.ts +1 -0
- package/dist/templates/builderIdUtils.d.ts +4 -0
- package/dist/templates/builderPresetControls.d.ts +10 -0
- package/dist/templates/builderReadUtils.d.ts +8 -0
- package/dist/templates/builders.d.ts +26 -67
- package/dist/templates/calibrationCurveAdapters.d.ts +4 -0
- package/dist/templates/calibrationCurveBuilder.d.ts +2 -0
- package/dist/templates/calibrationNormalizers.d.ts +5 -0
- package/dist/templates/componentBindingCatalog.d.ts +25 -0
- package/dist/templates/componentBindingHelpers.d.ts +17 -0
- package/dist/templates/componentDoseResponseProps.d.ts +3 -0
- package/dist/templates/componentGenericProps.d.ts +8 -0
- package/dist/templates/componentPlateHelpers.d.ts +5 -0
- package/dist/templates/componentPlateMapProps.d.ts +3 -0
- package/dist/templates/componentPropsFactory.d.ts +3 -0
- package/dist/templates/componentQpcrPlateProps.d.ts +3 -0
- package/dist/templates/componentTargetResolvers.d.ts +5 -0
- package/dist/templates/componentTemplateProps.d.ts +3 -0
- package/dist/templates/controlSchemaClone.d.ts +4 -0
- package/dist/templates/controlSchemaConstants.d.ts +10 -0
- package/dist/templates/controlSchemaMerge.d.ts +3 -0
- package/dist/templates/controlSchemaTargets.d.ts +17 -0
- package/dist/templates/controlSchemaTypes.d.ts +4 -0
- package/dist/templates/controlSchemas.d.ts +4 -4
- package/dist/templates/defaultBioTemplateBuilder.d.ts +2 -0
- package/dist/templates/doseResponseAdapters.d.ts +4 -0
- package/dist/templates/doseResponseBuilder.d.ts +2 -0
- package/dist/templates/elisaAssayCollectionBuilder.d.ts +2 -0
- package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +2 -0
- package/dist/templates/flowCytometryPanelBuilder.d.ts +2 -0
- package/dist/templates/flowNormalizers.d.ts +8 -0
- package/dist/templates/flowPanelAdapters.d.ts +4 -0
- package/dist/templates/index.js +1 -1
- package/dist/templates/instrumentRunAdapterHelpers.d.ts +8 -0
- package/dist/templates/instrumentRunAdapters.d.ts +8 -0
- package/dist/templates/instrumentRunBuilder.d.ts +2 -0
- package/dist/templates/lcmsBatchCollectionBuilder.d.ts +2 -0
- package/dist/templates/plateGeometry.d.ts +4 -0
- package/dist/templates/plateMapAdapters.d.ts +3 -0
- package/dist/templates/plateMapBuilder.d.ts +2 -0
- package/dist/templates/presetControlSchemas.d.ts +534 -0
- package/dist/templates/protocolAdapters.d.ts +5 -0
- package/dist/templates/protocolNormalizers.d.ts +6 -0
- package/dist/templates/protocolStepsBuilder.d.ts +2 -0
- package/dist/templates/qpcrAdapters.d.ts +5 -0
- package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +2 -0
- package/dist/templates/qpcrPlateBuilder.d.ts +2 -0
- package/dist/templates/reagentAdapters.d.ts +5 -0
- package/dist/templates/reagentListBuilder.d.ts +2 -0
- package/dist/templates/runNormalizers.d.ts +10 -0
- package/dist/templates/sampleNormalizers.d.ts +4 -0
- package/dist/templates/samplePrepAdapters.d.ts +4 -0
- package/dist/templates/samplePrepBuilder.d.ts +2 -0
- package/dist/templates/sampleSheetAdapters.d.ts +5 -0
- package/dist/templates/sampleSheetBuilder.d.ts +2 -0
- package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +2 -0
- package/dist/templates/targetedMetabolomicsHelpers.d.ts +5 -0
- package/dist/templates/templateAdapterTypes.d.ts +48 -0
- package/dist/templates/templateControlSchemas.d.ts +400 -0
- package/dist/templates/templateCreateOptions.d.ts +165 -0
- package/dist/templates/templateEnvelopes.d.ts +9 -0
- package/dist/templates/templatePackCollectionBuilder.d.ts +2 -0
- package/dist/templates/templatePresetCollectionBuilder.d.ts +18 -0
- package/dist/templates/templateQpcrTypes.d.ts +42 -0
- package/dist/templates/templateValidators.d.ts +13 -0
- package/dist/templates/timeCourseAdapters.d.ts +5 -0
- package/dist/templates/timeCourseBuilder.d.ts +2 -0
- package/dist/templates/types.d.ts +5 -250
- package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +2 -0
- package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +2 -0
- package/dist/{templates-BorLR_7p.js → templates-DtdUvJ4c.js} +3565 -3411
- package/dist/templates-DtdUvJ4c.js.map +1 -0
- package/dist/types/auto-group.d.ts +79 -9
- package/dist/types/componentLabTypes.d.ts +161 -0
- package/dist/types/componentWorkflowTypes.d.ts +150 -0
- package/dist/types/components.d.ts +2 -311
- package/dist/{useProtocolTemplates-n6AJqSqv.js → useProtocolTemplates-Bm5vyH4_.js} +1220 -454
- package/dist/useProtocolTemplates-Bm5vyH4_.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
- package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
- package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
- package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
- package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
- package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +41 -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/ProtocolStepParameterField.test.ts +44 -0
- package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
- package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
- package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
- package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
- package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
- package/src/__tests__/components/SampleSelector.test.ts +32 -0
- package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
- package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
- package/src/__tests__/components/SettingsModal.schema.test.ts +97 -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/autoGroup/classify.test.ts +107 -0
- package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
- package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
- package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
- package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
- package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
- package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
- package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
- package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
- package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
- package/src/__tests__/composables/useControlSchema.test.ts +23 -0
- package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
- package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
- package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
- package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
- package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
- package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
- package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
- package/src/components/AppSidebar.vue +2 -6
- package/src/components/AppTopBar.navigation.ts +62 -0
- package/src/components/AppTopBar.vue +17 -44
- package/src/components/AutoGroupModal.story.vue +50 -0
- package/src/components/AutoGroupModal.vue +441 -158
- package/src/components/ControlWorkspaceView.vue +2 -6
- package/src/components/DoseCalculator.vue +13 -73
- package/src/components/DoseCalculatorVolumeField.vue +61 -0
- package/src/components/ExperimentTimeline.vue +6 -31
- package/src/components/FormBuilder.vue +2 -7
- package/src/components/PlateMapEditor.vue +32 -106
- package/src/components/PluginWorkspaceView.controls.ts +182 -0
- package/src/components/PluginWorkspaceView.navigation.ts +106 -0
- package/src/components/PluginWorkspaceView.props.ts +174 -0
- package/src/components/PluginWorkspaceView.shell.ts +66 -0
- package/src/components/PluginWorkspaceView.vue +85 -404
- package/src/components/ProtocolStep.presentation.ts +31 -0
- package/src/components/ProtocolStepEditor.state.ts +104 -0
- package/src/components/ProtocolStepEditor.vue +48 -179
- package/src/components/ProtocolStepParameterField.vue +134 -0
- package/src/components/ReagentList.presentation.ts +105 -0
- package/src/components/ReagentList.vue +16 -79
- package/src/components/SampleSelector.colors.ts +43 -0
- package/src/components/SampleSelector.drag.ts +164 -0
- package/src/components/SampleSelector.groups.ts +109 -0
- package/src/components/SampleSelector.selection.ts +103 -0
- package/src/components/SampleSelector.vue +82 -349
- package/src/components/SampleSelectorSampleRow.vue +64 -0
- package/src/components/ScheduleCalendar.vue +44 -199
- package/src/components/SettingsModal.schema.ts +71 -0
- package/src/components/SettingsModal.vue +16 -46
- 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.vue +102 -550
- package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
- package/src/composables/autoGroup/classKey.ts +5 -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 +156 -0
- package/src/composables/autoGroup/cooccurrence.ts +46 -0
- package/src/composables/autoGroup/csv-shim.ts +44 -0
- package/src/composables/autoGroup/fingerprint.ts +49 -0
- package/src/composables/autoGroup/index.ts +20 -0
- package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
- package/src/composables/autoGroup/template.ts +126 -0
- package/src/composables/autoGroup/tokenize.ts +41 -0
- package/src/composables/autoGroup/vocab.json +67 -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 +196 -0
- package/src/composables/controlSchemaDoseDesign.ts +215 -0
- package/src/composables/controlSchemaFormFields.ts +61 -0
- package/src/composables/controlSchemaLayout.ts +59 -0
- package/src/composables/controlSchemaModel.ts +163 -0
- package/src/composables/controlSchemaNormalize.ts +101 -0
- package/src/composables/controlSchemaTypes.ts +364 -0
- package/src/composables/controlSchemaUtils.ts +36 -0
- package/src/composables/controlWorkspaceOptions.ts +21 -0
- package/src/composables/formBuilderSchema.ts +153 -0
- package/src/composables/pluginEndpointBuilder.ts +203 -0
- package/src/composables/protocolTemplateCatalog.ts +325 -0
- package/src/composables/useAutoGroup.ts +395 -549
- package/src/composables/useAutoGroupInputSources.ts +147 -0
- package/src/composables/useBioTemplateControls.ts +1 -1
- package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
- package/src/composables/useBioTemplateWorkspace.ts +1 -1
- package/src/composables/useControlSchema.ts +64 -1312
- package/src/composables/useControlWorkspace.ts +201 -0
- package/src/composables/useForm.ts +5 -187
- package/src/composables/useFormBuilder.ts +11 -153
- package/src/composables/useFormValidation.ts +154 -0
- package/src/composables/usePluginClient.ts +10 -193
- package/src/composables/useProtocolTemplates.ts +10 -328
- package/src/composables/useScheduleCalendarLayout.ts +287 -0
- package/src/styles/components/auto-group-modal.css +248 -310
- package/src/templates/adapters.ts +89 -930
- package/src/templates/assayLookups.ts +33 -0
- package/src/templates/assayMatrixAdapters.ts +78 -0
- package/src/templates/assayMatrixBuilder.ts +59 -0
- package/src/templates/assayNormalizers.ts +34 -0
- package/src/templates/builderDefaults.ts +11 -0
- package/src/templates/builderIdUtils.ts +20 -0
- package/src/templates/builderPresetControls.ts +165 -0
- package/src/templates/builderReadUtils.ts +57 -0
- package/src/templates/builders.ts +122 -2350
- package/src/templates/calibrationCurveAdapters.ts +59 -0
- package/src/templates/calibrationCurveBuilder.ts +99 -0
- package/src/templates/calibrationNormalizers.ts +60 -0
- package/src/templates/componentBindingCatalog.ts +90 -0
- package/src/templates/componentBindingHelpers.ts +93 -0
- package/src/templates/componentBindings.ts +12 -461
- package/src/templates/componentDoseResponseProps.ts +42 -0
- package/src/templates/componentGenericProps.ts +77 -0
- package/src/templates/componentPlateHelpers.ts +29 -0
- package/src/templates/componentPlateMapProps.ts +32 -0
- package/src/templates/componentPropsFactory.ts +21 -0
- package/src/templates/componentQpcrPlateProps.ts +28 -0
- package/src/templates/componentTargetResolvers.ts +69 -0
- package/src/templates/componentTemplateProps.ts +78 -0
- package/src/templates/controlSchemaClone.ts +32 -0
- package/src/templates/controlSchemaConstants.ts +11 -0
- package/src/templates/controlSchemaMerge.ts +40 -0
- package/src/templates/controlSchemaTargets.ts +87 -0
- package/src/templates/controlSchemaTypes.ts +20 -0
- package/src/templates/controlSchemas.ts +22 -704
- 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/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/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/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 +79 -275
- package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
- package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
- package/src/types/auto-group.ts +107 -9
- package/src/types/componentLabTypes.ts +235 -0
- package/src/types/componentWorkflowTypes.ts +190 -0
- package/src/types/components.ts +74 -424
- package/dist/components-BhK-dW99.js.map +0 -1
- package/dist/composables-Bg7CFuNz.js.map +0 -1
- package/dist/templates-BorLR_7p.js.map +0 -1
- package/dist/useProtocolTemplates-n6AJqSqv.js.map +0 -1
|
@@ -1,191 +1,32 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
/** Standard plugin workspace shell that combines AppLayout, AppTopBar, and AppSidebar with LEAF-style defaults. */
|
|
3
|
-
import { computed,
|
|
3
|
+
import { computed, useSlots } from 'vue'
|
|
4
4
|
import type {
|
|
5
5
|
AccountMenuItem,
|
|
6
6
|
ExperimentSummary,
|
|
7
7
|
PageSelectorItem,
|
|
8
|
-
PageSelectorItemInput,
|
|
9
8
|
PillNavItem,
|
|
10
|
-
PillNavItemInput,
|
|
11
|
-
PluginSwitcherInfo,
|
|
12
9
|
PluginSwitcherPlugin,
|
|
13
|
-
SidebarToolSection,
|
|
14
|
-
TopBarSettingsConfig,
|
|
15
10
|
PillNavOption,
|
|
16
|
-
TopBarVariant,
|
|
17
11
|
} from '../types'
|
|
18
|
-
import
|
|
19
|
-
import type {
|
|
20
|
-
ControlComponentBinding,
|
|
21
|
-
ControlComponentBindingsById,
|
|
22
|
-
ControlComponentBindingsConfig,
|
|
23
|
-
ControlComponentPropsByIdMap,
|
|
24
|
-
ControlComponentPropsMap,
|
|
25
|
-
ControlModel,
|
|
26
|
-
ControlModelBinding,
|
|
27
|
-
ControlSchema,
|
|
28
|
-
ControlWorkspaceOptions,
|
|
29
|
-
} from '../composables/useControlSchema'
|
|
30
|
-
import {
|
|
31
|
-
controlValuesToComponentBindings,
|
|
32
|
-
controlValuesToComponentBindingsById,
|
|
33
|
-
controlValuesToComponentProps,
|
|
34
|
-
controlsToViewItems,
|
|
35
|
-
defineControlModel,
|
|
36
|
-
getDefaultControlView,
|
|
37
|
-
getControlDefaults,
|
|
38
|
-
mergeControlWorkspaceOptions,
|
|
39
|
-
} from '../composables/useControlSchema'
|
|
40
|
-
import {
|
|
41
|
-
useAppExperiment,
|
|
42
|
-
type AppExperimentRecord,
|
|
43
|
-
} from '../composables/useAppExperiment'
|
|
12
|
+
import { useAppExperiment } from '../composables/useAppExperiment'
|
|
44
13
|
import AppLayout from './AppLayout.vue'
|
|
45
14
|
import AppSidebar from './AppSidebar.vue'
|
|
46
15
|
import AppTopBar from './AppTopBar.vue'
|
|
16
|
+
import { usePluginWorkspaceControls } from './PluginWorkspaceView.controls'
|
|
17
|
+
import { usePluginWorkspaceNavigation } from './PluginWorkspaceView.navigation'
|
|
18
|
+
import {
|
|
19
|
+
getPluginWorkspaceSidebarSlotNames,
|
|
20
|
+
getPluginWorkspaceTopBarSlotNames,
|
|
21
|
+
hasPluginWorkspaceSidebarSurface,
|
|
22
|
+
} from './PluginWorkspaceView.shell'
|
|
23
|
+
import type {
|
|
24
|
+
PluginWorkspaceForwardedSlotProps,
|
|
25
|
+
PluginWorkspaceSlotProps,
|
|
26
|
+
PluginWorkspaceViewProps,
|
|
27
|
+
} from './PluginWorkspaceView.props'
|
|
47
28
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
interface Props {
|
|
51
|
-
/** App or plugin title shown in the top bar. */
|
|
52
|
-
title?: string
|
|
53
|
-
/** Secondary copy shown under the title. */
|
|
54
|
-
subtitle?: string
|
|
55
|
-
/** Top bar visual treatment. */
|
|
56
|
-
topBarVariant?: TopBarVariant
|
|
57
|
-
/** Home link used by the top bar brand icon. */
|
|
58
|
-
homePath?: string
|
|
59
|
-
/** Show the default MINT logo when no icon/logo slot is provided. */
|
|
60
|
-
showLogo?: boolean
|
|
61
|
-
/** Preferred route-level page selector entries. */
|
|
62
|
-
pageSelector?: PageSelectorItemInput[]
|
|
63
|
-
/** Active page selector id. Defaults to activeView. */
|
|
64
|
-
currentPageSelectorId?: string
|
|
65
|
-
/** Optional plugin switcher shown in the left navigation position. */
|
|
66
|
-
pluginSwitcher?: PluginSwitcherInfo
|
|
67
|
-
/** Preferred centered navigation for local modes inside the current route. */
|
|
68
|
-
pillNav?: PillNavItemInput[]
|
|
69
|
-
/** Active centered pill id. Defaults to activeView. */
|
|
70
|
-
currentPillId?: string
|
|
71
|
-
/** Show the theme toggle button. */
|
|
72
|
-
showThemeToggle?: boolean
|
|
73
|
-
/** Show the settings button and modal. */
|
|
74
|
-
showSettings?: boolean
|
|
75
|
-
/** Built-in settings modal configuration. */
|
|
76
|
-
settingsConfig?: TopBarSettingsConfig
|
|
77
|
-
/** Show the standalone badge when not integrated into the platform. */
|
|
78
|
-
showStandaloneLabel?: boolean
|
|
79
|
-
/** Custom standalone badge label. */
|
|
80
|
-
standaloneLabel?: string
|
|
81
|
-
/** Account dropdown entries. */
|
|
82
|
-
accountMenu?: AccountMenuItem[]
|
|
83
|
-
/** Show the notifications icon button. */
|
|
84
|
-
showNotifications?: boolean
|
|
85
|
-
/** Draw a notification dot on the notifications icon. */
|
|
86
|
-
hasNotificationDot?: boolean
|
|
87
|
-
/** Show the classic admin shortcut. */
|
|
88
|
-
showAdmin?: boolean
|
|
89
|
-
/** Route used by the classic admin shortcut. */
|
|
90
|
-
adminPath?: string
|
|
91
|
-
/** Show the classic profile button when accountMenu is not provided. */
|
|
92
|
-
showProfile?: boolean
|
|
93
|
-
/** Classic profile display name. */
|
|
94
|
-
userName?: string
|
|
95
|
-
/** Explicit classic profile initial. */
|
|
96
|
-
userInitial?: string
|
|
97
|
-
/** Classic profile email. */
|
|
98
|
-
userEmail?: string
|
|
99
|
-
/** Enable the built-in AppTopBar experiment popover and selector flow. */
|
|
100
|
-
experimentShell?: boolean
|
|
101
|
-
/** Current experiment mirrored into the AppTopBar experiment chip when experimentShell is enabled. */
|
|
102
|
-
experiment?: AppExperimentRecord | null
|
|
103
|
-
/** Save handler used by the AppTopBar experiment chip. Return a message to flash success. */
|
|
104
|
-
experimentSave?: () => string | null | Promise<string | null>
|
|
105
|
-
/** Disable the experiment save action. */
|
|
106
|
-
experimentSaveDisabled?: boolean
|
|
107
|
-
/** Tooltip shown when the experiment save action is disabled. */
|
|
108
|
-
experimentSaveDisabledMessage?: string
|
|
109
|
-
|
|
110
|
-
/** Active workspace view used by top bar navigation and sidebar panels. */
|
|
111
|
-
activeView?: string
|
|
112
|
-
/** Initial active view when activeView is uncontrolled. */
|
|
113
|
-
defaultActiveView?: string
|
|
114
|
-
/** Map of view IDs to sidebar tool sections. */
|
|
115
|
-
panels?: Record<string, SidebarToolSection[]>
|
|
116
|
-
/** Optional FormBuilder schemas keyed by section ID. */
|
|
117
|
-
forms?: Record<string, FormSchema>
|
|
118
|
-
/** Sidebar chrome title. */
|
|
119
|
-
sidebarTitle?: string
|
|
120
|
-
/** Sidebar chrome subtitle. */
|
|
121
|
-
sidebarSubtitle?: string
|
|
122
|
-
/** Optional compact badge/count rendered in the sidebar header. */
|
|
123
|
-
sidebarBadge?: string | number
|
|
124
|
-
/** AppSidebar visual preset. `analysis` matches the LEAF-style MINT analysis sidebar language. */
|
|
125
|
-
sidebarVariant?: SidebarVariant
|
|
126
|
-
/** Sidebar CSS width. Defaults to AppSidebar's variant width. */
|
|
127
|
-
sidebarWidth?: string
|
|
128
|
-
/** Sidebar position in AppLayout. */
|
|
129
|
-
sidebarPosition?: 'left' | 'right'
|
|
130
|
-
/** Convert the sidebar into an SDK-owned mobile overlay below the AppLayout breakpoint. */
|
|
131
|
-
responsiveSidebar?: boolean
|
|
132
|
-
/** Render the sidebar shell even when no panel matches the active view. */
|
|
133
|
-
showSidebarWhenEmpty?: boolean
|
|
134
|
-
/** Disable the built-in sidebar surface entirely. */
|
|
135
|
-
showSidebar?: boolean
|
|
136
|
-
/** DOM id for the AppSidebar scrollable content area. Use with route/tab-owned Teleport sidebars. */
|
|
137
|
-
sidebarContentId?: string
|
|
138
|
-
/** Compact AppSidebar density. */
|
|
139
|
-
dense?: boolean
|
|
140
|
-
/** Show a built-in collapse/expand button in the sidebar chrome. Defaults to AppSidebar's variant behavior. */
|
|
141
|
-
sidebarCollapsible?: boolean
|
|
142
|
-
/** Sidebar width when collapsed. */
|
|
143
|
-
sidebarCollapsedWidth?: string
|
|
144
|
-
/** Accessible label for the sidebar collapse action. */
|
|
145
|
-
sidebarCollapseButtonLabel?: string
|
|
146
|
-
/** Accessible label for the sidebar expand action. */
|
|
147
|
-
sidebarExpandButtonLabel?: string
|
|
148
|
-
/** Floating AppLayout style. */
|
|
149
|
-
floating?: boolean
|
|
150
|
-
/** Optional compact control model for generated sidebar forms. */
|
|
151
|
-
model?: ControlModel | ControlModelBinding
|
|
152
|
-
/** Compact control schema for generated sidebar forms. */
|
|
153
|
-
controls?: ControlSchema
|
|
154
|
-
/** Options passed to compact control schema generation. */
|
|
155
|
-
controlOptions?: ControlWorkspaceOptions
|
|
156
|
-
/** Optional SDK component bindings exposed to the default slot with resolved props. */
|
|
157
|
-
componentBindings?: ControlComponentBindingsConfig
|
|
158
|
-
/** Optional mapping from workspace values to component props exposed to the default slot. */
|
|
159
|
-
componentProps?: ControlComponentPropsMap
|
|
160
|
-
/** Optional named mappings from workspace values to component props exposed to the default slot. */
|
|
161
|
-
componentPropsById?: ControlComponentPropsByIdMap
|
|
162
|
-
/** Shared values for auto-rendered sidebar forms. Supports default v-model. */
|
|
163
|
-
modelValue?: Record<string, unknown>
|
|
164
|
-
/** Shared values for auto-rendered sidebar forms. */
|
|
165
|
-
values?: Record<string, unknown>
|
|
166
|
-
/** Runtime FormBuilder enhancements for auto-rendered sidebar forms. */
|
|
167
|
-
formEnhancements?: FormEnhancements<Record<string, unknown>>
|
|
168
|
-
/** Show submit/cancel actions inside auto-rendered sidebar forms. */
|
|
169
|
-
showFormActions?: boolean
|
|
170
|
-
/** Loading/saving state for auto-rendered sidebar forms. */
|
|
171
|
-
formLoading?: boolean
|
|
172
|
-
/** Disabled state for auto-rendered sidebar forms. */
|
|
173
|
-
formDisabled?: boolean
|
|
174
|
-
/** Readonly state for auto-rendered sidebar forms. */
|
|
175
|
-
formReadonly?: boolean
|
|
176
|
-
/** Size passed to auto-rendered sidebar forms. */
|
|
177
|
-
formSize?: 'sm' | 'md' | 'lg'
|
|
178
|
-
/** Controlled sidebar collapsed state. */
|
|
179
|
-
sidebarCollapsed?: boolean
|
|
180
|
-
/** Initial sidebar collapsed state when uncontrolled. */
|
|
181
|
-
defaultSidebarCollapsed?: boolean
|
|
182
|
-
/** Accessible label for the mobile sidebar toggle. */
|
|
183
|
-
sidebarToggleLabel?: string
|
|
184
|
-
/** Accessible label used when the mobile sidebar is open. */
|
|
185
|
-
sidebarCloseLabel?: string
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
29
|
+
const props = withDefaults(defineProps<PluginWorkspaceViewProps>(), {
|
|
189
30
|
title: 'Workspace',
|
|
190
31
|
subtitle: undefined,
|
|
191
32
|
topBarVariant: 'card',
|
|
@@ -278,58 +119,26 @@ const emit = defineEmits<{
|
|
|
278
119
|
'form-cancel': [sectionId: string]
|
|
279
120
|
}>()
|
|
280
121
|
|
|
281
|
-
interface PluginWorkspaceSlotProps {
|
|
282
|
-
activeView: string
|
|
283
|
-
setActiveView: (viewId: string) => void
|
|
284
|
-
values: Record<string, unknown>
|
|
285
|
-
componentBindings: ControlComponentBinding[]
|
|
286
|
-
componentBindingsById: ControlComponentBindingsById
|
|
287
|
-
componentProps: Record<string, unknown>
|
|
288
|
-
componentPropsById: Record<string, Record<string, unknown>>
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
type ForwardedSlotProps = Record<string, unknown>
|
|
292
|
-
|
|
293
122
|
defineSlots<{
|
|
294
123
|
default?: (props: PluginWorkspaceSlotProps) => unknown
|
|
295
124
|
topbar?: (props: PluginWorkspaceSlotProps) => unknown
|
|
296
125
|
sidebar?: (props: PluginWorkspaceSlotProps) => unknown
|
|
297
|
-
icon?: (props:
|
|
298
|
-
logo?: (props:
|
|
299
|
-
'page-selector-icon'?: (props:
|
|
300
|
-
'page-selector-item-icon'?: (props:
|
|
301
|
-
nav?: (props:
|
|
302
|
-
center?: (props:
|
|
303
|
-
actions?: (props:
|
|
304
|
-
'account-menu-items'?: (props:
|
|
305
|
-
'account-menu-item-icon'?: (props:
|
|
306
|
-
'settings-appearance'?: (props:
|
|
307
|
-
header?: (props:
|
|
308
|
-
collapsed?: (props:
|
|
309
|
-
footer?: (props:
|
|
126
|
+
icon?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
127
|
+
logo?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
128
|
+
'page-selector-icon'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
129
|
+
'page-selector-item-icon'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
130
|
+
nav?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
131
|
+
center?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
132
|
+
actions?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
133
|
+
'account-menu-items'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
134
|
+
'account-menu-item-icon'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
135
|
+
'settings-appearance'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
136
|
+
header?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
137
|
+
collapsed?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
138
|
+
footer?: (props: PluginWorkspaceForwardedSlotProps) => unknown
|
|
310
139
|
}>()
|
|
311
140
|
|
|
312
|
-
const topBarForwardedSlots = new Set([
|
|
313
|
-
'icon',
|
|
314
|
-
'logo',
|
|
315
|
-
'page-selector-icon',
|
|
316
|
-
'page-selector-item-icon',
|
|
317
|
-
'nav',
|
|
318
|
-
'center',
|
|
319
|
-
'actions',
|
|
320
|
-
'account-menu-items',
|
|
321
|
-
'account-menu-item-icon',
|
|
322
|
-
'settings-appearance',
|
|
323
|
-
])
|
|
324
|
-
|
|
325
|
-
const sidebarForwardedSlots = new Set([
|
|
326
|
-
'header',
|
|
327
|
-
'collapsed',
|
|
328
|
-
'footer',
|
|
329
|
-
])
|
|
330
|
-
|
|
331
141
|
const slots = useSlots()
|
|
332
|
-
const internalActiveView = ref(props.defaultActiveView)
|
|
333
142
|
|
|
334
143
|
if (props.experimentShell) {
|
|
335
144
|
useAppExperiment({
|
|
@@ -343,171 +152,77 @@ if (props.experimentShell) {
|
|
|
343
152
|
}
|
|
344
153
|
|
|
345
154
|
const topBarSlotNames = computed<string[]>(() =>
|
|
346
|
-
|
|
347
|
-
topBarForwardedSlots.has(name) || name.startsWith('settings-tab-'),
|
|
348
|
-
),
|
|
155
|
+
getPluginWorkspaceTopBarSlotNames(slots),
|
|
349
156
|
)
|
|
350
157
|
|
|
351
158
|
const sidebarSlotNames = computed<string[]>(() =>
|
|
352
|
-
|
|
353
|
-
sidebarForwardedSlots.has(name) || name.startsWith('section-'),
|
|
354
|
-
),
|
|
159
|
+
getPluginWorkspaceSidebarSlotNames(slots),
|
|
355
160
|
)
|
|
356
161
|
|
|
357
|
-
const
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
})
|
|
361
|
-
|
|
362
|
-
const resolvedControls = computed<ControlSchema | undefined>(() =>
|
|
363
|
-
props.controls ?? resolvedModel.value?.controls,
|
|
364
|
-
)
|
|
365
|
-
|
|
366
|
-
const resolvedControlOptions = computed<ControlWorkspaceOptions>(() =>
|
|
367
|
-
mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, props.controlOptions),
|
|
368
|
-
)
|
|
369
|
-
|
|
370
|
-
const externalControlValues = computed(() => props.modelValue ?? props.values)
|
|
371
|
-
const internalControlValues = reactive<Record<string, unknown>>({})
|
|
372
|
-
let syncingControlValues = false
|
|
373
|
-
|
|
374
|
-
const generatedControlDefaults = computed<Record<string, unknown>>(() => {
|
|
375
|
-
if (!resolvedControls.value) return {}
|
|
376
|
-
return {
|
|
377
|
-
...getControlDefaults(resolvedControls.value),
|
|
378
|
-
...(resolvedControlOptions.value.initialValues ?? {}),
|
|
379
|
-
}
|
|
380
|
-
})
|
|
381
|
-
|
|
382
|
-
syncResolvedControlValues()
|
|
383
|
-
|
|
384
|
-
watch(
|
|
385
|
-
[generatedControlDefaults, externalControlValues],
|
|
386
|
-
syncResolvedControlValues,
|
|
387
|
-
{ deep: true },
|
|
388
|
-
)
|
|
389
|
-
|
|
390
|
-
watch(
|
|
162
|
+
const {
|
|
163
|
+
generatedPillNav,
|
|
164
|
+
generatedDefaultView,
|
|
391
165
|
internalControlValues,
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
166
|
+
resolvedComponentBindings,
|
|
167
|
+
resolvedComponentBindingsById,
|
|
168
|
+
resolvedComponentProps,
|
|
169
|
+
resolvedComponentPropsById,
|
|
170
|
+
handleControlValuesUpdate,
|
|
171
|
+
} = usePluginWorkspaceControls({
|
|
172
|
+
model: () => props.model,
|
|
173
|
+
controls: () => props.controls,
|
|
174
|
+
controlOptions: () => props.controlOptions,
|
|
175
|
+
modelValue: () => props.modelValue,
|
|
176
|
+
values: () => props.values,
|
|
177
|
+
componentBindings: () => props.componentBindings,
|
|
178
|
+
componentProps: () => props.componentProps,
|
|
179
|
+
componentPropsById: () => props.componentPropsById,
|
|
180
|
+
emitValues: (values) => {
|
|
181
|
+
emit('update:modelValue', values)
|
|
182
|
+
emit('update:values', values)
|
|
395
183
|
},
|
|
396
|
-
{ deep: true, flush: 'sync' },
|
|
397
|
-
)
|
|
398
|
-
|
|
399
|
-
const resolvedComponentBindings = computed(() =>
|
|
400
|
-
controlValuesToComponentBindings(
|
|
401
|
-
internalControlValues,
|
|
402
|
-
props.componentBindings ?? resolvedModel.value?.componentBindings,
|
|
403
|
-
),
|
|
404
|
-
)
|
|
405
|
-
|
|
406
|
-
const resolvedComponentBindingsById = computed(() =>
|
|
407
|
-
controlValuesToComponentBindingsById(
|
|
408
|
-
internalControlValues,
|
|
409
|
-
props.componentBindings ?? resolvedModel.value?.componentBindings,
|
|
410
|
-
),
|
|
411
|
-
)
|
|
412
|
-
|
|
413
|
-
const resolvedComponentProps = computed(() => {
|
|
414
|
-
const mapping = props.componentProps ?? resolvedModel.value?.componentProps
|
|
415
|
-
return mapping === undefined ? {} : controlValuesToComponentProps(internalControlValues, mapping)
|
|
416
|
-
})
|
|
417
|
-
|
|
418
|
-
const resolvedComponentPropsById = computed(() => {
|
|
419
|
-
const mappings = props.componentPropsById ?? resolvedModel.value?.componentPropsById
|
|
420
|
-
if (mappings === undefined) return {}
|
|
421
|
-
|
|
422
|
-
return Object.fromEntries(
|
|
423
|
-
Object.entries(mappings).map(([id, mapping]) => [
|
|
424
|
-
id,
|
|
425
|
-
controlValuesToComponentProps(internalControlValues, mapping),
|
|
426
|
-
]),
|
|
427
|
-
)
|
|
428
184
|
})
|
|
429
185
|
|
|
430
|
-
const
|
|
431
|
-
|
|
432
|
-
|
|
186
|
+
const {
|
|
187
|
+
resolvedPillNav,
|
|
188
|
+
resolvedActiveView,
|
|
189
|
+
resolvedCurrentPillId,
|
|
190
|
+
resolvedCurrentPageSelectorId,
|
|
191
|
+
setActiveView,
|
|
192
|
+
handlePageSelectorSelect,
|
|
193
|
+
handlePillSelect,
|
|
194
|
+
} = usePluginWorkspaceNavigation({
|
|
195
|
+
activeView: () => props.activeView,
|
|
196
|
+
defaultActiveView: () => props.defaultActiveView,
|
|
197
|
+
currentPillId: () => props.currentPillId,
|
|
198
|
+
currentPageSelectorId: () => props.currentPageSelectorId,
|
|
199
|
+
pillNav: () => props.pillNav,
|
|
200
|
+
pageSelector: () => props.pageSelector,
|
|
201
|
+
panelIds: () => Object.keys(props.panels),
|
|
202
|
+
generatedPillNav,
|
|
203
|
+
generatedDefaultView,
|
|
204
|
+
emitActiveView: (viewId) => emit('update:activeView', viewId),
|
|
205
|
+
emitPageSelectorSelect: (page) => emit('page-selector-select', page),
|
|
206
|
+
emitPillSelect: (item) => emit('pill-select', item),
|
|
433
207
|
})
|
|
434
208
|
|
|
435
|
-
const generatedDefaultView = computed(() => {
|
|
436
|
-
if (!resolvedControls.value) return ''
|
|
437
|
-
return getDefaultControlView(resolvedControls.value, resolvedControlOptions.value)
|
|
438
|
-
})
|
|
439
|
-
|
|
440
|
-
const resolvedPillNav = computed<PillNavItemInput[] | undefined>(() => {
|
|
441
|
-
if (props.pillNav !== undefined) return props.pillNav
|
|
442
|
-
return generatedPillNav.value.length > 0 ? generatedPillNav.value : undefined
|
|
443
|
-
})
|
|
444
|
-
|
|
445
|
-
const firstConfiguredViewId = computed(() =>
|
|
446
|
-
props.defaultActiveView
|
|
447
|
-
?? firstItemId(props.pillNav)
|
|
448
|
-
?? generatedDefaultView.value
|
|
449
|
-
?? firstItemId(props.pageSelector)
|
|
450
|
-
?? Object.keys(props.panels)[0]
|
|
451
|
-
?? '',
|
|
452
|
-
)
|
|
453
|
-
|
|
454
|
-
const resolvedActiveView = computed({
|
|
455
|
-
get: () =>
|
|
456
|
-
props.activeView
|
|
457
|
-
?? props.currentPillId
|
|
458
|
-
?? props.currentPageSelectorId
|
|
459
|
-
?? internalActiveView.value
|
|
460
|
-
?? firstConfiguredViewId.value,
|
|
461
|
-
set: (value: string) => {
|
|
462
|
-
internalActiveView.value = value
|
|
463
|
-
emit('update:activeView', value)
|
|
464
|
-
},
|
|
465
|
-
})
|
|
466
|
-
|
|
467
|
-
const resolvedCurrentPillId = computed(() => props.currentPillId ?? resolvedActiveView.value)
|
|
468
|
-
const resolvedCurrentPageSelectorId = computed(() => props.currentPageSelectorId ?? resolvedActiveView.value)
|
|
469
|
-
|
|
470
209
|
const hasSidebarSurface = computed(() => {
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
)
|
|
210
|
+
return hasPluginWorkspaceSidebarSurface({
|
|
211
|
+
showSidebar: props.showSidebar,
|
|
212
|
+
panels: props.panels,
|
|
213
|
+
forms: props.forms,
|
|
214
|
+
model: props.model,
|
|
215
|
+
controls: props.controls,
|
|
216
|
+
showSidebarWhenEmpty: props.showSidebarWhenEmpty,
|
|
217
|
+
sidebarContentId: props.sidebarContentId,
|
|
218
|
+
sidebarTitle: props.sidebarTitle,
|
|
219
|
+
sidebarSubtitle: props.sidebarSubtitle,
|
|
220
|
+
sidebarBadge: props.sidebarBadge,
|
|
221
|
+
hasSidebarSlot: Boolean(slots.sidebar),
|
|
222
|
+
sidebarSlotCount: sidebarSlotNames.value.length,
|
|
223
|
+
})
|
|
485
224
|
})
|
|
486
225
|
|
|
487
|
-
function firstItemId(items?: readonly (string | { id: string })[]): string | undefined {
|
|
488
|
-
const item = items?.[0]
|
|
489
|
-
if (item === undefined) return undefined
|
|
490
|
-
return typeof item === 'string' ? item : item.id
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
function isControlModelBinding(model: ControlModel | ControlModelBinding): model is ControlModelBinding {
|
|
494
|
-
return 'controls' in model && 'controlOptions' in model
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
function setActiveView(viewId: string) {
|
|
498
|
-
resolvedActiveView.value = viewId
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
function handlePageSelectorSelect(page: PageSelectorItem) {
|
|
502
|
-
setActiveView(page.id)
|
|
503
|
-
emit('page-selector-select', page)
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
function handlePillSelect(item: PillNavItem) {
|
|
507
|
-
setActiveView(item.id)
|
|
508
|
-
emit('pill-select', item)
|
|
509
|
-
}
|
|
510
|
-
|
|
511
226
|
function handlePillOptionSelect(option: PillNavOption, item: PillNavItem) {
|
|
512
227
|
emit('pill-option-select', option, item)
|
|
513
228
|
}
|
|
@@ -516,16 +231,6 @@ function handleToggle(sectionId: string, value: boolean) {
|
|
|
516
231
|
emit('update:toggle', sectionId, value)
|
|
517
232
|
}
|
|
518
233
|
|
|
519
|
-
function handleControlValuesUpdate(values: Record<string, unknown>) {
|
|
520
|
-
syncingControlValues = true
|
|
521
|
-
replaceControlValues({
|
|
522
|
-
...generatedControlDefaults.value,
|
|
523
|
-
...values,
|
|
524
|
-
})
|
|
525
|
-
syncingControlValues = false
|
|
526
|
-
emitControlValues()
|
|
527
|
-
}
|
|
528
|
-
|
|
529
234
|
function handleFormSubmit(sectionId: string, values: Record<string, unknown>) {
|
|
530
235
|
emit('form-submit', sectionId, values)
|
|
531
236
|
}
|
|
@@ -534,30 +239,6 @@ function handleFormCancel(sectionId: string) {
|
|
|
534
239
|
emit('form-cancel', sectionId)
|
|
535
240
|
}
|
|
536
241
|
|
|
537
|
-
function syncResolvedControlValues() {
|
|
538
|
-
syncingControlValues = true
|
|
539
|
-
replaceControlValues({
|
|
540
|
-
...generatedControlDefaults.value,
|
|
541
|
-
...(externalControlValues.value === undefined ? internalControlValues : externalControlValues.value),
|
|
542
|
-
})
|
|
543
|
-
syncingControlValues = false
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
function replaceControlValues(values: Record<string, unknown>) {
|
|
547
|
-
for (const key of Object.keys(internalControlValues)) {
|
|
548
|
-
if (!(key in values)) {
|
|
549
|
-
delete internalControlValues[key]
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
Object.assign(internalControlValues, values)
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
function emitControlValues() {
|
|
556
|
-
const nextValues = { ...internalControlValues }
|
|
557
|
-
emit('update:modelValue', nextValues)
|
|
558
|
-
emit('update:values', nextValues)
|
|
559
|
-
}
|
|
560
|
-
|
|
561
242
|
</script>
|
|
562
243
|
|
|
563
244
|
<template>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ProtocolStepType } from '../types'
|
|
2
|
+
|
|
3
|
+
export const PROTOCOL_STEP_TYPE_ICONS: Record<ProtocolStepType, string> = {
|
|
4
|
+
incubation: 'M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z',
|
|
5
|
+
wash: 'M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z',
|
|
6
|
+
addition: 'M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z',
|
|
7
|
+
measurement: 'M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z',
|
|
8
|
+
transfer: 'M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4',
|
|
9
|
+
centrifuge: 'M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15',
|
|
10
|
+
mix: 'M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z',
|
|
11
|
+
custom: 'M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const PROTOCOL_STEP_TYPE_COLORS: Record<ProtocolStepType, string> = {
|
|
15
|
+
incubation: '#F59E0B',
|
|
16
|
+
wash: '#06B6D4',
|
|
17
|
+
addition: '#10B981',
|
|
18
|
+
measurement: '#8B5CF6',
|
|
19
|
+
transfer: '#3B82F6',
|
|
20
|
+
centrifuge: '#6B7280',
|
|
21
|
+
mix: '#F97316',
|
|
22
|
+
custom: '#EC4899',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function formatProtocolDuration(minutes: number | undefined): string {
|
|
26
|
+
if (minutes === undefined) return ''
|
|
27
|
+
if (minutes < 60) return `${minutes}m`
|
|
28
|
+
const hours = Math.floor(minutes / 60)
|
|
29
|
+
const mins = minutes % 60
|
|
30
|
+
return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`
|
|
31
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { ProtocolStep, ProtocolStepStatus } from '../types'
|
|
2
|
+
import type { ParameterDefinition, StepTemplate } from '../composables/useProtocolTemplates'
|
|
3
|
+
|
|
4
|
+
export interface ProtocolStepEditorFields {
|
|
5
|
+
name: string
|
|
6
|
+
description: string
|
|
7
|
+
duration?: number
|
|
8
|
+
parameters: Record<string, unknown>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface InitializedProtocolStepEditorState {
|
|
12
|
+
selectedTemplateId: string | null
|
|
13
|
+
fields: ProtocolStepEditorFields
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type ProtocolParameterFormatter = (
|
|
17
|
+
value: unknown,
|
|
18
|
+
parameter: ParameterDefinition
|
|
19
|
+
) => string
|
|
20
|
+
|
|
21
|
+
export function buildProtocolTemplateDefaults(
|
|
22
|
+
template: StepTemplate
|
|
23
|
+
): ProtocolStepEditorFields {
|
|
24
|
+
const parameters: Record<string, unknown> = {}
|
|
25
|
+
for (const parameter of template.parameters) {
|
|
26
|
+
if (parameter.default !== undefined) {
|
|
27
|
+
parameters[parameter.key] = parameter.default
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
name: template.name,
|
|
33
|
+
description: template.description || '',
|
|
34
|
+
duration: template.defaultDuration,
|
|
35
|
+
parameters,
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function buildProtocolStepEditorState(
|
|
40
|
+
step: ProtocolStep,
|
|
41
|
+
getTemplateByType: (type: ProtocolStep['type']) => StepTemplate | undefined
|
|
42
|
+
): InitializedProtocolStepEditorState {
|
|
43
|
+
const template = getTemplateByType(step.type)
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
selectedTemplateId: template?.id || null,
|
|
47
|
+
fields: {
|
|
48
|
+
name: step.name,
|
|
49
|
+
description: step.description || '',
|
|
50
|
+
duration: step.duration,
|
|
51
|
+
parameters: { ...(step.parameters || {}) },
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function buildProtocolStepPreview(
|
|
57
|
+
template: StepTemplate,
|
|
58
|
+
fields: ProtocolStepEditorFields,
|
|
59
|
+
sourceStep?: ProtocolStep
|
|
60
|
+
): ProtocolStep {
|
|
61
|
+
return {
|
|
62
|
+
id: sourceStep?.id || 'preview',
|
|
63
|
+
type: template.type,
|
|
64
|
+
name: fields.name || template.name,
|
|
65
|
+
description: fields.description,
|
|
66
|
+
duration: fields.duration ?? template.defaultDuration,
|
|
67
|
+
status: (sourceStep?.status || 'pending') as ProtocolStepStatus,
|
|
68
|
+
parameters: { ...fields.parameters },
|
|
69
|
+
order: sourceStep?.order || 0,
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function buildProtocolPreviewParams(
|
|
74
|
+
template: StepTemplate,
|
|
75
|
+
parameters: Record<string, unknown>,
|
|
76
|
+
formatParameterValue: ProtocolParameterFormatter
|
|
77
|
+
): string {
|
|
78
|
+
return template.parameters
|
|
79
|
+
.filter((parameter) => (
|
|
80
|
+
parameters[parameter.key] !== undefined
|
|
81
|
+
&& parameters[parameter.key] !== ''
|
|
82
|
+
))
|
|
83
|
+
.map((parameter) => formatParameterValue(parameters[parameter.key], parameter))
|
|
84
|
+
.join(', ')
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function buildCustomProtocolTemplate(
|
|
88
|
+
template: StepTemplate,
|
|
89
|
+
fields: ProtocolStepEditorFields,
|
|
90
|
+
templateId = `custom-${Date.now()}`
|
|
91
|
+
): StepTemplate {
|
|
92
|
+
return {
|
|
93
|
+
id: templateId,
|
|
94
|
+
type: template.type,
|
|
95
|
+
name: fields.name || template.name,
|
|
96
|
+
description: fields.description,
|
|
97
|
+
defaultDuration: fields.duration,
|
|
98
|
+
parameters: template.parameters.map((parameter) => ({
|
|
99
|
+
...parameter,
|
|
100
|
+
default: fields.parameters[parameter.key],
|
|
101
|
+
})),
|
|
102
|
+
isBuiltIn: false,
|
|
103
|
+
}
|
|
104
|
+
}
|