@qoretechnologies/reqraft 0.10.25 → 0.10.26

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 (310) hide show
  1. package/.claude/CLAUDE.md +52 -23
  2. package/design/COMPACT_ENGINE_REDESIGN.md +156 -0
  3. package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +353 -0
  4. package/dist/components/FocusedEditing/index.d.ts +9 -1
  5. package/dist/components/FocusedEditing/index.d.ts.map +1 -1
  6. package/dist/components/FocusedEditing/index.js +2 -2
  7. package/dist/components/FocusedEditing/index.js.map +1 -1
  8. package/dist/components/composer/Composer.d.ts +108 -0
  9. package/dist/components/composer/Composer.d.ts.map +1 -0
  10. package/dist/components/composer/Composer.js +238 -0
  11. package/dist/components/composer/Composer.js.map +1 -0
  12. package/dist/components/composer/helpers.d.ts +21 -0
  13. package/dist/components/composer/helpers.d.ts.map +1 -0
  14. package/dist/components/composer/helpers.js +75 -0
  15. package/dist/components/composer/helpers.js.map +1 -0
  16. package/dist/components/composer/index.d.ts +3 -0
  17. package/dist/components/composer/index.d.ts.map +1 -0
  18. package/dist/components/composer/index.js +19 -0
  19. package/dist/components/composer/index.js.map +1 -0
  20. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  21. package/dist/components/form/engine/CompactRow.js +307 -110
  22. package/dist/components/form/engine/CompactRow.js.map +1 -1
  23. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  24. package/dist/components/form/engine/CompactToolbar.js +123 -106
  25. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  26. package/dist/components/form/engine/FormEngine.d.ts +107 -11
  27. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  28. package/dist/components/form/engine/FormEngine.js +618 -179
  29. package/dist/components/form/engine/FormEngine.js.map +1 -1
  30. package/dist/components/form/engine/compactRowContext.d.ts +9 -0
  31. package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
  32. package/dist/components/form/engine/compactRowContext.js.map +1 -1
  33. package/dist/components/form/engine/compactRowStyles.d.ts +7 -3
  34. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  35. package/dist/components/form/engine/compactRowStyles.js +88 -51
  36. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  37. package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
  38. package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
  39. package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
  40. package/dist/components/form/engine/optionActions.d.ts +28 -0
  41. package/dist/components/form/engine/optionActions.d.ts.map +1 -0
  42. package/dist/components/form/engine/optionActions.js +18 -0
  43. package/dist/components/form/engine/optionActions.js.map +1 -0
  44. package/dist/components/form/engine/readFirst.d.ts +63 -2
  45. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  46. package/dist/components/form/engine/readFirst.js +121 -6
  47. package/dist/components/form/engine/readFirst.js.map +1 -1
  48. package/dist/components/form/engine/rendererTypes.d.ts +35 -0
  49. package/dist/components/form/engine/rendererTypes.d.ts.map +1 -0
  50. package/dist/components/form/engine/rendererTypes.js +63 -0
  51. package/dist/components/form/engine/rendererTypes.js.map +1 -0
  52. package/dist/components/form/engine/variants/VariantCalmTable.d.ts +6 -0
  53. package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -0
  54. package/dist/components/form/engine/variants/VariantCalmTable.js +94 -0
  55. package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -0
  56. package/dist/components/form/engine/variants/VariantCards.d.ts +6 -0
  57. package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -0
  58. package/dist/components/form/engine/variants/VariantCards.js +80 -0
  59. package/dist/components/form/engine/variants/VariantCards.js.map +1 -0
  60. package/dist/components/form/engine/variants/VariantFocus.d.ts +7 -0
  61. package/dist/components/form/engine/variants/VariantFocus.d.ts.map +1 -0
  62. package/dist/components/form/engine/variants/VariantFocus.js +138 -0
  63. package/dist/components/form/engine/variants/VariantFocus.js.map +1 -0
  64. package/dist/components/form/engine/variants/VariantMinimal.d.ts +6 -0
  65. package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -0
  66. package/dist/components/form/engine/variants/VariantMinimal.js +73 -0
  67. package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -0
  68. package/dist/components/form/engine/variants/focusDemo.d.ts +13 -0
  69. package/dist/components/form/engine/variants/focusDemo.d.ts.map +1 -0
  70. package/dist/components/form/engine/variants/focusDemo.js +139 -0
  71. package/dist/components/form/engine/variants/focusDemo.js.map +1 -0
  72. package/dist/components/form/engine/variants/variantModel.d.ts +70 -0
  73. package/dist/components/form/engine/variants/variantModel.d.ts.map +1 -0
  74. package/dist/components/form/engine/variants/variantModel.js +133 -0
  75. package/dist/components/form/engine/variants/variantModel.js.map +1 -0
  76. package/dist/components/form/engine/variants/variantParts.d.ts +79 -0
  77. package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -0
  78. package/dist/components/form/engine/variants/variantParts.js +191 -0
  79. package/dist/components/form/engine/variants/variantParts.js.map +1 -0
  80. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  81. package/dist/components/form/expressions/builder/index.js +13 -2
  82. package/dist/components/form/expressions/builder/index.js.map +1 -1
  83. package/dist/components/form/expressions/useExpressions.d.ts.map +1 -1
  84. package/dist/components/form/expressions/useExpressions.js +4 -1
  85. package/dist/components/form/expressions/useExpressions.js.map +1 -1
  86. package/dist/components/form/fields/Field.d.ts.map +1 -1
  87. package/dist/components/form/fields/Field.js +5 -3
  88. package/dist/components/form/fields/Field.js.map +1 -1
  89. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +2 -1
  90. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  91. package/dist/components/form/fields/allowed-values/AllowedValues.js +8 -26
  92. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  93. package/dist/components/form/fields/auto/AutoFormField.d.ts +3 -0
  94. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  95. package/dist/components/form/fields/auto/AutoFormField.js +42 -8
  96. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  97. package/dist/components/form/fields/binary/Binary.d.ts +15 -0
  98. package/dist/components/form/fields/binary/Binary.d.ts.map +1 -0
  99. package/dist/components/form/fields/binary/Binary.js +74 -0
  100. package/dist/components/form/fields/binary/Binary.js.map +1 -0
  101. package/dist/components/form/fields/boolean/Boolean.js +1 -1
  102. package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
  103. package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
  104. package/dist/components/form/fields/multi-select/MultiSelectFormField.js +5 -4
  105. package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
  106. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  107. package/dist/components/form/fields/select/Select.js +29 -12
  108. package/dist/components/form/fields/select/Select.js.map +1 -1
  109. package/dist/components/form/fields/select/SelectCollection.d.ts +8 -2
  110. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  111. package/dist/components/form/fields/select/SelectCollection.js +52 -16
  112. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  113. package/dist/components/form/index.d.ts +2 -0
  114. package/dist/components/form/index.d.ts.map +1 -1
  115. package/dist/components/form/index.js +2 -0
  116. package/dist/components/form/index.js.map +1 -1
  117. package/dist/components/imageLightbox/ImageLightbox.d.ts +21 -0
  118. package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -0
  119. package/dist/components/imageLightbox/ImageLightbox.js +169 -0
  120. package/dist/components/imageLightbox/ImageLightbox.js.map +1 -0
  121. package/dist/components/imageLightbox/index.d.ts +2 -0
  122. package/dist/components/imageLightbox/index.d.ts.map +1 -0
  123. package/dist/components/imageLightbox/index.js +18 -0
  124. package/dist/components/imageLightbox/index.js.map +1 -0
  125. package/dist/components/searchFilterBar/SearchFilterBar.d.ts +33 -0
  126. package/dist/components/searchFilterBar/SearchFilterBar.d.ts.map +1 -0
  127. package/dist/components/searchFilterBar/SearchFilterBar.js +76 -0
  128. package/dist/components/searchFilterBar/SearchFilterBar.js.map +1 -0
  129. package/dist/components/searchFilterBar/index.d.ts +2 -0
  130. package/dist/components/searchFilterBar/index.d.ts.map +1 -0
  131. package/dist/components/searchFilterBar/index.js +18 -0
  132. package/dist/components/searchFilterBar/index.js.map +1 -0
  133. package/dist/components/supportTicket/AttachmentChips.d.ts +10 -0
  134. package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -0
  135. package/dist/components/supportTicket/AttachmentChips.js +122 -0
  136. package/dist/components/supportTicket/AttachmentChips.js.map +1 -0
  137. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +43 -0
  138. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -0
  139. package/dist/components/supportTicket/InterfaceReferenceTags.js +31 -0
  140. package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -0
  141. package/dist/components/supportTicket/ReferencePicker.d.ts +87 -0
  142. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -0
  143. package/dist/components/supportTicket/ReferencePicker.js +295 -0
  144. package/dist/components/supportTicket/ReferencePicker.js.map +1 -0
  145. package/dist/components/supportTicket/TicketHeader.d.ts +86 -0
  146. package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -0
  147. package/dist/components/supportTicket/TicketHeader.js +149 -0
  148. package/dist/components/supportTicket/TicketHeader.js.map +1 -0
  149. package/dist/components/supportTicket/TicketMetaTags.d.ts +32 -0
  150. package/dist/components/supportTicket/TicketMetaTags.d.ts.map +1 -0
  151. package/dist/components/supportTicket/TicketMetaTags.js +21 -0
  152. package/dist/components/supportTicket/TicketMetaTags.js.map +1 -0
  153. package/dist/components/supportTicket/TicketReplyBox.d.ts +63 -0
  154. package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -0
  155. package/dist/components/supportTicket/TicketReplyBox.js +115 -0
  156. package/dist/components/supportTicket/TicketReplyBox.js.map +1 -0
  157. package/dist/components/supportTicket/attachmentAccess.d.ts +37 -0
  158. package/dist/components/supportTicket/attachmentAccess.d.ts.map +1 -0
  159. package/dist/components/supportTicket/attachmentAccess.js +132 -0
  160. package/dist/components/supportTicket/attachmentAccess.js.map +1 -0
  161. package/dist/components/supportTicket/fileToAttachment.d.ts +9 -0
  162. package/dist/components/supportTicket/fileToAttachment.d.ts.map +1 -0
  163. package/dist/components/supportTicket/fileToAttachment.js +28 -0
  164. package/dist/components/supportTicket/fileToAttachment.js.map +1 -0
  165. package/dist/components/supportTicket/index.d.ts +11 -0
  166. package/dist/components/supportTicket/index.d.ts.map +1 -0
  167. package/dist/components/supportTicket/index.js +27 -0
  168. package/dist/components/supportTicket/index.js.map +1 -0
  169. package/dist/components/supportTicket/meta.d.ts +71 -0
  170. package/dist/components/supportTicket/meta.d.ts.map +1 -0
  171. package/dist/components/supportTicket/meta.js +115 -0
  172. package/dist/components/supportTicket/meta.js.map +1 -0
  173. package/dist/components/supportTicket/ticketModel.d.ts +102 -0
  174. package/dist/components/supportTicket/ticketModel.d.ts.map +1 -0
  175. package/dist/components/supportTicket/ticketModel.js +3 -0
  176. package/dist/components/supportTicket/ticketModel.js.map +1 -0
  177. package/dist/components/ticketReferences/TicketReferences.d.ts +52 -0
  178. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -0
  179. package/dist/components/ticketReferences/TicketReferences.js +492 -0
  180. package/dist/components/ticketReferences/TicketReferences.js.map +1 -0
  181. package/dist/components/ticketReferences/index.d.ts +3 -0
  182. package/dist/components/ticketReferences/index.d.ts.map +1 -0
  183. package/dist/components/ticketReferences/index.js +6 -0
  184. package/dist/components/ticketReferences/index.js.map +1 -0
  185. package/dist/components/ticketThread/TicketThread.d.ts +57 -0
  186. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -0
  187. package/dist/components/ticketThread/TicketThread.js +299 -0
  188. package/dist/components/ticketThread/TicketThread.js.map +1 -0
  189. package/dist/components/ticketThread/index.d.ts +3 -0
  190. package/dist/components/ticketThread/index.d.ts.map +1 -0
  191. package/dist/components/ticketThread/index.js +7 -0
  192. package/dist/components/ticketThread/index.js.map +1 -0
  193. package/dist/helpers/common.d.ts +5 -0
  194. package/dist/helpers/common.d.ts.map +1 -1
  195. package/dist/helpers/common.js +20 -1
  196. package/dist/helpers/common.js.map +1 -1
  197. package/dist/helpers/scrollbar.d.ts +2 -0
  198. package/dist/helpers/scrollbar.d.ts.map +1 -0
  199. package/dist/helpers/scrollbar.js +25 -0
  200. package/dist/helpers/scrollbar.js.map +1 -0
  201. package/dist/index.d.ts +8 -1
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +10 -1
  204. package/dist/index.js.map +1 -1
  205. package/dist/providers/StorageProvider.d.ts +13 -0
  206. package/dist/providers/StorageProvider.d.ts.map +1 -1
  207. package/dist/providers/StorageProvider.js +29 -5
  208. package/dist/providers/StorageProvider.js.map +1 -1
  209. package/package.json +6 -5
  210. package/src/components/FocusedEditing/index.tsx +17 -2
  211. package/src/components/composer/Composer.stories.tsx +238 -0
  212. package/src/components/composer/Composer.tsx +545 -0
  213. package/src/components/composer/helpers.ts +74 -0
  214. package/src/components/composer/index.ts +2 -0
  215. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +74 -2
  216. package/src/components/form/engine/CompactRow.tsx +561 -283
  217. package/src/components/form/engine/CompactToolbar.tsx +216 -182
  218. package/src/components/form/engine/FormEngine.stories.tsx +1736 -162
  219. package/src/components/form/engine/FormEngine.tsx +886 -170
  220. package/src/components/form/engine/FormEngineRemote.stories.tsx +377 -0
  221. package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +8 -0
  222. package/src/components/form/engine/compactRowContext.ts +14 -0
  223. package/src/components/form/engine/compactRowStyles.ts +273 -146
  224. package/src/components/form/engine/compactToolbarContext.ts +1 -0
  225. package/src/components/form/engine/optionActions.ts +40 -0
  226. package/src/components/form/engine/readFirst.ts +169 -10
  227. package/src/components/form/engine/rendererTypes.ts +55 -0
  228. package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +159 -0
  229. package/src/components/form/engine/variants/VariantCalmTable.tsx +242 -0
  230. package/src/components/form/engine/variants/VariantCards.tsx +212 -0
  231. package/src/components/form/engine/variants/VariantFocus.tsx +382 -0
  232. package/src/components/form/engine/variants/VariantMinimal.tsx +170 -0
  233. package/src/components/form/engine/variants/focusDemo.ts +145 -0
  234. package/src/components/form/engine/variants/variantModel.ts +216 -0
  235. package/src/components/form/engine/variants/variantParts.tsx +313 -0
  236. package/src/components/form/expressions/ExpressionField.stories.tsx +84 -2
  237. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +213 -19
  238. package/src/components/form/expressions/builder/index.tsx +12 -1
  239. package/src/components/form/expressions/useExpressions.ts +4 -1
  240. package/src/components/form/fields/Field.stories.tsx +40 -0
  241. package/src/components/form/fields/Field.tsx +10 -1
  242. package/src/components/form/fields/allowed-values/AllowedValues.tsx +13 -36
  243. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +64 -0
  244. package/src/components/form/fields/auto/AutoFormField.stories.tsx +146 -2
  245. package/src/components/form/fields/auto/AutoFormField.tsx +42 -1
  246. package/src/components/form/fields/binary/Binary.stories.tsx +122 -0
  247. package/src/components/form/fields/binary/Binary.tsx +81 -0
  248. package/src/components/form/fields/boolean/Boolean.stories.tsx +58 -0
  249. package/src/components/form/fields/boolean/Boolean.tsx +1 -1
  250. package/src/components/form/fields/byte-size/ByteSize.stories.tsx +24 -0
  251. package/src/components/form/fields/color/Color.stories.tsx +30 -0
  252. package/src/components/form/fields/cron/Cron.stories.tsx +8 -0
  253. package/src/components/form/fields/date/Date.stories.tsx +22 -0
  254. package/src/components/form/fields/file/File.stories.tsx +48 -0
  255. package/src/components/form/fields/long-string/LongString.stories.tsx +24 -0
  256. package/src/components/form/fields/markdown/Markdown.stories.tsx +8 -0
  257. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +14 -10
  258. package/src/components/form/fields/number/Number.stories.tsx +31 -0
  259. package/src/components/form/fields/object/Object.stories.tsx +88 -0
  260. package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +24 -0
  261. package/src/components/form/fields/rich-text/RichText.stories.tsx +23 -0
  262. package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +72 -0
  263. package/src/components/form/fields/select/Select.stories.tsx +108 -0
  264. package/src/components/form/fields/select/Select.tsx +38 -12
  265. package/src/components/form/fields/select/SelectCollection.tsx +78 -17
  266. package/src/components/form/fields/string/String.stories.tsx +16 -0
  267. package/src/components/form/fields/template/TemplateField.stories.tsx +160 -0
  268. package/src/components/form/fields/url/Url.stories.tsx +24 -0
  269. package/src/components/form/index.tsx +2 -0
  270. package/src/components/imageLightbox/ImageLightbox.stories.tsx +238 -0
  271. package/src/components/imageLightbox/ImageLightbox.tsx +236 -0
  272. package/src/components/imageLightbox/index.ts +1 -0
  273. package/src/components/log/Log.stories.tsx +96 -0
  274. package/src/components/menu/Menu.stories.tsx +54 -0
  275. package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +83 -37
  276. package/src/components/searchFilterBar/SearchFilterBar.tsx +131 -0
  277. package/src/components/searchFilterBar/index.ts +1 -0
  278. package/src/components/smartEditor/SmartEditor.stories.tsx +32 -0
  279. package/src/components/supportTicket/AttachmentChips.stories.tsx +171 -0
  280. package/src/components/supportTicket/AttachmentChips.tsx +147 -0
  281. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +171 -0
  282. package/src/components/supportTicket/InterfaceReferenceTags.tsx +96 -0
  283. package/src/components/supportTicket/ReferencePicker.stories.tsx +519 -0
  284. package/src/components/supportTicket/ReferencePicker.tsx +563 -0
  285. package/src/components/supportTicket/TicketConversation.stories.tsx +121 -0
  286. package/src/components/supportTicket/TicketHeader.stories.tsx +183 -0
  287. package/src/components/supportTicket/TicketHeader.tsx +247 -0
  288. package/src/components/supportTicket/TicketMetaTags.stories.tsx +103 -0
  289. package/src/components/supportTicket/TicketMetaTags.tsx +85 -0
  290. package/src/components/supportTicket/TicketReplyBox.stories.tsx +351 -0
  291. package/src/components/supportTicket/TicketReplyBox.tsx +146 -0
  292. package/src/components/supportTicket/attachmentAccess.ts +97 -0
  293. package/src/components/supportTicket/fileToAttachment.ts +24 -0
  294. package/src/components/supportTicket/index.ts +10 -0
  295. package/src/components/supportTicket/meta.ts +185 -0
  296. package/src/components/supportTicket/ticketModel.ts +131 -0
  297. package/src/components/ticketReferences/TicketReferences.stories.tsx +315 -0
  298. package/src/components/ticketReferences/TicketReferences.tsx +886 -0
  299. package/src/components/ticketReferences/index.ts +2 -0
  300. package/src/components/ticketThread/TicketThread.stories.tsx +828 -0
  301. package/src/components/ticketThread/TicketThread.tsx +704 -0
  302. package/src/components/ticketThread/index.ts +6 -0
  303. package/src/helpers/common.ts +19 -0
  304. package/src/helpers/scrollbar.ts +32 -0
  305. package/src/hooks/useFetch/useFetch.stories.tsx +30 -0
  306. package/src/hooks/useStorage/useStorage.stories.tsx +82 -0
  307. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +127 -1
  308. package/src/index.tsx +8 -1
  309. package/src/providers/StorageProvider.tsx +30 -4
  310. package/src/stores/currentUser/currentUser.stories.tsx +49 -0
