@morscherlab/mint-sdk 1.0.0-rc.2 → 1.0.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
  2. package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
  3. package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
  4. package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
  5. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  6. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  7. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  8. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  9. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  10. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  11. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  12. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  13. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  14. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  15. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  16. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  17. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  18. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  19. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  20. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  21. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  22. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  23. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  24. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  25. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  26. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  27. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  28. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  29. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  30. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  31. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  32. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  33. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  34. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  35. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  36. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  37. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  38. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  39. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  40. package/dist/components/AppTopBar.navigation.d.ts +11 -0
  41. package/dist/components/BaseButton.vue.d.ts +1 -1
  42. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  43. package/dist/components/BaseInput.vue.d.ts +2 -2
  44. package/dist/components/BasePill.vue.d.ts +1 -1
  45. package/dist/components/BaseRadioGroup.vue.d.ts +1 -1
  46. package/dist/components/BaseSelect.vue.d.ts +1 -1
  47. package/dist/components/BaseSlider.vue.d.ts +2 -2
  48. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  49. package/dist/components/BaseToggle.vue.d.ts +1 -1
  50. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  51. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  52. package/dist/components/ColorSlider.vue.d.ts +2 -2
  53. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  54. package/dist/components/DatePicker.vue.d.ts +1 -1
  55. package/dist/components/DateTimePicker.vue.d.ts +2 -2
  56. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
  57. package/dist/components/DropdownButton.vue.d.ts +1 -1
  58. package/dist/components/FileUploader.vue.d.ts +2 -2
  59. package/dist/components/FormulaInput.vue.d.ts +2 -2
  60. package/dist/components/IconButton.vue.d.ts +1 -1
  61. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  62. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  63. package/dist/components/MultiSelect.vue.d.ts +1 -1
  64. package/dist/components/NumberInput.vue.d.ts +1 -1
  65. package/dist/components/PlateMapEditor.vue.d.ts +6 -6
  66. package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
  67. package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
  68. package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
  69. package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
  70. package/dist/components/PluginWorkspaceView.vue.d.ts +46 -195
  71. package/dist/components/ProgressBar.vue.d.ts +1 -1
  72. package/dist/components/ProtocolStep.presentation.d.ts +4 -0
  73. package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
  74. package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
  75. package/dist/components/ReagentList.presentation.d.ts +16 -0
  76. package/dist/components/ResourceCard.vue.d.ts +1 -1
  77. package/dist/components/SampleSelector.colors.d.ts +13 -0
  78. package/dist/components/SampleSelector.drag.d.ts +24 -0
  79. package/dist/components/SampleSelector.groups.d.ts +15 -0
  80. package/dist/components/SampleSelector.selection.d.ts +26 -0
  81. package/dist/components/SampleSelector.vue.d.ts +4 -1
  82. package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
  83. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  84. package/dist/components/SequenceInput.vue.d.ts +2 -2
  85. package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
  86. package/dist/components/SettingsModal.schema.d.ts +9 -0
  87. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  88. package/dist/components/TagsInput.vue.d.ts +2 -2
  89. package/dist/components/TimePicker.vue.d.ts +2 -2
  90. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  91. package/dist/components/UnitInput.vue.d.ts +2 -2
  92. package/dist/components/WellPlate.colors.d.ts +9 -0
  93. package/dist/components/WellPlate.conditions.d.ts +26 -0
  94. package/dist/components/WellPlate.geometry.d.ts +23 -0
  95. package/dist/components/WellPlate.interaction.d.ts +71 -0
  96. package/dist/components/WellPlate.legend.d.ts +2 -0
  97. package/dist/components/WellPlate.rendering.d.ts +24 -0
  98. package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
  99. package/dist/components/WellPlate.vue.d.ts +1 -1
  100. package/dist/components/index.js +2 -2
  101. package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
  102. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
  103. package/dist/{components-BhK-dW99.js → components-DtHA2bgp.js} +3754 -2991
  104. package/dist/components-DtHA2bgp.js.map +1 -0
  105. package/dist/composables/autoGroup/classKey.d.ts +4 -0
  106. package/dist/composables/autoGroup/classify.d.ts +28 -0
  107. package/dist/composables/autoGroup/colors.d.ts +2 -0
  108. package/dist/composables/autoGroup/columns.d.ts +10 -0
  109. package/dist/composables/autoGroup/compose.d.ts +8 -0
  110. package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
  111. package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
  112. package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
  113. package/dist/composables/autoGroup/index.d.ts +16 -0
  114. package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
  115. package/dist/composables/autoGroup/template.d.ts +15 -0
  116. package/dist/composables/autoGroup/tokenize.d.ts +8 -0
  117. package/dist/composables/autoGroupConstants.d.ts +1 -0
  118. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  119. package/dist/composables/controlComponentBindings.d.ts +7 -0
  120. package/dist/composables/controlSchemaAdapters.d.ts +20 -0
  121. package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
  122. package/dist/composables/controlSchemaFormFields.d.ts +3 -0
  123. package/dist/composables/controlSchemaLayout.d.ts +7 -0
  124. package/dist/composables/controlSchemaModel.d.ts +5 -0
  125. package/dist/composables/controlSchemaNormalize.d.ts +15 -0
  126. package/dist/composables/controlSchemaTypes.d.ts +305 -0
  127. package/dist/composables/controlSchemaUtils.d.ts +9 -0
  128. package/dist/composables/controlWorkspaceOptions.d.ts +2 -0
  129. package/dist/composables/formBuilderSchema.d.ts +18 -0
  130. package/dist/composables/index.js +3 -3
  131. package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
  132. package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
  133. package/dist/composables/useAutoGroup.d.ts +61 -74
  134. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  135. package/dist/composables/useBioTemplateControls.d.ts +1 -1
  136. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
  137. package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
  138. package/dist/composables/useControlSchema.d.ts +8 -346
  139. package/dist/composables/useControlWorkspace.d.ts +5 -0
  140. package/dist/composables/useForm.d.ts +2 -33
  141. package/dist/composables/useFormBuilder.d.ts +2 -9
  142. package/dist/composables/useFormValidation.d.ts +34 -0
  143. package/dist/composables/usePluginClient.d.ts +1 -4
  144. package/dist/composables/useProtocolTemplates.d.ts +2 -24
  145. package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
  146. package/dist/{composables-Bg7CFuNz.js → composables-Dlg8jenH.js} +33 -31
  147. package/dist/composables-Dlg8jenH.js.map +1 -0
  148. package/dist/index.js +4 -4
  149. package/dist/install.js +2 -2
  150. package/dist/styles.css +547 -516
  151. package/dist/templates/adapters.d.ts +14 -47
  152. package/dist/templates/assayLookups.d.ts +3 -0
  153. package/dist/templates/assayMatrixAdapters.d.ts +6 -0
  154. package/dist/templates/assayMatrixBuilder.d.ts +2 -0
  155. package/dist/templates/assayNormalizers.d.ts +4 -0
  156. package/dist/templates/builderDefaults.d.ts +1 -0
  157. package/dist/templates/builderIdUtils.d.ts +4 -0
  158. package/dist/templates/builderPresetControls.d.ts +10 -0
  159. package/dist/templates/builderReadUtils.d.ts +8 -0
  160. package/dist/templates/builders.d.ts +26 -67
  161. package/dist/templates/calibrationCurveAdapters.d.ts +4 -0
  162. package/dist/templates/calibrationCurveBuilder.d.ts +2 -0
  163. package/dist/templates/calibrationNormalizers.d.ts +5 -0
  164. package/dist/templates/componentBindingCatalog.d.ts +25 -0
  165. package/dist/templates/componentBindingHelpers.d.ts +17 -0
  166. package/dist/templates/componentDoseResponseProps.d.ts +3 -0
  167. package/dist/templates/componentGenericProps.d.ts +8 -0
  168. package/dist/templates/componentPlateHelpers.d.ts +5 -0
  169. package/dist/templates/componentPlateMapProps.d.ts +3 -0
  170. package/dist/templates/componentPropsFactory.d.ts +3 -0
  171. package/dist/templates/componentQpcrPlateProps.d.ts +3 -0
  172. package/dist/templates/componentTargetResolvers.d.ts +5 -0
  173. package/dist/templates/componentTemplateProps.d.ts +3 -0
  174. package/dist/templates/controlSchemaClone.d.ts +4 -0
  175. package/dist/templates/controlSchemaConstants.d.ts +10 -0
  176. package/dist/templates/controlSchemaMerge.d.ts +3 -0
  177. package/dist/templates/controlSchemaTargets.d.ts +17 -0
  178. package/dist/templates/controlSchemaTypes.d.ts +4 -0
  179. package/dist/templates/controlSchemas.d.ts +4 -4
  180. package/dist/templates/defaultBioTemplateBuilder.d.ts +2 -0
  181. package/dist/templates/doseResponseAdapters.d.ts +4 -0
  182. package/dist/templates/doseResponseBuilder.d.ts +2 -0
  183. package/dist/templates/elisaAssayCollectionBuilder.d.ts +2 -0
  184. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +2 -0
  185. package/dist/templates/flowCytometryPanelBuilder.d.ts +2 -0
  186. package/dist/templates/flowNormalizers.d.ts +8 -0
  187. package/dist/templates/flowPanelAdapters.d.ts +4 -0
  188. package/dist/templates/index.js +1 -1
  189. package/dist/templates/instrumentRunAdapterHelpers.d.ts +8 -0
  190. package/dist/templates/instrumentRunAdapters.d.ts +8 -0
  191. package/dist/templates/instrumentRunBuilder.d.ts +2 -0
  192. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +2 -0
  193. package/dist/templates/plateGeometry.d.ts +4 -0
  194. package/dist/templates/plateMapAdapters.d.ts +3 -0
  195. package/dist/templates/plateMapBuilder.d.ts +2 -0
  196. package/dist/templates/presetControlSchemas.d.ts +534 -0
  197. package/dist/templates/protocolAdapters.d.ts +5 -0
  198. package/dist/templates/protocolNormalizers.d.ts +6 -0
  199. package/dist/templates/protocolStepsBuilder.d.ts +2 -0
  200. package/dist/templates/qpcrAdapters.d.ts +5 -0
  201. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +2 -0
  202. package/dist/templates/qpcrPlateBuilder.d.ts +2 -0
  203. package/dist/templates/reagentAdapters.d.ts +5 -0
  204. package/dist/templates/reagentListBuilder.d.ts +2 -0
  205. package/dist/templates/runNormalizers.d.ts +10 -0
  206. package/dist/templates/sampleNormalizers.d.ts +4 -0
  207. package/dist/templates/samplePrepAdapters.d.ts +4 -0
  208. package/dist/templates/samplePrepBuilder.d.ts +2 -0
  209. package/dist/templates/sampleSheetAdapters.d.ts +5 -0
  210. package/dist/templates/sampleSheetBuilder.d.ts +2 -0
  211. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +2 -0
  212. package/dist/templates/targetedMetabolomicsHelpers.d.ts +5 -0
  213. package/dist/templates/templateAdapterTypes.d.ts +48 -0
  214. package/dist/templates/templateControlSchemas.d.ts +400 -0
  215. package/dist/templates/templateCreateOptions.d.ts +165 -0
  216. package/dist/templates/templateEnvelopes.d.ts +9 -0
  217. package/dist/templates/templatePackCollectionBuilder.d.ts +2 -0
  218. package/dist/templates/templatePresetCollectionBuilder.d.ts +18 -0
  219. package/dist/templates/templateQpcrTypes.d.ts +42 -0
  220. package/dist/templates/templateValidators.d.ts +13 -0
  221. package/dist/templates/timeCourseAdapters.d.ts +5 -0
  222. package/dist/templates/timeCourseBuilder.d.ts +2 -0
  223. package/dist/templates/types.d.ts +5 -250
  224. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +2 -0
  225. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +2 -0
  226. package/dist/{templates-BorLR_7p.js → templates-DtdUvJ4c.js} +3565 -3411
  227. package/dist/templates-DtdUvJ4c.js.map +1 -0
  228. package/dist/types/auto-group.d.ts +79 -9
  229. package/dist/types/componentLabTypes.d.ts +161 -0
  230. package/dist/types/componentWorkflowTypes.d.ts +150 -0
  231. package/dist/types/components.d.ts +2 -311
  232. package/dist/{useProtocolTemplates-n6AJqSqv.js → useProtocolTemplates-Bm5vyH4_.js} +1220 -454
  233. package/dist/useProtocolTemplates-Bm5vyH4_.js.map +1 -0
  234. package/package.json +1 -1
  235. package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
  236. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  237. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  238. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  239. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  240. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +41 -0
  241. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  242. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  243. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  244. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  245. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  246. package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
  247. package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
  248. package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
  249. package/src/__tests__/components/SampleSelector.test.ts +32 -0
  250. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
  251. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  252. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  253. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  254. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  255. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  256. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  257. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  258. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  259. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  260. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  261. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  262. package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
  263. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  264. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
  265. package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
  266. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  267. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  268. package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
  269. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
  270. package/src/__tests__/composables/useControlSchema.test.ts +23 -0
  271. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  272. package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
  273. package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
  274. package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
  275. package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
  276. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  277. package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
  278. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  279. package/src/components/AppSidebar.vue +2 -6
  280. package/src/components/AppTopBar.navigation.ts +62 -0
  281. package/src/components/AppTopBar.vue +17 -44
  282. package/src/components/AutoGroupModal.story.vue +50 -0
  283. package/src/components/AutoGroupModal.vue +441 -158
  284. package/src/components/ControlWorkspaceView.vue +2 -6
  285. package/src/components/DoseCalculator.vue +13 -73
  286. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  287. package/src/components/ExperimentTimeline.vue +6 -31
  288. package/src/components/FormBuilder.vue +2 -7
  289. package/src/components/PlateMapEditor.vue +32 -106
  290. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  291. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  292. package/src/components/PluginWorkspaceView.props.ts +174 -0
  293. package/src/components/PluginWorkspaceView.shell.ts +66 -0
  294. package/src/components/PluginWorkspaceView.vue +85 -404
  295. package/src/components/ProtocolStep.presentation.ts +31 -0
  296. package/src/components/ProtocolStepEditor.state.ts +104 -0
  297. package/src/components/ProtocolStepEditor.vue +48 -179
  298. package/src/components/ProtocolStepParameterField.vue +134 -0
  299. package/src/components/ReagentList.presentation.ts +105 -0
  300. package/src/components/ReagentList.vue +16 -79
  301. package/src/components/SampleSelector.colors.ts +43 -0
  302. package/src/components/SampleSelector.drag.ts +164 -0
  303. package/src/components/SampleSelector.groups.ts +109 -0
  304. package/src/components/SampleSelector.selection.ts +103 -0
  305. package/src/components/SampleSelector.vue +82 -349
  306. package/src/components/SampleSelectorSampleRow.vue +64 -0
  307. package/src/components/ScheduleCalendar.vue +44 -199
  308. package/src/components/SettingsModal.schema.ts +71 -0
  309. package/src/components/SettingsModal.vue +16 -46
  310. package/src/components/WellPlate.colors.ts +56 -0
  311. package/src/components/WellPlate.conditions.ts +100 -0
  312. package/src/components/WellPlate.geometry.ts +91 -0
  313. package/src/components/WellPlate.interaction.ts +272 -0
  314. package/src/components/WellPlate.legend.ts +8 -0
  315. package/src/components/WellPlate.rendering.ts +105 -0
  316. package/src/components/WellPlate.sampleDrop.ts +73 -0
  317. package/src/components/WellPlate.vue +102 -550
  318. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  319. package/src/composables/autoGroup/classKey.ts +5 -0
  320. package/src/composables/autoGroup/classify.ts +205 -0
  321. package/src/composables/autoGroup/colors.ts +6 -0
  322. package/src/composables/autoGroup/columns.ts +226 -0
  323. package/src/composables/autoGroup/compose.ts +156 -0
  324. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  325. package/src/composables/autoGroup/csv-shim.ts +44 -0
  326. package/src/composables/autoGroup/fingerprint.ts +49 -0
  327. package/src/composables/autoGroup/index.ts +20 -0
  328. package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
  329. package/src/composables/autoGroup/template.ts +126 -0
  330. package/src/composables/autoGroup/tokenize.ts +41 -0
  331. package/src/composables/autoGroup/vocab.json +67 -0
  332. package/src/composables/autoGroupConstants.ts +4 -0
  333. package/src/composables/autoGroupGrouping.ts +148 -0
  334. package/src/composables/controlComponentBindings.ts +80 -0
  335. package/src/composables/controlSchemaAdapters.ts +196 -0
  336. package/src/composables/controlSchemaDoseDesign.ts +215 -0
  337. package/src/composables/controlSchemaFormFields.ts +61 -0
  338. package/src/composables/controlSchemaLayout.ts +59 -0
  339. package/src/composables/controlSchemaModel.ts +163 -0
  340. package/src/composables/controlSchemaNormalize.ts +101 -0
  341. package/src/composables/controlSchemaTypes.ts +364 -0
  342. package/src/composables/controlSchemaUtils.ts +36 -0
  343. package/src/composables/controlWorkspaceOptions.ts +21 -0
  344. package/src/composables/formBuilderSchema.ts +153 -0
  345. package/src/composables/pluginEndpointBuilder.ts +203 -0
  346. package/src/composables/protocolTemplateCatalog.ts +325 -0
  347. package/src/composables/useAutoGroup.ts +395 -549
  348. package/src/composables/useAutoGroupInputSources.ts +147 -0
  349. package/src/composables/useBioTemplateControls.ts +1 -1
  350. package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
  351. package/src/composables/useBioTemplateWorkspace.ts +1 -1
  352. package/src/composables/useControlSchema.ts +64 -1312
  353. package/src/composables/useControlWorkspace.ts +201 -0
  354. package/src/composables/useForm.ts +5 -187
  355. package/src/composables/useFormBuilder.ts +11 -153
  356. package/src/composables/useFormValidation.ts +154 -0
  357. package/src/composables/usePluginClient.ts +10 -193
  358. package/src/composables/useProtocolTemplates.ts +10 -328
  359. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  360. package/src/styles/components/auto-group-modal.css +248 -310
  361. package/src/templates/adapters.ts +89 -930
  362. package/src/templates/assayLookups.ts +33 -0
  363. package/src/templates/assayMatrixAdapters.ts +78 -0
  364. package/src/templates/assayMatrixBuilder.ts +59 -0
  365. package/src/templates/assayNormalizers.ts +34 -0
  366. package/src/templates/builderDefaults.ts +11 -0
  367. package/src/templates/builderIdUtils.ts +20 -0
  368. package/src/templates/builderPresetControls.ts +165 -0
  369. package/src/templates/builderReadUtils.ts +57 -0
  370. package/src/templates/builders.ts +122 -2350
  371. package/src/templates/calibrationCurveAdapters.ts +59 -0
  372. package/src/templates/calibrationCurveBuilder.ts +99 -0
  373. package/src/templates/calibrationNormalizers.ts +60 -0
  374. package/src/templates/componentBindingCatalog.ts +90 -0
  375. package/src/templates/componentBindingHelpers.ts +93 -0
  376. package/src/templates/componentBindings.ts +12 -461
  377. package/src/templates/componentDoseResponseProps.ts +42 -0
  378. package/src/templates/componentGenericProps.ts +77 -0
  379. package/src/templates/componentPlateHelpers.ts +29 -0
  380. package/src/templates/componentPlateMapProps.ts +32 -0
  381. package/src/templates/componentPropsFactory.ts +21 -0
  382. package/src/templates/componentQpcrPlateProps.ts +28 -0
  383. package/src/templates/componentTargetResolvers.ts +69 -0
  384. package/src/templates/componentTemplateProps.ts +78 -0
  385. package/src/templates/controlSchemaClone.ts +32 -0
  386. package/src/templates/controlSchemaConstants.ts +11 -0
  387. package/src/templates/controlSchemaMerge.ts +40 -0
  388. package/src/templates/controlSchemaTargets.ts +87 -0
  389. package/src/templates/controlSchemaTypes.ts +20 -0
  390. package/src/templates/controlSchemas.ts +22 -704
  391. package/src/templates/defaultBioTemplateBuilder.ts +124 -0
  392. package/src/templates/doseResponseAdapters.ts +45 -0
  393. package/src/templates/doseResponseBuilder.ts +44 -0
  394. package/src/templates/elisaAssayCollectionBuilder.ts +62 -0
  395. package/src/templates/flowCytometryAssayCollectionBuilder.ts +41 -0
  396. package/src/templates/flowCytometryPanelBuilder.ts +53 -0
  397. package/src/templates/flowNormalizers.ts +58 -0
  398. package/src/templates/flowPanelAdapters.ts +58 -0
  399. package/src/templates/instrumentRunAdapterHelpers.ts +94 -0
  400. package/src/templates/instrumentRunAdapters.ts +163 -0
  401. package/src/templates/instrumentRunBuilder.ts +97 -0
  402. package/src/templates/lcmsBatchCollectionBuilder.ts +38 -0
  403. package/src/templates/plateGeometry.ts +62 -0
  404. package/src/templates/plateMapAdapters.ts +36 -0
  405. package/src/templates/plateMapBuilder.ts +43 -0
  406. package/src/templates/presetControlSchemas.ts +258 -0
  407. package/src/templates/protocolAdapters.ts +69 -0
  408. package/src/templates/protocolNormalizers.ts +37 -0
  409. package/src/templates/protocolStepsBuilder.ts +36 -0
  410. package/src/templates/qpcrAdapters.ts +104 -0
  411. package/src/templates/qpcrExpressionCollectionBuilder.ts +33 -0
  412. package/src/templates/qpcrPlateBuilder.ts +96 -0
  413. package/src/templates/reagentAdapters.ts +77 -0
  414. package/src/templates/reagentListBuilder.ts +30 -0
  415. package/src/templates/runNormalizers.ts +63 -0
  416. package/src/templates/sampleNormalizers.ts +58 -0
  417. package/src/templates/samplePrepAdapters.ts +63 -0
  418. package/src/templates/samplePrepBuilder.ts +51 -0
  419. package/src/templates/sampleSheetAdapters.ts +75 -0
  420. package/src/templates/sampleSheetBuilder.ts +23 -0
  421. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +79 -0
  422. package/src/templates/targetedMetabolomicsHelpers.ts +102 -0
  423. package/src/templates/templateAdapterTypes.ts +58 -0
  424. package/src/templates/templateControlSchemas.ts +320 -0
  425. package/src/templates/templateCreateOptions.ts +208 -0
  426. package/src/templates/templateEnvelopes.ts +137 -0
  427. package/src/templates/templatePackCollectionBuilder.ts +23 -0
  428. package/src/templates/templatePresetCollectionBuilder.ts +139 -0
  429. package/src/templates/templateQpcrTypes.ts +48 -0
  430. package/src/templates/templateValidators.ts +414 -0
  431. package/src/templates/timeCourseAdapters.ts +73 -0
  432. package/src/templates/timeCourseBuilder.ts +64 -0
  433. package/src/templates/types.ts +79 -275
  434. package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
  435. package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
  436. package/src/types/auto-group.ts +107 -9
  437. package/src/types/componentLabTypes.ts +235 -0
  438. package/src/types/componentWorkflowTypes.ts +190 -0
  439. package/src/types/components.ts +74 -424
  440. package/dist/components-BhK-dW99.js.map +0 -1
  441. package/dist/composables-Bg7CFuNz.js.map +0 -1
  442. package/dist/templates-BorLR_7p.js.map +0 -1
  443. package/dist/useProtocolTemplates-n6AJqSqv.js.map +0 -1
