@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
@@ -4,7 +4,6 @@ import {
4
4
  ReqoreControlGroup,
5
5
  ReqoreMessage,
6
6
  ReqoreModal,
7
- ReqoreP,
8
7
  } from '@qoretechnologies/reqore';
9
8
  import { IReqoreCollectionItemProps } from '@qoretechnologies/reqore/dist/components/Collection/item';
10
9
  import { TReqoreBadge } from '@qoretechnologies/reqore/dist/components/Button';
@@ -12,7 +11,7 @@ import { TReqoreIntent } from '@qoretechnologies/reqore/dist/constants/theme';
12
11
  import { IReqoreIconName } from '@qoretechnologies/reqore/dist/types/icons';
13
12
  import { capitalize, isEqual, size } from 'lodash';
14
13
  import { useMemo, useState } from 'react';
15
- import ReactMarkdown from 'react-markdown';
14
+ import { Description } from '../../../Description';
16
15
 
17
16
  const PositiveColorEffect = {
18
17
  gradient: {
@@ -25,6 +24,7 @@ const PositiveColorEffect = {
25
24
 
26
25
  export interface ISelectFieldCollectionItem {
27
26
  value?: unknown;
27
+ name?: unknown;
28
28
  display_name?: string;
29
29
  desc?: string;
30
30
  short_desc?: string;
@@ -42,16 +42,76 @@ export interface ISelectFieldCollectionItem {
42
42
  export interface ISelectFieldCollectionProps {
43
43
  onClose: () => void;
44
44
  items: ISelectFieldCollectionItem[];
45
- getItemDescription: (value: unknown) => string;
46
45
  value?: unknown;
47
46
  onItemSelect: (item: ISelectFieldCollectionItem) => void;
48
47
  filters?: string[];
49
48
  }
50
49
 
50
+ const normalizeSelectItemDescription = (value: unknown): string | undefined => {
51
+ if (typeof value !== 'string' || !value.trim()) {
52
+ return undefined;
53
+ }
54
+
55
+ const seen = new Set<string>();
56
+
57
+ return value
58
+ .split('\n')
59
+ .filter((line) => {
60
+ const normalized = line.trim().replace(/\s+/g, ' ').toLocaleLowerCase();
61
+
62
+ if (!normalized) {
63
+ return true;
64
+ }
65
+
66
+ if (seen.has(normalized)) {
67
+ return false;
68
+ }
69
+
70
+ seen.add(normalized);
71
+ return true;
72
+ })
73
+ .join('\n')
74
+ .trim();
75
+ };
76
+
77
+ export const getSelectItemDescription = (
78
+ item: Pick<ISelectFieldCollectionItem, 'desc' | 'short_desc'>
79
+ ): string | undefined => {
80
+ const desc = normalizeSelectItemDescription(item.desc);
81
+ const shortDesc = normalizeSelectItemDescription(item.short_desc);
82
+ return desc ?? shortDesc;
83
+ };
84
+
85
+ export const getSelectItemShortDescription = (
86
+ item: Pick<ISelectFieldCollectionItem, 'desc' | 'short_desc'> | undefined,
87
+ defaultDesc = ''
88
+ ): string | undefined => {
89
+ if (!item) {
90
+ return defaultDesc || undefined;
91
+ }
92
+
93
+ const shortDescription = normalizeSelectItemDescription(item.short_desc);
94
+
95
+ return shortDescription || defaultDesc || undefined;
96
+ };
97
+
98
+ export const getSelectItemDescriptionProps = (
99
+ item: Pick<ISelectFieldCollectionItem, 'desc' | 'short_desc'>
100
+ ): { longDescription?: string; shortDescription?: string } => {
101
+ const longDescription = normalizeSelectItemDescription(item.desc);
102
+
103
+ if (longDescription) {
104
+ return { longDescription };
105
+ }
106
+
107
+ const shortDescription = normalizeSelectItemDescription(item.short_desc);
108
+
109
+ return { shortDescription };
110
+ };
111
+
51
112
  export const SelectFieldCollection = ({
52
113
  onClose,
53
114
  items,
54
- getItemDescription,
55
115
  value,
56
116
  onItemSelect,
57
117
  filters,
@@ -100,8 +160,10 @@ export const SelectFieldCollection = ({
100
160
  transparent={false}
101
161
  size='tiny'
102
162
  showLayoutSwitch={false}
103
- items={filteredItems.map(
104
- (item): IReqoreCollectionItemProps => ({
163
+ items={filteredItems.map((item): IReqoreCollectionItemProps => {
164
+ const { longDescription, shortDescription } = getSelectItemDescriptionProps(item);
165
+
166
+ return {
105
167
  label: item.display_name || item.value?.toString(),
106
168
  size: 'tiny',
107
169
  groups: item.groups,
@@ -109,8 +171,14 @@ export const SelectFieldCollection = ({
109
171
  responsiveTitle: false,
110
172
  content: (
111
173
  <ReqoreControlGroup vertical fluid>
112
- {item.short_desc && <ReqoreP size='small'>{item.short_desc}</ReqoreP>}
113
- {item.desc && <ReqoreP size='small'>{item.desc}</ReqoreP>}
174
+ {longDescription || shortDescription ? (
175
+ <Description
176
+ longDescription={longDescription || ''}
177
+ shortDescription={shortDescription}
178
+ size='small'
179
+ margin='none'
180
+ />
181
+ ) : null}
114
182
  {item.actions?.map(({ as: Component = ReqoreButton, props, ...rest }, index) => (
115
183
  <Component
116
184
  key={index}
@@ -148,13 +216,6 @@ export const SelectFieldCollection = ({
148
216
  size: '20px',
149
217
  rounded: true,
150
218
  },
151
- tooltip: !!item.desc
152
- ? {
153
- delay: 800,
154
- content: <ReactMarkdown>{getItemDescription(item.value)}</ReactMarkdown>,
155
- maxWidth: '70vw',
156
- }
157
- : undefined,
158
219
  onClick: !item.disabled
159
220
  ? (e) => {
160
221
  if (e.currentTarget.contains(e.target as Node)) {
@@ -163,8 +224,8 @@ export const SelectFieldCollection = ({
163
224
  }
164
225
  }
165
226
  : undefined,
166
- })
167
- )}
227
+ };
228
+ })}
168
229
  actions={filters?.map((filter) => ({
169
230
  label: capitalize(filter.replace('_', ' ')),
170
231
  badge: items.filter((item) => item[filter]).length,
@@ -38,6 +38,14 @@ export const Default: Story = {
38
38
  args: {
39
39
  value: 'Qore',
40
40
  },
41
+ parameters: {
42
+ docs: {
43
+ description: {
44
+ story:
45
+ 'Renders the String field pre-populated with "Qore". Clicking clear empties the input and fires onClearClick; typing new text updates the value and fires onChange.',
46
+ },
47
+ },
48
+ },
41
49
  play: async ({ canvasElement, args }) => {
42
50
  const canvas = within(canvasElement);
43
51
  const input = canvas.getByLabelText('Name');
@@ -60,6 +68,14 @@ export const Sensitive: Story = {
60
68
  sensitive: true,
61
69
  value: 'password',
62
70
  },
71
+ parameters: {
72
+ docs: {
73
+ description: {
74
+ story:
75
+ 'Renders the String field in sensitive mode — the input renders as type="password" so the value is masked.',
76
+ },
77
+ },
78
+ },
63
79
  play: async ({ canvasElement }) => {
64
80
  const canvas = within(canvasElement);
65
81
  const input = canvas.getByLabelText('Name');
@@ -209,6 +209,14 @@ export const StringComponent: StoryObj<typeof meta> = {
209
209
  value: 'Some string',
210
210
  type: 'string',
211
211
  },
212
+ parameters: {
213
+ docs: {
214
+ description: {
215
+ story:
216
+ 'Renders TemplateField wrapping a LongString component with a plain string value — the field shows the literal string in a textarea, no template selected.',
217
+ },
218
+ },
219
+ },
212
220
  };
213
221
 
214
222
  export const BooleanComponent: StoryObj<typeof meta> = {
@@ -218,6 +226,14 @@ export const BooleanComponent: StoryObj<typeof meta> = {
218
226
  allowTemplates: true,
219
227
  componentFromType: true,
220
228
  },
229
+ parameters: {
230
+ docs: {
231
+ description: {
232
+ story:
233
+ 'Renders TemplateField for a boolean value with templates allowed — the boolean toggle is shown with the template toggle available on the side.',
234
+ },
235
+ },
236
+ },
221
237
  };
222
238
 
223
239
  export const NumberComponent: StoryObj<typeof meta> = {
@@ -227,6 +243,14 @@ export const NumberComponent: StoryObj<typeof meta> = {
227
243
  allowTemplates: true,
228
244
  componentFromType: true,
229
245
  },
246
+ parameters: {
247
+ docs: {
248
+ description: {
249
+ story:
250
+ 'Renders TemplateField for an int value of 25 with templates allowed — the numeric input is shown alongside the template toggle.',
251
+ },
252
+ },
253
+ },
230
254
  };
231
255
 
232
256
  export const AutoComponent: StoryObj<typeof meta> = {
@@ -235,6 +259,14 @@ export const AutoComponent: StoryObj<typeof meta> = {
235
259
  allowTemplates: true,
236
260
  component: auto,
237
261
  },
262
+ parameters: {
263
+ docs: {
264
+ description: {
265
+ story:
266
+ 'Renders TemplateField wrapping the AutoFormField dispatcher — the operator can pick a type from the auto picker or switch to a template value.',
267
+ },
268
+ },
269
+ },
238
270
  };
239
271
 
240
272
  export const AllowedValuesWithTemplate: StoryObj<typeof meta> = {
@@ -249,6 +281,14 @@ export const AllowedValuesWithTemplate: StoryObj<typeof meta> = {
249
281
  ],
250
282
  component: auto,
251
283
  },
284
+ parameters: {
285
+ docs: {
286
+ description: {
287
+ story:
288
+ 'Renders TemplateField restricted to a single allowed value ("Test") but with templates also allowed — the operator can pick the allowed value or switch to a template.',
289
+ },
290
+ },
291
+ },
252
292
  };
253
293
 
254
294
  export const TemplateValue: StoryObj<typeof meta> = {
@@ -257,6 +297,14 @@ export const TemplateValue: StoryObj<typeof meta> = {
257
297
  type: 'int',
258
298
  value: '$local:id',
259
299
  },
300
+ parameters: {
301
+ docs: {
302
+ description: {
303
+ story:
304
+ 'Renders TemplateField for an int wrapped over the Number component with a template value ($local:id) — the template selector replaces the number input.',
305
+ },
306
+ },
307
+ },
260
308
  };
261
309
 
262
310
  export const ElementTypeInListShowsCorrectTemplates: StoryObj<typeof meta> = {
@@ -271,6 +319,14 @@ export const ElementTypeInListShowsCorrectTemplates: StoryObj<typeof meta> = {
271
319
  { type: 'number', value: 3 },
272
320
  ],
273
321
  },
322
+ parameters: {
323
+ docs: {
324
+ description: {
325
+ story:
326
+ 'Renders TemplateField in list mode with three number items. Adding a new item and opening the templates popover shows the templates that resolve to the number element type.',
327
+ },
328
+ },
329
+ },
274
330
  play: async () => {
275
331
  await _testsClickButton({ label: 'Add new item for "Test"' });
276
332
  await _testsOpenTemplates();
@@ -280,6 +336,14 @@ export const ElementTypeInListShowsCorrectTemplates: StoryObj<typeof meta> = {
280
336
 
281
337
  export const ShowsTemplatesList: StoryObj<typeof meta> = {
282
338
  ...TemplateValue,
339
+ parameters: {
340
+ docs: {
341
+ description: {
342
+ story:
343
+ 'Renders TemplateField with the $local:id template value, then opens the templates popover — the operator sees the available templates that resolve to an int.',
344
+ },
345
+ },
346
+ },
283
347
  play: async () => {
284
348
  await _testsOpenTemplates();
285
349
  },
@@ -287,6 +351,14 @@ export const ShowsTemplatesList: StoryObj<typeof meta> = {
287
351
 
288
352
  export const ShowsTemplatesListForString: StoryObj<typeof meta> = {
289
353
  ...StringComponent,
354
+ parameters: {
355
+ docs: {
356
+ description: {
357
+ story:
358
+ 'Renders TemplateField over a LongString component with a plain string value, then opens the templates popover — the templates list is shown for a string target type.',
359
+ },
360
+ },
361
+ },
290
362
  play: async () => {
291
363
  await _testsOpenTemplates();
292
364
  },
@@ -294,6 +366,14 @@ export const ShowsTemplatesListForString: StoryObj<typeof meta> = {
294
366
 
295
367
  export const ShowsTemplatesListForBoolean: StoryObj<typeof meta> = {
296
368
  ...BooleanComponent,
369
+ parameters: {
370
+ docs: {
371
+ description: {
372
+ story:
373
+ 'Renders TemplateField for a boolean value, switches to template mode and opens the templates popover — the templates list is shown for a boolean target type.',
374
+ },
375
+ },
376
+ },
297
377
  play: async () => {
298
378
  await _testsSetTemplate();
299
379
  await _testsOpenTemplates();
@@ -302,6 +382,14 @@ export const ShowsTemplatesListForBoolean: StoryObj<typeof meta> = {
302
382
 
303
383
  export const ShowsTemplatesListForNumber: StoryObj<typeof meta> = {
304
384
  ...NumberComponent,
385
+ parameters: {
386
+ docs: {
387
+ description: {
388
+ story:
389
+ 'Renders TemplateField for an int value, then opens the templates popover — the templates list is shown for an int target type.',
390
+ },
391
+ },
392
+ },
305
393
  play: async () => {
306
394
  await _testsOpenTemplates();
307
395
  },
@@ -314,6 +402,14 @@ export const TemplateValueCanBeRemoved: StoryObj<typeof meta> = {
314
402
  allowTemplates: true,
315
403
  componentFromType: true,
316
404
  },
405
+ parameters: {
406
+ docs: {
407
+ description: {
408
+ story:
409
+ 'Renders TemplateField holding a $config:boolean template value. Clicking the template-remove action clears the template and the underlying boolean checkbox is shown instead.',
410
+ },
411
+ },
412
+ },
317
413
  play: async () => {
318
414
  await expect(document.querySelector('.template-selector')).toBeInTheDocument();
319
415
 
@@ -333,6 +429,14 @@ export const TemplateWithFunctions: StoryObj<typeof meta> = {
333
429
  fluid: false,
334
430
  expressions: storyExpressions as any,
335
431
  },
432
+ parameters: {
433
+ docs: {
434
+ description: {
435
+ story:
436
+ 'Renders TemplateField with allowFunctions enabled — the template menu now exposes a "Use Expression" entry alongside the plain templates.',
437
+ },
438
+ },
439
+ },
336
440
  play: async () => {
337
441
  await _testsOpenTemplateMenu();
338
442
  await _testsWaitForText('Use Expression');
@@ -358,6 +462,14 @@ export const TemplateWithFunctionValue: StoryObj<typeof meta> = {
358
462
  fluid: false,
359
463
  expressions: storyExpressions as any,
360
464
  },
465
+ parameters: {
466
+ docs: {
467
+ description: {
468
+ story:
469
+ 'Renders TemplateField holding a substr function value with three arguments — the expression builder shows the function name and each argument slot.',
470
+ },
471
+ },
472
+ },
361
473
  };
362
474
 
363
475
  export const TemplateWithNestedFunctionValue: StoryObj<typeof meta> = {
@@ -389,6 +501,14 @@ export const TemplateWithNestedFunctionValue: StoryObj<typeof meta> = {
389
501
  fluid: false,
390
502
  expressions: storyExpressions as any,
391
503
  },
504
+ parameters: {
505
+ docs: {
506
+ description: {
507
+ story:
508
+ 'Renders TemplateField holding a substr function whose second argument is itself a PLUS-INT expression — the expression builder shows the nested function inline within the outer call.',
509
+ },
510
+ },
511
+ },
392
512
  };
393
513
 
394
514
  export const TemplateCanBeSelected: StoryObj<typeof meta> = {
@@ -397,6 +517,14 @@ export const TemplateCanBeSelected: StoryObj<typeof meta> = {
397
517
  defaultType: 'string',
398
518
  defaultInternalType: 'string',
399
519
  },
520
+ parameters: {
521
+ docs: {
522
+ description: {
523
+ story:
524
+ 'Renders TemplateField for a string, opens the templates popover and clicks the Interface ID template — the field switches to the $local:id template value.',
525
+ },
526
+ },
527
+ },
400
528
  play: async ({ canvasElement, ...rest }) => {
401
529
  const canvas = within(canvasElement);
402
530
 
@@ -410,6 +538,14 @@ export const TemplateCanBeSelected: StoryObj<typeof meta> = {
410
538
  };
411
539
 
412
540
  export const ValueIsResetWhenChangingToCustom: StoryObj<typeof meta> = {
541
+ parameters: {
542
+ docs: {
543
+ description: {
544
+ story:
545
+ 'Renders TemplateField over a number type holding a $config:something template value. Clicking template-remove resets the value to undefined and fires onChange with the cleared value.',
546
+ },
547
+ },
548
+ },
413
549
  render: (args) => {
414
550
  const [value, setValue] = useState(args.value);
415
551
 
@@ -449,6 +585,14 @@ export const TemplatesWithMultipleLevels: StoryObj<typeof meta> = {
449
585
  type: 'string',
450
586
  templates: buildTemplates(multiLevelTemplates as any),
451
587
  },
588
+ parameters: {
589
+ docs: {
590
+ description: {
591
+ story:
592
+ 'Renders TemplateField for a string with a hierarchical template catalogue. Drilling into "Testing Hash" narrows the list to templates that resolve to a string (Testing Int Item is filtered out).',
593
+ },
594
+ },
595
+ },
452
596
  play: async () => {
453
597
  await _testsOpenTemplates();
454
598
  await _testsClickButton({ label: 'Testing Hash' });
@@ -458,6 +602,14 @@ export const TemplatesWithMultipleLevels: StoryObj<typeof meta> = {
458
602
  };
459
603
 
460
604
  export const TemplatesWithMultipleLevelsAndHashField: StoryObj<typeof meta> = {
605
+ parameters: {
606
+ docs: {
607
+ description: {
608
+ story:
609
+ 'Renders TemplateField for a hash type with a hierarchical template catalogue — switching to template mode and opening the popover exposes the nested template groups.',
610
+ },
611
+ },
612
+ },
461
613
  render: (args) => {
462
614
  const [value, setValue] = useState(args.value);
463
615
 
@@ -486,6 +638,14 @@ export const TemplatesWithMultipleLevelsAndHashField: StoryObj<typeof meta> = {
486
638
 
487
639
  export const TemplateWithItemsCanBeSelected: StoryObj<typeof meta> = {
488
640
  ...TemplatesWithMultipleLevelsAndHashField,
641
+ parameters: {
642
+ docs: {
643
+ description: {
644
+ story:
645
+ 'Renders TemplateField for a hash type with a hierarchical catalogue. Selecting an item from a nested group updates the template value to the picked entry (Testing Hash).',
646
+ },
647
+ },
648
+ },
489
649
  play: async (args) => {
490
650
  await TemplatesWithMultipleLevelsAndHashField.play(args);
491
651
  await _testsClickButton({ selector: '.reqore-menu-item-left-action' });
@@ -30,6 +30,14 @@ export default meta;
30
30
  type Story = StoryObj<typeof meta>;
31
31
 
32
32
  export const Default: Story = {
33
+ parameters: {
34
+ docs: {
35
+ description: {
36
+ story:
37
+ 'Renders the Url field with no value. Typing into the address input recomposes the URL and fires onChange after the debounce; because no protocol is selected, the composed value keeps a bare "://" prefix.',
38
+ },
39
+ },
40
+ },
33
41
  play: async ({ canvasElement, args }) => {
34
42
  const canvas = within(canvasElement);
35
43
  const input = canvas.getByLabelText('URL address');
@@ -49,6 +57,14 @@ export const WithValue: Story = {
49
57
  args: {
50
58
  value: 'https://example.com',
51
59
  },
60
+ parameters: {
61
+ docs: {
62
+ description: {
63
+ story:
64
+ 'Renders the Url field pre-populated with "https://example.com" — the URL is split across the https protocol selector and the example.com address input.',
65
+ },
66
+ },
67
+ },
52
68
  play: async ({ canvasElement }) => {
53
69
  const canvas = within(canvasElement);
54
70
  await expect(await canvas.findByDisplayValue('example.com')).toBeInTheDocument();
@@ -60,6 +76,14 @@ export const KeepsSeparatorInsideAddress: Story = {
60
76
  args: {
61
77
  value: 'https://proxy/forward?to=http://inner',
62
78
  },
79
+ parameters: {
80
+ docs: {
81
+ description: {
82
+ story:
83
+ 'Renders the Url field with a URL whose query-string embeds a second "://". The protocol split only consumes the leading separator; the inner "://" survives inside the address input.',
84
+ },
85
+ },
86
+ },
63
87
  play: async ({ canvasElement }) => {
64
88
  const canvas = within(canvasElement);
65
89
  // `://` inside the address survives the protocol/address split.
@@ -22,6 +22,8 @@ export * from './fields/select/SelectCollection';
22
22
  export * from './fields/string/String';
23
23
  export * from './fields/template/TemplateField';
24
24
  export * from './engine/FormEngine';
25
+ export * from './engine/optionActions';
26
+ export * from './engine/rendererTypes';
25
27
  export * from './expressions/types';
26
28
  export * from './expressions/useExpressions';
27
29
  // Named (not wildcard) so the `_resetRenderExpressionTransportForTests`