@morscherlab/mint-sdk 1.2.0-beta.8 → 1.2.0
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 +60 -0
- package/dist/{ExperimentPopover-CfOdh5Rm.js → ExperimentPopover-CJdNlCZb.js} +24 -15
- package/dist/ExperimentPopover-CJdNlCZb.js.map +1 -0
- package/dist/{ExperimentSelectorModal-DvIagrxY.js → ExperimentSelectorModal-DCXmwKNS.js} +5 -5
- package/dist/ExperimentSelectorModal-DCXmwKNS.js.map +1 -0
- package/dist/{SettingsModal-W3TYfnP9.js → SettingsModal-BYR20I4c.js} +5 -5
- package/dist/SettingsModal-BYR20I4c.js.map +1 -0
- package/dist/{EmptyState-NBqf2_8z.js → Skeleton-BAF3CKY7.js} +111 -93
- package/dist/Skeleton-BAF3CKY7.js.map +1 -0
- package/dist/__tests__/components/DataStates.test.d.ts +1 -0
- package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
- package/dist/__tests__/components/FileBrowserModal.test.d.ts +1 -0
- package/dist/__tests__/components/FilePicker.state.test.d.ts +1 -0
- package/dist/__tests__/components/FilePicker.test.d.ts +1 -0
- package/dist/__tests__/components/PlotlyChart.test.d.ts +1 -0
- package/dist/__tests__/components/iconButtonIconSizing.test.d.ts +1 -0
- package/dist/__tests__/composables/useFileBrowser.test.d.ts +1 -0
- package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
- package/dist/__tests__/composables/usePlatformFilePickerAdapter.test.d.ts +1 -0
- package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
- package/dist/apiErrors.d.ts +26 -0
- package/dist/components/ActionMenu.vue.d.ts +1 -1
- package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
- package/dist/components/AuditTrail.vue.d.ts +13 -0
- package/dist/components/BaseInput.vue.d.ts +1 -1
- package/dist/components/BaseSelect.vue.d.ts +1 -1
- package/dist/components/BaseTextarea.vue.d.ts +1 -1
- package/dist/components/BatchProgressList.vue.d.ts +17 -0
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
- package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +2 -2
- package/dist/components/ConcentrationInput.vue.d.ts +1 -1
- package/dist/components/DataFrame.vue.d.ts +14 -2
- package/dist/components/DatePicker.vue.d.ts +2 -2
- package/dist/components/DateTimePicker.vue.d.ts +3 -1
- package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
- package/dist/components/ExperimentPopover.vue.d.ts +1 -0
- package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
- package/dist/components/FileBrowserModal.vue.d.ts +99 -0
- package/dist/components/FilePicker.vue.d.ts +32 -0
- package/dist/components/FileUploader.vue.d.ts +5 -2
- package/dist/components/FormulaInput.vue.d.ts +1 -1
- package/dist/components/GeneratedPlotlyResult.vue.d.ts +1 -3
- package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
- package/dist/components/MobileSupportGate.vue.d.ts +1 -1
- package/dist/components/MoleculeInput.vue.d.ts +1 -1
- package/dist/components/NumberInput.vue.d.ts +1 -1
- package/dist/components/PlotlyChart.vue.d.ts +59 -0
- package/dist/components/ProgressBar.vue.d.ts +1 -1
- package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
- package/dist/components/ReagentList.vue.d.ts +29 -1
- package/dist/components/ResourceCard.vue.d.ts +1 -1
- package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
- package/dist/components/SampleSelector.drag.d.ts +13 -0
- package/dist/components/SampleSelector.tree.d.ts +2 -0
- package/dist/components/SampleSelector.vue.d.ts +34 -1
- package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
- package/dist/components/SecretInput.vue.d.ts +1 -1
- package/dist/components/SequenceInput.vue.d.ts +1 -1
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -0
- package/dist/components/StatusIndicator.vue.d.ts +1 -1
- package/dist/components/TagsInput.vue.d.ts +1 -1
- package/dist/components/TimePicker.vue.d.ts +2 -1
- package/dist/components/TimeRangeInput.vue.d.ts +1 -1
- package/dist/components/UnitInput.vue.d.ts +1 -1
- package/dist/components/WellPlate.geometry.d.ts +15 -0
- package/dist/components/WellPlate.interaction.d.ts +13 -0
- package/dist/components/WellPlate.vue.d.ts +30 -1
- package/dist/components/fileBrowserPresentation.d.ts +10 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +8 -8
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
- package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
- package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +34 -0
- package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +25 -0
- package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +26 -0
- package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +18 -0
- package/dist/components/internal/FilePickerTreeInternal.vue.d.ts +31 -0
- package/dist/{components-B80gV0P6.js → components-DIum5hkx.js} +5415 -2753
- package/dist/components-DIum5hkx.js.map +1 -0
- package/dist/composables/controlSchemaTypes.d.ts +34 -0
- package/dist/composables/filePicker/localFiles.d.ts +3 -0
- package/dist/composables/filePicker/usePickerNavigation.d.ts +96 -0
- package/dist/composables/filePicker/usePickerSelection.d.ts +31 -0
- package/dist/composables/filePicker/validation.d.ts +5 -0
- package/dist/composables/index.d.ts +3 -0
- package/dist/composables/index.js +10 -10
- package/dist/composables/useApi.d.ts +14 -7
- package/dist/composables/useDropdownState.d.ts +18 -2
- package/dist/composables/useEventStream.d.ts +9 -0
- package/dist/composables/useFileBrowser.d.ts +55 -0
- package/dist/composables/useFilePicker.d.ts +189 -0
- package/dist/composables/useListReorder.d.ts +90 -0
- package/dist/composables/useMenuKeyboard.d.ts +2 -2
- package/dist/composables/usePlatformFilePickerAdapter.d.ts +11 -0
- package/dist/composables/usePluginConfig.d.ts +3 -1
- package/dist/composables/useRequestSyncState.d.ts +42 -2
- package/dist/composables/useScheduleDrag.d.ts +1 -0
- package/dist/{composables-C8mmD5ta.js → composables-mFXsTA4g.js} +307 -74
- package/dist/composables-mFXsTA4g.js.map +1 -0
- package/dist/{useApi-CDBq6z23.js → errors-BLuqMee5.js} +178 -16
- package/dist/errors-BLuqMee5.js.map +1 -0
- package/dist/{experiment-Y9Iz7KYi.js → experiment-CVDRAnqp.js} +3 -8
- package/dist/experiment-CVDRAnqp.js.map +1 -0
- package/dist/{experiment-utils-DV3DrvE_.js → experiment-utils-CV2Wza3z.js} +1 -1
- package/dist/experiment-utils-CV2Wza3z.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -15
- package/dist/install.js +2 -7
- package/dist/install.js.map +1 -1
- package/dist/permissions.d.ts +42 -1
- package/dist/permissions.js +20 -10
- package/dist/permissions.js.map +1 -1
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +3 -3
- package/dist/stores/settings.d.ts +31 -1
- package/dist/styles.css +15162 -32475
- package/dist/templates/index.js +2 -4
- package/dist/{templates-CK72aKO1.js → templates-CmGfmBRA.js} +291 -85
- package/dist/templates-CmGfmBRA.js.map +1 -0
- package/dist/types/fileBrowserTypes.d.ts +77 -0
- package/dist/types/filePicker.d.ts +77 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/{useControlSchema-_OVhavKq.js → useControlSchema-DldpxNOP.js} +234 -1121
- package/dist/useControlSchema-DldpxNOP.js.map +1 -0
- package/dist/{useDropdownState-D5G4UvWd.js → useDropdownState-C7hRiVQf.js} +22 -6
- package/dist/useDropdownState-C7hRiVQf.js.map +1 -0
- package/dist/{useExperimentSelector-DSEckf_g.js → useExperimentSelector-CEcIaueJ.js} +4 -4
- package/dist/{useExperimentSelector-DSEckf_g.js.map → useExperimentSelector-CEcIaueJ.js.map} +1 -1
- package/dist/{useFormBuilder-Bd714C7y.js → useFormBuilder-z5L_dUIy.js} +2 -2
- package/dist/{useFormBuilder-Bd714C7y.js.map → useFormBuilder-z5L_dUIy.js.map} +1 -1
- package/dist/utils/color.d.ts +13 -0
- package/dist/utils/errors.d.ts +9 -0
- package/dist/{useProtocolTemplates-Dq5Pzwyd.js → validation-uwoJGEb6.js} +231 -158
- package/dist/validation-uwoJGEb6.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/apiErrors.test.ts +81 -0
- package/src/__tests__/components/ActionMenu.test.ts +94 -0
- package/src/__tests__/components/DataFrame.test.ts +183 -11
- package/src/__tests__/components/DataStates.test.ts +176 -0
- package/src/__tests__/components/DatePicker.test.ts +76 -0
- package/src/__tests__/components/DateTimePicker.test.ts +36 -0
- package/src/__tests__/components/ExperimentPopover.test.ts +30 -0
- package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
- package/src/__tests__/components/FileBrowserModal.test.ts +460 -0
- package/src/__tests__/components/FilePicker.state.test.ts +287 -0
- package/src/__tests__/components/FilePicker.test.ts +487 -0
- package/src/__tests__/components/GeneratedPlotlyResult.test.ts +52 -5
- package/src/__tests__/components/GroupAssigner.test.ts +53 -0
- package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
- package/src/__tests__/components/PlotlyChart.test.ts +305 -0
- package/src/__tests__/components/RackEditor.test.ts +35 -0
- package/src/__tests__/components/ReagentList.test.ts +64 -2
- package/src/__tests__/components/RetiredStyles.test.ts +31 -0
- package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
- package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
- package/src/__tests__/components/SegmentedControl.test.ts +107 -0
- package/src/__tests__/components/TimePicker.test.ts +61 -0
- package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
- package/src/__tests__/components/iconButtonIconSizing.test.ts +18 -0
- package/src/__tests__/composables/useApi.test.ts +92 -9
- package/src/__tests__/composables/useDropdownState.test.ts +58 -1
- package/src/__tests__/composables/useFileBrowser.test.ts +305 -0
- package/src/__tests__/composables/useGeneratedAnalysis.test.ts +7 -2
- package/src/__tests__/composables/useListReorder.test.ts +145 -0
- package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +67 -0
- package/src/__tests__/composables/usePluginClient.test.ts +3 -0
- package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
- package/src/__tests__/stores/settings.test.ts +71 -1
- package/src/__tests__/styles/cssTokens.test.ts +131 -0
- package/src/__tests__/utils/permissions.test.ts +68 -0
- package/src/apiErrors.ts +85 -0
- package/src/components/ActionMenu.vue +45 -88
- package/src/components/AlertBox.vue +0 -4
- package/src/components/AppAvatarMenu.vue +2 -14
- package/src/components/AppLayout.vue +0 -4
- package/src/components/AppPluginSwitcher.story.vue +87 -0
- package/src/components/AppPluginSwitcher.vue +2 -5
- package/src/components/AppSidebar.vue +0 -4
- package/src/components/AppToastContainer.vue +6 -8
- package/src/components/AppTopBar.vue +0 -4
- package/src/components/ArtifactSaveDialog.vue +0 -4
- package/src/components/ArtifactSelectorModal.vue +0 -4
- package/src/components/AuditTrail.story.vue +18 -0
- package/src/components/AuditTrail.vue +27 -7
- package/src/components/AutoGroupModal.vue +0 -4
- package/src/components/Avatar.vue +0 -4
- package/src/components/BaseButton.vue +0 -4
- package/src/components/BaseCheckbox.vue +0 -4
- package/src/components/BaseInput.vue +0 -4
- package/src/components/BaseModal.vue +0 -4
- package/src/components/BasePill.vue +0 -4
- package/src/components/BaseRadioGroup.vue +0 -4
- package/src/components/BaseSelect.vue +0 -4
- package/src/components/BaseSlider.vue +0 -4
- package/src/components/BaseTabs.vue +0 -4
- package/src/components/BaseTextarea.vue +0 -4
- package/src/components/BaseToggle.vue +0 -4
- package/src/components/BatchProgressList.story.vue +18 -0
- package/src/components/BatchProgressList.vue +32 -4
- package/src/components/Breadcrumb.vue +0 -4
- package/src/components/Calendar.vue +0 -4
- package/src/components/ChartContainer.story.vue +1 -1
- package/src/components/ChartContainer.vue +0 -4
- package/src/components/ChemicalFormula.vue +0 -4
- package/src/components/CollapsibleCard.vue +0 -4
- package/src/components/ColorSlider.vue +0 -4
- package/src/components/ConcentrationInput.vue +0 -4
- package/src/components/ConfirmDialog.vue +0 -4
- package/src/components/DataFrame.story.vue +14 -0
- package/src/components/DataFrame.vue +97 -23
- package/src/components/DatePicker.vue +73 -27
- package/src/components/DateTimePicker.vue +45 -17
- package/src/components/Divider.vue +0 -4
- package/src/components/DoseCalculator.vue +0 -4
- package/src/components/DropdownButton.vue +2 -14
- package/src/components/EmptyState.vue +0 -4
- package/src/components/ExperimentCodeBadge.vue +0 -4
- package/src/components/ExperimentDataViewer.story.vue +3 -0
- package/src/components/ExperimentDataViewer.vue +33 -13
- package/src/components/ExperimentPopover.vue +12 -7
- package/src/components/ExperimentSelectorModal.vue +0 -4
- package/src/components/ExperimentTimeline.story.vue +18 -0
- package/src/components/ExperimentTimeline.vue +81 -75
- package/src/components/FileBrowserModal.story.vue +203 -0
- package/src/components/FileBrowserModal.vue +384 -0
- package/src/components/FilePicker.story.vue +44 -0
- package/src/components/FilePicker.vue +284 -0
- package/src/components/FileUploader.vue +32 -18
- package/src/components/FitPanel.vue +0 -4
- package/src/components/FormActions.story.vue +96 -0
- package/src/components/FormActions.vue +0 -4
- package/src/components/FormBuilder.vue +0 -4
- package/src/components/FormField.vue +0 -4
- package/src/components/FormulaInput.vue +0 -4
- package/src/components/GeneratedPathInput.story.vue +68 -0
- package/src/components/GeneratedPlotlyResult.story.vue +96 -0
- package/src/components/GeneratedPlotlyResult.vue +34 -69
- package/src/components/GeneratedPluginView.story.vue +145 -0
- package/src/components/GeneratedPluginView.vue +10 -10
- package/src/components/GeneratedResultRenderer.story.vue +117 -0
- package/src/components/GeneratedResultRenderer.vue +4 -9
- package/src/components/GroupAssigner.vue +67 -5
- package/src/components/IconButton.vue +0 -4
- package/src/components/InstrumentAlertLog.vue +0 -4
- package/src/components/InstrumentStateBadge.vue +0 -4
- package/src/components/InstrumentStatusCard.vue +0 -4
- package/src/components/JobsStatusTray.vue +0 -4
- package/src/components/LcmsSequenceTable.vue +81 -50
- package/src/components/LoadingSpinner.vue +0 -4
- package/src/components/MobileSupportGate.vue +0 -4
- package/src/components/MoleculeInput.vue +0 -4
- package/src/components/MultiSelect.vue +0 -4
- package/src/components/NumberInput.vue +0 -4
- package/src/components/PlateMapEditor.vue +3 -14
- package/src/components/PlotlyChart.story.vue +61 -0
- package/src/components/PlotlyChart.vue +233 -0
- package/src/components/PluginIcon.vue +0 -4
- package/src/components/ProgressBar.vue +0 -4
- package/src/components/ProtocolStepEditor.vue +2 -4
- package/src/components/RackEditor.vue +51 -70
- package/src/components/ReagentEditor.vue +0 -4
- package/src/components/ReagentList.story.vue +18 -0
- package/src/components/ReagentList.vue +127 -82
- package/src/components/ResourceCard.vue +0 -4
- package/src/components/RuntimeUpdateNotice.story.vue +49 -0
- package/src/components/RuntimeUpdateNotice.vue +4 -4
- package/src/components/SampleHierarchyTree.story.vue +18 -0
- package/src/components/SampleHierarchyTree.vue +32 -9
- package/src/components/SampleLegend.vue +2 -8
- package/src/components/SampleSelector.drag.ts +51 -0
- package/src/components/SampleSelector.story.vue +6 -0
- package/src/components/SampleSelector.tree.ts +2 -0
- package/src/components/SampleSelector.vue +49 -10
- package/src/components/SampleSelectorGroupNode.vue +19 -0
- package/src/components/ScheduleCalendar.story.vue +6 -0
- package/src/components/ScheduleCalendar.vue +82 -7
- package/src/components/ScientificNumber.vue +0 -4
- package/src/components/SectionCard.vue +0 -4
- package/src/components/SegmentedControl.vue +50 -7
- package/src/components/SequenceInput.vue +0 -4
- package/src/components/SequenceProgressBar.story.vue +110 -0
- package/src/components/SequenceProgressBar.vue +0 -4
- package/src/components/SettingsModal.vue +0 -4
- package/src/components/Skeleton.vue +0 -4
- package/src/components/SmartGroupFieldRecipe.vue +8 -6
- package/src/components/SmartGroupManual.vue +0 -4
- package/src/components/StatusIndicator.vue +0 -4
- package/src/components/StepWizard.vue +0 -4
- package/src/components/TagsInput.vue +4 -6
- package/src/components/ThemeToggle.vue +0 -4
- package/src/components/TimePicker.vue +36 -7
- package/src/components/TimeRangeInput.vue +0 -4
- package/src/components/Tooltip.story.vue +3 -3
- package/src/components/Tooltip.vue +0 -4
- package/src/components/UnitInput.vue +0 -4
- package/src/components/WellPlate.geometry.ts +60 -1
- package/src/components/WellPlate.interaction.ts +44 -0
- package/src/components/WellPlate.story.vue +8 -0
- package/src/components/WellPlate.vue +53 -7
- package/src/components/fileBrowserPresentation.ts +39 -0
- package/src/components/index.ts +5 -0
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
- package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
- package/src/components/internal/DataStateInternal.vue +74 -0
- package/src/components/internal/FileBrowserDialogInternal.vue +75 -0
- package/src/components/internal/FileBrowserListingInternal.vue +197 -0
- package/src/components/internal/FileBrowserToolbarInternal.vue +136 -0
- package/src/components/internal/FilePickerPreviewInternal.vue +100 -0
- package/src/components/internal/FilePickerTreeInternal.vue +238 -0
- package/src/components/internal/FormSectionRenderer.vue +0 -4
- package/src/components/internal/WellEditPopupInternal.vue +0 -4
- package/src/composables/controlSchemaTypes.ts +34 -0
- package/src/composables/filePicker/localFiles.ts +58 -0
- package/src/composables/filePicker/usePickerNavigation.ts +220 -0
- package/src/composables/filePicker/usePickerSelection.ts +259 -0
- package/src/composables/filePicker/validation.ts +41 -0
- package/src/composables/index.ts +17 -0
- package/src/composables/useApi.ts +57 -13
- package/src/composables/useDropdownState.ts +35 -5
- package/src/composables/useEventStream.ts +14 -2
- package/src/composables/useFileBrowser.ts +314 -0
- package/src/composables/useFileImport.ts +2 -7
- package/src/composables/useFilePicker.ts +366 -0
- package/src/composables/useGeneratedAnalysis.ts +18 -26
- package/src/composables/useListReorder.story.vue +143 -0
- package/src/composables/useListReorder.ts +242 -0
- package/src/composables/useMenuKeyboard.ts +2 -2
- package/src/composables/useOptimisticMutation.ts +1 -15
- package/src/composables/usePlatformFilePickerAdapter.ts +104 -0
- package/src/composables/usePluginClient.ts +3 -0
- package/src/composables/usePluginConfig.ts +3 -1
- package/src/composables/useRackEditor.ts +2 -11
- package/src/composables/useRequestSyncState.ts +98 -28
- package/src/composables/useResourceCrud.ts +1 -15
- package/src/composables/useScheduleDrag.ts +37 -0
- package/src/composables/useWellPainting.ts +5 -29
- package/src/composables/useWellPlateEditor.ts +1 -11
- package/src/index.ts +3 -0
- package/src/permissions.ts +48 -9
- package/src/stores/experiment.ts +2 -7
- package/src/stores/index.ts +9 -1
- package/src/stores/settings.ts +93 -1
- package/src/styles/components/audit-trail.css +5 -5
- package/src/styles/components/batch-progress-list.css +7 -0
- package/src/styles/components/color-slider.css +2 -2
- package/src/styles/components/data-state.css +30 -0
- package/src/styles/components/dataframe.css +29 -35
- package/src/styles/components/experiment-data-viewer.css +4 -4
- package/src/styles/components/experiment-timeline.css +3 -30
- package/src/styles/components/file-browser-modal.css +489 -0
- package/src/styles/components/file-picker.css +502 -0
- package/src/styles/components/form-builder.css +5 -5
- package/src/styles/components/icon-button.css +9 -0
- package/src/styles/components/lcms-sequence-table.css +16 -1
- package/src/styles/components/multi-select.css +1 -1
- package/src/styles/components/reagent-list.css +38 -31
- package/src/styles/components/sample-hierarchy-tree.css +5 -19
- package/src/styles/components/sample-selector.css +9 -2
- package/src/styles/components/schedule-calendar.css +8 -0
- package/src/styles/components/scientific-number.css +1 -1
- package/src/styles/components/well-plate.css +8 -0
- package/src/styles/index.css +11 -0
- package/src/styles/variables.css +29 -0
- package/src/templates/builderPresetControls.ts +1 -1
- package/src/templates/componentPlateHelpers.ts +3 -1
- package/src/templates/doseResponseAdapters.ts +2 -13
- package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
- package/src/templates/plateMapBuilder.ts +2 -2
- package/src/templates/qpcrPlateBuilder.ts +1 -1
- package/src/templates/templateValidators.ts +1 -1
- package/src/templates/timeCourseBuilder.ts +2 -2
- package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
- package/src/types/fileBrowserTypes.ts +85 -0
- package/src/types/filePicker.ts +72 -0
- package/src/types/index.ts +14 -0
- package/src/utils/color.ts +51 -0
- package/src/utils/errors.ts +29 -0
- package/dist/EmptyState-NBqf2_8z.js.map +0 -1
- package/dist/ExperimentPopover-CfOdh5Rm.js.map +0 -1
- package/dist/ExperimentSelectorModal-DvIagrxY.js.map +0 -1
- package/dist/SettingsModal-W3TYfnP9.js.map +0 -1
- package/dist/components-B80gV0P6.js.map +0 -1
- package/dist/composables/autoGroupConstants.d.ts +0 -1
- package/dist/composables/autoGroupGrouping.d.ts +0 -3
- package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
- package/dist/composables-C8mmD5ta.js.map +0 -1
- package/dist/experiment-Y9Iz7KYi.js.map +0 -1
- package/dist/experiment-utils-DV3DrvE_.js.map +0 -1
- package/dist/templates/builderDefaults.d.ts +0 -1
- package/dist/templates/plateGeometry.d.ts +0 -4
- package/dist/templates-CK72aKO1.js.map +0 -1
- package/dist/useApi-CDBq6z23.js.map +0 -1
- package/dist/useControlSchema-_OVhavKq.js.map +0 -1
- package/dist/useDropdownState-D5G4UvWd.js.map +0 -1
- package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +0 -1
- package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
- package/src/composables/autoGroupConstants.ts +0 -4
- package/src/composables/autoGroupGrouping.ts +0 -148
- package/src/composables/useAutoGroupInputSources.ts +0 -147
- package/src/templates/builderDefaults.ts +0 -11
- package/src/templates/plateGeometry.ts +0 -62
- /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → apiErrors.test.d.ts} +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils'
|
|
2
|
+
import { afterEach, expect, it, vi } from 'vitest'
|
|
3
|
+
import { ref } from 'vue'
|
|
4
|
+
import FilePicker from '../../components/FilePicker.vue'
|
|
5
|
+
import FileUploader from '../../components/FileUploader.vue'
|
|
6
|
+
import type { PickerAdapter, PickerNode, PickerSelection } from '../../types/filePicker'
|
|
7
|
+
|
|
8
|
+
enableAutoUnmount(afterEach)
|
|
9
|
+
const folder: PickerNode = { kind: 'folder', path: 'opaque-root', name: 'Root' }
|
|
10
|
+
const child: PickerNode = {
|
|
11
|
+
kind: 'folder',
|
|
12
|
+
path: 'unrelated-child',
|
|
13
|
+
name: 'Child',
|
|
14
|
+
parentPath: folder.path,
|
|
15
|
+
}
|
|
16
|
+
const file: PickerNode = {
|
|
17
|
+
kind: 'file',
|
|
18
|
+
path: 'independent-file',
|
|
19
|
+
name: 'run.raw',
|
|
20
|
+
format: 'raw',
|
|
21
|
+
bytes: 7,
|
|
22
|
+
parentPath: child.path,
|
|
23
|
+
}
|
|
24
|
+
function adapter(): PickerAdapter {
|
|
25
|
+
return {
|
|
26
|
+
listRoot: vi.fn(async () => [folder]),
|
|
27
|
+
listChildren: vi.fn(async (path) => (path === folder.path ? [child] : [file])),
|
|
28
|
+
search: vi.fn(async () => []),
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function setup(data = adapter(), extra: Record<string, unknown> = {}) {
|
|
32
|
+
const wrapper = mount(FilePicker, {
|
|
33
|
+
props: { open: true, adapter: data, ...extra },
|
|
34
|
+
global: { stubs: { teleport: true } },
|
|
35
|
+
})
|
|
36
|
+
await flushPromises()
|
|
37
|
+
return wrapper
|
|
38
|
+
}
|
|
39
|
+
function row(wrapper: Awaited<ReturnType<typeof setup>>, path: string) {
|
|
40
|
+
return wrapper.findAll('[role="treeitem"]').find((item) => item.attributes('data-path') === path)!
|
|
41
|
+
}
|
|
42
|
+
function confirm(wrapper: Awaited<ReturnType<typeof setup>>) {
|
|
43
|
+
return wrapper.findAll('.mint-picker__actions button').at(-1)!
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
it('root breadcrumb returns directly to mounts and navigation keeps a tabbable row', async () => {
|
|
47
|
+
const wrapper = await setup()
|
|
48
|
+
await row(wrapper, folder.path).trigger('click')
|
|
49
|
+
await row(wrapper, folder.path).trigger('dblclick')
|
|
50
|
+
await flushPromises()
|
|
51
|
+
expect(row(wrapper, child.path).attributes('tabindex')).toBe('0')
|
|
52
|
+
await row(wrapper, child.path).trigger('dblclick')
|
|
53
|
+
await flushPromises()
|
|
54
|
+
await wrapper.get('[aria-label="Breadcrumb"] button').trigger('click')
|
|
55
|
+
await flushPromises()
|
|
56
|
+
expect(row(wrapper, folder.path)).toBeDefined()
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('restored nested files inherit their folder and disappear when that folder is deselected', async () => {
|
|
60
|
+
const wrapper = await setup()
|
|
61
|
+
await row(wrapper, folder.path).trigger('click')
|
|
62
|
+
await flushPromises()
|
|
63
|
+
await confirm(wrapper).trigger('click')
|
|
64
|
+
const result = wrapper.emitted('select')![0]![0] as PickerSelection
|
|
65
|
+
await wrapper.setProps({ open: false, initialSelection: result })
|
|
66
|
+
await wrapper.setProps({ open: true })
|
|
67
|
+
await flushPromises()
|
|
68
|
+
await row(wrapper, folder.path).trigger('click', { ctrlKey: true })
|
|
69
|
+
await flushPromises()
|
|
70
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('refresh removes deleted descendants from a selected folder', async () => {
|
|
74
|
+
const data = adapter()
|
|
75
|
+
const wrapper = await setup(data)
|
|
76
|
+
await row(wrapper, folder.path).trigger('click')
|
|
77
|
+
await flushPromises()
|
|
78
|
+
expect(confirm(wrapper).attributes('disabled')).toBeUndefined()
|
|
79
|
+
vi.mocked(data.listChildren).mockImplementation(async (path) =>
|
|
80
|
+
path === folder.path ? [child] : [],
|
|
81
|
+
)
|
|
82
|
+
await wrapper.get('[aria-label="Refresh location"]').trigger('click')
|
|
83
|
+
await flushPromises()
|
|
84
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
85
|
+
expect(wrapper.get('.mint-picker__receipt').text()).not.toContain('7 B')
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
it('marks only an explicit refresh so adapters can bypass their caches', async () => {
|
|
89
|
+
const data = adapter()
|
|
90
|
+
const wrapper = await setup(data)
|
|
91
|
+
await row(wrapper, folder.path).trigger('dblclick')
|
|
92
|
+
await flushPromises()
|
|
93
|
+
expect(vi.mocked(data.listRoot).mock.calls[0]![0]).not.toHaveProperty('refresh')
|
|
94
|
+
expect(vi.mocked(data.listChildren).mock.calls[0]![1]).not.toHaveProperty('refresh')
|
|
95
|
+
await wrapper.get('[aria-label="Refresh location"]').trigger('click')
|
|
96
|
+
await flushPromises()
|
|
97
|
+
expect(vi.mocked(data.listChildren).mock.calls.at(-1)![1]).toMatchObject({ refresh: true })
|
|
98
|
+
await wrapper.get('[aria-label="Breadcrumb"] button').trigger('click')
|
|
99
|
+
await flushPromises()
|
|
100
|
+
expect(vi.mocked(data.listRoot).mock.calls.at(-1)![0]).not.toHaveProperty('refresh')
|
|
101
|
+
await wrapper.get('[aria-label="Refresh location"]').trigger('click')
|
|
102
|
+
await flushPromises()
|
|
103
|
+
expect(vi.mocked(data.listRoot).mock.calls.at(-1)![0]).toMatchObject({ refresh: true })
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('late server responses cannot overwrite browser source metadata', async () => {
|
|
107
|
+
const data = adapter()
|
|
108
|
+
let release!: (nodes: PickerNode[]) => void
|
|
109
|
+
vi.mocked(data.listRoot).mockReturnValueOnce(
|
|
110
|
+
new Promise((resolve) => {
|
|
111
|
+
release = resolve
|
|
112
|
+
}),
|
|
113
|
+
)
|
|
114
|
+
const wrapper = await setup(data, { sources: ['server', 'localFile'] })
|
|
115
|
+
await wrapper.get('[aria-label="Local files"]').trigger('click')
|
|
116
|
+
await flushPromises()
|
|
117
|
+
release([folder])
|
|
118
|
+
await flushPromises()
|
|
119
|
+
expect(wrapper.findAll('[role="treeitem"]')).toHaveLength(0)
|
|
120
|
+
expect(wrapper.text()).toContain('No selection')
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('browser source confirms original File objects without reading or uploading them', async () => {
|
|
124
|
+
const wrapper = await setup(adapter(), { sources: ['localFile'], selectionMode: 'multi-file' })
|
|
125
|
+
const local = new File(['content'], 'run.raw')
|
|
126
|
+
const read = vi.spyOn(local, 'arrayBuffer')
|
|
127
|
+
const input = wrapper.get('input[type="file"]')
|
|
128
|
+
Object.defineProperty(input.element, 'files', { value: [local], configurable: true })
|
|
129
|
+
await input.trigger('change')
|
|
130
|
+
await flushPromises()
|
|
131
|
+
await confirm(wrapper).trigger('click')
|
|
132
|
+
expect(wrapper.emitted('select')?.[0]?.[0]).toEqual({ source: 'localFile', files: [local] })
|
|
133
|
+
expect(read).not.toHaveBeenCalled()
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
it('restores dropped folder paths after remounting with the confirmed local selection', async () => {
|
|
137
|
+
const options = { sources: ['localFile'], selectionMode: 'folder' }
|
|
138
|
+
const wrapper = await setup(adapter(), options)
|
|
139
|
+
const file = new File(['data'], 'run.raw')
|
|
140
|
+
wrapper.getComponent(FileUploader).vm.$emit('upload', [file], 'batch', ['batch/run.raw'])
|
|
141
|
+
await flushPromises()
|
|
142
|
+
await confirm(wrapper).trigger('click')
|
|
143
|
+
const result = wrapper.emitted('select')![0]![0] as PickerSelection
|
|
144
|
+
expect(result).toEqual({ source: 'localFile', files: [file], relativePaths: ['batch/run.raw'] })
|
|
145
|
+
expect(result.files[0]).toBe(file)
|
|
146
|
+
wrapper.unmount()
|
|
147
|
+
|
|
148
|
+
const restored = await setup(adapter(), { ...options, initialSelection: result })
|
|
149
|
+
expect(confirm(restored).attributes('disabled')).toBeUndefined()
|
|
150
|
+
await confirm(restored).trigger('click')
|
|
151
|
+
const confirmed = restored.emitted('select')![0]![0] as PickerSelection
|
|
152
|
+
expect(confirmed).toEqual(result)
|
|
153
|
+
expect(confirmed.files[0]).toBe(file)
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
it('restores a nested selected folder display name without exposing its opaque identity', async () => {
|
|
157
|
+
const wrapper = await setup()
|
|
158
|
+
await row(wrapper, folder.path).trigger('dblclick')
|
|
159
|
+
await flushPromises()
|
|
160
|
+
await row(wrapper, child.path).trigger('click')
|
|
161
|
+
await flushPromises()
|
|
162
|
+
await wrapper.get('[aria-label="Breadcrumb"] button').trigger('click')
|
|
163
|
+
await flushPromises()
|
|
164
|
+
await confirm(wrapper).trigger('click')
|
|
165
|
+
await wrapper.setProps({ open: false })
|
|
166
|
+
await wrapper.setProps({ open: true })
|
|
167
|
+
await flushPromises()
|
|
168
|
+
expect(wrapper.get('.mint-picker__preview-name').text()).toBe('Child')
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('blocks confirmation while refresh is replacing stale folder metadata', async () => {
|
|
172
|
+
const data = adapter()
|
|
173
|
+
const wrapper = await setup(data)
|
|
174
|
+
await row(wrapper, folder.path).trigger('click')
|
|
175
|
+
await flushPromises()
|
|
176
|
+
let release!: (nodes: PickerNode[]) => void
|
|
177
|
+
vi.mocked(data.listRoot).mockReturnValueOnce(
|
|
178
|
+
new Promise((resolve) => {
|
|
179
|
+
release = resolve
|
|
180
|
+
}),
|
|
181
|
+
)
|
|
182
|
+
await wrapper.get('[aria-label="Refresh location"]').trigger('click')
|
|
183
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
184
|
+
await confirm(wrapper).trigger('click')
|
|
185
|
+
expect(wrapper.emitted('select')).toBeUndefined()
|
|
186
|
+
release([folder])
|
|
187
|
+
await flushPromises()
|
|
188
|
+
expect(confirm(wrapper).attributes('disabled')).toBeUndefined()
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
it('does not confirm a folder after the host switches the same picker to single-file mode', async () => {
|
|
192
|
+
const wrapper = await setup()
|
|
193
|
+
await row(wrapper, folder.path).trigger('click')
|
|
194
|
+
await flushPromises()
|
|
195
|
+
await wrapper.setProps({ selectionMode: 'single-file' })
|
|
196
|
+
await flushPromises()
|
|
197
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
198
|
+
await confirm(wrapper).trigger('click')
|
|
199
|
+
expect(wrapper.emitted('select')).toBeUndefined()
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
it('system filter hides denied folders and skips their contents during folder selection', async () => {
|
|
203
|
+
const allowed: PickerNode = { ...file, path: 'allowed', name: 'allowed.raw', parentPath: folder.path }
|
|
204
|
+
const data = adapter()
|
|
205
|
+
vi.mocked(data.listChildren).mockImplementation(async (path) =>
|
|
206
|
+
path === folder.path ? [child, allowed] : [file],
|
|
207
|
+
)
|
|
208
|
+
const filter = vi.fn((node: PickerNode) => node.path !== child.path)
|
|
209
|
+
const wrapper = await setup(data, { systemFilter: filter })
|
|
210
|
+
await row(wrapper, folder.path).trigger('click')
|
|
211
|
+
await flushPromises()
|
|
212
|
+
expect(data.listChildren).not.toHaveBeenCalledWith(child.path, expect.anything())
|
|
213
|
+
await row(wrapper, folder.path).trigger('dblclick')
|
|
214
|
+
await flushPromises()
|
|
215
|
+
expect(row(wrapper, child.path)).toBeUndefined()
|
|
216
|
+
await confirm(wrapper).trigger('click')
|
|
217
|
+
expect(wrapper.emitted('select')?.[0]?.[0]).toMatchObject({ files: [allowed], excluded: [] })
|
|
218
|
+
expect(filter).toHaveBeenCalledWith(expect.objectContaining({ path: child.path }), 'server')
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
it('system filter applies to search results and restored or already selected files', async () => {
|
|
222
|
+
const data = adapter()
|
|
223
|
+
vi.mocked(data.listRoot).mockResolvedValue([file])
|
|
224
|
+
vi.mocked(data.search).mockResolvedValue([file])
|
|
225
|
+
const wrapper = await setup(data, { selectionMode: 'multi-file' })
|
|
226
|
+
await row(wrapper, file.path).trigger('click')
|
|
227
|
+
await flushPromises()
|
|
228
|
+
const deny = (node: PickerNode) => node.path !== file.path
|
|
229
|
+
await wrapper.setProps({ systemFilter: deny })
|
|
230
|
+
expect(row(wrapper, file.path)).toBeUndefined()
|
|
231
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
232
|
+
await wrapper.get('input[aria-label="Search folders and files"]').setValue('run')
|
|
233
|
+
await new Promise((resolve) => setTimeout(resolve, 250))
|
|
234
|
+
await flushPromises()
|
|
235
|
+
expect(data.search).toHaveBeenCalled()
|
|
236
|
+
expect(row(wrapper, file.path)).toBeUndefined()
|
|
237
|
+
await wrapper.setProps({ open: false, initialSelection: {
|
|
238
|
+
source: 'server', folders: [], files: [file], excluded: [],
|
|
239
|
+
} })
|
|
240
|
+
await wrapper.setProps({ open: true })
|
|
241
|
+
await flushPromises()
|
|
242
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
243
|
+
await confirm(wrapper).trigger('click')
|
|
244
|
+
expect(wrapper.emitted('select')).toBeUndefined()
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
it('system filter receives local source and prevents denied browser files from being confirmed', async () => {
|
|
248
|
+
const filter = vi.fn((node: PickerNode) => node.name !== 'private.raw')
|
|
249
|
+
const wrapper = await setup(adapter(), {
|
|
250
|
+
sources: ['localFile'], selectionMode: 'multi-file', systemFilter: filter,
|
|
251
|
+
})
|
|
252
|
+
const allowed = new File(['public'], 'public.raw')
|
|
253
|
+
const denied = new File(['private'], 'private.raw')
|
|
254
|
+
const input = wrapper.get('input[type="file"]')
|
|
255
|
+
Object.defineProperty(input.element, 'files', { value: [allowed, denied], configurable: true })
|
|
256
|
+
await input.trigger('change')
|
|
257
|
+
await flushPromises()
|
|
258
|
+
expect(wrapper.get('.mint-picker__receipt').text()).toContain('1 file')
|
|
259
|
+
expect(wrapper.text()).not.toContain('private.raw')
|
|
260
|
+
await confirm(wrapper).trigger('click')
|
|
261
|
+
expect(wrapper.emitted('select')?.[0]?.[0]).toEqual({ source: 'localFile', files: [allowed] })
|
|
262
|
+
expect(filter).toHaveBeenCalledWith(expect.objectContaining({ name: denied.name }), 'localFile')
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
it('reactive permission changes restore visible rows and resolve newly allowed selected subfolders', async () => {
|
|
266
|
+
const allowed = ref(false)
|
|
267
|
+
const data = adapter()
|
|
268
|
+
const wrapper = await setup(data, {
|
|
269
|
+
systemFilter: (node: PickerNode) => node.path !== child.path || allowed.value,
|
|
270
|
+
})
|
|
271
|
+
await row(wrapper, folder.path).trigger('click')
|
|
272
|
+
await flushPromises()
|
|
273
|
+
await row(wrapper, folder.path).trigger('dblclick')
|
|
274
|
+
await flushPromises()
|
|
275
|
+
expect(row(wrapper, child.path)).toBeUndefined()
|
|
276
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
277
|
+
allowed.value = true
|
|
278
|
+
await flushPromises()
|
|
279
|
+
expect(row(wrapper, child.path)).toBeDefined()
|
|
280
|
+
expect(confirm(wrapper).attributes('disabled')).toBeUndefined()
|
|
281
|
+
await confirm(wrapper).trigger('click')
|
|
282
|
+
expect(wrapper.emitted('select')?.[0]?.[0]).toMatchObject({ files: [file] })
|
|
283
|
+
allowed.value = false
|
|
284
|
+
await flushPromises()
|
|
285
|
+
expect(row(wrapper, child.path)).toBeUndefined()
|
|
286
|
+
expect(confirm(wrapper).attributes('disabled')).toBeDefined()
|
|
287
|
+
})
|