@morscherlab/mint-sdk 1.0.0-beta.2 → 1.0.0-beta.4

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 (427) hide show
  1. package/README.md +225 -6
  2. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  3. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  4. package/dist/__tests__/components/AppPageSelector.test.d.ts +1 -0
  5. package/dist/__tests__/components/AppPillNav.test.d.ts +1 -0
  6. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  7. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  8. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  9. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  10. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  11. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  12. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  13. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  14. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  15. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  16. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  17. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  18. package/dist/__tests__/components/ComponentBindingRenderer.test.d.ts +1 -0
  19. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  20. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  21. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  23. package/dist/__tests__/components/DoseDesignWorkspaceView.test.d.ts +1 -0
  24. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  25. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  26. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/PluginWorkspaceView.test.d.ts +1 -0
  30. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  31. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  32. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  33. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  34. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  35. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  36. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  37. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  38. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  39. package/dist/__tests__/composables/experiment-utils.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useApi.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  52. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  53. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  54. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  55. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  62. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  63. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  64. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  65. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  66. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  67. package/dist/auth-QQj2kkze.js.map +1 -0
  68. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  69. package/dist/components/AppContainer.vue.d.ts +1 -1
  70. package/dist/components/AppLayout.vue.d.ts +20 -1
  71. package/dist/components/AppSidebar.vue.d.ts +111 -6
  72. package/dist/components/AppTopBar.vue.d.ts +35 -22
  73. package/dist/components/BaseButton.vue.d.ts +1 -1
  74. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  75. package/dist/components/BaseInput.vue.d.ts +2 -2
  76. package/dist/components/BasePill.vue.d.ts +2 -2
  77. package/dist/components/BaseRadioGroup.vue.d.ts +3 -3
  78. package/dist/components/BaseSelect.vue.d.ts +3 -3
  79. package/dist/components/BaseTabs.vue.d.ts +2 -2
  80. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  81. package/dist/components/BaseToggle.vue.d.ts +1 -1
  82. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +119 -0
  83. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +93 -0
  84. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +87 -0
  85. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  86. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  87. package/dist/components/Calendar.vue.d.ts +1 -1
  88. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  89. package/dist/components/ComponentBindingRenderer.vue.d.ts +44 -0
  90. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  91. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  92. package/dist/components/ControlWorkspaceView.vue.d.ts +147 -0
  93. package/dist/components/DatePicker.vue.d.ts +1 -1
  94. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  95. package/dist/components/Divider.vue.d.ts +1 -1
  96. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
  97. package/dist/components/DropdownButton.vue.d.ts +3 -3
  98. package/dist/components/EmptyState.vue.d.ts +1 -2
  99. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  100. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  101. package/dist/components/FileUploader.vue.d.ts +1 -1
  102. package/dist/components/FitPanel.vue.d.ts +1 -1
  103. package/dist/components/FormActions.vue.d.ts +4 -4
  104. package/dist/components/FormBuilder.vue.d.ts +31 -17
  105. package/dist/components/FormulaInput.vue.d.ts +2 -2
  106. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  107. package/dist/components/MultiSelect.vue.d.ts +3 -3
  108. package/dist/components/NumberInput.vue.d.ts +1 -1
  109. package/dist/components/PlateMapEditor.vue.d.ts +1 -1
  110. package/dist/components/PluginWorkspaceView.vue.d.ts +310 -0
  111. package/dist/components/ProgressBar.vue.d.ts +1 -1
  112. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  113. package/dist/components/RackEditor.vue.d.ts +2 -2
  114. package/dist/components/SampleLegend.vue.d.ts +2 -2
  115. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  116. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  117. package/dist/components/SequenceInput.vue.d.ts +3 -3
  118. package/dist/components/SettingsModal.vue.d.ts +14 -6
  119. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  120. package/dist/components/TagsInput.vue.d.ts +3 -2
  121. package/dist/components/TimePicker.vue.d.ts +3 -3
  122. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  123. package/dist/components/UnitInput.vue.d.ts +2 -2
  124. package/dist/components/WellPlate.vue.d.ts +6 -6
  125. package/dist/components/index.d.ts +9 -8
  126. package/dist/components/index.js +3 -3
  127. package/dist/components/{SettingsButton.vue.d.ts → internal/ActionItemInternal.vue.d.ts} +11 -9
  128. package/dist/components/{AppPageSelector.vue.d.ts → internal/AppPageSelectorInternal.vue.d.ts} +3 -6
  129. package/dist/components/{AppPillNav.vue.d.ts → internal/AppPillNavInternal.vue.d.ts} +4 -2
  130. package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +25 -0
  131. package/dist/components/{FormFieldRenderer.vue.d.ts → internal/FormFieldRendererInternal.vue.d.ts} +2 -2
  132. package/dist/components/{FormSection.vue.d.ts → internal/FormSectionRenderer.vue.d.ts} +7 -7
  133. package/dist/components/{WellEditPopup.vue.d.ts → internal/WellEditPopupInternal.vue.d.ts} +1 -1
  134. package/dist/{components-_XqPEhP9.js → components-BkGF4B4y.js} +9760 -8471
  135. package/dist/components-BkGF4B4y.js.map +1 -0
  136. package/dist/composables/experiment-utils.d.ts +8 -0
  137. package/dist/composables/index.d.ts +22 -5
  138. package/dist/composables/index.js +4 -3
  139. package/dist/composables/platformContextHelpers.d.ts +14 -0
  140. package/dist/composables/useAppExperiment.d.ts +31 -2
  141. package/dist/composables/useBioTemplateComponents.d.ts +22 -0
  142. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  143. package/dist/composables/useBioTemplatePackWorkspace.d.ts +46 -0
  144. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +75 -0
  145. package/dist/composables/useBioTemplateWorkspace.d.ts +51 -0
  146. package/dist/composables/useCalendarGrid.d.ts +26 -0
  147. package/dist/composables/useControlSchema.d.ts +343 -0
  148. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  149. package/dist/composables/useDropdownState.d.ts +19 -0
  150. package/dist/composables/useEventListener.d.ts +13 -0
  151. package/dist/composables/useExpansionSet.d.ts +21 -0
  152. package/dist/composables/useExperimentData.d.ts +10 -0
  153. package/dist/composables/useExperimentSave.d.ts +31 -2
  154. package/dist/composables/useExperimentSelector.d.ts +20 -0
  155. package/dist/composables/useForm.d.ts +2 -0
  156. package/dist/composables/useGroupAssignment.d.ts +31 -0
  157. package/dist/composables/useListSelection.d.ts +35 -0
  158. package/dist/composables/usePlatformContext.d.ts +21 -3
  159. package/dist/composables/usePluginClient.d.ts +112 -0
  160. package/dist/composables/usePluginConfig.d.ts +12 -0
  161. package/dist/composables/useRequestSyncState.d.ts +34 -0
  162. package/dist/composables/useSampleGroups.d.ts +32 -0
  163. package/dist/composables/useSelectionLimit.d.ts +17 -0
  164. package/dist/composables/useSortedItems.d.ts +32 -0
  165. package/dist/composables/useTemplateCollection.d.ts +58 -0
  166. package/dist/composables/useTextSearch.d.ts +18 -0
  167. package/dist/composables/useTimeUtils.d.ts +8 -0
  168. package/dist/{composables-tiZqLu1M.js → composables-CHsME9H1.js} +240 -146
  169. package/dist/composables-CHsME9H1.js.map +1 -0
  170. package/dist/index.d.ts +6 -4
  171. package/dist/index.js +6 -5
  172. package/dist/install.d.ts +7 -2
  173. package/dist/install.js +2 -2
  174. package/dist/install.js.map +1 -1
  175. package/dist/stores/index.js +1 -1
  176. package/dist/stores/settings.d.ts +4 -1
  177. package/dist/styles.css +4746 -5514
  178. package/dist/templates/adapters.d.ts +43 -0
  179. package/dist/templates/builders.d.ts +63 -0
  180. package/dist/templates/catalog.d.ts +188 -0
  181. package/dist/templates/componentBindings.d.ts +71 -0
  182. package/dist/templates/controlSchemas.d.ts +25 -0
  183. package/dist/templates/index.d.ts +15 -0
  184. package/dist/templates/index.js +2 -0
  185. package/dist/templates/lookup.d.ts +4 -0
  186. package/dist/templates/packs.d.ts +18 -0
  187. package/dist/templates/presets.d.ts +90 -0
  188. package/dist/templates/types.d.ts +531 -0
  189. package/dist/templates-B5jmTWuk.js +9388 -0
  190. package/dist/templates-B5jmTWuk.js.map +1 -0
  191. package/dist/types/components.d.ts +26 -23
  192. package/dist/types/form-builder.d.ts +6 -8
  193. package/dist/types/index.d.ts +2 -2
  194. package/dist/types/platform.d.ts +7 -1
  195. package/dist/useScheduleDrag-BgzpQT53.js +4414 -0
  196. package/dist/useScheduleDrag-BgzpQT53.js.map +1 -0
  197. package/dist/utils/formModelSync.d.ts +5 -0
  198. package/dist/utils/items.d.ts +8 -0
  199. package/dist/utils/options.d.ts +6 -0
  200. package/dist/utils/pluginIcon.d.ts +9 -0
  201. package/package.json +7 -2
  202. package/src/__tests__/components/ActionItem.test.ts +99 -0
  203. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  204. package/src/__tests__/components/AppLayout.test.ts +44 -0
  205. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  206. package/src/__tests__/components/AppPillNav.test.ts +125 -0
  207. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  208. package/src/__tests__/components/AppSidebar.test.ts +496 -0
  209. package/src/__tests__/components/AppToastContainer.test.ts +37 -0
  210. package/src/__tests__/components/AppTopBar.test.ts +455 -9
  211. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  212. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  213. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  214. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  215. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
  216. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +175 -0
  217. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +306 -0
  218. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  219. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  220. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  221. package/src/__tests__/components/ComponentBindingRenderer.test.ts +161 -0
  222. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  223. package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
  224. package/src/__tests__/components/DataFrame.test.ts +11 -0
  225. package/src/__tests__/components/DatePicker.test.ts +45 -0
  226. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  227. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
  228. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  229. package/src/__tests__/components/EmptyState.test.ts +23 -0
  230. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  231. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  232. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  233. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  234. package/src/__tests__/components/PluginWorkspaceView.test.ts +548 -0
  235. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  236. package/src/__tests__/components/ReagentList.test.ts +82 -0
  237. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  238. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  239. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  240. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  241. package/src/__tests__/components/TagsInput.test.ts +75 -0
  242. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  243. package/src/__tests__/components/TimePicker.test.ts +38 -0
  244. package/src/__tests__/composables/experiment-utils.test.ts +30 -0
  245. package/src/__tests__/composables/useApi.test.ts +30 -0
  246. package/src/__tests__/composables/useAppExperiment.test.ts +100 -1
  247. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
  248. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  249. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
  250. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  251. package/src/__tests__/composables/useControlSchema.test.ts +1033 -0
  252. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  253. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  254. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  255. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  256. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  257. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  258. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  259. package/src/__tests__/composables/useForm.test.ts +58 -0
  260. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  261. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  262. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  263. package/src/__tests__/composables/usePluginClient.test.ts +541 -0
  264. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  265. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  266. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  267. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  268. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  269. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  270. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  271. package/src/__tests__/composables/useTheme.test.ts +91 -0
  272. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  273. package/src/__tests__/docs/frontendDocsCatalog.test.ts +324 -0
  274. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  275. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  276. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  277. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  278. package/src/__tests__/templates/templates.test.ts +1055 -0
  279. package/src/components/AppAvatarMenu.vue +15 -69
  280. package/src/components/AppLayout.story.vue +64 -25
  281. package/src/components/AppLayout.vue +83 -2
  282. package/src/components/AppPluginSwitcher.vue +41 -145
  283. package/src/components/AppSidebar.story.vue +203 -1
  284. package/src/components/AppSidebar.vue +320 -25
  285. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  286. package/src/components/{ToastNotification.vue → AppToastContainer.vue} +1 -1
  287. package/src/components/AppTopBar.story.vue +7 -33
  288. package/src/components/AppTopBar.vue +104 -300
  289. package/src/components/BaseModal.vue +3 -5
  290. package/src/components/BaseRadioGroup.vue +7 -3
  291. package/src/components/BaseSelect.vue +11 -7
  292. package/src/components/BaseTabs.vue +6 -4
  293. package/src/components/BatchProgressList.vue +5 -8
  294. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  295. package/src/components/BioTemplateExperimentWorkspaceView.vue +343 -0
  296. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  297. package/src/components/BioTemplatePackWorkspaceView.vue +177 -0
  298. package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
  299. package/src/components/BioTemplatePresetWorkspaceView.vue +401 -0
  300. package/src/components/BioTemplateRenderer.story.vue +57 -0
  301. package/src/components/BioTemplateRenderer.vue +57 -0
  302. package/src/components/Breadcrumb.vue +14 -8
  303. package/src/components/ComponentBindingRenderer.story.vue +57 -0
  304. package/src/components/ComponentBindingRenderer.vue +308 -0
  305. package/src/components/ConcentrationInput.vue +27 -64
  306. package/src/components/ControlWorkspaceView.story.vue +347 -0
  307. package/src/components/ControlWorkspaceView.vue +378 -0
  308. package/src/components/DataFrame.vue +34 -50
  309. package/src/components/DatePicker.vue +59 -192
  310. package/src/components/DateTimePicker.vue +50 -171
  311. package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
  312. package/src/components/DoseDesignWorkspaceView.vue +255 -0
  313. package/src/components/DropdownButton.vue +14 -32
  314. package/src/components/EmptyState.vue +4 -2
  315. package/src/components/ExperimentPopover.vue +7 -28
  316. package/src/components/ExperimentSelectorModal.vue +6 -5
  317. package/src/components/FormBuilder.story.vue +190 -0
  318. package/src/components/FormBuilder.vue +124 -27
  319. package/src/components/GroupAssigner.vue +24 -56
  320. package/src/components/MultiSelect.vue +17 -12
  321. package/src/components/PlateMapEditor.vue +3 -8
  322. package/src/components/PluginIcon.vue +2 -22
  323. package/src/components/PluginWorkspaceView.story.vue +334 -0
  324. package/src/components/PluginWorkspaceView.vue +708 -0
  325. package/src/components/ProtocolStepEditor.vue +13 -22
  326. package/src/components/ReagentList.vue +25 -33
  327. package/src/components/SampleHierarchyTree.vue +12 -23
  328. package/src/components/SampleSelector.vue +42 -122
  329. package/src/components/SegmentedControl.vue +7 -3
  330. package/src/components/SettingsModal.story.vue +88 -1
  331. package/src/components/SettingsModal.vue +120 -29
  332. package/src/components/TagsInput.vue +29 -14
  333. package/src/components/ThemeToggle.vue +9 -7
  334. package/src/components/TimePicker.vue +19 -41
  335. package/src/components/Tooltip.vue +7 -12
  336. package/src/components/WellPlate.vue +6 -12
  337. package/src/components/index.ts +9 -8
  338. package/src/components/internal/ActionItemInternal.vue +82 -0
  339. package/src/components/internal/AppPageSelectorInternal.vue +128 -0
  340. package/src/components/internal/AppPillNavInternal.vue +194 -0
  341. package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
  342. package/src/components/{FormFieldRenderer.vue → internal/FormFieldRendererInternal.vue} +4 -12
  343. package/src/components/{FormSection.vue → internal/FormSectionRenderer.vue} +6 -18
  344. package/src/components/{WellEditPopup.vue → internal/WellEditPopupInternal.vue} +5 -10
  345. package/src/composables/experiment-utils.ts +26 -0
  346. package/src/composables/index.ts +229 -3
  347. package/src/composables/platformContextHelpers.ts +74 -0
  348. package/src/composables/useApi.ts +9 -2
  349. package/src/composables/useAppExperiment.ts +85 -13
  350. package/src/composables/useBioTemplateComponents.ts +105 -0
  351. package/src/composables/useBioTemplateControls.ts +41 -0
  352. package/src/composables/useBioTemplatePackWorkspace.ts +185 -0
  353. package/src/composables/useBioTemplatePresetWorkspace.ts +326 -0
  354. package/src/composables/useBioTemplateWorkspace.ts +141 -0
  355. package/src/composables/useCalendarGrid.ts +140 -0
  356. package/src/composables/useControlSchema.ts +1362 -0
  357. package/src/composables/useDebouncedWatch.ts +119 -0
  358. package/src/composables/useDropdownState.ts +83 -0
  359. package/src/composables/useEventListener.ts +111 -0
  360. package/src/composables/useExpansionSet.ts +117 -0
  361. package/src/composables/useExperimentData.ts +20 -11
  362. package/src/composables/useExperimentSave.ts +202 -50
  363. package/src/composables/useExperimentSelector.ts +86 -72
  364. package/src/composables/useForm.ts +49 -4
  365. package/src/composables/useFormBuilder.ts +93 -42
  366. package/src/composables/useGroupAssignment.ts +148 -0
  367. package/src/composables/useListSelection.ts +158 -0
  368. package/src/composables/usePluginClient.ts +466 -0
  369. package/src/composables/usePluginConfig.ts +34 -13
  370. package/src/composables/useRequestSyncState.ts +126 -0
  371. package/src/composables/useSampleGroups.ts +126 -0
  372. package/src/composables/useSelectionLimit.ts +57 -0
  373. package/src/composables/useSortedItems.ts +118 -0
  374. package/src/composables/useTemplateCollection.ts +229 -0
  375. package/src/composables/useTextSearch.ts +60 -0
  376. package/src/composables/useTheme.ts +2 -28
  377. package/src/composables/useTimeUtils.ts +26 -2
  378. package/src/composables/useWellPlateEditor.ts +13 -9
  379. package/src/index.ts +11 -348
  380. package/src/install.ts +11 -4
  381. package/src/stores/settings.ts +13 -9
  382. package/src/styles/components/app-layout.css +82 -0
  383. package/src/styles/components/app-page-selector.css +23 -0
  384. package/src/styles/components/app-pill-nav.css +77 -0
  385. package/src/styles/components/app-sidebar.css +119 -0
  386. package/src/styles/components/app-top-bar.css +0 -201
  387. package/src/styles/components/concentration-input.css +3 -142
  388. package/src/styles/components/empty-state.css +0 -16
  389. package/src/styles/components/theme-toggle.css +3 -66
  390. package/src/styles/index.css +0 -2
  391. package/src/templates/adapters.ts +785 -0
  392. package/src/templates/builders.ts +2149 -0
  393. package/src/templates/catalog.ts +245 -0
  394. package/src/templates/componentBindings.ts +653 -0
  395. package/src/templates/controlSchemas.ts +718 -0
  396. package/src/templates/index.ts +318 -0
  397. package/src/templates/lookup.ts +18 -0
  398. package/src/templates/packs.ts +156 -0
  399. package/src/templates/presets.ts +146 -0
  400. package/src/templates/types.ts +668 -0
  401. package/src/types/components.ts +39 -27
  402. package/src/types/form-builder.ts +7 -2
  403. package/src/types/index.ts +13 -3
  404. package/src/types/platform.ts +7 -1
  405. package/src/utils/formModelSync.ts +52 -0
  406. package/src/utils/items.ts +28 -0
  407. package/src/utils/options.ts +23 -0
  408. package/src/utils/pluginIcon.ts +30 -0
  409. package/dist/__tests__/composables/usePluginApi.test.d.ts +0 -13
  410. package/dist/auth-DsI0rQ7_.js.map +0 -1
  411. package/dist/components/GroupingModal.vue.d.ts +0 -12
  412. package/dist/components-_XqPEhP9.js.map +0 -1
  413. package/dist/composables/usePluginApi.d.ts +0 -29
  414. package/dist/composables-tiZqLu1M.js.map +0 -1
  415. package/dist/useScheduleDrag-CA9sGNJG.js +0 -7181
  416. package/dist/useScheduleDrag-CA9sGNJG.js.map +0 -1
  417. package/src/__tests__/composables/usePluginApi.test.ts +0 -81
  418. package/src/components/AppPageSelector.vue +0 -159
  419. package/src/components/AppPillNav.vue +0 -66
  420. package/src/components/GroupingModal.story.vue +0 -52
  421. package/src/components/GroupingModal.vue +0 -422
  422. package/src/components/SettingsButton.story.vue +0 -58
  423. package/src/components/SettingsButton.vue +0 -76
  424. package/src/composables/usePluginApi.ts +0 -39
  425. package/src/styles/components/grouping-modal.css +0 -323
  426. package/src/styles/components/settings-button.css +0 -94
  427. /package/dist/components/{ToastNotification.vue.d.ts → AppToastContainer.vue.d.ts} +0 -0