@@ -0,0 +1,201 @@
1
+ import {
2
+ computed,
3
+ reactive,
4
+ ref,
5
+ watch,
6
+ } from 'vue'
7
+ import type {
8
+ PillNavItem,
9
+ TopBarSettingsConfig,
10
+ } from '../types'
11
+ import {
12
+ replaceRecord,
13
+ } from './controlSchemaUtils'
14
+ import {
15
+ mergeControlWorkspaceOptions,
16
+ } from './controlWorkspaceOptions'
17
+ import {
18
+ controlValuesToComponentBindings,
19
+ controlValuesToComponentBindingsById,
20
+ controlValuesToComponentProps,
21
+ } from './controlComponentBindings'
22
+ import {
23
+ isControlModelBinding,
24
+ } from './controlSchemaModel'
25
+ import {
26
+ useControlSchema,
27
+ } from './useControlSchema'
28
+ import type {
29
+ ControlComponentBinding,
30
+ ControlComponentBindingsById,
31
+ ControlComponentBindingsConfig,
32
+ ControlComponentPropsByIdMap,
33
+ ControlComponentPropsMap,
34
+ ControlModelBinding,
35
+ ControlSchema,
36
+ ControlValues,
37
+ ControlWorkspaceComponentBindings,
38
+ ControlWorkspaceFormBinding,
39
+ ControlWorkspaceOptions,
40
+ ControlWorkspacePillNavBinding,
41
+ ControlWorkspaceSidebarBinding,
42
+ ControlWorkspaceTopBarBinding,
43
+ ControlWorkspaceTopBarSettingsBinding,
44
+ UseControlWorkspaceReturn,
45
+ } from './controlSchemaTypes'
46
+
47
+ /** Prepare shared reactive values plus AppTopBar/AppSidebar/FormBuilder bindings from one simple controls data model. */
48
+ export function useControlWorkspace<TControls extends ControlSchema>(
49
+ controlsOrModel: TControls | (ControlModelBinding & { controls: TControls }),
50
+ options: ControlWorkspaceOptions = {},
51
+ ): UseControlWorkspaceReturn<TControls> {
52
+ const model = isControlModelBinding<ControlModelBinding & { controls: TControls }>(controlsOrModel)
53
+ ? controlsOrModel
54
+ : undefined
55
+ const controls: TControls = model ? model.controls : controlsOrModel as TControls
56
+ const workspaceOptions = model
57
+ ? mergeControlWorkspaceOptions(model.controlOptions, options)
58
+ : options
59
+ const { initialValues, topBarSettings, ...schemaOptions } = workspaceOptions
60
+ const schema = useControlSchema(controls, schemaOptions)
61
+ const activeView = ref(schema.defaultView)
62
+ const values = reactive({
63
+ ...schema.initialValues,
64
+ ...(initialValues ?? {}),
65
+ }) as ControlValues<TControls> & Record<string, unknown>
66
+
67
+ function setActiveView(viewId: string) {
68
+ syncActiveView(viewId)
69
+ }
70
+
71
+ function syncActiveView(viewId: string) {
72
+ if (!schema.viewIds.includes(viewId)) return
73
+ if (activeView.value !== viewId) activeView.value = viewId
74
+ if (sidebar.activeView !== viewId) sidebar.activeView = viewId
75
+ if (pillNav.currentItemId !== viewId) pillNav.currentItemId = viewId
76
+ }
77
+
78
+ function setValues(nextValues: Record<string, unknown>) {
79
+ Object.assign(values, nextValues)
80
+ }
81
+
82
+ function resetValues(nextValues: Record<string, unknown> = {}) {
83
+ replaceRecord(values, {
84
+ ...schema.initialValues,
85
+ ...nextValues,
86
+ })
87
+ }
88
+
89
+ function getComponentProps(
90
+ mapping?: ControlComponentPropsMap<ControlValues<TControls> & Record<string, unknown>>,
91
+ ): Record<string, unknown> {
92
+ return controlValuesToComponentProps(values, mapping)
93
+ }
94
+
95
+ function getComponentPropsById(
96
+ mappings?: ControlComponentPropsByIdMap<ControlValues<TControls> & Record<string, unknown>>,
97
+ ): Record<string, Record<string, unknown>> {
98
+ if (mappings === undefined) return {}
99
+
100
+ return Object.fromEntries(
101
+ Object.entries(mappings).map(([id, mapping]) => [
102
+ id,
103
+ controlValuesToComponentProps(values, mapping),
104
+ ]),
105
+ )
106
+ }
107
+
108
+ function getComponentBindings(
109
+ bindings?: ControlComponentBindingsConfig<ControlValues<TControls> & Record<string, unknown>>,
110
+ ): ControlComponentBinding[] {
111
+ return controlValuesToComponentBindings(values, bindings)
112
+ }
113
+
114
+ function getComponentBindingsById(
115
+ bindings?: ControlComponentBindingsConfig<ControlValues<TControls> & Record<string, unknown>>,
116
+ ): ControlComponentBindingsById {
117
+ return controlValuesToComponentBindingsById(values, bindings)
118
+ }
119
+
120
+ const componentProps = computed(() => (
121
+ model?.componentProps === undefined ? {} : getComponentProps(model.componentProps)
122
+ ))
123
+ const componentPropsById = computed(() => getComponentPropsById(model?.componentPropsById))
124
+ const componentBindings = computed(() => getComponentBindings(model?.componentBindings))
125
+ const componentBindingsById = computed(() => getComponentBindingsById(model?.componentBindings))
126
+ const form = {
127
+ ...schema.form,
128
+ modelValue: values,
129
+ 'onUpdate:modelValue': setValues,
130
+ } as ControlWorkspaceFormBinding
131
+
132
+ const topBarSettingsConfig: TopBarSettingsConfig = {
133
+ ...schema.topBarSettingsConfig,
134
+ ...(topBarSettings ?? {}),
135
+ values,
136
+ }
137
+ const sidebar = reactive({
138
+ ...schema.sidebar,
139
+ activeView: activeView.value,
140
+ modelValue: values,
141
+ 'onUpdate:modelValue': setValues,
142
+ values,
143
+ 'onUpdate:values': setValues,
144
+ }) as ControlWorkspaceSidebarBinding
145
+ const pillNav = reactive({
146
+ items: schema.viewItems,
147
+ currentItemId: activeView.value,
148
+ onSelect: (item: PillNavItem) => setActiveView(item.id),
149
+ }) as ControlWorkspacePillNavBinding
150
+ const topBarSettingsBinding = {
151
+ showSettings: true,
152
+ settingsConfig: topBarSettingsConfig,
153
+ onSettingsValuesChange: setValues,
154
+ } as ControlWorkspaceTopBarSettingsBinding
155
+ const topBarProps = computed<ControlWorkspaceTopBarBinding>(() => ({
156
+ pillNav: pillNav.items,
157
+ currentPillId: pillNav.currentItemId,
158
+ onPillSelect: pillNav.onSelect,
159
+ ...topBarSettingsBinding,
160
+ }))
161
+ const bindings: ControlWorkspaceComponentBindings = {
162
+ form,
163
+ sidebar,
164
+ topBar: topBarProps,
165
+ topBarSettings: topBarSettingsBinding,
166
+ pillNav,
167
+ componentBindings,
168
+ componentBindingsById,
169
+ componentProps,
170
+ componentPropsById,
171
+ }
172
+
173
+ watch(activeView, syncActiveView, { flush: 'sync' })
174
+ watch(() => sidebar.activeView, syncActiveView, { flush: 'sync' })
175
+ watch(() => pillNav.currentItemId, syncActiveView, { flush: 'sync' })
176
+
177
+ return {
178
+ ...schema,
179
+ schema,
180
+ values,
181
+ activeView,
182
+ topBarSettingsConfig,
183
+ form,
184
+ sidebar,
185
+ topBar: topBarProps,
186
+ pillNav,
187
+ topBarSettings: topBarSettingsBinding,
188
+ bindings,
189
+ componentBindings,
190
+ componentBindingsById,
191
+ componentProps,
192
+ componentPropsById,
193
+ setActiveView,
194
+ setValues,
195
+ resetValues,
196
+ getComponentProps,
197
+ getComponentPropsById,
198
+ getComponentBindings,
199
+ getComponentBindingsById,
200
+ }
201
+ }
@@ -1,24 +1,7 @@
1
1
  import { ref, reactive, computed, toRaw, watch, type Ref } from 'vue'