@@ -12,8 +12,8 @@ import { ReqoreCheckbox, ReqoreControlGroup, ReqoreSpan } from '@qoretechnologie
12
12
  import { IReqoreButtonProps } from '@qoretechnologies/reqore/dist/components/Button';
13
13
  import { IQorusAllowedValue, TQorusType } from '@qoretechnologies/ts-toolkit';
14
14
  import { size as count, isEqual } from 'lodash';
15
- import { memo, useCallback, useEffect, useMemo, useState } from 'react';
16
- import { useDebounce } from 'react-use';
15
+ import { memo, useMemo } from 'react';
16
+ import { getSelectItemShortDescription } from '../select/SelectCollection';
17
17
  import { ISelectFormFieldItem, SelectFormField as Select } from '../select/Select';
18
18
 
19
19
  export interface IFieldAllowedValuesProps extends Pick<
@@ -30,6 +30,7 @@ export interface IFieldAllowedValuesProps extends Pick<
30
30
  app?: string;
31
31
  action?: string;
32
32
  showSavedValues?: boolean;
33
+ forceDropdown?: boolean;
33
34
  [key: string]: any;
34
35
  }
35
36
 
@@ -57,7 +58,7 @@ export const FieldAllowedValuesCheckGroup = memo(
57
58
  margin='right'
58
59
  key={item.value?.toString()}
59
60
  label={item.display_name || JSON.stringify(item.value)}
60
- tooltip={item.short_desc || item.desc}
61
+ tooltip={getSelectItemShortDescription(item)}
61
62
  disabled={rest.disabled}
62
63
  readOnly={rest.readOnly}
63
64
  intent={item.value === value ? 'info' : undefined}
@@ -97,49 +98,23 @@ export const FieldAllowedValues = memo(
97
98
  allowCreation,
98
99
  showSavedValues,
99
100
  showDescription,
101
+ forceDropdown,
100
102
  size,
101
103
  disabled,
102
104
  name,
103
105
  readOnly,
104
106
  }: IFieldAllowedValuesProps) => {
105
- const [localValue, setLocalValue] = useState(value);
106
- const [localItems, setLocalItems] = useState<IQorusAllowedValue[]>(items);
107
-
108
- useEffect(() => {
109
- setLocalItems(items);
110
- }, [JSON.stringify(items)]);
111
-
112
- const handleLocalChange = useCallback((_name: string, value: unknown) => {
113
- setLocalValue(value);
114
- }, []);
115
-
116
- useDebounce(
117
- () => {
118
- if (localValue !== value) {
119
- onChange(name, localValue);
120
- }
121
- },
122
- 200,
123
- [localValue]
124
- );
125
-
126
- useEffect(() => {
127
- if (value !== localValue) {
128
- setLocalValue(value);
129
- }
130
- }, [value]);
131
-
132
107
  const fullItems = useMemo(() => {
133
108
  const result = [
134
109
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
135
- ...localItems.map(({ metadata, value, ...rest }) => ({
110
+ ...items.map(({ metadata, value, ...rest }) => ({
136
111
  value: value?.value,
137
112
  ...rest,
138
113
  })),
139
114
  ] as ISelectFormFieldItem[];
140
115
 
141
116
  return result;
142
- }, [JSON.stringify(localItems), type, value, showSavedValues, disabled, readOnly]);
117
+ }, [JSON.stringify(items), type, value, showSavedValues, disabled, readOnly]);
143
118
 
144
119
  const style = useMemo(() => ({ width: '100%' }), []);
145
120
 
@@ -153,8 +128,8 @@ export const FieldAllowedValues = memo(
153
128
  return (
154
129
  <FieldAllowedValuesCheckGroup
155
130
  items={fullItems}
156
- onChange={handleLocalChange}
157
- value={localValue}
131
+ onChange={onChange}
132
+ value={value}
158
133
  name={name}
159
134
  />
160
135
  );
@@ -164,10 +139,11 @@ export const FieldAllowedValues = memo(
164
139
  <Select
165
140
  items={fullItems}
166
141
  value={value}
167
- onChange={(value) => handleLocalChange(name, value)}
142
+ onChange={(value) => onChange(name, value)}
168
143
  fluid
169
144
  fixed={false}
170
145
  showDescription={Boolean(showDescription || showDescription === undefined)}
146
+ forceDropdown={forceDropdown}
171
147
  style={style}
172
148
  size={size}
173
149
  disabled={disabled}
@@ -178,10 +154,11 @@ export const FieldAllowedValues = memo(
178
154
  return (
179
155
  <Select
180
156
  items={fullItems}
181
- onChange={(value) => handleLocalChange(name, value)}
157
+ onChange={(value) => onChange(name, value)}
182
158
  fluid
183
159
  fixed={false}
184
160
  showDescription={false}
161
+ forceDropdown={forceDropdown}
185
162
  style={style}
186
163
  minimal
187
164
  placeholder={'Saved & Suggested Values'}
@@ -83,6 +83,14 @@ export const CompactEmpty: Story = {
83
83
  type: 'string',
84
84
  value: [],
85
85
  },
86
+ parameters: {
87
+ docs: {
88
+ description: {
89
+ story:
90
+ 'Renders ArrayAutoField in compact string mode with no items — only the entry input and a disabled confirm button are visible.',
91
+ },
92
+ },
93
+ },
86
94
  async play({ canvasElement }) {
87
95
  const canvas = within(canvasElement);
88
96
 
@@ -102,6 +110,14 @@ export const CompactWithValues: Story = {
102
110
  type: 'string',
103
111
  value: ['hello', 'world'],
104
112
  },
113
+ parameters: {
114
+ docs: {
115
+ description: {
116
+ story:
117
+ 'Renders ArrayAutoField in compact string mode with two existing items — the values are shown as tags above the entry input.',
118
+ },
119
+ },
120
+ },
105
121
  async play({ canvasElement }) {
106
122
  const canvas = within(canvasElement);
107
123
 
@@ -122,6 +138,14 @@ export const CompactAddItem: Story = {
122
138
  type: 'string',
123
139
  value: ['existing'],
124
140
  },
141
+ parameters: {
142
+ docs: {
143
+ description: {
144
+ story:
145
+ 'Renders ArrayAutoField in compact string mode with one existing item. Typing into the input and clicking confirm appends the new item and fires onChange with the full list.',
146
+ },
147
+ },
148
+ },
125
149
  async play({ args }) {
126
150
  await waitFor(
127
151
  () => expect(document.querySelectorAll('.array-auto-compact-tag').length).toBe(1),
@@ -157,6 +181,14 @@ export const CompactEditItem: Story = {
157
181
  type: 'string',
158
182
  value: ['alpha', 'beta'],
159
183
  },
184
+ parameters: {
185
+ docs: {
186
+ description: {
187
+ story:
188
+ 'Renders ArrayAutoField in compact string mode with two items. Clicking a tag\'s edit action loads its value into the input; editing and confirming replaces the tag in place.',
189
+ },
190
+ },
191
+ },
160
192
  async play({ args }) {
161
193
  await waitFor(
162
194
  () => expect(document.querySelectorAll('.array-auto-compact-tag').length).toBe(2),
@@ -199,6 +231,14 @@ export const CompactRemoveItem: Story = {
199
231
  type: 'string',
200
232
  value: ['one', 'two', 'three'],
201
233
  },
234
+ parameters: {
235
+ docs: {
236
+ description: {
237
+ story:
238
+ 'Renders ArrayAutoField in compact string mode with three items. Clicking the middle tag\'s remove action drops it from the list and fires onChange with the remaining two.',
239
+ },
240
+ },
241
+ },
202
242
  async play({ args }) {
203
243
  await waitFor(
204
244
  () => expect(document.querySelectorAll('.array-auto-compact-tag').length).toBe(3),
@@ -230,6 +270,14 @@ export const CompactWithNumbers: Story = {
230
270
  value: [10, 20, 30],
231
271
  renderItem: numberRenderItem,
232
272
  },
273
+ parameters: {
274
+ docs: {
275
+ description: {
276
+ story:
277
+ 'Renders ArrayAutoField in compact int mode with three numeric items — the tags show 10, 20 and 30 and the entry input uses the Number field.',
278
+ },
279
+ },
280
+ },
233
281
  async play() {
234
282
  await waitFor(
235
283
  () => expect(document.querySelectorAll('.array-auto-compact-tag').length).toBe(3),
@@ -244,6 +292,14 @@ export const CompactDisabled: Story = {
244
292
  value: ['locked'],
245
293
  disabled: true,
246
294
  },
295
+ parameters: {
296
+ docs: {
297
+ description: {
298
+ story:
299
+ 'Renders ArrayAutoField in compact string mode with one item but disabled — the tag is visible without edit/remove actions and no entry input is shown.',
300
+ },
301
+ },
302
+ },
247
303
  async play() {
248
304
  await waitFor(
249
305
  () => expect(document.querySelectorAll('.array-auto-compact-tag').length).toBe(1),
@@ -267,6 +323,14 @@ export const ComplexHashItems: Story = {
267
323
  value: [{ key: 'value' }],
268
324
  display_name: 'Hash Items',
269
325
  },
326
+ parameters: {
327
+ docs: {
328
+ description: {
329
+ story:
330
+ 'Renders ArrayAutoField in hash mode with one hash item — the field switches to the panel-based layout rather than compact tags.',
331
+ },
332
+ },
333
+ },
270
334
  async play() {
271
335
  // Should render panel-based UI, not compact tags
272
336
  await waitFor(() => expect(document.querySelectorAll('.array-auto-item').length).toBe(1), {
@@ -57,6 +57,14 @@ const waitForText = async (text: string | RegExp) => {
57
57
  /** Auto type, no value — the picker is shown and the field area prompts for a type. */
58
58
  export const Empty: Story = {
59
59
  args: {},
60
+ parameters: {
61
+ docs: {
62
+ description: {
63
+ story:
64
+ 'Renders AutoFormField with no value or defaultType — the type picker is shown and the field area prompts the operator to pick a data type.',
65
+ },
66
+ },
67
+ },
60
68
  async play({ canvasElement }) {
61
69
  const canvas = within(canvasElement);
62
70
  // The IDE auto resolves its type in a mount effect — assert asynchronously.
@@ -71,6 +79,14 @@ export const InferredInteger: Story = {
71
79
  args: {
72
80
  value: 42,
73
81
  },
82
+ parameters: {
83
+ docs: {
84
+ description: {
85
+ story:
86
+ 'Renders AutoFormField with a pre-existing numeric value of 42 — the type is inferred as int and the numeric input is shown without prompting for a type.',
87
+ },
88
+ },
89
+ },
74
90
  async play({ canvasElement }) {
75
91
  const canvas = within(canvasElement);
76
92
  // Resolved → a concrete field renders (post mount effect) and no prompt.
@@ -86,6 +102,14 @@ export const InferredText: Story = {
86
102
  args: {
87
103
  value: 'hello world',
88
104
  },
105
+ parameters: {
106
+ docs: {
107
+ description: {
108
+ story:
109
+ 'Renders AutoFormField with a pre-existing string value — the type is inferred as string and the text field is shown holding "hello world".',
110
+ },
111
+ },
112
+ },
89
113
  async play({ canvasElement }) {
90
114
  const canvas = within(canvasElement);
91
115
  await expect(await canvas.findByDisplayValue('hello world')).toBeInTheDocument();
@@ -97,6 +121,14 @@ export const ConcreteString: Story = {
97
121
  args: {
98
122
  defaultType: 'string',
99
123
  },
124
+ parameters: {
125
+ docs: {
126
+ description: {
127
+ story:
128
+ 'Renders AutoFormField with a concrete defaultType of string — the text field is shown directly, no type picker. Typing "abc" fires onChange with the value and inferred type.',
129
+ },
130
+ },
131
+ },
100
132
  async play({ canvasElement, args }) {
101
133
  const canvas = within(canvasElement);
102
134
  // string renders the IDE's LongString field — a textarea. The verbatim
@@ -121,6 +153,14 @@ export const Nullable: Story = {
121
153
  value: 'some text',
122
154
  canBeNull: true,
123
155
  },
156
+ parameters: {
157
+ docs: {
158
+ description: {
159
+ story:
160
+ 'Renders AutoFormField with canBeNull enabled. Clicking "Set as null" clears the value to null, hides the field editor and flips the toggle to "Unset null".',
161
+ },
162
+ },
163
+ },
124
164
  async play({ canvasElement, args }) {
125
165
  const canvas = within(canvasElement);
126
166
 
@@ -147,6 +187,14 @@ export const AllowedTypesSubset: Story = {
147
187
  { name: 'string', display_name: 'Text' },
148
188
  ],
149
189
  },
190
+ parameters: {
191
+ docs: {
192
+ description: {
193
+ story:
194
+ 'Renders AutoFormField with allowedTypes restricted to Integer and Text — the picker badge shows 2 available types instead of the full 14.',
195
+ },
196
+ },
197
+ },
150
198
  async play() {
151
199
  // The picker badge reflects the restricted list — 2 instead of 14.
152
200
  await waitForText('Please select data type');
@@ -159,6 +207,14 @@ export const NoSoftTypes: Story = {
159
207
  args: {
160
208
  noSoft: true,
161
209
  },
210
+ parameters: {
211
+ docs: {
212
+ description: {
213
+ story:
214
+ 'Renders AutoFormField with noSoft enabled — the soft* type variants are hidden and the picker badge reads 9 instead of 14.',
215
+ },
216
+ },
217
+ },
162
218
  async play() {
163
219
  await waitForText('Please select data type');
164
220
  await waitForText('9');
@@ -170,6 +226,14 @@ export const NoSoftTypes: Story = {
170
226
  * `auto` renders the picker for free, via FormEngine → TemplateField → auto.
171
227
  */
172
228
  export const ViaFormEngine: Story = {
229
+ parameters: {
230
+ docs: {
231
+ description: {
232
+ story:
233
+ 'Renders a FormEngine schema whose single option is typed as auto — the engine flows through TemplateField and renders the AutoFormField picker without any extra wiring.',
234
+ },
235
+ },
236
+ },
173
237
  render: () => {
174
238
  const [val, setVal] = useState<any>({});
175
239
  return (
@@ -190,9 +254,16 @@ export const ViaFormEngine: Story = {
190
254
  },
191
255
  async play({ canvasElement }) {
192
256
  const canvas = within(canvasElement);
193
- await expect(await canvas.findByText('My Auto Field')).toBeInTheDocument();
257
+ // Generous timeout: findByText defaults to 1s, which flakes under CI load
258
+ // while the engine boots the auto field's type picker (the rest of the suite
259
+ // waits ~10s).
260
+ await expect(
261
+ await canvas.findByText('My Auto Field', undefined, { timeout: 10000 })
262
+ ).toBeInTheDocument();
194
263
  // The auto field renders its type picker inside the engine-driven form.
195
- await expect(await canvas.findByText('Please select data type')).toBeInTheDocument();
264
+ await expect(
265
+ await canvas.findByText('Please select data type', undefined, { timeout: 10000 })
266
+ ).toBeInTheDocument();
196
267
  },
197
268
  };
198
269
 
@@ -215,6 +286,14 @@ export const StringWithAllowedValues: Story = {
215
286
  },
216
287
  ],
217
288
  },
289
+ parameters: {
290
+ docs: {
291
+ description: {
292
+ story:
293
+ 'Renders AutoFormField for a string with two allowed values — the operator picks from the constrained list rather than typing freely.',
294
+ },
295
+ },
296
+ },
218
297
  };
219
298
 
220
299
  export const RichText: Story = {
@@ -224,6 +303,14 @@ export const RichText: Story = {
224
303
  allowTemplates: true,
225
304
  templates: buildTemplates(templates as any),
226
305
  },
306
+ parameters: {
307
+ docs: {
308
+ description: {
309
+ story:
310
+ 'Renders AutoFormField in richtext mode with templates enabled. Typing appends to the existing value inside the contenteditable editor.',
311
+ },
312
+ },
313
+ },
227
314
  play: async ({ canvasElement }) => {
228
315
  await waitFor(() => canvasElement.querySelector('div[contenteditable]'), {
229
316
  timeout: 15000,
@@ -243,6 +330,7 @@ export const RichText: Story = {
243
330
  export const ConnectionWithAllowedValues: Story = {
244
331
  args: {
245
332
  defaultType: 'connection',
333
+ forceDropdown: false,
246
334
  allowed_values: [
247
335
  {
248
336
  display_name: 'test',
@@ -257,6 +345,14 @@ export const ConnectionWithAllowedValues: Story = {
257
345
  },
258
346
  ],
259
347
  },
348
+ parameters: {
349
+ docs: {
350
+ description: {
351
+ story:
352
+ 'Renders AutoFormField for a connection with two allowed values — clicking "Please select" opens the item picker modal titled "Select from items".',
353
+ },
354
+ },
355
+ },
260
356
  play: async () => {
261
357
  // connection is a no-compact type → the allowed values render as the
262
358
  // select with the item collection (the IDE asserts the same modal title).
@@ -270,6 +366,14 @@ export const Hash: Story = {
270
366
  args: {
271
367
  value: jsyaml.dump({ key: 'value' }),
272
368
  },
369
+ parameters: {
370
+ docs: {
371
+ description: {
372
+ story:
373
+ 'Renders AutoFormField with a YAML-serialized hash value — the type is inferred as hash and the object editor is shown holding the parsed data.',
374
+ },
375
+ },
376
+ },
273
377
  };
274
378
 
275
379
  export const File: Story = {
@@ -281,6 +385,14 @@ export const File: Story = {
281
385
  size: 1234,
282
386
  },
283
387
  },
388
+ parameters: {
389
+ docs: {
390
+ description: {
391
+ story:
392
+ 'Renders AutoFormField in file mode holding a text-file value — the file field shows the file name in place of the drop zone.',
393
+ },
394
+ },
395
+ },
284
396
  };
285
397
 
286
398
  export const AutoDoesNotChangeTypeBackToAuto: Story = {
@@ -288,6 +400,14 @@ export const AutoDoesNotChangeTypeBackToAuto: Story = {
288
400
  defaultType: 'auto',
289
401
  value: 'test',
290
402
  },
403
+ parameters: {
404
+ docs: {
405
+ description: {
406
+ story:
407
+ 'Renders AutoFormField in auto mode with a string value — the inferred type ("string") is shown and the picker still exposes all 14 types so the operator can switch away from auto without the field snapping back.',
408
+ },
409
+ },
410
+ },
291
411
  play: async () => {
292
412
  await waitForText('string');
293
413
  await waitForText('14');
@@ -310,6 +430,14 @@ export const ListWithAllowedValues: Story = {
310
430
  },
311
431
  ],
312
432
  },
433
+ parameters: {
434
+ docs: {
435
+ description: {
436
+ story:
437
+ 'Renders AutoFormField in list mode restricted to two allowed list values — the operator picks one of the pre-defined lists rather than composing their own.',
438
+ },
439
+ },
440
+ },
313
441
  };
314
442
 
315
443
  export const ListWithCreatableAllowedValues: Story = {
@@ -330,6 +458,14 @@ export const ListWithCreatableAllowedValues: Story = {
330
458
  },
331
459
  ],
332
460
  },
461
+ parameters: {
462
+ docs: {
463
+ description: {
464
+ story:
465
+ 'Renders AutoFormField in list mode with two allowed values but with allowed_values_creatable enabled — the operator can pick a canned list or compose a custom one.',
466
+ },
467
+ },
468
+ },
333
469
  };
334
470
 
335
471
  export const ListWithElementType: Story = {
@@ -337,4 +473,12 @@ export const ListWithElementType: Story = {
337
473
  defaultType: 'list',
338
474
  element_type: 'int',
339
475
  },
476
+ parameters: {
477
+ docs: {
478
+ description: {
479
+ story:
480
+ 'Renders AutoFormField in list mode with an int element type — new items are added as integers rather than requiring the operator to pick a per-item type.',
481
+ },
482
+ },
483
+ },
340
484
  };
@@ -71,6 +71,9 @@ export interface IAutoFieldProps
71
71
  uniqueName?: string;
72
72
 
73
73
  arg_schema?: string | IOptionsSchema;
74
+ /** Render the arg_schema sub-form in compact (read-first) mode, matching the
75
+ * parent engine. */
76
+ compact?: boolean;
74
77
  path?: string;
75
78
  column?: boolean;
76
79
  level?: number;
@@ -137,6 +140,7 @@ function AutoField<T = any>({
137
140
  noSoft,
138
141
  path,
139
142
  arg_schema,
143
+ compact,
140
144
  column,
141
145
  level = 0,
142
146
  canBeNull,
@@ -150,6 +154,12 @@ function AutoField<T = any>({
150
154
  showSavedValues,
151
155
  uniqueName,
152
156
  componentOverrides,
157
+ // qorus#347-followup (scope forwarding): destructure so it does NOT
158
+ // land in `...rest` — otherwise the primitive field renderers spread
159
+ // rest onto DOM nodes and React warns about the unknown attribute.
160
+ // Only the nested arg_schema mount sites re-forward this into their
161
+ // sub-forms explicitly.
162
+ inheritedFromParent,
153
163
  ...rest
154
164
  }: IAutoFieldProps & T) {
155
165
  const [currentType, setType] = useState<IQorusType>(defaultInternalType || null);
@@ -346,7 +356,12 @@ function AutoField<T = any>({
346
356
  {...rest}
347
357
  name={name}
348
358
  value={value}
349
- onChange={(val: any) => handleChange(name, val)}
359
+ onChange={(val: any, emittedType?: IQorusType, emittedIsFunction?: boolean) => {
360
+ const returnType = emittedType || currentType;
361
+ if (onChange && returnType) {
362
+ onChange(name, val, returnType, emittedIsFunction);
363
+ }
364
+ }}
350
365
  />
351
366
  );
352
367
  }
@@ -359,6 +374,7 @@ function AutoField<T = any>({
359
374
  ) {
360
375
  return (
361
376
  <SchemaDefinitionEditor
377
+ {...((rest as any).fieldProps || {})}
362
378
  value={
363
379
  value === null || value === undefined
364
380
  ? undefined
@@ -404,6 +420,7 @@ function AutoField<T = any>({
404
420
  app={rest.app}
405
421
  action={rest.action}
406
422
  showDescription={rest.showDescription}
423
+ forceDropdown={rest.forceDropdown}
407
424
  allowCreation={rest.allowed_values_creatable}
408
425
  showSavedValues={showSavedValues}
409
426
  readOnly={rest.readonly}
@@ -540,6 +557,10 @@ function AutoField<T = any>({
540
557
  <FormEngine
541
558
  wrapperPadding='top'
542
559
  flat
560
+ compact={compact}
561
+ // Embedded sub-form: no scroll context of its own, so its toolbar
562
+ // isn't sticky and its header stays transparent (no dark backdrop).
563
+ compactNested
543
564
  name={name}
544
565
  uniqueName={uniqueName}
545
566
  options={finalArgSchema}
@@ -556,6 +577,20 @@ function AutoField<T = any>({
556
577
  stringTemplates={rest.templates}
557
578
  size={rest.size}
558
579
  disabled={rest.disabled}
580
+ // Forward consumer-injected editors into the nested sub-form
581
+ // so its own fields can render host-injected types (e.g. a
582
+ // `code-editor` override for a `body` sub-field inside a
583
+ // list-of-hash row). Was missing pre-qorus#347-followup —
584
+ // catches an existing gap surfaced by the nested inherit_props
585
+ // story.
586
+ componentOverrides={componentOverrides}
587
+ // qorus#347-followup (scope forwarding): thread the accumulated
588
+ // inheritance bag into the nested sub-form so its own fields'
589
+ // `inherit_props` can reach ancestor-scope values (e.g. a
590
+ // service-method row's `body` picking up `language` from the
591
+ // parent service form). The parent FormEngine populates this
592
+ // via TemplateField -> AutoFormField's `rest`.
593
+ inheritedFromParent={inheritedFromParent}
559
594
  />
560
595
  );
561
596
  }
@@ -650,6 +685,12 @@ function AutoField<T = any>({
650
685
  allowed_values_creatable={rest.element_allowed_values_creatable}
651
686
  type={effectiveElementType}
652
687
  componentOverrides={componentOverrides}
688
+ // qorus#347-followup (scope forwarding): thread the accumulated
689
+ // inheritance bag through the list wrapper so each row's
690
+ // arg_schema sub-form sees it. ArrayAuto forwards this via
691
+ // TemplateField's `rest` into each row's AutoFormField, which
692
+ // hands it to the row's nested FormEngine (case 'hash' above).
693
+ inheritedFromParent={inheritedFromParent}
653
694
  onChange={(name, value) => {
654
695
  if (!size(value)) {
655
696
  return handleChange(name, undefined);