@@ -0,0 +1,105 @@
1
+ import {
2
+ getBioTemplateComponentBindings,
3
+ getBioTemplateComponentProps as getTemplateComponentProps,
4
+ toBioTemplateComponentImports,
5
+ toBioTemplateComponentBindings,
6
+ toBioTemplateComponentBindingsById,
7
+ toBioTemplateComponentProps,
8
+ toBioTemplateComponentPropsByComponent as toTemplateComponentPropsByComponent,
9
+ toBioTemplateComponentPropsById,
10
+ toBioTemplateComponentSnippets,
11
+ toBioTemplateComponentUsage,
12
+ type BioTemplateComponentBinding,
13
+ type BioTemplateComponentBindingsById,
14
+ type BioTemplateComponentImport,
15
+ type BioTemplateComponentPropsByComponent,
16
+ type BioTemplateComponentPropsBinding,
17
+ type BioTemplateComponentPropsById,
18
+ type BioTemplateComponentPropsLookupOptions,
19
+ type BioTemplateResolvedComponentBinding,
20
+ type BioTemplateComponentSnippet,
21
+ type BioTemplateComponentTarget,
22
+ type BioTemplateComponentUsage,
23
+ } from '../templates/componentBindings'
24
+ import type {
25
+ BioTemplateEnvelope,
26
+ TemplateCollectionEnvelope,
27
+ } from '../templates/types'
28
+
29
+ export {
30
+ getBioTemplateComponentBindings,
31
+ toBioTemplateComponentBindings,
32
+ toBioTemplateComponentBindingsById,
33
+ toBioTemplateComponentImports,
34
+ toBioTemplateComponentProps,
35
+ toBioTemplateComponentPropsById,
36
+ toBioTemplateComponentSnippets,
37
+ toBioTemplateComponentUsage,
38
+ }
39
+
40
+ export type {
41
+ BioTemplateComponentBinding,
42
+ BioTemplateComponentBindingsById,
43
+ BioTemplateComponentImport,
44
+ BioTemplateComponentPropsByComponent,
45
+ BioTemplateComponentPropsBinding,
46
+ BioTemplateComponentPropsById,
47
+ BioTemplateComponentPropsLookupOptions,
48
+ BioTemplateResolvedComponentBinding,
49
+ BioTemplateComponentSnippet,
50
+ BioTemplateComponentTarget,
51
+ BioTemplateComponentUsage,
52
+ }
53
+
54
+ export interface UseBioTemplateComponentsReturn {
55
+ bindings: BioTemplateComponentBinding[]
56
+ imports: BioTemplateComponentImport[]
57
+ componentBindings: BioTemplateResolvedComponentBinding[]
58
+ componentBindingsById: BioTemplateComponentBindingsById
59
+ componentProps: BioTemplateComponentPropsBinding[]
60
+ componentPropsById: BioTemplateComponentPropsById
61
+ componentPropsByComponent: BioTemplateComponentPropsByComponent
62
+ snippets: BioTemplateComponentSnippet[]
63
+ usage: BioTemplateComponentUsage | null
64
+ getComponentProps: (
65
+ component: string,
66
+ options?: BioTemplateComponentPropsLookupOptions,
67
+ ) => Record<string, unknown> | undefined
68
+ }
69
+
70
+ /** Return component props grouped by SDK component name for direct WellPlate/DoseCalculator binding. */
71
+ export function toBioTemplateComponentPropsByComponent(
72
+ target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope,
73
+ ): BioTemplateComponentPropsByComponent {
74
+ return toTemplateComponentPropsByComponent(target)
75
+ }
76
+
77
+ /** Return the first props object for an SDK component, optionally restricted by template id or binding id. */
78
+ export function getBioTemplateComponentProps(
79
+ target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope,
80
+ component: string,
81
+ options: BioTemplateComponentPropsLookupOptions = {},
82
+ ): Record<string, unknown> | undefined {
83
+ return getTemplateComponentProps(target, component, options)
84
+ }
85
+
86
+ /** Map built-in biology templates to SDK components such as WellPlate, DataFrame, DoseCalculator, and PlateMapEditor. */
87
+ export function useBioTemplateComponents(
88
+ target: BioTemplateComponentTarget
89
+ ): UseBioTemplateComponentsReturn {
90
+ return {
91
+ bindings: getBioTemplateComponentBindings(target),
92
+ imports: toBioTemplateComponentImports(target),
93
+ componentBindings: typeof target === 'string' ? [] : toBioTemplateComponentBindings(target),
94
+ componentBindingsById: typeof target === 'string' ? {} : toBioTemplateComponentBindingsById(target),
95
+ componentProps: typeof target === 'string' ? [] : toBioTemplateComponentProps(target),
96
+ componentPropsById: typeof target === 'string' ? {} : toBioTemplateComponentPropsById(target),
97
+ componentPropsByComponent: typeof target === 'string' ? {} : toBioTemplateComponentPropsByComponent(target),
98
+ snippets: typeof target === 'string' ? [] : toBioTemplateComponentSnippets(target),
99
+ usage: typeof target === 'string' ? null : toBioTemplateComponentUsage(target),
100
+ getComponentProps: (component, options) =>
101
+ typeof target === 'string'
102
+ ? undefined
103
+ : getBioTemplateComponentProps(target, component, options),
104
+ }
105
+ }
@@ -0,0 +1,41 @@
1
+ import {
2
+ createBioTemplateControlToolkit,
3
+ getBioTemplateControlSchema,
4
+ requireBioTemplateControlSchema,
5
+ type BioTemplateControlSchema,
6
+ type BioTemplateControlTarget,
7
+ } from '../templates/controlSchemas'
8
+ import type {
9
+ ControlSchemaOptions,
10
+ ControlWorkspaceOptions,
11
+ UseControlSchemaReturn,
12
+ } from './useControlSchema'
13
+
14
+ export {
15
+ getBioTemplateControlSchema,
16
+ requireBioTemplateControlSchema,
17
+ }
18
+
19
+ export type {
20
+ BioTemplateControlSchema,
21
+ BioTemplateControlTarget,
22
+ }
23
+
24
+ /** Build FormBuilder schema, AppSidebar panels, and defaults for a built-in biology template or preset. */
25
+ export function useBioTemplateControls(
26
+ target: BioTemplateControlTarget,
27
+ options: ControlWorkspaceOptions = {},
28
+ ): UseControlSchemaReturn<BioTemplateControlSchema> {
29
+ const { initialValues, topBarSettings: _topBarSettings, ...schemaOptions } = options
30
+ const controls = createBioTemplateControlToolkit(target, schemaOptions as ControlSchemaOptions)
31
+
32
+ if (initialValues === undefined) return controls
33
+
34
+ return {
35
+ ...controls,
36
+ initialValues: {
37
+ ...controls.initialValues,
38
+ ...initialValues,
39
+ },
40
+ }
41
+ }
@@ -0,0 +1,185 @@
1
+ import {
2
+ computed,
3
+ effectScope,
4
+ getCurrentScope,
5
+ onScopeDispose,
6
+ shallowRef,
7
+ watch,
8
+ type ComputedRef,
9
+ type EffectScope,
10
+ type Ref,
11
+ } from 'vue'
12
+ import {
13
+ createBioTemplatePackCollection,
14
+ getBioTemplatePackInfo,
15
+ type BioTemplatePackEntry,
16
+ type TemplateCollectionEnvelope,
17
+ type TemplatePackId,
18
+ } from '../templates'
19
+ import {
20
+ useTemplateCollection,
21
+ type UseTemplateCollectionOptions,
22
+ type UseTemplateCollectionReturn,
23
+ } from './useTemplateCollection'
24
+ import {
25
+ useBioTemplateWorkspace,
26
+ type BioTemplateRendererBinding,
27
+ type BioTemplateWorkspaceBindings,
28
+ type UseBioTemplateWorkspaceReturn,
29
+ } from './useBioTemplateWorkspace'
30
+ import type {
31
+ BioTemplateComponentBinding,
32
+ BioTemplateComponentBindingsById,
33
+ BioTemplateComponentImport,
34
+ BioTemplateComponentPropsByComponent,
35
+ BioTemplateComponentPropsBinding,
36
+ BioTemplateComponentPropsById,
37
+ BioTemplateComponentSnippet,
38
+ BioTemplateComponentUsage,
39
+ } from './useBioTemplateComponents'
40
+
41
+ export type UseBioTemplatePackWorkspaceOptions = UseTemplateCollectionOptions
42
+
43
+ export interface UseBioTemplatePackWorkspaceReturn {
44
+ packId: TemplatePackId
45
+ pack: BioTemplatePackEntry
46
+ collection: Ref<TemplateCollectionEnvelope>
47
+ templates: UseTemplateCollectionReturn['templates']
48
+ templateIds: UseTemplateCollectionReturn['templateIds']
49
+ currentExperimentId: UseTemplateCollectionReturn['currentExperimentId']
50
+ hasCurrentExperiment: UseTemplateCollectionReturn['hasCurrentExperiment']
51
+ loading: UseTemplateCollectionReturn['isLoading']
52
+ saving: UseTemplateCollectionReturn['isSaving']
53
+ error: UseTemplateCollectionReturn['error']
54
+ lastLoadedAt: UseTemplateCollectionReturn['lastLoadedAt']
55
+ lastSavedAt: UseTemplateCollectionReturn['lastSavedAt']
56
+ renderer: ComputedRef<BioTemplateRendererBinding>
57
+ workspace: ComputedRef<UseBioTemplateWorkspaceReturn>
58
+ form: ComputedRef<UseBioTemplateWorkspaceReturn['form']>
59
+ sidebar: ComputedRef<UseBioTemplateWorkspaceReturn['sidebar']>
60
+ topBar: ComputedRef<UseBioTemplateWorkspaceReturn['topBar']['value']>
61
+ pillNav: ComputedRef<UseBioTemplateWorkspaceReturn['pillNav']>
62
+ topBarSettings: ComputedRef<UseBioTemplateWorkspaceReturn['topBarSettings']>
63
+ bindings: ComputedRef<BioTemplateWorkspaceBindings>
64
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
65
+ componentBindingsById: ComputedRef<BioTemplateComponentBindingsById>
66
+ componentImports: ComputedRef<BioTemplateComponentImport[]>
67
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
68
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
69
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
70
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
71
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
72
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
73
+ applyCollection: (value: unknown, metadata?: Record<string, unknown>) => TemplateCollectionEnvelope
74
+ resetToDefaultCollection: () => TemplateCollectionEnvelope
75
+ save: UseTemplateCollectionReturn['save']
76
+ saveCurrent: UseTemplateCollectionReturn['saveCurrent']
77
+ load: UseTemplateCollectionReturn['load']
78
+ loadCurrent: UseTemplateCollectionReturn['loadCurrent']
79
+ requireCurrentExperimentId: UseTemplateCollectionReturn['requireCurrentExperimentId']
80
+ }
81
+
82
+ /** Create a complete workspace for a curated biology template pack from a single pack id. */
83
+ export function useBioTemplatePackWorkspace(
84
+ packId: TemplatePackId | string,
85
+ options: UseBioTemplatePackWorkspaceOptions = {},
86
+ ): UseBioTemplatePackWorkspaceReturn {
87
+ const pack = getBioTemplatePackInfo(packId)
88
+ if (!pack) {
89
+ throw new Error(`Unknown template pack '${packId}'.`)
90
+ }
91
+ const resolvedPack = pack
92
+
93
+ const templateCollection = useTemplateCollection({
94
+ ...options,
95
+ initial: createDefaultCollection,
96
+ })
97
+ const collection = templateCollection.templateCollection
98
+ let workspaceScope: EffectScope | undefined
99
+
100
+ function createWorkspace(value: TemplateCollectionEnvelope): UseBioTemplateWorkspaceReturn {
101
+ workspaceScope?.stop()
102
+ workspaceScope = effectScope()
103
+ return workspaceScope.run(() => useBioTemplateWorkspace(value))!
104
+ }
105
+
106
+ const workspaceRef = shallowRef<UseBioTemplateWorkspaceReturn>(createWorkspace(collection.value))
107
+ const workspace = computed(() => workspaceRef.value)
108
+ const renderer = computed<BioTemplateRendererBinding>(() => ({ target: collection.value }))
109
+ const form = computed(() => workspace.value.form)
110
+ const sidebar = computed(() => workspace.value.sidebar)
111
+ const topBar = computed(() => workspace.value.topBar.value)
112
+ const pillNav = computed(() => workspace.value.pillNav)
113
+ const topBarSettings = computed(() => workspace.value.topBarSettings)
114
+ const bindings = computed(() => workspace.value.bindings)
115
+ const componentBindings = computed(() => workspace.value.componentBindings)
116
+ const componentBindingsById = computed(() => workspace.value.componentBindingsById)
117
+ const componentImports = computed(() => workspace.value.componentImports)
118
+ const componentProps = computed(() => workspace.value.componentProps)
119
+ const componentPropsById = computed(() => workspace.value.componentPropsById)
120
+ const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent)
121
+ const componentSnippets = computed(() => workspace.value.componentSnippets)
122
+ const componentUsage = computed(() => workspace.value.componentUsage)
123
+
124
+ watch(collection, value => {
125
+ workspaceRef.value = createWorkspace(value)
126
+ })
127
+
128
+ if (getCurrentScope()) {
129
+ onScopeDispose(() => workspaceScope?.stop())
130
+ }
131
+
132
+ function createDefaultCollection(): TemplateCollectionEnvelope {
133
+ return createBioTemplatePackCollection(resolvedPack.name)
134
+ }
135
+
136
+ function applyCollection(
137
+ value: unknown,
138
+ metadata?: Record<string, unknown>,
139
+ ): TemplateCollectionEnvelope {
140
+ return templateCollection.apply(value, metadata)
141
+ }
142
+
143
+ function resetToDefaultCollection(): TemplateCollectionEnvelope {
144
+ return templateCollection.apply(createDefaultCollection())
145
+ }
146
+
147
+ return {
148
+ packId: resolvedPack.name,
149
+ pack: resolvedPack,
150
+ collection,
151
+ templates: templateCollection.templates,
152
+ templateIds: templateCollection.templateIds,
153
+ currentExperimentId: templateCollection.currentExperimentId,
154
+ hasCurrentExperiment: templateCollection.hasCurrentExperiment,
155
+ loading: templateCollection.isLoading,
156
+ saving: templateCollection.isSaving,
157
+ error: templateCollection.error,
158
+ lastLoadedAt: templateCollection.lastLoadedAt,
159
+ lastSavedAt: templateCollection.lastSavedAt,
160
+ renderer,
161
+ workspace,
162
+ form,
163
+ sidebar,
164
+ topBar,
165
+ pillNav,
166
+ topBarSettings,
167
+ bindings,
168
+ componentBindings,
169
+ componentBindingsById,
170
+ componentImports,
171
+ componentProps,
172
+ componentPropsById,
173
+ componentPropsByComponent,
174
+ componentSnippets,
175
+ componentUsage,
176
+ getComponentProps: (component, options) => workspace.value.getComponentProps(component, options),
177
+ applyCollection,
178
+ resetToDefaultCollection,
179
+ save: templateCollection.save,
180
+ saveCurrent: templateCollection.saveCurrent,
181
+ load: templateCollection.load,
182
+ loadCurrent: templateCollection.loadCurrent,
183
+ requireCurrentExperimentId: templateCollection.requireCurrentExperimentId,
184
+ }
185
+ }
@@ -0,0 +1,326 @@
1
+ import {
2
+ computed,
3
+ reactive,
4
+ ref,
5
+ watch,
6
+ type ComputedRef,
7
+ type Ref,
8
+ } from 'vue'
9
+ import type { PillNavItem } from '../types'
10
+ import {
11
+ createBioTemplatePresetCollectionFromControls,
12
+ getBioTemplatePresetInfo,
13
+ type BioTemplateControlValues,
14
+ type BioTemplatePresetEntry,
15
+ type TemplateCollectionEnvelope,
16
+ type TemplatePresetId,
17
+ } from '../templates'
18
+ import type {
19
+ ControlWorkspaceOptions,
20
+ ControlWorkspaceFormBinding,
21
+ ControlWorkspacePillNavBinding,
22
+ ControlWorkspaceSidebarBinding,
23
+ ControlWorkspaceTopBarBinding,
24
+ ControlWorkspaceTopBarSettingsBinding,
25
+ UseControlSchemaReturn,
26
+ } from './useControlSchema'
27
+ import {
28
+ useTemplateCollection,
29
+ type UseTemplateCollectionOptions,
30
+ type UseTemplateCollectionReturn,
31
+ } from './useTemplateCollection'
32
+ import {
33
+ useBioTemplateWorkspace,
34
+ type BioTemplateRendererBinding,
35
+ type UseBioTemplateWorkspaceReturn,
36
+ } from './useBioTemplateWorkspace'
37
+ import type {
38
+ BioTemplateComponentBinding,
39
+ BioTemplateComponentBindingsById,
40
+ BioTemplateComponentImport,
41
+ BioTemplateComponentPropsByComponent,
42
+ BioTemplateComponentPropsBinding,
43
+ BioTemplateComponentPropsById,
44
+ BioTemplateComponentSnippet,
45
+ BioTemplateComponentUsage,
46
+ } from './useBioTemplateComponents'
47
+ import type {
48
+ BioTemplateControlSchema,
49
+ } from './useBioTemplateControls'
50
+
51
+ export interface UseBioTemplatePresetWorkspaceOptions extends UseTemplateCollectionOptions {
52
+ /** Optional schema-rendering options for the generated FormBuilder/AppSidebar controls. */
53
+ controlOptions?: ControlWorkspaceOptions
54
+ /** Initial control values for the generated preset. Merged over controlOptions.initialValues. */
55
+ initialValues?: BioTemplateControlValues
56
+ }
57
+
58
+ export interface UseBioTemplatePresetWorkspaceReturn {
59
+ presetId: TemplatePresetId
60
+ presetInfo: ComputedRef<BioTemplatePresetEntry | undefined>
61
+ presetLabel: ComputedRef<string>
62
+ collection: Ref<TemplateCollectionEnvelope>
63
+ templates: UseTemplateCollectionReturn['templates']
64
+ templateIds: UseTemplateCollectionReturn['templateIds']
65
+ currentExperimentId: UseTemplateCollectionReturn['currentExperimentId']
66
+ hasCurrentExperiment: UseTemplateCollectionReturn['hasCurrentExperiment']
67
+ saving: UseTemplateCollectionReturn['isSaving']
68
+ error: UseTemplateCollectionReturn['error']
69
+ lastSavedAt: UseTemplateCollectionReturn['lastSavedAt']
70
+ controls: UseControlSchemaReturn<BioTemplateControlSchema>
71
+ controlSchema: BioTemplateControlSchema
72
+ controlValues: Ref<BioTemplateControlValues>
73
+ controlViewIds: ComputedRef<string[]>
74
+ controlViewItems: ComputedRef<PillNavItem[]>
75
+ activeControlView: Ref<string>
76
+ form: ControlWorkspaceFormBinding
77
+ sidebar: ControlWorkspaceSidebarBinding
78
+ topBar: ComputedRef<ControlWorkspaceTopBarBinding>
79
+ pillNav: ControlWorkspacePillNavBinding
80
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
81
+ bindings: BioTemplatePresetWorkspaceBindings
82
+ renderer: ComputedRef<BioTemplateRendererBinding>
83
+ workspace: ComputedRef<UseBioTemplateWorkspaceReturn>
84
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
85
+ componentBindingsById: ComputedRef<BioTemplateComponentBindingsById>
86
+ componentImports: ComputedRef<BioTemplateComponentImport[]>
87
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
88
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
89
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
90
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
91
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
92
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
93
+ setActiveControlView: (viewId: string) => void
94
+ setControlValues: (values: BioTemplateControlValues) => TemplateCollectionEnvelope
95
+ updateControlValues: (values: Partial<BioTemplateControlValues>) => TemplateCollectionEnvelope
96
+ applyCollection: (value: TemplateCollectionEnvelope) => TemplateCollectionEnvelope
97
+ resetToDefaultCollection: () => TemplateCollectionEnvelope
98
+ save: UseTemplateCollectionReturn['save']
99
+ saveCurrent: UseTemplateCollectionReturn['saveCurrent']
100
+ }
101
+
102
+ export interface BioTemplatePresetWorkspaceBindings {
103
+ renderer: ComputedRef<BioTemplateRendererBinding>
104
+ form: ControlWorkspaceFormBinding
105
+ sidebar: ControlWorkspaceSidebarBinding
106
+ topBar: ComputedRef<ControlWorkspaceTopBarBinding>
107
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
108
+ pillNav: ControlWorkspacePillNavBinding
109
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
110
+ componentBindingsById: ComputedRef<BioTemplateComponentBindingsById>
111
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
112
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
113
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
114
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
115
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
116
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
117
+ }
118
+
119
+ /** Create a complete editable WellPlate/DoseCalculator workspace for dose design from a built-in biology template preset with current-experiment save wiring. */
120
+ export function useBioTemplatePresetWorkspace(
121
+ presetId: TemplatePresetId,
122
+ options: UseBioTemplatePresetWorkspaceOptions = {},
123
+ ): UseBioTemplatePresetWorkspaceReturn {
124
+ const { controlOptions, initialValues, ...collectionOptions } = options
125
+ const resolvedControlOptions = mergeInitialValues(controlOptions, initialValues)
126
+ const presetWorkspace = useBioTemplateWorkspace(presetId, resolvedControlOptions)
127
+ const presetInfo = computed(() => getBioTemplatePresetInfo(presetId))
128
+ const presetLabel = computed(() => presetInfo.value?.label ?? humanizePresetId(presetId))
129
+ const controls = presetWorkspace.controls
130
+ const controlValues = ref<BioTemplateControlValues>({ ...controls.initialValues })
131
+ const controlViewIds = computed(() => controls.viewIds)
132
+ const controlViewItems = computed(() => controls.viewItems)
133
+ const activeControlView = ref(controls.defaultView)
134
+ const templateCollection = useTemplateCollection({
135
+ ...collectionOptions,
136
+ initial: createDefaultCollection,
137
+ })
138
+ const collection = templateCollection.templateCollection
139
+ const workspace = computed(() => useBioTemplateWorkspace(collection.value, resolvedControlOptions))
140
+ const renderer = computed<BioTemplateRendererBinding>(() => ({ target: collection.value }))
141
+ const componentBindings = computed(() => workspace.value.componentBindings)
142
+ const componentBindingsById = computed(() => workspace.value.componentBindingsById)
143
+ const componentImports = computed(() => workspace.value.componentImports)
144
+ const componentProps = computed(() => workspace.value.componentProps)
145
+ const componentPropsById = computed(() => workspace.value.componentPropsById)
146
+ const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent)
147
+ const componentSnippets = computed(() => workspace.value.componentSnippets)
148
+ const componentUsage = computed(() => workspace.value.componentUsage)
149
+ const form = reactive({
150
+ ...controls.form,
151
+ modelValue: controlValues.value,
152
+ 'onUpdate:modelValue': setControlValues,
153
+ }) as ControlWorkspaceFormBinding
154
+ const sidebar = reactive({
155
+ ...controls.sidebar,
156
+ activeView: activeControlView.value,
157
+ modelValue: controlValues.value,
158
+ 'onUpdate:modelValue': setControlValues,
159
+ values: controlValues.value,
160
+ 'onUpdate:values': setControlValues,
161
+ }) as ControlWorkspaceSidebarBinding
162
+ const pillNav = reactive({
163
+ items: controls.viewItems,
164
+ currentItemId: activeControlView.value,
165
+ onSelect: (item: { id: string }) => setActiveControlView(item.id),
166
+ }) as ControlWorkspacePillNavBinding
167
+ const topBarSettings = reactive({
168
+ showSettings: true,
169
+ settingsConfig: {
170
+ ...controls.topBarSettingsConfig,
171
+ values: controlValues.value,
172
+ },
173
+ onSettingsValuesChange: setControlValues,
174
+ }) as ControlWorkspaceTopBarSettingsBinding
175
+ const topBarProps = computed<ControlWorkspaceTopBarBinding>(() => ({
176
+ pillNav: pillNav.items,
177
+ currentPillId: pillNav.currentItemId,
178
+ onPillSelect: pillNav.onSelect,
179
+ ...topBarSettings,
180
+ }))
181
+
182
+ function getComponentProps(
183
+ component: string,
184
+ options?: Parameters<UseBioTemplateWorkspaceReturn['getComponentProps']>[1],
185
+ ) {
186
+ return workspace.value.getComponentProps(component, options)
187
+ }
188
+
189
+ const bindings: BioTemplatePresetWorkspaceBindings = {
190
+ renderer,
191
+ form,
192
+ sidebar,
193
+ topBar: topBarProps,
194
+ topBarSettings,
195
+ pillNav,
196
+ componentBindings,
197
+ componentBindingsById,
198
+ componentProps,
199
+ componentPropsById,
200
+ componentPropsByComponent,
201
+ componentSnippets,
202
+ componentUsage,
203
+ getComponentProps,
204
+ }
205
+
206
+ function createDefaultCollection(): TemplateCollectionEnvelope {
207
+ return createBioTemplatePresetCollectionFromControls(presetId, controls.initialValues)
208
+ }
209
+
210
+ watch(
211
+ controlValues,
212
+ (values) => {
213
+ syncControlValueBindings(values)
214
+ templateCollection.apply(createBioTemplatePresetCollectionFromControls(presetId, values))
215
+ },
216
+ { deep: true },
217
+ )
218
+
219
+ watch(activeControlView, (viewId) => {
220
+ sidebar.activeView = viewId
221
+ pillNav.currentItemId = viewId
222
+ }, { flush: 'sync' })
223
+ watch(() => sidebar.activeView, setActiveControlView, { flush: 'sync' })
224
+ watch(() => pillNav.currentItemId, setActiveControlView, { flush: 'sync' })
225
+
226
+ function applyCollection(value: TemplateCollectionEnvelope): TemplateCollectionEnvelope {
227
+ return templateCollection.apply(value)
228
+ }
229
+
230
+ function setActiveControlView(viewId: string): void {
231
+ if (!controlViewIds.value.includes(viewId)) return
232
+ activeControlView.value = viewId
233
+ }
234
+
235
+ function setControlValues(values: BioTemplateControlValues): TemplateCollectionEnvelope {
236
+ const nextValues = { ...values }
237
+ controlValues.value = nextValues
238
+ syncControlValueBindings(nextValues)
239
+ return templateCollection.apply(createBioTemplatePresetCollectionFromControls(presetId, nextValues))
240
+ }
241
+
242
+ function updateControlValues(values: Partial<BioTemplateControlValues>): TemplateCollectionEnvelope {
243
+ return setControlValues({
244
+ ...controlValues.value,
245
+ ...values,
246
+ })
247
+ }
248
+
249
+ function resetToDefaultCollection(): TemplateCollectionEnvelope {
250
+ return setControlValues({ ...controls.initialValues })
251
+ }
252
+
253
+ function syncControlValueBindings(values: BioTemplateControlValues): void {
254
+ form.modelValue = values
255
+ sidebar.modelValue = values
256
+ sidebar.values = values
257
+ topBarSettings.settingsConfig = {
258
+ ...topBarSettings.settingsConfig,
259
+ values,
260
+ }
261
+ }
262
+
263
+ return {
264
+ presetId,
265
+ presetInfo,
266
+ presetLabel,
267
+ collection,
268
+ templates: templateCollection.templates,
269
+ templateIds: templateCollection.templateIds,
270
+ currentExperimentId: templateCollection.currentExperimentId,
271
+ hasCurrentExperiment: templateCollection.hasCurrentExperiment,
272
+ saving: templateCollection.isSaving,
273
+ error: templateCollection.error,
274
+ lastSavedAt: templateCollection.lastSavedAt,
275
+ controls,
276
+ controlSchema: controls.controls,
277
+ controlValues,
278
+ controlViewIds,
279
+ controlViewItems,
280
+ activeControlView,
281
+ form,
282
+ sidebar,
283
+ topBar: topBarProps,
284
+ pillNav,
285
+ topBarSettings,
286
+ bindings,
287
+ renderer,
288
+ workspace,
289
+ componentBindings,
290
+ componentBindingsById,
291
+ componentImports,
292
+ componentProps,
293
+ componentPropsById,
294
+ componentPropsByComponent,
295
+ componentSnippets,
296
+ componentUsage,
297
+ getComponentProps,
298
+ setActiveControlView,
299
+ setControlValues,
300
+ updateControlValues,
301
+ applyCollection,
302
+ resetToDefaultCollection,
303
+ save: templateCollection.save,
304
+ saveCurrent: templateCollection.saveCurrent,
305
+ }
306
+ }
307
+
308
+ function humanizePresetId(value: string): string {
309
+ return value
310
+ .replace(/[-_]+/g, ' ')
311
+ .replace(/\b\w/g, match => match.toUpperCase())
312
+ }
313
+
314
+ function mergeInitialValues(
315
+ controlOptions: ControlWorkspaceOptions | undefined,
316
+ initialValues: BioTemplateControlValues | undefined,
317
+ ): ControlWorkspaceOptions | undefined {
318
+ if (initialValues === undefined) return controlOptions
319
+ return {
320
+ ...(controlOptions ?? {}),
321
+ initialValues: {
322
+ ...(controlOptions?.initialValues ?? {}),
323
+ ...initialValues,
324
+ },
325
+ }
326
+ }