@morscherlab/mint-sdk 1.2.10 → 1.3.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (841) hide show
  1. package/README.md +45 -137
  2. package/dist/ResourcePickerListInternal-CFAw4vTZ.js +605 -0
  3. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
  4. package/dist/__stories__/experiment-helpers.d.ts +12 -1
  5. package/dist/__tests__/components/ScientificNumber.test.d.ts +1 -0
  6. package/dist/__tests__/components/SequenceInput.test.d.ts +1 -0
  7. package/dist/__tests__/components/Skeleton.test.d.ts +1 -0
  8. package/dist/__tests__/components/SmartGroupFieldRecipe.test.d.ts +1 -0
  9. package/dist/__tests__/components/SmartGroupModal.test.d.ts +1 -0
  10. package/dist/__tests__/components/StepWizard.test.d.ts +1 -0
  11. package/dist/__tests__/components/TimeRangeInput.test.d.ts +1 -0
  12. package/dist/__tests__/components/UnitInput.test.d.ts +1 -0
  13. package/dist/__tests__/components/WellPlate.keyboard.test.d.ts +1 -0
  14. package/dist/__tests__/components/WellPlate.sampleTypeIndicator.test.d.ts +1 -0
  15. package/dist/__tests__/composables/useChemicalFormula.test.d.ts +1 -0
  16. package/dist/__tests__/composables/useRackEditor.test.d.ts +1 -0
  17. package/dist/__tests__/composables/useSequenceUtils.test.d.ts +1 -0
  18. package/dist/__tests__/styles/baseControlsRules.test.d.ts +1 -0
  19. package/dist/__tests__/styles/controlRefreshRules.test.d.ts +1 -0
  20. package/dist/__tests__/styles/darkModeRules.test.d.ts +1 -0
  21. package/dist/__tests__/styles/menusShellRefresh.test.d.ts +1 -0
  22. package/dist/__tests__/templates/templatesDeprecation.test.d.ts +1 -0
  23. package/dist/__tests__/utils/plotlyTemplate.test.d.ts +1 -0
  24. package/dist/__tests__/utils/sampleTypeMarker.test.d.ts +1 -0
  25. package/dist/{analysisArtifactTypes-DQ0MjwHZ.js → analysisArtifactTypes-Cy3D0Ipg.js} +1 -1
  26. package/dist/{analysisArtifactTypes-DQ0MjwHZ.js.map → analysisArtifactTypes-Cy3D0Ipg.js.map} +1 -1
  27. package/dist/components/ActionMenu.vue.d.ts +17 -5
  28. package/dist/components/AdductText.vue.d.ts +3 -2
  29. package/dist/components/AlertBox.vue.d.ts +11 -14
  30. package/dist/components/AppAvatarMenu.vue.d.ts +18 -28
  31. package/dist/components/AppContainer.vue.d.ts +7 -11
  32. package/dist/components/AppLayout.vue.d.ts +11 -13
  33. package/dist/components/AppSidebar.vue.d.ts +30 -28
  34. package/dist/components/AppToastContainer.vue.d.ts +2 -1
  35. package/dist/components/AppTopBar.vue.d.ts +45 -44
  36. package/dist/components/ArtifactSaveDialog.vue.d.ts +3 -2
  37. package/dist/components/ArtifactSelectorModal.vue.d.ts +5 -6
  38. package/dist/components/AuditTrail.vue.d.ts +17 -18
  39. package/dist/components/AutoGroupModal.vue.d.ts +4 -3
  40. package/dist/components/Avatar.vue.d.ts +2 -1
  41. package/dist/components/BaseButton.vue.d.ts +11 -13
  42. package/dist/components/BaseCheckbox.vue.d.ts +7 -1
  43. package/dist/components/BaseInput.vue.d.ts +15 -2
  44. package/dist/components/BaseModal.vue.d.ts +20 -23
  45. package/dist/components/BasePill.vue.d.ts +10 -13
  46. package/dist/components/BaseRadioGroup.vue.d.ts +2 -1
  47. package/dist/components/BaseSelect.vue.d.ts +3 -2
  48. package/dist/components/BaseSlider.vue.d.ts +18 -1
  49. package/dist/components/BaseTabs.vue.d.ts +2 -1
  50. package/dist/components/BaseTextarea.vue.d.ts +2 -1
  51. package/dist/components/BaseToggle.vue.d.ts +2 -1
  52. package/dist/components/BatchProgressList.vue.d.ts +22 -26
  53. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +7 -14
  54. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +6 -13
  55. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +7 -14
  56. package/dist/components/BioTemplateRenderer.vue.d.ts +2 -1
  57. package/dist/components/Breadcrumb.vue.d.ts +13 -16
  58. package/dist/components/Calendar.vue.d.ts +21 -23
  59. package/dist/components/ChartContainer.vue.d.ts +19 -25
  60. package/dist/components/ChemicalFormula.vue.d.ts +7 -11
  61. package/dist/components/CollapsibleCard.vue.d.ts +7 -11
  62. package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -1
  63. package/dist/components/ConcentrationInput.vue.d.ts +2 -1
  64. package/dist/components/ConfirmDialog.vue.d.ts +10 -13
  65. package/dist/components/ControlWorkspaceView.vue.d.ts +9 -18
  66. package/dist/components/DataFrame.vue.d.ts +27 -24
  67. package/dist/components/DatePicker.vue.d.ts +3 -6
  68. package/dist/components/DateTimePicker.vue.d.ts +3 -6
  69. package/dist/components/Divider.vue.d.ts +3 -2
  70. package/dist/components/DoseCalculator.vue.d.ts +2 -1
  71. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +2 -1
  72. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +9 -18
  73. package/dist/components/EmptyState.vue.d.ts +9 -12
  74. package/dist/components/ExperimentCodeBadge.vue.d.ts +2 -1
  75. package/dist/components/ExperimentDataViewer.vue.d.ts +13 -15
  76. package/dist/components/ExperimentPopover.vue.d.ts +3 -5
  77. package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -4
  78. package/dist/components/ExperimentTimeline.vue.d.ts +13 -15
  79. package/dist/components/FilePicker.vue.d.ts +10 -5
  80. package/dist/components/FileUploader.vue.d.ts +8 -16
  81. package/dist/components/FitPanel.vue.d.ts +26 -16
  82. package/dist/components/FormActions.vue.d.ts +2 -1
  83. package/dist/components/FormBuilder.vue.d.ts +54 -250
  84. package/dist/components/FormField.vue.d.ts +14 -16
  85. package/dist/components/FormulaInput.vue.d.ts +2 -1
  86. package/dist/components/GeneratedPathInput.vue.d.ts +6 -5
  87. package/dist/components/GeneratedPlotlyResult.vue.d.ts +2 -1
  88. package/dist/components/GeneratedPluginView.vue.d.ts +2 -1
  89. package/dist/components/GeneratedResultRenderer.vue.d.ts +2 -1
  90. package/dist/components/GroupAssigner.vue.d.ts +2 -1
  91. package/dist/components/IconButton.vue.d.ts +7 -11
  92. package/dist/components/InstrumentStateBadge.vue.d.ts +4 -3
  93. package/dist/components/JobsStatusTray.vue.d.ts +13 -29
  94. package/dist/components/LayoutResizeHandle.vue.d.ts +2 -1
  95. package/dist/components/LoadingSpinner.vue.d.ts +2 -1
  96. package/dist/components/MobileSupportGate.vue.d.ts +5 -13
  97. package/dist/components/MoleculeInput.vue.d.ts +3 -4
  98. package/dist/components/MultiSelect.vue.d.ts +2 -1
  99. package/dist/components/NumberInput.vue.d.ts +2 -1
  100. package/dist/components/PlateEditor.vue.d.ts +147 -0
  101. package/dist/components/PlotlyChart.vue.d.ts +21 -31
  102. package/dist/components/PluginIcon.vue.d.ts +2 -1
  103. package/dist/components/PluginWorkspaceView.props.d.ts +2 -6
  104. package/dist/components/PluginWorkspaceView.vue.d.ts +23 -51
  105. package/dist/components/ProgressBar.vue.d.ts +4 -9
  106. package/dist/components/ProtocolStepEditor.vue.d.ts +7 -5
  107. package/dist/components/ProtocolStepParameterField.vue.d.ts +2 -1
  108. package/dist/components/ReagentEditor.vue.d.ts +2 -1
  109. package/dist/components/ReagentList.presentation.d.ts +2 -1
  110. package/dist/components/ReagentList.vue.d.ts +15 -17
  111. package/dist/components/ResourceCard.vue.d.ts +18 -17
  112. package/dist/components/RuntimeUpdateNotice.vue.d.ts +3 -2
  113. package/dist/components/SampleHierarchyTree.vue.d.ts +21 -15
  114. package/dist/components/SampleLegend.vue.d.ts +2 -1
  115. package/dist/components/SampleSelector.vue.d.ts +15 -21
  116. package/dist/components/SampleSelectorGroupNode.vue.d.ts +2 -1
  117. package/dist/components/SampleSelectorSampleRow.vue.d.ts +2 -5
  118. package/dist/components/ScheduleCalendar.vue.d.ts +34 -36
  119. package/dist/components/ScientificNumber.vue.d.ts +3 -2
  120. package/dist/components/SearchableSelect.vue.d.ts +14 -32
  121. package/dist/components/SecretInput.vue.d.ts +2 -1
  122. package/dist/components/SectionCard.vue.d.ts +13 -14
  123. package/dist/components/SegmentedControl.vue.d.ts +2 -1
  124. package/dist/components/SequenceInput.vue.d.ts +10 -21
  125. package/dist/components/SequenceProgressBar.vue.d.ts +2 -1
  126. package/dist/components/SettingsModal.schema.d.ts +1 -1
  127. package/dist/components/SettingsModal.vue.d.ts +28 -25
  128. package/dist/components/Skeleton.vue.d.ts +2 -1
  129. package/dist/components/SmartGroup.types.d.ts +2 -2
  130. package/dist/components/SmartGroupFieldRecipe.groups.d.ts +2 -0
  131. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +4 -7
  132. package/dist/components/SmartGroupManual.vue.d.ts +3 -2
  133. package/dist/components/SmartGroupModal.vue.d.ts +6 -4
  134. package/dist/components/StatusIndicator.vue.d.ts +2 -1
  135. package/dist/components/StepWizard.vue.d.ts +26 -27
  136. package/dist/components/TagsInput.vue.d.ts +3 -5
  137. package/dist/components/ThemeToggle.vue.d.ts +2 -1
  138. package/dist/components/TimePicker.vue.d.ts +6 -6
  139. package/dist/components/TimeRangeInput.vue.d.ts +9 -2
  140. package/dist/components/Tooltip.vue.d.ts +8 -18
  141. package/dist/components/UnitInput.vue.d.ts +2 -1
  142. package/dist/components/WellPlate.colors.d.ts +2 -4
  143. package/dist/components/WellPlate.rendering.d.ts +7 -1
  144. package/dist/components/WellPlate.sampleDrop.d.ts +2 -0
  145. package/dist/components/WellPlate.vue.d.ts +22 -39
  146. package/dist/components/index.d.ts +34 -31
  147. package/dist/components/index.js +5 -8
  148. package/dist/components/internal/ActionItemInternal.vue.d.ts +11 -13
  149. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +14 -23
  150. package/dist/components/internal/AppTopBarPillNavInternal.vue.d.ts +2 -1
  151. package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +2 -1
  152. package/dist/components/internal/DataStateInternal.vue.d.ts +7 -11
  153. package/dist/components/internal/{FilePickerTreeInternal.vue.d.ts → FilePickerListInternal.vue.d.ts} +9 -6
  154. package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +4 -3
  155. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +16 -18
  156. package/dist/components/internal/FormSectionRenderer.vue.d.ts +36 -32
  157. package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +8 -0
  158. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +65 -0
  159. package/dist/components/internal/SettingsPaneHeadInternal.vue.d.ts +15 -0
  160. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +12 -4
  161. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +6 -13
  162. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +19 -42
  163. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +9 -19
  164. package/dist/components/internal/filePickerPresentation.d.ts +8 -0
  165. package/dist/components/internal/generatedJobsApi.d.ts +9 -0
  166. package/dist/{components-Bbg_gtzF.js → components-GDDvof8D.js} +7088 -5955
  167. package/dist/components-GDDvof8D.js.map +1 -0
  168. package/dist/composables/controlSchemaTypes.d.ts +4 -43
  169. package/dist/composables/createFilePickerAdapter.d.ts +5 -1
  170. package/dist/composables/filePicker/usePickerNavigation.d.ts +7 -2
  171. package/dist/composables/index.d.ts +2 -13
  172. package/dist/composables/index.js +7 -11
  173. package/dist/composables/pluginWorkspaceModel.d.ts +1 -3
  174. package/dist/composables/useAutoGroup.d.ts +10 -0
  175. package/dist/composables/useBioTemplateComponents.d.ts +15 -3
  176. package/dist/composables/useBioTemplateControls.d.ts +5 -1
  177. package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
  178. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
  179. package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
  180. package/dist/composables/useChemicalFormula.d.ts +2 -1
  181. package/dist/composables/useDropdownState.d.ts +5 -0
  182. package/dist/composables/useExperimentSave.d.ts +5 -1
  183. package/dist/composables/useFileBrowser.d.ts +3 -2
  184. package/dist/composables/useFilePicker.d.ts +25 -13
  185. package/dist/composables/useFocusTrap.d.ts +2 -1
  186. package/dist/composables/useGroupAssignment.d.ts +5 -1
  187. package/dist/composables/useJobsStatusTray.d.ts +5 -5
  188. package/dist/composables/useMenuKeyboard.d.ts +3 -3
  189. package/dist/composables/usePlatformContext.d.ts +3 -0
  190. package/dist/composables/usePluginClient.d.ts +1 -1
  191. package/dist/composables/useRackEditor.d.ts +36 -1
  192. package/dist/composables/useSequenceUtils.d.ts +8 -0
  193. package/dist/composables/useTemplateCollection.d.ts +5 -1
  194. package/dist/composables/workspaceRecipes.d.ts +1 -0
  195. package/dist/composables-D6uqp0UF.js +591 -0
  196. package/dist/composables-D6uqp0UF.js.map +1 -0
  197. package/dist/{errors-BLuqMee5.js → experiment-DgllIc3I.js} +89 -333
  198. package/dist/experiment-DgllIc3I.js.map +1 -0
  199. package/dist/{experiment-utils-CV2Wza3z.js → experiment-utils-DTANyVKV.js} +68 -37
  200. package/dist/experiment-utils-DTANyVKV.js.map +1 -0
  201. package/dist/index.d.ts +2 -0
  202. package/dist/index.js +122 -17
  203. package/dist/index.js.map +1 -1
  204. package/dist/install.js +1 -2
  205. package/dist/install.js.map +1 -1
  206. package/dist/instrument.d.ts +6 -0
  207. package/dist/lcms.d.ts +11 -0
  208. package/dist/permissions.d.ts +2 -47
  209. package/dist/permissions.js +2 -26
  210. package/dist/permissions.js.map +1 -1
  211. package/dist/settings-BLr8lzw6.js +341 -0
  212. package/dist/settings-BLr8lzw6.js.map +1 -0
  213. package/dist/stores/auth.d.ts +2 -150
  214. package/dist/stores/experiment.d.ts +2 -106
  215. package/dist/stores/index.js +2 -2
  216. package/dist/stores/settings.d.ts +2 -44
  217. package/dist/styles.css +8608 -6950
  218. package/dist/tailwind.preset.js.map +1 -1
  219. package/dist/templates/adapters.d.ts +3 -0
  220. package/dist/templates/assayMatrixAdapters.d.ts +8 -1
  221. package/dist/templates/assayMatrixBuilder.d.ts +1 -0
  222. package/dist/templates/builderPresetControls.d.ts +1 -0
  223. package/dist/templates/calibrationCurveAdapters.d.ts +3 -0
  224. package/dist/templates/calibrationCurveBuilder.d.ts +1 -0
  225. package/dist/templates/catalog.d.ts +6 -2
  226. package/dist/templates/componentBindings.d.ts +31 -5
  227. package/dist/templates/componentPlateHelpers.d.ts +7 -1
  228. package/dist/templates/controlSchemas.d.ts +9 -0
  229. package/dist/templates/defaultBioTemplateBuilder.d.ts +1 -0
  230. package/dist/templates/doseResponseAdapters.d.ts +2 -0
  231. package/dist/templates/doseResponseBuilder.d.ts +1 -0
  232. package/dist/templates/elisaAssayCollectionBuilder.d.ts +1 -0
  233. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +1 -0
  234. package/dist/templates/flowCytometryPanelBuilder.d.ts +1 -0
  235. package/dist/templates/flowPanelAdapters.d.ts +3 -0
  236. package/dist/templates/index.d.ts +1 -1
  237. package/dist/templates/index.js +2 -3
  238. package/dist/templates/instrumentRunAdapters.d.ts +13 -2
  239. package/dist/templates/instrumentRunBuilder.d.ts +1 -0
  240. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +1 -0
  241. package/dist/templates/packs.d.ts +4 -0
  242. package/dist/templates/plateMapAdapters.d.ts +2 -0
  243. package/dist/templates/plateMapBuilder.d.ts +1 -0
  244. package/dist/templates/presets.d.ts +6 -2
  245. package/dist/templates/protocolAdapters.d.ts +4 -0
  246. package/dist/templates/protocolStepsBuilder.d.ts +1 -0
  247. package/dist/templates/qpcrAdapters.d.ts +4 -0
  248. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +1 -0
  249. package/dist/templates/qpcrPlateBuilder.d.ts +1 -0
  250. package/dist/templates/reagentAdapters.d.ts +4 -0
  251. package/dist/templates/reagentListBuilder.d.ts +1 -0
  252. package/dist/templates/samplePrepAdapters.d.ts +3 -0
  253. package/dist/templates/samplePrepBuilder.d.ts +1 -0
  254. package/dist/templates/sampleSheetAdapters.d.ts +4 -0
  255. package/dist/templates/sampleSheetBuilder.d.ts +1 -0
  256. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +1 -0
  257. package/dist/templates/templateEnvelopes.d.ts +8 -0
  258. package/dist/templates/templatePackCollectionBuilder.d.ts +1 -0
  259. package/dist/templates/templatePresetCollectionBuilder.d.ts +2 -0
  260. package/dist/templates/templateValidators.d.ts +12 -0
  261. package/dist/templates/timeCourseAdapters.d.ts +4 -0
  262. package/dist/templates/timeCourseBuilder.d.ts +1 -0
  263. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +1 -0
  264. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +1 -0
  265. package/dist/templates-BU1pet28.js +12304 -0
  266. package/dist/templates-BU1pet28.js.map +1 -0
  267. package/dist/types/auth.d.ts +0 -27
  268. package/dist/types/componentLabTypes.d.ts +14 -7
  269. package/dist/types/componentWorkflowTypes.d.ts +26 -0
  270. package/dist/types/components.d.ts +40 -17
  271. package/dist/types/fileBrowserTypes.d.ts +13 -0
  272. package/dist/types/filePicker.d.ts +19 -1
  273. package/dist/types/generated-ui.d.ts +13 -0
  274. package/dist/types/index.d.ts +4 -4
  275. package/dist/types/index.js +1 -1
  276. package/dist/types/instrument.d.ts +43 -15
  277. package/dist/types/platform.d.ts +2 -0
  278. package/dist/utils/color.d.ts +6 -1
  279. package/dist/utils/formModelSync.d.ts +1 -0
  280. package/dist/utils/plotlyTemplate.d.ts +3 -0
  281. package/dist/utils/rack.d.ts +16 -0
  282. package/dist/utils/sampleTypeMarker.d.ts +23 -0
  283. package/dist/{validation-ChMyixAf.js → validation-Dmp9Q5W0.js} +3032 -838
  284. package/dist/validation-Dmp9Q5W0.js.map +1 -0
  285. package/package.json +17 -23
  286. package/src/__stories__/experiment-helpers.ts +8 -4
  287. package/src/__tests__/components/ActionMenu.test.ts +66 -0
  288. package/src/__tests__/components/AlertBox.test.ts +21 -0
  289. package/src/__tests__/components/AppAvatarMenu.test.ts +25 -0
  290. package/src/__tests__/components/AppTopBar.test.ts +79 -0
  291. package/src/__tests__/components/AppTopBarPageSelector.test.ts +20 -0
  292. package/src/__tests__/components/AppTopBarPillNav.test.ts +74 -0
  293. package/src/__tests__/components/ArtifactSelectorModal.test.ts +20 -6
  294. package/src/__tests__/components/AuditTrail.test.ts +38 -0
  295. package/src/__tests__/components/BaseCheckbox.test.ts +43 -0
  296. package/src/__tests__/components/BaseInput.test.ts +43 -0
  297. package/src/__tests__/components/BaseModal.test.ts +90 -0
  298. package/src/__tests__/components/BaseRadioGroup.test.ts +8 -0
  299. package/src/__tests__/components/BaseSlider.test.ts +116 -0
  300. package/src/__tests__/components/BaseToggle.test.ts +7 -0
  301. package/src/__tests__/components/BatchProgressList.test.ts +22 -14
  302. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +4 -4
  303. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +1 -1
  304. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +8 -8
  305. package/src/__tests__/components/BioTemplateRenderer.test.ts +2 -2
  306. package/src/__tests__/components/Breadcrumb.test.ts +45 -0
  307. package/src/__tests__/components/CalendarGridPanel.test.ts +14 -0
  308. package/src/__tests__/components/ChartContainer.test.ts +23 -0
  309. package/src/__tests__/components/ChemicalFormula.test.ts +15 -0
  310. package/src/__tests__/components/CollapsibleCard.test.ts +12 -9
  311. package/src/__tests__/components/ComponentBindingRenderer.test.ts +45 -17
  312. package/src/__tests__/components/ConcentrationInput.test.ts +17 -2
  313. package/src/__tests__/components/DataFrame.test.ts +107 -4
  314. package/src/__tests__/components/DataStates.test.ts +0 -16
  315. package/src/__tests__/components/DatePicker.test.ts +10 -0
  316. package/src/__tests__/components/DoseCalculator.test.ts +47 -0
  317. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +37 -34
  318. package/src/__tests__/components/EmptyState.test.ts +16 -1
  319. package/src/__tests__/components/ExperimentSelectorModal.test.ts +31 -3
  320. package/src/__tests__/components/ExperimentTimeline.test.ts +45 -0
  321. package/src/__tests__/components/FilePicker.state.test.ts +2 -2
  322. package/src/__tests__/components/FilePicker.test.ts +360 -13
  323. package/src/__tests__/components/FileUploader.test.ts +15 -0
  324. package/src/__tests__/components/FitPanel.test.ts +96 -0
  325. package/src/__tests__/components/FormulaInput.test.ts +97 -0
  326. package/src/__tests__/components/GeneratedPathInput.test.ts +168 -41
  327. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +1 -1
  328. package/src/__tests__/components/GeneratedResultRenderer.test.ts +47 -2
  329. package/src/__tests__/components/InstrumentStateBadge.test.ts +50 -0
  330. package/src/__tests__/components/JobsStatusTray.test.ts +27 -0
  331. package/src/__tests__/components/MoleculeInput.test.ts +78 -0
  332. package/src/__tests__/components/MultiSelect.test.ts +6 -0
  333. package/src/__tests__/components/PlateEditor.test.ts +1134 -0
  334. package/src/__tests__/components/PlateEditorBindingInternal.test.ts +64 -0
  335. package/src/__tests__/components/PlotlyChart.test.ts +147 -1
  336. package/src/__tests__/components/ProgressBar.test.ts +18 -0
  337. package/src/__tests__/components/ProtocolStepEditor.test.ts +106 -18
  338. package/src/__tests__/components/ProtocolStepParameterField.test.ts +74 -29
  339. package/src/__tests__/components/ReagentList.presentation.test.ts +10 -5
  340. package/src/__tests__/components/ReagentList.test.ts +23 -0
  341. package/src/__tests__/components/ResourcePickerListInternal.test.ts +141 -0
  342. package/src/__tests__/components/RetiredStyles.test.ts +0 -6
  343. package/src/__tests__/components/SampleHierarchyTree.test.ts +102 -0
  344. package/src/__tests__/components/SampleLegend.test.ts +18 -0
  345. package/src/__tests__/components/SampleSelector.test.ts +92 -1
  346. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +5 -2
  347. package/src/__tests__/components/ScheduleCalendar.test.ts +32 -0
  348. package/src/__tests__/components/ScientificNumber.test.ts +113 -0
  349. package/src/__tests__/components/SearchableSelect.test.ts +21 -0
  350. package/src/__tests__/components/SecretInput.test.ts +6 -0
  351. package/src/__tests__/components/SegmentedControl.test.ts +14 -0
  352. package/src/__tests__/components/SequenceInput.test.ts +81 -0
  353. package/src/__tests__/components/SettingsModal.schema.test.ts +5 -5
  354. package/src/__tests__/components/SettingsModal.test.ts +371 -23
  355. package/src/__tests__/components/Skeleton.test.ts +23 -0
  356. package/src/__tests__/components/SmartGroupFieldRecipe.test.ts +12 -0
  357. package/src/__tests__/components/SmartGroupModal.test.ts +69 -0
  358. package/src/__tests__/components/StepWizard.test.ts +75 -0
  359. package/src/__tests__/components/TagsInput.test.ts +16 -0
  360. package/src/__tests__/components/TimePicker.test.ts +66 -0
  361. package/src/__tests__/components/TimeRangeInput.test.ts +83 -0
  362. package/src/__tests__/components/UnitInput.test.ts +147 -0
  363. package/src/__tests__/components/WellEditPopupInternal.test.ts +434 -2
  364. package/src/__tests__/components/WellPlate.decoration.test.ts +18 -0
  365. package/src/__tests__/components/WellPlate.geometry.test.ts +13 -0
  366. package/src/__tests__/components/WellPlate.interaction.test.ts +213 -0
  367. package/src/__tests__/components/WellPlate.keyboard.test.ts +24 -0
  368. package/src/__tests__/components/WellPlate.rendering.test.ts +38 -19
  369. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +19 -0
  370. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +58 -0
  371. package/src/__tests__/composables/createFilePickerAdapter.test.ts +114 -1
  372. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +1 -1
  373. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +1 -1
  374. package/src/__tests__/composables/useChemicalFormula.test.ts +60 -0
  375. package/src/__tests__/composables/useControlSchema.test.ts +15 -5
  376. package/src/__tests__/composables/useDropdownState.test.ts +20 -1
  377. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +52 -0
  378. package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
  379. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
  380. package/src/__tests__/composables/useRackEditor.test.ts +270 -0
  381. package/src/__tests__/composables/useSequenceUtils.test.ts +28 -0
  382. package/src/__tests__/docs/frontendDocsCatalog.test.ts +44 -9
  383. package/src/__tests__/styles/baseControlsRules.test.ts +115 -0
  384. package/src/__tests__/styles/controlRefreshRules.test.ts +218 -0
  385. package/src/__tests__/styles/cssTokens.test.ts +7 -5
  386. package/src/__tests__/styles/darkModeRules.test.ts +47 -0
  387. package/src/__tests__/styles/menusShellRefresh.test.ts +75 -0
  388. package/src/__tests__/templates/templates.test.ts +65 -15
  389. package/src/__tests__/templates/templatesDeprecation.test.ts +78 -0
  390. package/src/__tests__/utils/permissions.test.ts +0 -68
  391. package/src/__tests__/utils/plotlyTemplate.test.ts +69 -0
  392. package/src/__tests__/utils/sampleTypeMarker.test.ts +54 -0
  393. package/src/components/ActionMenu.vue +44 -23
  394. package/src/components/AdductText.story.vue +18 -0
  395. package/src/components/AdductText.vue +7 -1
  396. package/src/components/AlertBox.vue +3 -7
  397. package/src/components/AppAvatarMenu.vue +12 -10
  398. package/src/components/AppSidebar.vue +1 -1
  399. package/src/components/AppTopBar.story.vue +47 -4
  400. package/src/components/AppTopBar.vue +16 -22
  401. package/src/components/ArtifactSelectorModal.story.vue +1 -1
  402. package/src/components/ArtifactSelectorModal.vue +48 -160
  403. package/src/components/AuditTrail.vue +26 -12
  404. package/src/components/AutoGroupModal.vue +1 -1
  405. package/src/components/BaseCheckbox.story.vue +58 -2
  406. package/src/components/BaseCheckbox.vue +21 -3
  407. package/src/components/BaseInput.story.vue +51 -0
  408. package/src/components/BaseInput.vue +62 -1
  409. package/src/components/BaseModal.story.vue +55 -0
  410. package/src/components/BaseModal.vue +83 -50
  411. package/src/components/BaseRadioGroup.vue +1 -1
  412. package/src/components/BaseSlider.story.vue +36 -0
  413. package/src/components/BaseSlider.vue +56 -8
  414. package/src/components/BaseToggle.vue +1 -7
  415. package/src/components/BatchProgressList.vue +50 -52
  416. package/src/components/BioTemplatePresetWorkspaceView.vue +1 -1
  417. package/src/components/Breadcrumb.story.vue +1 -1
  418. package/src/components/Breadcrumb.vue +50 -15
  419. package/src/components/ChartContainer.story.vue +42 -0
  420. package/src/components/ChartContainer.vue +22 -1
  421. package/src/components/ChemicalFormula.story.vue +11 -11
  422. package/src/components/ChemicalFormula.vue +1 -0
  423. package/src/components/CollapsibleCard.vue +12 -32
  424. package/src/components/ComponentBindingRenderer.vue +6 -8
  425. package/src/components/ConcentrationInput.story.vue +1 -1
  426. package/src/components/ConcentrationInput.vue +8 -14
  427. package/src/components/ControlWorkspaceView.vue +1 -1
  428. package/src/components/DataFrame.story.vue +45 -2
  429. package/src/components/DataFrame.vue +28 -13
  430. package/src/components/DatePicker.story.vue +11 -0
  431. package/src/components/DatePicker.vue +5 -5
  432. package/src/components/DateTimePicker.story.vue +1 -1
  433. package/src/components/DateTimePicker.vue +8 -5
  434. package/src/components/Divider.story.vue +1 -1
  435. package/src/components/DoseCalculator.vue +44 -51
  436. package/src/components/DoseCalculatorVolumeField.vue +22 -35
  437. package/src/components/DoseDesignWorkspaceView.vue +1 -1
  438. package/src/components/EmptyState.story.vue +4 -4
  439. package/src/components/EmptyState.vue +4 -2
  440. package/src/components/ExperimentPopover.story.vue +2 -2
  441. package/src/components/ExperimentPopover.vue +6 -4
  442. package/src/components/ExperimentSelectorModal.story.vue +2 -1
  443. package/src/components/ExperimentSelectorModal.vue +91 -261
  444. package/src/components/ExperimentTimeline.story.vue +29 -0
  445. package/src/components/ExperimentTimeline.vue +20 -0
  446. package/src/components/FilePicker.story.vue +65 -10
  447. package/src/components/FilePicker.vue +203 -121
  448. package/src/components/FitPanel.story.vue +72 -6
  449. package/src/components/FitPanel.vue +70 -18
  450. package/src/components/FormField.vue +2 -0
  451. package/src/components/FormulaInput.story.vue +6 -0
  452. package/src/components/FormulaInput.vue +49 -70
  453. package/src/components/GeneratedPathInput.story.vue +121 -8
  454. package/src/components/GeneratedPathInput.vue +155 -86
  455. package/src/components/GeneratedPlotlyResult.vue +1 -1
  456. package/src/components/GeneratedPluginView.vue +4 -4
  457. package/src/components/GeneratedResultRenderer.vue +19 -0
  458. package/src/components/InstrumentStateBadge.story.vue +41 -0
  459. package/src/components/InstrumentStateBadge.vue +24 -14
  460. package/src/components/JobsStatusTray.vue +30 -8
  461. package/src/components/MoleculeInput.vue +12 -7
  462. package/src/components/MultiSelect.vue +3 -3
  463. package/src/components/PlateEditor.story.vue +333 -0
  464. package/src/components/PlateEditor.vue +793 -0
  465. package/src/components/PlotlyChart.story.vue +37 -1
  466. package/src/components/PlotlyChart.vue +86 -16
  467. package/src/components/PluginWorkspaceView.props.ts +1 -7
  468. package/src/components/PluginWorkspaceView.vue +0 -4
  469. package/src/components/ProgressBar.story.vue +0 -30
  470. package/src/components/ProgressBar.vue +3 -53
  471. package/src/components/ProtocolStepEditor.story.vue +8 -0
  472. package/src/components/ProtocolStepEditor.vue +55 -145
  473. package/src/components/ProtocolStepParameterField.vue +55 -93
  474. package/src/components/ReagentList.presentation.ts +7 -6
  475. package/src/components/ReagentList.vue +18 -17
  476. package/src/components/SampleHierarchyTree.story.vue +19 -0
  477. package/src/components/SampleHierarchyTree.vue +47 -14
  478. package/src/components/SampleLegend.vue +12 -4
  479. package/src/components/SampleSelector.story.vue +5 -1
  480. package/src/components/SampleSelector.vue +25 -15
  481. package/src/components/SampleSelectorGroupNode.vue +10 -20
  482. package/src/components/SampleSelectorSampleRow.vue +7 -18
  483. package/src/components/ScheduleCalendar.story.vue +14 -0
  484. package/src/components/ScheduleCalendar.vue +13 -1
  485. package/src/components/ScientificNumber.story.vue +15 -2
  486. package/src/components/ScientificNumber.vue +22 -26
  487. package/src/components/SearchableSelect.vue +14 -9
  488. package/src/components/SecretInput.vue +1 -1
  489. package/src/components/SegmentedControl.story.vue +23 -0
  490. package/src/components/SegmentedControl.vue +6 -1
  491. package/src/components/SequenceInput.story.vue +27 -5
  492. package/src/components/SequenceInput.vue +74 -29
  493. package/src/components/SequenceProgressBar.vue +0 -1
  494. package/src/components/SettingsModal.schema.ts +4 -2
  495. package/src/components/SettingsModal.story.vue +83 -22
  496. package/src/components/SettingsModal.vue +338 -79
  497. package/src/components/Skeleton.vue +6 -35
  498. package/src/components/SmartGroup.types.ts +2 -2
  499. package/src/components/SmartGroupFieldRecipe.groups.ts +4 -1
  500. package/src/components/SmartGroupFieldRecipe.vue +14 -8
  501. package/src/components/SmartGroupManual.vue +14 -11
  502. package/src/components/StepWizard.vue +16 -19
  503. package/src/components/TagsInput.story.vue +16 -11
  504. package/src/components/TagsInput.vue +20 -3
  505. package/src/components/TimePicker.story.vue +38 -3
  506. package/src/components/TimePicker.vue +26 -11
  507. package/src/components/TimeRangeInput.story.vue +50 -1
  508. package/src/components/TimeRangeInput.vue +36 -17
  509. package/src/components/UnitInput.story.vue +1 -1
  510. package/src/components/UnitInput.vue +173 -107
  511. package/src/components/WellPlate.colors.ts +7 -6
  512. package/src/components/WellPlate.geometry.ts +3 -0
  513. package/src/components/WellPlate.interaction.ts +39 -5
  514. package/src/components/WellPlate.rendering.ts +21 -27
  515. package/src/components/WellPlate.sampleDrop.ts +20 -12
  516. package/src/components/WellPlate.story.vue +18 -7
  517. package/src/components/WellPlate.vue +28 -22
  518. package/src/components/index.ts +34 -31
  519. package/src/components/internal/AppTopBarPageSelectorInternal.vue +13 -7
  520. package/src/components/internal/AppTopBarPillNavInternal.vue +12 -7
  521. package/src/components/internal/CalendarGridPanelInternal.vue +1 -1
  522. package/src/components/internal/FilePickerListInternal.vue +318 -0
  523. package/src/components/internal/FilePickerPreviewInternal.vue +54 -52
  524. package/src/components/internal/PlateEditorBindingInternal.vue +37 -0
  525. package/src/components/internal/ResourcePickerListInternal.vue +237 -0
  526. package/src/components/internal/SettingsPaneHeadInternal.vue +41 -0
  527. package/src/components/internal/WellEditPopupInternal.vue +219 -146
  528. package/src/components/internal/WorkspaceShellInternal.vue +0 -6
  529. package/src/components/internal/filePickerPresentation.ts +30 -0
  530. package/src/components/internal/generatedJobsApi.ts +12 -0
  531. package/src/composables/autoGroup/index.ts +3 -0
  532. package/src/composables/controlSchemaAdapters.ts +0 -4
  533. package/src/composables/controlSchemaFormFields.ts +0 -4
  534. package/src/composables/controlSchemaTypes.ts +4 -43
  535. package/src/composables/createFilePickerAdapter.ts +90 -22
  536. package/src/composables/filePicker/localFiles.ts +1 -0
  537. package/src/composables/filePicker/usePickerNavigation.ts +29 -2
  538. package/src/composables/index.ts +2 -71
  539. package/src/composables/pluginWorkspaceModel.ts +0 -3
  540. package/src/composables/useAutoGroup.ts +10 -0
  541. package/src/composables/useBioTemplateComponents.ts +15 -3
  542. package/src/composables/useBioTemplateControls.ts +5 -1
  543. package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
  544. package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
  545. package/src/composables/useBioTemplateWorkspace.ts +5 -1
  546. package/src/composables/useChemicalFormula.ts +39 -13
  547. package/src/composables/useDropdownState.ts +6 -1
  548. package/src/composables/useExperimentSave.ts +5 -1
  549. package/src/composables/useFileBrowser.ts +3 -2
  550. package/src/composables/useFilePicker.ts +98 -13
  551. package/src/composables/useFocusTrap.ts +9 -6
  552. package/src/composables/useGeneratedAnalysis.ts +38 -0
  553. package/src/composables/useGroupAssignment.ts +5 -1
  554. package/src/composables/useJobsStatusTray.ts +5 -5
  555. package/src/composables/useMenuKeyboard.ts +5 -3
  556. package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
  557. package/src/composables/usePluginClient.ts +1 -1
  558. package/src/composables/usePluginWorkspace.ts +0 -1
  559. package/src/composables/useRackEditor.ts +202 -12
  560. package/src/composables/useSequenceUtils.ts +20 -2
  561. package/src/composables/useTemplateCollection.ts +5 -1
  562. package/src/composables/workspaceRecipes.ts +1 -0
  563. package/src/index.ts +9 -3
  564. package/src/instrument.ts +6 -0
  565. package/src/lcms.ts +11 -0
  566. package/src/permissions.ts +2 -59
  567. package/src/styles/components/action-menu.css +9 -38
  568. package/src/styles/components/adduct-text.css +15 -3
  569. package/src/styles/components/alert-box.css +19 -70
  570. package/src/styles/components/app-avatar-menu.css +22 -57
  571. package/src/styles/components/app-container.css +4 -4
  572. package/src/styles/components/app-layout.css +18 -18
  573. package/src/styles/components/app-page-selector.css +50 -105
  574. package/src/styles/components/app-pill-nav.css +24 -42
  575. package/src/styles/components/app-sidebar.css +2 -2
  576. package/src/styles/components/app-top-bar.css +78 -55
  577. package/src/styles/components/artifact-selector-modal.css +1 -211
  578. package/src/styles/components/audit-trail.css +45 -38
  579. package/src/styles/components/avatar.css +1 -1
  580. package/src/styles/components/batch-progress-list.css +179 -95
  581. package/src/styles/components/breadcrumb.css +34 -15
  582. package/src/styles/components/calendar.css +2 -8
  583. package/src/styles/components/chart-container.css +81 -38
  584. package/src/styles/components/checkbox.css +8 -6
  585. package/src/styles/components/chemical-formula.css +8 -6
  586. package/src/styles/components/collapsible-card.css +6 -46
  587. package/src/styles/components/concentration-input.css +1 -10
  588. package/src/styles/components/dataframe.css +48 -67
  589. package/src/styles/components/date-picker.css +124 -62
  590. package/src/styles/components/datetime-picker.css +81 -47
  591. package/src/styles/components/divider.css +2 -4
  592. package/src/styles/components/dose-calculator.css +9 -135
  593. package/src/styles/components/empty-state.css +26 -35
  594. package/src/styles/components/experiment-code-badge.css +1 -1
  595. package/src/styles/components/experiment-popover.css +16 -83
  596. package/src/styles/components/experiment-selector-modal.css +9 -226
  597. package/src/styles/components/experiment-timeline.css +120 -50
  598. package/src/styles/components/file-picker.css +323 -299
  599. package/src/styles/components/file-uploader.css +4 -6
  600. package/src/styles/components/fit-panel.css +108 -22
  601. package/src/styles/components/form-field.css +6 -4
  602. package/src/styles/components/formula-input.css +121 -48
  603. package/src/styles/components/group-assigner.css +1 -3
  604. package/src/styles/components/icon-button.css +15 -37
  605. package/src/styles/components/input.css +91 -2
  606. package/src/styles/components/instrument-monitor.css +37 -447
  607. package/src/styles/components/jobs-status-tray.css +82 -61
  608. package/src/styles/components/loading-spinner.css +18 -0
  609. package/src/styles/components/mobile-support-gate.css +15 -17
  610. package/src/styles/components/modal.css +44 -33
  611. package/src/styles/components/molecule-input.css +31 -16
  612. package/src/styles/components/multi-select.css +33 -29
  613. package/src/styles/components/number-input.css +1 -1
  614. package/src/styles/components/plate-editor.css +497 -0
  615. package/src/styles/components/popover.css +162 -0
  616. package/src/styles/components/progress-bar.css +1 -70
  617. package/src/styles/components/protocol-step-editor.css +21 -333
  618. package/src/styles/components/radio-group.css +9 -18
  619. package/src/styles/components/reagent-editor.css +3 -7
  620. package/src/styles/components/reagent-list.css +63 -69
  621. package/src/styles/components/resource-card.css +4 -6
  622. package/src/styles/components/resource-picker-list.css +212 -0
  623. package/src/styles/components/sample-hierarchy-tree.css +83 -65
  624. package/src/styles/components/sample-legend.css +18 -7
  625. package/src/styles/components/sample-selector.css +41 -68
  626. package/src/styles/components/schedule-calendar.css +59 -54
  627. package/src/styles/components/scientific-number.css +72 -18
  628. package/src/styles/components/searchable-select.css +17 -26
  629. package/src/styles/components/secret-input.css +20 -23
  630. package/src/styles/components/section-card.css +3 -5
  631. package/src/styles/components/segmented-control.css +14 -1
  632. package/src/styles/components/select.css +19 -8
  633. package/src/styles/components/sequence-input.css +85 -37
  634. package/src/styles/components/sequence-progress-bar.css +18 -37
  635. package/src/styles/components/settings-modal.css +683 -34
  636. package/src/styles/components/skeleton.css +24 -23
  637. package/src/styles/components/slider.css +74 -8
  638. package/src/styles/components/smart-group.css +27 -39
  639. package/src/styles/components/status-indicator.css +1 -1
  640. package/src/styles/components/step-wizard.css +62 -99
  641. package/src/styles/components/tabs.css +2 -6
  642. package/src/styles/components/tags-input.css +64 -54
  643. package/src/styles/components/textarea.css +2 -2
  644. package/src/styles/components/time-picker.css +67 -38
  645. package/src/styles/components/time-range-input.css +16 -18
  646. package/src/styles/components/toast.css +1 -1
  647. package/src/styles/components/toggle.css +21 -31
  648. package/src/styles/components/tooltip.css +13 -15
  649. package/src/styles/components/unit-input.css +86 -36
  650. package/src/styles/components/well-edit-popup.css +111 -189
  651. package/src/styles/components/well-plate.css +7 -7
  652. package/src/styles/index.css +5 -7
  653. package/src/styles/variables.css +35 -7
  654. package/src/templates/adapters.ts +4 -0
  655. package/src/templates/assayMatrixAdapters.ts +8 -1
  656. package/src/templates/assayMatrixBuilder.ts +1 -0
  657. package/src/templates/builderPresetControls.ts +1 -0
  658. package/src/templates/calibrationCurveAdapters.ts +3 -0
  659. package/src/templates/calibrationCurveBuilder.ts +1 -0
  660. package/src/templates/catalog.ts +6 -2
  661. package/src/templates/componentBindingCatalog.ts +1 -1
  662. package/src/templates/componentBindings.ts +31 -5
  663. package/src/templates/componentDoseResponseProps.ts +0 -1
  664. package/src/templates/componentPlateHelpers.ts +22 -1
  665. package/src/templates/componentPlateMapProps.ts +7 -5
  666. package/src/templates/componentQpcrPlateProps.ts +0 -1
  667. package/src/templates/controlSchemas.ts +9 -0
  668. package/src/templates/defaultBioTemplateBuilder.ts +1 -0
  669. package/src/templates/doseResponseAdapters.ts +2 -0
  670. package/src/templates/doseResponseBuilder.ts +1 -0
  671. package/src/templates/elisaAssayCollectionBuilder.ts +1 -0
  672. package/src/templates/flowCytometryAssayCollectionBuilder.ts +1 -0
  673. package/src/templates/flowCytometryPanelBuilder.ts +1 -0
  674. package/src/templates/flowPanelAdapters.ts +3 -0
  675. package/src/templates/index.ts +4 -0
  676. package/src/templates/instrumentRunAdapters.ts +13 -2
  677. package/src/templates/instrumentRunBuilder.ts +1 -0
  678. package/src/templates/lcmsBatchCollectionBuilder.ts +1 -0
  679. package/src/templates/packs.ts +4 -0
  680. package/src/templates/plateMapAdapters.ts +2 -0
  681. package/src/templates/plateMapBuilder.ts +1 -0
  682. package/src/templates/presets.ts +6 -2
  683. package/src/templates/protocolAdapters.ts +4 -0
  684. package/src/templates/protocolStepsBuilder.ts +1 -0
  685. package/src/templates/qpcrAdapters.ts +4 -0
  686. package/src/templates/qpcrExpressionCollectionBuilder.ts +1 -0
  687. package/src/templates/qpcrPlateBuilder.ts +1 -0
  688. package/src/templates/reagentAdapters.ts +4 -0
  689. package/src/templates/reagentListBuilder.ts +1 -0
  690. package/src/templates/samplePrepAdapters.ts +3 -0
  691. package/src/templates/samplePrepBuilder.ts +1 -0
  692. package/src/templates/sampleSheetAdapters.ts +4 -0
  693. package/src/templates/sampleSheetBuilder.ts +1 -0
  694. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +1 -0
  695. package/src/templates/templateEnvelopes.ts +8 -0
  696. package/src/templates/templatePackCollectionBuilder.ts +1 -0
  697. package/src/templates/templatePresetCollectionBuilder.ts +2 -0
  698. package/src/templates/templateValidators.ts +12 -0
  699. package/src/templates/timeCourseAdapters.ts +4 -0
  700. package/src/templates/timeCourseBuilder.ts +1 -0
  701. package/src/templates/wellPlateScreenCollectionBuilder.ts +1 -0
  702. package/src/templates/westernBlotAssayCollectionBuilder.ts +1 -0
  703. package/src/types/auth.ts +0 -37
  704. package/src/types/componentLabTypes.ts +16 -13
  705. package/src/types/componentWorkflowTypes.ts +29 -0
  706. package/src/types/components.ts +43 -20
  707. package/src/types/fileBrowserTypes.ts +15 -0
  708. package/src/types/filePicker.ts +19 -1
  709. package/src/types/generated-ui.ts +15 -0
  710. package/src/types/index.ts +12 -11
  711. package/src/types/instrument.ts +47 -15
  712. package/src/types/platform.ts +2 -0
  713. package/src/utils/color.ts +16 -1
  714. package/src/utils/formModelSync.ts +1 -1
  715. package/src/utils/plotlyTemplate.ts +39 -0
  716. package/src/utils/rack.ts +16 -0
  717. package/src/utils/sampleTypeMarker.ts +44 -0
  718. package/dist/ExperimentPopover-CJdNlCZb.js +0 -451
  719. package/dist/ExperimentPopover-CJdNlCZb.js.map +0 -1
  720. package/dist/ExperimentSelectorModal-DHE9k8TP.js +0 -507
  721. package/dist/ExperimentSelectorModal-DHE9k8TP.js.map +0 -1
  722. package/dist/SettingsModal-DELMkUFR.js +0 -492
  723. package/dist/SettingsModal-DELMkUFR.js.map +0 -1
  724. package/dist/Skeleton-jhF9wUkU.js +0 -485
  725. package/dist/Skeleton-jhF9wUkU.js.map +0 -1
  726. package/dist/__tests__/composables/usePluginConfig.test.d.ts +0 -15
  727. package/dist/chunk-BoAXSpZd.js +0 -33
  728. package/dist/components/AppPluginSwitcher.vue.d.ts +0 -40
  729. package/dist/components/ColorSlider.vue.d.ts +0 -34
  730. package/dist/components/DropdownButton.vue.d.ts +0 -49
  731. package/dist/components/FileBrowserModal.vue.d.ts +0 -99
  732. package/dist/components/InstrumentAlertLog.vue.d.ts +0 -22
  733. package/dist/components/InstrumentStatusCard.vue.d.ts +0 -13
  734. package/dist/components/LcmsSequenceTable.vue.d.ts +0 -54
  735. package/dist/components/PlateMapEditor.vue.d.ts +0 -50
  736. package/dist/components/RackEditor.vue.d.ts +0 -78
  737. package/dist/components/fileBrowserPresentation.d.ts +0 -10
  738. package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +0 -34
  739. package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +0 -25
  740. package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +0 -26
  741. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +0 -28
  742. package/dist/components-Bbg_gtzF.js.map +0 -1
  743. package/dist/composables/useAsync.d.ts +0 -132
  744. package/dist/composables/useAuth.d.ts +0 -47
  745. package/dist/composables/useCommandHistory.d.ts +0 -33
  746. package/dist/composables/useOptimisticMutation.d.ts +0 -32
  747. package/dist/composables/usePasskey.d.ts +0 -10
  748. package/dist/composables/usePluginConfig.d.ts +0 -27
  749. package/dist/composables/useResourceCrud.d.ts +0 -44
  750. package/dist/composables/useWellPainting.d.ts +0 -39
  751. package/dist/composables/useWellPlateAdapter.d.ts +0 -40
  752. package/dist/composables/useWellPlateEditor.d.ts +0 -33
  753. package/dist/composables/useWellPlateValidation.d.ts +0 -31
  754. package/dist/composables-BCbYb2lA.js +0 -2356
  755. package/dist/composables-BCbYb2lA.js.map +0 -1
  756. package/dist/errors-BLuqMee5.js.map +0 -1
  757. package/dist/experiment-CVDRAnqp.js +0 -90
  758. package/dist/experiment-CVDRAnqp.js.map +0 -1
  759. package/dist/experiment-utils-CV2Wza3z.js.map +0 -1
  760. package/dist/plotly.min-c2Sez60c.js +0 -180634
  761. package/dist/plotly.min-c2Sez60c.js.map +0 -1
  762. package/dist/templates-NuaNHohp.js +0 -5260
  763. package/dist/templates-NuaNHohp.js.map +0 -1
  764. package/dist/useControlSchema-vLiRPUmj.js +0 -7301
  765. package/dist/useControlSchema-vLiRPUmj.js.map +0 -1
  766. package/dist/useDropdownState-C7hRiVQf.js +0 -63
  767. package/dist/useDropdownState-C7hRiVQf.js.map +0 -1
  768. package/dist/useExperimentSelector-G_CAOFTX.js +0 -328
  769. package/dist/useExperimentSelector-G_CAOFTX.js.map +0 -1
  770. package/dist/useFormBuilder-D37ajgS8.js +0 -729
  771. package/dist/useFormBuilder-D37ajgS8.js.map +0 -1
  772. package/dist/validation-ChMyixAf.js.map +0 -1
  773. package/src/__tests__/components/AppPluginSwitcher.test.ts +0 -44
  774. package/src/__tests__/components/DropdownButton.test.ts +0 -628
  775. package/src/__tests__/components/FileBrowserModal.test.ts +0 -460
  776. package/src/__tests__/components/InstrumentAlertLog.test.ts +0 -59
  777. package/src/__tests__/components/LcmsSequenceTable.test.ts +0 -79
  778. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +0 -54
  779. package/src/__tests__/components/RackEditor.test.ts +0 -169
  780. package/src/__tests__/composables/useAuth.test.ts +0 -233
  781. package/src/__tests__/composables/useCommandHistory.test.ts +0 -43
  782. package/src/__tests__/composables/useOptimisticMutation.test.ts +0 -40
  783. package/src/__tests__/composables/usePluginConfig.test.ts +0 -497
  784. package/src/__tests__/composables/useResourceCrud.test.ts +0 -56
  785. package/src/__tests__/composables/useWellPainting.test.ts +0 -52
  786. package/src/__tests__/composables/useWellPlateAdapter.test.ts +0 -50
  787. package/src/__tests__/composables/useWellPlateValidation.test.ts +0 -42
  788. package/src/components/AppPluginSwitcher.story.vue +0 -87
  789. package/src/components/AppPluginSwitcher.vue +0 -134
  790. package/src/components/ColorSlider.story.vue +0 -120
  791. package/src/components/ColorSlider.vue +0 -160
  792. package/src/components/DropdownButton.story.vue +0 -102
  793. package/src/components/DropdownButton.vue +0 -181
  794. package/src/components/FileBrowserModal.story.vue +0 -203
  795. package/src/components/FileBrowserModal.vue +0 -384
  796. package/src/components/InstrumentAlertLog.vue +0 -187
  797. package/src/components/InstrumentStatusCard.vue +0 -184
  798. package/src/components/LcmsSequenceTable.vue +0 -222
  799. package/src/components/PlateMapEditor.story.vue +0 -92
  800. package/src/components/PlateMapEditor.vue +0 -423
  801. package/src/components/RackEditor.story.vue +0 -100
  802. package/src/components/RackEditor.vue +0 -429
  803. package/src/components/fileBrowserPresentation.ts +0 -39
  804. package/src/components/internal/FileBrowserDialogInternal.vue +0 -75
  805. package/src/components/internal/FileBrowserListingInternal.vue +0 -197
  806. package/src/components/internal/FileBrowserToolbarInternal.vue +0 -136
  807. package/src/components/internal/FilePickerTreeInternal.vue +0 -238
  808. package/src/components/internal/PlateMapEditorToolbarInternal.vue +0 -128
  809. package/src/composables/useAsync.ts +0 -327
  810. package/src/composables/useAuth.ts +0 -458
  811. package/src/composables/useCommandHistory.ts +0 -117
  812. package/src/composables/useOptimisticMutation.ts +0 -97
  813. package/src/composables/usePasskey.ts +0 -216
  814. package/src/composables/usePluginConfig.ts +0 -252
  815. package/src/composables/useResourceCrud.ts +0 -235
  816. package/src/composables/useWellPainting.ts +0 -167
  817. package/src/composables/useWellPlateAdapter.ts +0 -151
  818. package/src/composables/useWellPlateEditor.ts +0 -415
  819. package/src/composables/useWellPlateValidation.ts +0 -89
  820. package/src/plotly-dist.d.ts +0 -3
  821. package/src/styles/components/app-plugin-switcher.css +0 -196
  822. package/src/styles/components/color-slider.css +0 -110
  823. package/src/styles/components/dropdown-button.css +0 -280
  824. package/src/styles/components/file-browser-modal.css +0 -489
  825. package/src/styles/components/lcms-sequence-table.css +0 -204
  826. package/src/styles/components/plate-map-editor.css +0 -464
  827. package/src/styles/components/rack-editor.css +0 -287
  828. /package/dist/__tests__/components/{AppPluginSwitcher.test.d.ts → AlertBox.test.d.ts} +0 -0
  829. /package/dist/__tests__/components/{DropdownButton.test.d.ts → AuditTrail.test.d.ts} +0 -0
  830. /package/dist/__tests__/components/{FileBrowserModal.test.d.ts → BaseCheckbox.test.d.ts} +0 -0
  831. /package/dist/__tests__/components/{InstrumentAlertLog.test.d.ts → BaseSlider.test.d.ts} +0 -0
  832. /package/dist/__tests__/components/{LcmsSequenceTable.test.d.ts → DoseCalculator.test.d.ts} +0 -0
  833. /package/dist/__tests__/components/{PlateMapEditorToolbarInternal.test.d.ts → FileUploader.test.d.ts} +0 -0
  834. /package/dist/__tests__/components/{RackEditor.test.d.ts → FitPanel.test.d.ts} +0 -0
  835. /package/dist/__tests__/{composables/useAuth.test.d.ts → components/FormulaInput.test.d.ts} +0 -0
  836. /package/dist/__tests__/{composables/useCommandHistory.test.d.ts → components/InstrumentStateBadge.test.d.ts} +0 -0
  837. /package/dist/__tests__/{composables/useOptimisticMutation.test.d.ts → components/MoleculeInput.test.d.ts} +0 -0
  838. /package/dist/__tests__/{composables/useResourceCrud.test.d.ts → components/PlateEditor.test.d.ts} +0 -0
  839. /package/dist/__tests__/{composables/useWellPainting.test.d.ts → components/PlateEditorBindingInternal.test.d.ts} +0 -0
  840. /package/dist/__tests__/{composables/useWellPlateAdapter.test.d.ts → components/ResourcePickerListInternal.test.d.ts} +0 -0
  841. /package/dist/__tests__/{composables/useWellPlateValidation.test.d.ts → components/SampleLegend.test.d.ts} +0 -0