2
+ import { validateFieldValue, type FieldRules } from './useFormValidation'
2
3
 
3
- /**
4
- * Validation rule function type.
5
- * Returns error message string if invalid, undefined/null if valid.
6
- */
7
- export type ValidationRule<T = unknown> = (value: T, formData: Record<string, unknown>) => string | undefined | null
8
-
9
- /**
10
- * Field validation rules configuration.
11
- */
12
- export interface FieldRules<T = unknown> {
13
- required?: boolean | string
14
- minLength?: number | { value: number; message: string }
15
- maxLength?: number | { value: number; message: string }
16
- min?: number | { value: number; message: string }
17
- max?: number | { value: number; message: string }
18
- pattern?: RegExp | { value: RegExp; message: string }
19
- email?: boolean | string
20
- custom?: ValidationRule<T> | ValidationRule<T>[]
21
- }
4
+ export type { FieldRules, ValidationRule } from './useFormValidation'
22
5
 
23
6
  /**
24
7
  * Field validation rules configuration.
@@ -69,68 +52,6 @@ export interface UseFormReturn<T extends Record<string, unknown>> {
69
52
  }
70
53
  }
71
54
 
72
- // Built-in validators
73
- const validators = {
74
- required: (value: unknown, message = 'This field is required'): string | null => {
75
- if (value === null || value === undefined || value === '') {
76
- return message
77
- }
78
- if (Array.isArray(value) && value.length === 0) {
79
- return message
80
- }
81
- return null
82
- },
83
-
84
- minLength: (value: unknown, min: number, message?: string): string | null => {
85
- if (typeof value !== 'string') return null
86
- if (value.length < min) {
87
- return message || `Must be at least ${min} characters`
88
- }
89
- return null
90
- },
91
-
92
- maxLength: (value: unknown, max: number, message?: string): string | null => {
93
- if (typeof value !== 'string') return null
94
- if (value.length > max) {
95
- return message || `Must be at most ${max} characters`
96
- }
97
- return null
98
- },
99
-
100
- min: (value: unknown, min: number, message?: string): string | null => {
101
- if (typeof value !== 'number') return null
102
- if (value < min) {
103
- return message || `Must be at least ${min}`
104
- }
105
- return null
106
- },
107
-
108
- max: (value: unknown, max: number, message?: string): string | null => {
109
- if (typeof value !== 'number') return null
110
- if (value > max) {
111
- return message || `Must be at most ${max}`
112
- }
113
- return null
114
- },
115
-
116
- pattern: (value: unknown, pattern: RegExp, message?: string): string | null => {
117
- if (typeof value !== 'string') return null
118
- if (!pattern.test(value)) {
119
- return message || 'Invalid format'
120
- }
121
- return null
122
- },
123
-
124
- email: (value: unknown, message = 'Invalid email address'): string | null => {
125
- if (typeof value !== 'string' || !value) return null
126
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
127
- if (!emailRegex.test(value)) {
128
- return message
129
- }
130
- return null
131
- },
132
- }
133
-
134
55
  /**
135
56
  * Form state management composable with validation.
136
57
  *
@@ -205,112 +126,9 @@ export function useForm<T extends Record<string, unknown>>(
205
126
  function validateField(field: string): boolean {
206
127
  const value = data[field as keyof T]
207
128
  const fieldRules = rules[field as keyof T]
208
-
209
- if (!fieldRules) {
210
- errors[field] = null
211
- return true
212
- }
213
-
214
- // Check required
215
- if (fieldRules.required) {
216
- const message = typeof fieldRules.required === 'string' ? fieldRules.required : undefined
217
- const error = validators.required(value, message)
218
- if (error) {
219
- errors[field] = error
220
- return false
221
- }
222
- }
223
-
224
- // Skip other validations if empty and not required
225
- if (value === null || value === undefined || value === '') {
226
- errors[field] = null
227
- return true
228
- }
229
-
230
- // Check minLength
231
- if (fieldRules.minLength !== undefined) {
232
- const config = typeof fieldRules.minLength === 'number'
233
- ? { value: fieldRules.minLength, message: undefined }
234
- : fieldRules.minLength
235
- const error = validators.minLength(value, config.value, config.message)
236
- if (error) {
237
- errors[field] = error
238
- return false
239
- }
240
- }
241
-
242
- // Check maxLength
243
- if (fieldRules.maxLength !== undefined) {
244
- const config = typeof fieldRules.maxLength === 'number'
245
- ? { value: fieldRules.maxLength, message: undefined }
246
- : fieldRules.maxLength
247
- const error = validators.maxLength(value, config.value, config.message)
248
- if (error) {
249
- errors[field] = error
250
- return false
251
- }
252
- }
253
-
254
- // Check min
255
- if (fieldRules.min !== undefined) {
256
- const config = typeof fieldRules.min === 'number'
257
- ? { value: fieldRules.min, message: undefined }
258
- : fieldRules.min
259
- const error = validators.min(value, config.value, config.message)
260
- if (error) {
261
- errors[field] = error
262
- return false
263
- }
264
- }
265
-
266
- // Check max
267
- if (fieldRules.max !== undefined) {
268
- const config = typeof fieldRules.max === 'number'
269
- ? { value: fieldRules.max, message: undefined }
270
- : fieldRules.max
271
- const error = validators.max(value, config.value, config.message)
272
- if (error) {
273
- errors[field] = error
274
- return false
275
- }
276
- }
277
-
278
- // Check pattern
279
- if (fieldRules.pattern !== undefined) {
280
- const config = fieldRules.pattern instanceof RegExp
281
- ? { value: fieldRules.pattern, message: undefined }
282
- : fieldRules.pattern
283
- const error = validators.pattern(value, config.value, config.message)
284
- if (error) {
285
- errors[field] = error
286
- return false
287
- }
288
- }
289
-
290
- // Check email
291
- if (fieldRules.email) {
292
- const message = typeof fieldRules.email === 'string' ? fieldRules.email : undefined
293
- const error = validators.email(value, message)
294
- if (error) {
295
- errors[field] = error
296
- return false
297
- }
298
- }
299
-
300
- // Check custom validators
301
- if (fieldRules.custom) {
302
- const customRules = Array.isArray(fieldRules.custom) ? fieldRules.custom : [fieldRules.custom]
303
- for (const rule of customRules) {
304
- const error = rule(value, data as Record<string, unknown>)
305
- if (error) {
306
- errors[field] = error
307
- return false
308
- }
309
- }
310
- }
311
-
312
- errors[field] = null
313
- return true
129
+ const error = validateFieldValue(value, fieldRules, data as Record<string, unknown>)
130
+ errors[field] = error
131
+ return error === null
314
132
  }
315
133
 
316
134
  // Validate all fields
@@ -1,167 +1,25 @@
1
1
  import { reactive, ref, computed, shallowRef, watch } from 'vue'
2
2
  import { useForm, type FieldRules, type UseFormReturn } from './useForm'
3
- import { getFieldRegistryEntry, getTypeDefault } from './formBuilderRegistry'
3
+ import { getFieldRegistryEntry } from './formBuilderRegistry'
4
+ import {
5
+ buildInitialValues,
6
+ buildRules,
7
+ collectSections,
8
+ evaluateCondition,
9
+ flattenFields,
10
+ replaceArray,
11
+ replaceRecord,
12
+ } from './formBuilderSchema'
4
13
  import type {
5
14
  FormSchema,
6
15
  FormFieldSchema,
7
16
  FormSectionSchema,
8
- FieldCondition,
9
- FieldValidation,
10
17
  FormOptionInput,
11
18
  FormEnhancements,
12
19
  UseFormBuilderReturn,
13
20
  } from '../types/form-builder'
14
21
 
15
- // ---------------------------------------------------------------------------
16
- // Condition evaluator
17
- // ---------------------------------------------------------------------------
18
-
19
- /**
20
- * Evaluate a JSON-serializable field condition against the current form data.
21
- *
22
- * Supports logical operators (`and`, `or`, `not`) and comparison operators
23
- * (`eq`, `neq`, `gt`, `lt`, `gte`, `lte`, `in`, `notIn`, `truthy`, `falsy`,
24
- * `contains`). Returns `true` if the condition passes.
25
- */
26
- export function evaluateCondition(
27
- condition: FieldCondition,
28
- data: Record<string, unknown>,
29
- ): boolean {
30
- if ('and' in condition) {
31
- return condition.and.every((c) => evaluateCondition(c, data))
32
- }
33
- if ('or' in condition) {
34
- return condition.or.some((c) => evaluateCondition(c, data))
35
- }
36
- if ('not' in condition) {
37
- return !evaluateCondition(condition.not, data)
38
- }
39
-
40
- const value = data[condition.field]
41
-
42
- if ('eq' in condition) return value === condition.eq
43
- if ('neq' in condition) return value !== condition.neq
44
- if ('gt' in condition) return typeof value === 'number' && value > condition.gt
45
- if ('lt' in condition) return typeof value === 'number' && value < condition.lt
46
- if ('gte' in condition) return typeof value === 'number' && value >= condition.gte
47
- if ('lte' in condition) return typeof value === 'number' && value <= condition.lte
48
- if ('in' in condition) return condition.in.includes(value)
49
- if ('notIn' in condition) return !condition.notIn.includes(value)
50
- if ('truthy' in condition) return !!value
51
- if ('falsy' in condition) return !value
52
- if ('contains' in condition) {
53
- if (typeof value === 'string') return value.includes(condition.contains)
54
- if (Array.isArray(value)) return value.includes(condition.contains)
55
- return false
56
- }
57
-
58
- return true
59
- }
60
-
61
- // ---------------------------------------------------------------------------
62
- // Schema helpers
63
- // ---------------------------------------------------------------------------
64
-
65
- /** Return all sections across steps (wizard) or directly from a flat schema. */
66
- function collectSections(schema: FormSchema): FormSectionSchema[] {
67
- return schema.steps ? schema.steps.flatMap((step) => step.sections) : schema.sections
68
- }
69
-
70
- /** Return all field schemas in schema order, flattening sections and steps. */
71
- function flattenFields(schema: FormSchema): FormFieldSchema[] {
72
- return collectSections(schema).flatMap((section) => section.fields)
73
- }
74
-
75
- /** Convert a JSON-safe `FieldValidation` descriptor to a runtime `FieldRules` object. */
76
- function convertValidation(v: FieldValidation): FieldRules {
77
- const rules: FieldRules = {}
78
-
79
- if (v.required !== undefined) rules.required = v.required
80
- if (v.minLength !== undefined) rules.minLength = v.minLength
81
- if (v.maxLength !== undefined) rules.maxLength = v.maxLength
82
- if (v.min !== undefined) rules.min = v.min
83
- if (v.max !== undefined) rules.max = v.max
84
- if (v.email !== undefined) rules.email = v.email
85
-
86
- if (v.pattern !== undefined) {
87
- rules.pattern =
88
- typeof v.pattern === 'string'
89
- ? new RegExp(v.pattern)
90
- : { value: new RegExp(v.pattern.value), message: v.pattern.message }
91
- }
92
-
93
- return rules
94
- }
95
-
96
- function buildInitialValues<T extends Record<string, unknown>>(
97
- fields: readonly FormFieldSchema[],
98
- initialData?: Partial<T>,
99
- ): Record<string, unknown> {
100
- const initialValues = {} as Record<string, unknown>
101
-
102
- for (const field of fields) {
103
- const key = field.name
104
- if (initialData && hasOwnKey(initialData, key)) {
105
- initialValues[key] = (initialData as Record<string, unknown>)[key]
106
- } else if (field.defaultValue !== undefined) {
107
- initialValues[key] = field.defaultValue
108
- } else {
109
- initialValues[key] = getTypeDefault(field.type)
110
- }
111
- }
112
-
113
- return initialValues
114
- }
115
-
116
- function buildRules<T extends Record<string, unknown>>(
117
- fields: readonly FormFieldSchema[],
118
- enhancements?: FormEnhancements<T>,
119
- ): Partial<Record<string, FieldRules>> {
120
- const rules: Partial<Record<string, FieldRules>> = {}
121
-
122
- for (const field of fields) {
123
- const base: FieldRules = field.validation ? convertValidation(field.validation) : {}
124
- const enhancement = enhancements?.fields?.[field.name as keyof T]
125
-
126
- const customValidators: Array<(
127
- value: unknown,
128
- formData: Record<string, unknown>,
129
- ) => string | undefined | null> = []
130
-
131
- if (enhancement?.validate) {
132
- const fn = enhancement.validate
133
- customValidators.push((value, formData) => fn(value, formData as T))
134
- }
135
-
136
- if (customValidators.length > 0) {
137
- base.custom = customValidators
138
- }
139
-
140
- if (Object.keys(base).length > 0) {
141
- rules[field.name] = base
142
- }
143
- }
144
-
145
- return rules
146
- }
147
-
148
- function replaceArray<T>(target: T[], values: readonly T[]): void {
149
- target.splice(0, target.length, ...values)
150
- }
151
-
152
- function replaceRecord<TValue>(
153
- target: Partial<Record<string, TValue>>,
154
- source: Partial<Record<string, TValue>>,
155
- ): void {
156
- for (const key of Object.keys(target)) {
157
- delete target[key]
158
- }
159
- Object.assign(target, source)
160
- }
161
-
162
- function hasOwnKey(source: object, key: string): boolean {
163
- return Object.prototype.hasOwnProperty.call(source, key)
164
- }
22
+ export { evaluateCondition } from './formBuilderSchema'
165
23
 
166
24
  // ---------------------------------------------------------------------------
167
25
  // useFormBuilder