@@ -1,51 +1,70 @@
1
1
  <script setup lang="ts">
2
- import { computed, ref, watch } from 'vue'
2
+ import { computed, inject, ref, watch } from 'vue'
3
3
 
4
+ import { mintApiErrorFromResponse } from '../apiErrors'
5
+ import { formatExperimentDate } from '../composables/experiment-utils'
4
6
  import { createGeneratedAnalysisTransport } from '../composables/useGeneratedAnalysis'
5
7
  import {
6
8
  getInjectedPlatformContext,
7
9
  resolveCurrentExperimentId,
8
10
  } from '../composables/platformContextHelpers'
9
- import type { AnalysisArtifactDetail } from '../types/analysisArtifactTypes'
10
- import type { PluginJobPathInput } from '../types/generated-ui'
11
- import AlertBox from './AlertBox.vue'
12
- import ArtifactSelectorModal from './ArtifactSelectorModal.vue'
11
+ import type { AnalysisArtifactSummary } from '../types/analysisArtifactTypes'
12
+ import type {
13
+ PluginJobArtifactPathInput,
14
+ PluginJobPathInput,
15
+ PluginJobPathSelection,
16
+ } from '../types/generated-ui'
13
17
  import BaseButton from './BaseButton.vue'
18
+ import BaseModal from './BaseModal.vue'
14
19
  import FileUploader from './FileUploader.vue'
20
+ import { GENERATED_JOBS_API_KEY } from './internal/generatedJobsApi'
21
+ import ResourcePickerListInternal from './internal/ResourcePickerListInternal.vue'
15
22
 
16
- interface ArtifactFileReference {
17
- key: string
18
- plugin_id?: string
19
- experiment_id?: number
20
- filename?: string
21
- content_type?: string
23
+ /** A file artifact the plugin's jobs API says this Path input may use. */
24
+ interface ReadableArtifact extends AnalysisArtifactSummary {
25
+ filename: string
22
26
  }
23
27
 
24
28
  const props = defineProps<{
25
- modelValue?: PluginJobPathInput | PluginJobPathInput[] | null
29
+ modelValue?: PluginJobPathSelection | PluginJobPathSelection[] | null
26
30
  disabled?: boolean
27
31
  multiple?: boolean
28
32
  }>()
29
33
 
30
34
  const emit = defineEmits<{
31
- 'update:modelValue': [value: PluginJobPathInput | PluginJobPathInput[] | null]
35
+ 'update:modelValue': [value: PluginJobPathSelection | PluginJobPathSelection[] | null]
32
36
  }>()
33
37
 
34
38
  const mode = ref<'file' | 'folder'>('file')
35
39
  const selections = computed(() => Array.isArray(props.modelValue)
36
40
  ? props.modelValue
37
41
  : props.modelValue ? [props.modelValue] : [])
38
- const selectedFiles = computed(() => selections.value.flatMap(selection => selection.files))
39
- watch(selections, (current) => {
42
+ const uploads = computed(() => selections.value.filter(
43
+ (selection): selection is PluginJobPathInput => selection.kind === 'path',
44
+ ))
45
+ const artifacts = computed(() => selections.value.filter(
46
+ (selection): selection is PluginJobArtifactPathInput => selection.kind === 'artifact-path',
47
+ ))
48
+ const selectedFiles = computed(() => uploads.value.flatMap(selection => selection.files))
49
+ watch(uploads, (current) => {
40
50
  if (current.length) mode.value = current.every(selection => selection.rootName) ? 'folder' : 'file'
41
51
  }, { immediate: true })
42
52
  const artifactOpen = ref(false)
53
+ const artifactSearch = ref('')
54
+ const artifactRows = ref<ReadableArtifact[]>([])
43
55
  const artifactLoading = ref(false)
44
- const artifactError = ref('')
56
+ const artifactError = ref<string | null>(null)
45
57
  const platform = getInjectedPlatformContext()
46
58
  const experimentId = resolveCurrentExperimentId(platform)
47
- const canSelectArtifact = computed(() => Boolean(platform?.isIntegrated && experimentId))
48
- const transport = createGeneratedAnalysisTransport()
59
+ const jobsApi = inject(GENERATED_JOBS_API_KEY, null)
60
+ const canSelectArtifact = computed(() => Boolean(platform?.isIntegrated && experimentId && jobsApi))
61
+ const visibleArtifactRows = computed(() => {
62
+ const query = artifactSearch.value.trim().toLowerCase()
63
+ return query
64
+ ? artifactRows.value.filter(row => [row.display_name, row.artifact_key, row.filename, row.plugin_id]
65
+ .some(text => text.toLowerCase().includes(query)))
66
+ : artifactRows.value
67
+ })
49
68
 
50
69
  function selectMode(nextMode: 'file' | 'folder'): void {
51
70
  mode.value = nextMode
@@ -58,7 +77,7 @@ function selectFiles(
58
77
  relativePaths?: string[],
59
78
  ): void {
60
79
  const paths = relativePaths ?? files.map(file => file.name)
61
- const selections: PluginJobPathInput[] = props.multiple && !rootName
80
+ const added: PluginJobPathInput[] = props.multiple && !rootName
62
81
  ? files.map((file, index) => ({
63
82
  kind: 'path',
64
83
  files: [file],
@@ -70,17 +89,13 @@ function selectFiles(
70
89
  relativePaths: paths,
71
90
  ...(rootName ? { rootName } : {}),
72
91
  }]
73
- if (props.multiple) {
74
- const existing = Array.isArray(props.modelValue) ? props.modelValue : []
75
- emit('update:modelValue', [...existing, ...selections])
76
- } else {
77
- emit('update:modelValue', selections[0] ?? null)
78
- }
92
+ emitSelections(props.multiple ? [...selections.value, ...added] : added)
79
93
  }
80
94
 
81
95
  function removeFiles(files: File[]): void {
82
96
  const removed = new Set(files)
83
- const remaining = selections.value.flatMap((selection) => {
97
+ emitSelections(selections.value.flatMap((selection): PluginJobPathSelection[] => {
98
+ if (selection.kind !== 'path') return [selection]
84
99
  const indexes = selection.files
85
100
  .map((file, index) => removed.has(file) ? -1 : index)
86
101
  .filter(index => index >= 0)
@@ -90,68 +105,72 @@ function removeFiles(files: File[]): void {
90
105
  files: indexes.map(index => selection.files[index]!),
91
106
  relativePaths: indexes.map(index => selection.relativePaths[index]!),
92
107
  }]
93
- })
94
- emit(
95
- 'update:modelValue',
96
- props.multiple ? remaining : remaining[0] ?? null,
97
- )
108
+ }))
109
+ }
110
+
111
+ function removeArtifact(artifact: PluginJobArtifactPathInput): void {
112
+ emitSelections(selections.value.filter(selection => selection !== artifact))
98
113
  }
99
114
 
100
- async function selectArtifact(detail: AnalysisArtifactDetail): Promise<void> {
115
+ function emitSelections(next: PluginJobPathSelection[]): void {
116
+ emit('update:modelValue', props.multiple ? next : next[0] ?? null)
117
+ }
118
+
119
+ // The plugin lists exactly the artifacts its staging route accepts (same
120
+ // readers and visibility rule), so a pick never fails later with a 404.
121
+ let artifactRequest = 0
122
+
123
+ async function openArtifactPicker(): Promise<void> {
124
+ if (!jobsApi || !experimentId) return
125
+ const request = ++artifactRequest
126
+ artifactOpen.value = true
127
+ artifactSearch.value = ''
101
128
  artifactLoading.value = true
102
- artifactError.value = ''
129
+ artifactError.value = null
130
+ let rows: ReadableArtifact[] = []
131
+ let error: string | null = null
103
132
  try {
104
- const reference = artifactFileReference(detail)
105
- const resolvedExperimentId = reference.experiment_id ?? detail.experiment_id
106
- const pluginId = reference.plugin_id ?? detail.plugin_id
107
- const baseUrl = (platform?.platformApiUrl ?? '/api').replace(/\/$/, '')
108
- const objectPath = reference.key.split('/').map(encodeURIComponent).join('/')
109
- const url = `${baseUrl}/experiments/${resolvedExperimentId}/objects/${objectPath}`
110
- + `?plugin_id=${encodeURIComponent(pluginId)}&format=raw`
111
- const response = await transport(url, { method: 'GET' })
112
- if (!response.ok) throw new Error(`Artifact download failed (${response.status})`)
113
- const resultFilename = String(detail.result.filename ?? '')
114
- const keySegments = reference.key.split('/')
115
- const filename = reference.filename
116
- || resultFilename
117
- || keySegments[keySegments.length - 1]
118
- || 'artifact.bin'
119
- const contentType = reference.content_type
120
- ?? response.headers.get('Content-Type')
121
- ?? 'application/octet-stream'
122
- const file = new File([await response.blob()], filename, { type: contentType })
123
- selectFiles([file], undefined, [filename])
133
+ const transport = jobsApi.transport ?? createGeneratedAnalysisTransport()
134
+ const baseUrl = jobsApi.baseUrl.replace(/\/$/, '')
135
+ const response = await transport(
136
+ `${baseUrl}/jobs/artifacts?experiment_id=${encodeURIComponent(experimentId)}`,
137
+ { headers: { Accept: 'application/json' } },
138
+ )
139
+ const payload: unknown = await response.json().catch(() => null)
140
+ if (!response.ok) throw mintApiErrorFromResponse(response.status, payload)
141
+ rows = (payload as { artifacts?: ReadableArtifact[] } | null)?.artifacts ?? []
124
142
  } catch (cause) {
125
- artifactError.value = cause instanceof Error ? cause.message : 'Failed to load artifact'
126
- } finally {
127
- artifactLoading.value = false
143
+ error = cause instanceof Error ? cause.message : 'Failed to load artifacts'
128
144
  }
145
+ // A reopened picker owns the list; an earlier, slower answer is dropped.
146
+ if (request !== artifactRequest) return
147
+ artifactRows.value = rows
148
+ artifactError.value = error
149
+ artifactLoading.value = false
129
150
  }
130
151
 
131
- function artifactFileReference(detail: AnalysisArtifactDetail): ArtifactFileReference {
132
- if (detail.result.schema_version !== 'mint.analysis_file.v1') {
133
- throw new Error('Only file-backed analysis artifacts can be used as a path')
134
- }
135
- const reference = detail.result.file
136
- if (!reference || typeof reference !== 'object' || !('key' in reference)) {
137
- throw new Error('The selected artifact has no file reference')
138
- }
139
- const candidate = reference as Record<string, unknown>
140
- if (typeof candidate.key !== 'string' || !candidate.key) {
141
- throw new Error('The selected artifact has no object key')
142
- }
152
+ function describeArtifact(row: ReadableArtifact) {
153
+ const date = row.updated_at ?? row.created_at
143
154
  return {
144
- key: candidate.key,
145
- ...(typeof candidate.plugin_id === 'string' ? { plugin_id: candidate.plugin_id } : {}),
146
- ...(typeof candidate.experiment_id === 'number'
147
- ? { experiment_id: candidate.experiment_id }
148
- : {}),
149
- ...(typeof candidate.filename === 'string' ? { filename: candidate.filename } : {}),
150
- ...(typeof candidate.content_type === 'string'
151
- ? { content_type: candidate.content_type }
152
- : {}),
155
+ code: row.artifact_key,
156
+ title: row.display_name,
157
+ meta: [row.filename, row.plugin_id],
158
+ date: date ? formatExperimentDate(date) : '',
153
159
  }
154
160
  }
161
+
162
+ // Only the database ids are kept: the plugin re-authorizes and copies the
163
+ // file when the job is submitted, so the browser never downloads it.
164
+ function selectArtifact(row: ReadableArtifact): void {
165
+ const selection: PluginJobArtifactPathInput = {
166
+ kind: 'artifact-path',
167
+ experimentId: row.experiment_id,
168
+ artifactId: row.id,
169
+ name: row.filename,
170
+ }
171
+ emitSelections(props.multiple ? [...selections.value, selection] : [selection])
172
+ artifactOpen.value = false
173
+ }
155
174
  </script>
156
175
 
157
176
  <template>
@@ -178,8 +197,7 @@ function artifactFileReference(detail: AnalysisArtifactDetail): ArtifactFileRefe
178
197
  size="sm"
179
198
  variant="secondary"
180
199
  :disabled="disabled"
181
- :loading="artifactLoading"
182
- @click="artifactOpen = true"
200
+ @click="openArtifactPicker"
183
201
  >
184
202
  Existing artifact
185
203
  </BaseButton>
@@ -189,22 +207,62 @@ function artifactFileReference(detail: AnalysisArtifactDetail): ArtifactFileRefe
189
207
  :key="mode"
190
208
  :mode="mode"
191
209
  :files="selectedFiles"
192
- :root-name="selections[0]?.rootName"
210
+ :root-name="uploads[0]?.rootName"
193
211
  :multiple="multiple && mode === 'file'"
194
212
  :disabled="disabled"
195
213
  @upload="selectFiles"
196
214
  @remove="removeFiles"
197
215
  />
198
216
 
199
- <AlertBox v-if="artifactError" type="error" :message="artifactError" />
200
- <ArtifactSelectorModal
217
+ <ul v-if="artifacts.length" class="mint-file-uploader__list">
218
+ <li
219
+ v-for="artifact in artifacts"
220
+ :key="`${artifact.experimentId}:${artifact.artifactId}`"
221
+ class="mint-file-uploader__file mint-generated-path-input__artifact"
222
+ >
223
+ <div class="mint-file-uploader__file-info">
224
+ <span class="mint-file-uploader__file-badge mint-generated-path-input__artifact-badge">ART</span>
225
+ <div class="mint-file-uploader__file-meta">
226
+ <span class="mint-file-uploader__file-name">{{ artifact.name }}</span>
227
+ <span class="mint-file-uploader__file-size">Existing artifact · experiment {{ artifact.experimentId }}</span>
228
+ </div>
229
+ </div>
230
+ <button
231
+ type="button"
232
+ :aria-label="`Remove ${artifact.name}`"
233
+ class="mint-file-uploader__remove-btn"
234
+ :disabled="disabled"
235
+ @click.stop="removeArtifact(artifact)"
236
+ >
237
+ <svg class="mint-file-uploader__remove-icon" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 24 24">
238
+ <path d="M18 6 6 18" /><path d="m6 6 12 12" />
239
+ </svg>
240
+ </button>
241
+ </li>
242
+ </ul>
243
+
244
+ <BaseModal
201
245
  v-if="canSelectArtifact"
202
246
  v-model="artifactOpen"
203
- :experiment-id="experimentId"
204
- :fetch-detail-on-select="true"
205
247
  title="Select a file artifact"
206
- @select-detail="selectArtifact"
207
- />
248
+ size="lg"
249
+ >
250
+ <ResourcePickerListInternal
251
+ v-model:search="artifactSearch"
252
+ label="File artifacts"
253
+ placeholder="Search file artifacts…"
254
+ :items="visibleArtifactRows"
255
+ :item-key="(row) => row.id"
256
+ :describe="describeArtifact"
257
+ :loading="artifactLoading"
258
+ :error="artifactError"
259
+ :empty-title="artifactRows.length ? 'No matching file artifacts' : 'No file artifacts this plugin can read'"
260
+ :empty-description="artifactRows.length
261
+ ? 'Try a different search.'
262
+ : 'Only active file artifacts saved by this plugin, or by the plugins it declares as readers, can be used as a path.'"
263
+ @select="selectArtifact"
264
+ />
265
+ </BaseModal>
208
266
  </div>
209
267
  </template>
210
268
 
@@ -219,4 +277,15 @@ function artifactFileReference(detail: AnalysisArtifactDetail): ArtifactFileRefe
219
277
  flex-wrap: wrap;
220
278
  gap: 0.5rem;
221
279
  }
280
+
281
+ .mint-generated-path-input__artifact-badge {
282
+ --badge-color: var(--color-primary);
283
+ }
284
+
285
+ .mint-generated-path-input__artifact .mint-file-uploader__remove-btn:disabled {
286
+ opacity: 0.5;
287
+ cursor: not-allowed;
288
+ color: var(--text-muted);
289
+ background: transparent;
290
+ }
222
291
  </style>
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import type * as PlotlyType from 'plotly.js'
2
+ import type * as PlotlyType from 'plotly.js-dist-min'
3
3
  import { computed, toRaw } from 'vue'
4
4
 
5
5
  import PlotlyChart from './PlotlyChart.vue'
@@ -7,7 +7,7 @@
7
7
  * <GeneratedPluginView base-url="/api/peak-qc" />
8
8
  * ```
9
9
  */
10
- import { computed, onMounted, reactive, ref, watch } from 'vue'
10
+ import { computed, onMounted, provide, reactive, ref, watch } from 'vue'
11
11
 
12
12
  import { generatedJobDefaults, generatedJobFormSchema, normalizeGeneratedJobInput } from '../generated/schema'
13
13
  import type { FormSchema } from '../types/form-builder'
@@ -27,6 +27,7 @@ import GeneratedResultRenderer from './GeneratedResultRenderer.vue'
27
27
  import JobsStatusTray from './JobsStatusTray.vue'
28
28
  import LoadingSpinner from './LoadingSpinner.vue'
29
29
  import PluginWorkspaceView from './PluginWorkspaceView.vue'
30
+ import { GENERATED_JOBS_API_KEY } from './internal/generatedJobsApi'
30
31
 
31
32
  interface Props {
32
33
  baseUrl: string
@@ -42,6 +43,7 @@ const generated = useGeneratedAnalysis({
42
43
  baseUrl: props.baseUrl,
43
44
  transport: props.transport,
44
45
  })
46
+ provide(GENERATED_JOBS_API_KEY, { baseUrl: props.baseUrl, transport: props.transport })
45
47
  const activeDefinitionId = ref('')
46
48
  const selectedJobId = ref('')
47
49
  const valuesByDefinition = reactive<Record<string, Record<string, unknown>>>({})
@@ -242,11 +244,9 @@ onMounted(() => {
242
244
 
243
245
  .mint-generated-workspace__eyebrow {
244
246
  margin: 0 0 0.35rem;
245
- color: var(--text-muted);
247
+ color: var(--text-secondary);
246
248
  font-size: 0.72rem;
247
249
  font-weight: 700;
248
- letter-spacing: 0.08em;
249
- text-transform: uppercase;
250
250
  }
251
251
 
252
252
  .mint-generated-workspace__resources {
@@ -9,6 +9,9 @@
9
9
  */
10
10
  import { computed } from 'vue'
11
11
 
12
+ import { mintApiErrorFromResponse } from '../apiErrors'
13
+ import { createGeneratedAnalysisTransport } from '../composables/useGeneratedAnalysis'
14
+ import { downloadBlob } from '../composables/usePluginClient'
12
15
  import type { DataFrameColumn } from '../types'
13
16
  import type { GeneratedAnalysisResult } from '../types/generated-ui'
14
17
  import ChartContainer from './ChartContainer.vue'
@@ -44,6 +47,21 @@ const artifactHref = computed(() => {
44
47
  : ''
45
48
  })
46
49
 
50
+ // A plugin route needs a Bearer credential, which a plain link navigation never sends.
51
+ // ponytail: buffers the whole file in memory; stream to showSaveFilePicker() if large files strain the tab.
52
+ async function downloadManagedArtifact(event: MouseEvent): Promise<void> {
53
+ if (props.result.kind !== 'artifact' || !props.result.download_url) return
54
+ event.preventDefault()
55
+ const response = await createGeneratedAnalysisTransport()(props.result.download_url)
56
+ if (!response.ok) {
57
+ const payload: unknown = await response.json().catch(() => null)
58
+ throw mintApiErrorFromResponse(response.status, payload, {
59
+ requestId: response.headers.get('X-Request-ID'),
60
+ })
61
+ }
62
+ downloadBlob(await response.blob(), props.result.name)
63
+ }
64
+
47
65
  function humanize(value: string): string {
48
66
  return value.replace(/[_-]+/g, ' ').replace(/^\w/, character => character.toUpperCase())
49
67
  }
@@ -86,6 +104,7 @@ function humanize(value: string): string {
86
104
  class="mint-generated-result__artifact"
87
105
  :href="artifactHref"
88
106
  :download="result.name"
107
+ @click="downloadManagedArtifact"
89
108
  >
90
109
  <span>{{ result.name }}</span>
91
110
  <small>{{ result.media_type }}</small>
@@ -0,0 +1,41 @@
1
+ <script setup lang="ts">
2
+ import InstrumentStateBadge from './InstrumentStateBadge.vue'
3
+ import type { InstrumentBadgeState } from '../types'
4
+
5
+ const states: InstrumentBadgeState[] = ['error', 'disconnected', 'running', 'standby', 'connected', 'idle', 'never', 'inactive']
6
+
7
+ function initState() {
8
+ return {
9
+ state: 'running' as InstrumentBadgeState,
10
+ label: '',
11
+ pulseWhenRunning: true,
12
+ }
13
+ }
14
+ </script>
15
+
16
+ <template>
17
+ <Story title="Workflow/InstrumentStateBadge">
18
+ <Variant title="Playground" :init-state="initState">
19
+ <template #default="{ state }">
20
+ <div style="padding: 2rem; max-width: 600px;">
21
+ <InstrumentStateBadge
22
+ :state="state.state"
23
+ :label="state.label || undefined"
24
+ :pulse-when-running="state.pulseWhenRunning"
25
+ />
26
+ </div>
27
+ </template>
28
+ <template #controls="{ state }">
29
+ <HstSelect v-model="state.state" title="State" :options="states.map(s => ({ label: s, value: s }))" />
30
+ <HstText v-model="state.label" title="Label override" />
31
+ <HstCheckbox v-model="state.pulseWhenRunning" title="Pulse when running" />
32
+ </template>
33
+ </Variant>
34
+
35
+ <Variant title="All states">
36
+ <div style="padding: 2rem; max-width: 600px; display: flex; flex-wrap: wrap; gap: 1.25rem;">
37
+ <InstrumentStateBadge v-for="s in states" :key="s" :state="s" :pulse-when-running="false" />
38
+ </div>
39
+ </Variant>
40
+ </Story>
41
+ </template>
@@ -1,10 +1,10 @@
1
1
  <script setup lang="ts">
2
- /** Status badge for shared instrument monitor states. */
2
+ /** Status badge for instrument states, plus the platform-derived `never` (no report yet) and `inactive` states. */
3
3
  import { computed } from 'vue'
4
- import type { InstrumentState } from '../types'
4
+ import type { InstrumentBadgeState } from '../types'
5
5
 
6
6
  interface Props {
7
- state: InstrumentState | string
7
+ state: InstrumentBadgeState | string
8
8
  label?: string
9
9
  pulseWhenRunning?: boolean
10
10
  }
@@ -14,19 +14,29 @@ const props = withDefaults(defineProps<Props>(), {
14
14
  pulseWhenRunning: true,
15
15
  })
16
16
 
17
- const stateConfig: Record<InstrumentState, { label: string; tone: string }> = {
18
- running: { label: 'RUNNING', tone: 'success' },
19
- standby: { label: 'STANDBY', tone: 'warning' },
20
- idle: { label: 'IDLE', tone: 'muted' },
21
- error: { label: 'ERROR', tone: 'error' },
22
- connected: { label: 'CONNECTED', tone: 'info' },
23
- disconnected: { label: 'OFFLINE', tone: 'muted' },
17
+ const stateConfig: Record<InstrumentBadgeState, { label: string; tone: string }> = {
18
+ running: { label: 'Running', tone: 'info' },
19
+ standby: { label: 'Standby', tone: 'warning' },
20
+ idle: { label: 'Idle', tone: 'muted' },
21
+ error: { label: 'Error', tone: 'error' },
22
+ connected: { label: 'Connected', tone: 'success' },
23
+ disconnected: { label: 'Offline', tone: 'muted' },
24
+ never: { label: 'Never reported', tone: 'muted' },
25
+ inactive: { label: 'Inactive', tone: 'muted' },
26
+ }
27
+
28
+ /** Hollow or non-dot shapes, so states read without relying on color. */
29
+ const shapeClass: Partial<Record<InstrumentBadgeState, string>> = {
30
+ disconnected: 'mint-instrument-state--offline',
31
+ never: 'mint-instrument-state--never',
32
+ inactive: 'mint-instrument-state--inactive',
24
33
  }
25
34
 
26
35
  const normalizedState = computed(() => props.state.toLowerCase())
27
36
  const config = computed(() => {
28
- const match = stateConfig[normalizedState.value as InstrumentState]
29
- return match ?? { label: props.state.toUpperCase(), tone: 'muted' }
37
+ const match = stateConfig[normalizedState.value as InstrumentBadgeState]
38
+ const raw = normalizedState.value
39
+ return match ?? { label: raw.charAt(0).toUpperCase() + raw.slice(1), tone: 'muted' }
30
40
  })
31
41
  const shouldPulse = computed(() => props.pulseWhenRunning && normalizedState.value === 'running')
32
42
  </script>
@@ -37,10 +47,10 @@ const shouldPulse = computed(() => props.pulseWhenRunning && normalizedState.val
37
47
  :class="[
38
48
  `mint-instrument-state--${config.tone}`,
39
49
  { 'mint-instrument-state--pulse': shouldPulse },
40
- { 'mint-instrument-state--offline': normalizedState === 'disconnected' },
50
+ shapeClass[normalizedState as InstrumentBadgeState],
41
51
  ]"
42
52
  >
43
- <span v-if="shouldPulse" class="mint-instrument-state__dot" />
53
+ <span class="mint-instrument-state__dot" aria-hidden="true" />
44
54
  {{ label ?? config.label }}
45
55
  </span>
46
56
  </template>
@@ -27,11 +27,11 @@ import type {
27
27
 
28
28
  interface Props {
29
29
  source?: PluginJobCenterSource
30
- /** @deprecated Pass a source instead. */
30
+ /** @deprecated Removed in MINT 1.4; pass a source instead. */
31
31
  jobs?: readonly JobStateInput[]
32
- /** @deprecated Pass source actions instead. */
32
+ /** @deprecated Removed in MINT 1.4; pass source actions instead. */
33
33
  adapter?: JobsStatusTrayAdapter
34
- /** @deprecated Event streams belong to the source runtime. */
34
+ /** @deprecated Removed in MINT 1.4; event streams belong to the source runtime. */
35
35
  eventStream?: UsePluginEventStreamReturn<JobStreamData>
36
36
  loadOnMount?: boolean
37
37
  title?: string
@@ -66,6 +66,20 @@ const tray = usePluginJobCenter({
66
66
  eventStream: toRef(props, 'eventStream'),
67
67
  loadOnMount: props.loadOnMount,
68
68
  })
69
+ // 2f: a job waiting for input is the only one that needs a person — pin it first.
70
+ const activeRows = computed(() => [
71
+ ...tray.activeJobs.value.filter(job => job.status === 'awaiting_input'),
72
+ ...tray.activeJobs.value.filter(job => job.status !== 'awaiting_input'),
73
+ ])
74
+ const subtitle = computed(() => {
75
+ const count = (status: JobState['status']) => tray.activeJobs.value.filter(job => job.status === status).length
76
+ const parts = [
77
+ [count('running'), 'running'],
78
+ [count('queued'), 'queued'],
79
+ [count('awaiting_input'), 'waiting'],
80
+ ].filter(([n]) => n).map(([n, word]) => `${n} ${word}`)
81
+ return parts.length ? parts.join(' · ') : `${tray.jobs.value.length} total`
82
+ })
69
83
  const canClear = computed(() => (
70
84
  tray.deletableJobs.value.length > 0
71
85
  && tray.canClearFinished.value
@@ -140,6 +154,10 @@ function statusClass(job: JobState): string {
140
154
  return `mint-jobs-tray__status--${job.status.replace('_', '-')}`
141
155
  }
142
156
 
157
+ function jobPercent(job: JobState): number {
158
+ return Math.round(normalizeJobPercent(job.progress.percent))
159
+ }
160
+
143
161
  async function cancelJob(job: JobState): Promise<void> {
144
162
  const succeeded = await tray.cancelJob(job)
145
163
  if (!succeeded && tray.error.value) emit('error', tray.error.value)
@@ -215,7 +233,7 @@ async function clearFinished(): Promise<void> {
215
233
  <header class="mint-jobs-tray__header">
216
234
  <div>
217
235
  <h2 :id="titleId" class="mint-jobs-tray__title">{{ title }}</h2>
218
- <p class="mint-jobs-tray__subtitle">{{ tray.jobs.value.length }} total</p>
236
+ <p class="mint-jobs-tray__subtitle">{{ subtitle }}</p>
219
237
  </div>
220
238
  <div class="mint-jobs-tray__header-actions">
221
239
  <button
@@ -281,9 +299,10 @@ async function clearFinished(): Promise<void> {
281
299
  No active jobs
282
300
  </p>
283
301
  <article
284
- v-for="job in tray.activeJobs.value"
302
+ v-for="job in activeRows"
285
303
  :key="job.job_id"
286
- class="mint-jobs-tray__job mint-jobs-tray__job--active"
304
+ class="mint-jobs-tray__job"
305
+ :class="{ 'mint-jobs-tray__job--awaiting-input': job.status === 'awaiting_input' }"
287
306
  >
288
307
  <div class="mint-jobs-tray__job-heading">
289
308
  <div class="mint-jobs-tray__job-identity">
@@ -297,8 +316,10 @@ async function clearFinished(): Promise<void> {
297
316
  <span class="mint-jobs-tray__kind">{{ job.kind }}</span>
298
317
  </div>
299
318
  <span class="mint-jobs-tray__status" :class="statusClass(job)">
319
+ <span class="mint-jobs-tray__status-dot" aria-hidden="true" />
300
320
  {{ jobStatusLabel(job.status) }}
301
321
  </span>
322
+ <span v-if="job.status === 'running'" class="mint-jobs-tray__percent">{{ jobPercent(job) }}%</span>
302
323
  </div>
303
324
  <div
304
325
  v-if="job.status === 'running'"
@@ -307,9 +328,9 @@ async function clearFinished(): Promise<void> {
307
328
  aria-label="Job progress"
308
329
  aria-valuemin="0"
309
330
  aria-valuemax="100"
310
- :aria-valuenow="normalizeJobPercent(job.progress.percent)"
331
+ :aria-valuenow="jobPercent(job)"
311
332
  >
312
- <span :style="{ width: `${normalizeJobPercent(job.progress.percent)}%` }" />
333
+ <span :style="{ width: `${jobPercent(job)}%` }" />
313
334
  </div>
314
335
  <div class="mint-jobs-tray__job-footer">
315
336
  <span>{{ progressText(job) }}</span>
@@ -372,6 +393,7 @@ async function clearFinished(): Promise<void> {
372
393
  <span class="mint-jobs-tray__kind">{{ job.kind }}</span>
373
394
  </div>
374
395
  <span class="mint-jobs-tray__status" :class="statusClass(job)">
396
+ <span class="mint-jobs-tray__status-dot" aria-hidden="true" />
375
397
  {{ jobStatusLabel(job.status) }}
376
398
  </span>
377
399
  </div>