@qoretechnologies/reqraft 0.10.54 → 0.10.55-pr.115.g37abdfc

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 (370) hide show
  1. package/.claude/CLAUDE.md +25 -0
  2. package/.tasks/INDEX.md +1 -0
  3. package/.tasks/STORY_NETWORK_ISOLATION.md +98 -0
  4. package/README.md +1 -1
  5. package/design/FORM_ENGINE_COMPACT.md +34 -0
  6. package/design/FORM_ENGINE_EXPRESSIONS.md +110 -0
  7. package/design/FORM_ENGINE_FIELD_MIGRATION.md +155 -1
  8. package/design/IDE_INTEGRATION.md +13 -0
  9. package/design/RENDER_EXPRESSION_TRANSPORT.md +76 -10
  10. package/design/SELECT_DIALOG_FLOOR.md +86 -0
  11. package/design/SMART_EDITOR_UX.md +21 -0
  12. package/design/UNAVAILABLE_ALLOWED_VALUES.md +226 -0
  13. package/dist/components/composer/Composer.d.ts +8 -3
  14. package/dist/components/composer/Composer.d.ts.map +1 -1
  15. package/dist/components/composer/Composer.js.map +1 -1
  16. package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
  17. package/dist/components/dpqlEditor/DpqlEditor.js +3 -3
  18. package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
  19. package/dist/components/dpqlEditor/dpqlHelpers.d.ts +6 -0
  20. package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
  21. package/dist/components/dpqlEditor/dpqlHelpers.js +21 -2
  22. package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
  23. package/dist/components/dpqlEditor/dpqlProbe.d.ts +37 -0
  24. package/dist/components/dpqlEditor/dpqlProbe.d.ts.map +1 -0
  25. package/dist/components/dpqlEditor/dpqlProbe.js +203 -0
  26. package/dist/components/dpqlEditor/dpqlProbe.js.map +1 -0
  27. package/dist/components/dpqlEditor/dpqlTags.d.ts +8 -0
  28. package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
  29. package/dist/components/dpqlEditor/dpqlTags.js +5 -1
  30. package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
  31. package/dist/components/dpqlEditor/index.d.ts +4 -0
  32. package/dist/components/dpqlEditor/index.d.ts.map +1 -1
  33. package/dist/components/dpqlEditor/index.js +5 -1
  34. package/dist/components/dpqlEditor/index.js.map +1 -1
  35. package/dist/components/dpqlEditor/types.d.ts +42 -2
  36. package/dist/components/dpqlEditor/types.d.ts.map +1 -1
  37. package/dist/components/dpqlEditor/types.js +0 -4
  38. package/dist/components/dpqlEditor/types.js.map +1 -1
  39. package/dist/components/dpqlEditor/useDpqlProbe.d.ts +4 -0
  40. package/dist/components/dpqlEditor/useDpqlProbe.d.ts.map +1 -0
  41. package/dist/components/dpqlEditor/useDpqlProbe.js +29 -0
  42. package/dist/components/dpqlEditor/useDpqlProbe.js.map +1 -0
  43. package/dist/components/dpqlEditor/useDpqlSession.d.ts +5 -2
  44. package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
  45. package/dist/components/dpqlEditor/useDpqlSession.js +8 -2
  46. package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
  47. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  48. package/dist/components/form/engine/CompactRow.js +414 -128
  49. package/dist/components/form/engine/CompactRow.js.map +1 -1
  50. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  51. package/dist/components/form/engine/CompactToolbar.js +5 -2
  52. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  53. package/dist/components/form/engine/FormEngine.d.ts +272 -19
  54. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  55. package/dist/components/form/engine/FormEngine.js +666 -161
  56. package/dist/components/form/engine/FormEngine.js.map +1 -1
  57. package/dist/components/form/engine/FormFieldsSkeleton.d.ts +48 -0
  58. package/dist/components/form/engine/FormFieldsSkeleton.d.ts.map +1 -0
  59. package/dist/components/form/engine/FormFieldsSkeleton.js +41 -0
  60. package/dist/components/form/engine/FormFieldsSkeleton.js.map +1 -0
  61. package/dist/components/form/engine/OptionFieldMessages.d.ts +108 -2
  62. package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
  63. package/dist/components/form/engine/OptionFieldMessages.js +203 -13
  64. package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
  65. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
  66. package/dist/components/form/engine/_structuredData/SchemaDataView.js +68 -5
  67. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
  68. package/dist/components/form/engine/compactRowContext.d.ts +15 -1
  69. package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
  70. package/dist/components/form/engine/compactRowContext.js.map +1 -1
  71. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  72. package/dist/components/form/engine/compactRowStyles.js +55 -29
  73. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  74. package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
  75. package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
  76. package/dist/components/form/engine/optionActions.d.ts +37 -1
  77. package/dist/components/form/engine/optionActions.d.ts.map +1 -1
  78. package/dist/components/form/engine/optionActions.js +71 -1
  79. package/dist/components/form/engine/optionActions.js.map +1 -1
  80. package/dist/components/form/engine/optionsContext.d.ts +22 -0
  81. package/dist/components/form/engine/optionsContext.d.ts.map +1 -0
  82. package/dist/components/form/engine/optionsContext.js +20 -0
  83. package/dist/components/form/engine/optionsContext.js.map +1 -0
  84. package/dist/components/form/engine/readFirst.d.ts +42 -1
  85. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  86. package/dist/components/form/engine/readFirst.js +76 -8
  87. package/dist/components/form/engine/readFirst.js.map +1 -1
  88. package/dist/components/form/engine/rendererTypes.d.ts +42 -3
  89. package/dist/components/form/engine/rendererTypes.d.ts.map +1 -1
  90. package/dist/components/form/engine/rendererTypes.js +3 -1
  91. package/dist/components/form/engine/rendererTypes.js.map +1 -1
  92. package/dist/components/form/engine/rowFocus.d.ts +30 -0
  93. package/dist/components/form/engine/rowFocus.d.ts.map +1 -0
  94. package/dist/components/form/engine/rowFocus.js +93 -0
  95. package/dist/components/form/engine/rowFocus.js.map +1 -0
  96. package/dist/components/form/engine/rowMenuContext.d.ts +78 -0
  97. package/dist/components/form/engine/rowMenuContext.d.ts.map +1 -0
  98. package/dist/components/form/engine/rowMenuContext.js +103 -0
  99. package/dist/components/form/engine/rowMenuContext.js.map +1 -0
  100. package/dist/components/form/engine/rowOpenPicker.d.ts +27 -0
  101. package/dist/components/form/engine/rowOpenPicker.d.ts.map +1 -0
  102. package/dist/components/form/engine/rowOpenPicker.js +30 -0
  103. package/dist/components/form/engine/rowOpenPicker.js.map +1 -0
  104. package/dist/components/form/engine/typeChoices.d.ts +42 -0
  105. package/dist/components/form/engine/typeChoices.d.ts.map +1 -0
  106. package/dist/components/form/engine/typeChoices.js +33 -0
  107. package/dist/components/form/engine/typeChoices.js.map +1 -0
  108. package/dist/components/form/expressions/DpqlRendering.d.ts +26 -0
  109. package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -0
  110. package/dist/components/form/expressions/DpqlRendering.js +53 -0
  111. package/dist/components/form/expressions/DpqlRendering.js.map +1 -0
  112. package/dist/components/form/expressions/ExpressionField.d.ts +7 -1
  113. package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
  114. package/dist/components/form/expressions/ExpressionField.js +203 -45
  115. package/dist/components/form/expressions/ExpressionField.js.map +1 -1
  116. package/dist/components/form/expressions/argumentPresence.d.ts +84 -0
  117. package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -0
  118. package/dist/components/form/expressions/argumentPresence.js +217 -0
  119. package/dist/components/form/expressions/argumentPresence.js.map +1 -0
  120. package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
  121. package/dist/components/form/expressions/builder/argumentLabel.js +9 -4
  122. package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
  123. package/dist/components/form/expressions/builder/index.d.ts +15 -2
  124. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  125. package/dist/components/form/expressions/builder/index.js +21 -65
  126. package/dist/components/form/expressions/builder/index.js.map +1 -1
  127. package/dist/components/form/expressions/builder/renderTemplate.d.ts +4 -1
  128. package/dist/components/form/expressions/builder/renderTemplate.d.ts.map +1 -1
  129. package/dist/components/form/expressions/builder/renderTemplate.js +10 -67
  130. package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
  131. package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
  132. package/dist/components/form/expressions/mockExpressions.js +8 -4
  133. package/dist/components/form/expressions/mockExpressions.js.map +1 -1
  134. package/dist/components/form/expressions/renderExpressionToText.d.ts +1 -1
  135. package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
  136. package/dist/components/form/expressions/renderExpressionToText.js +95 -19
  137. package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
  138. package/dist/components/form/expressions/types.d.ts +7 -0
  139. package/dist/components/form/expressions/types.d.ts.map +1 -1
  140. package/dist/components/form/expressions/useExpressions.d.ts.map +1 -1
  141. package/dist/components/form/expressions/useExpressions.js +5 -2
  142. package/dist/components/form/expressions/useExpressions.js.map +1 -1
  143. package/dist/components/form/expressions/useRenderExpression.d.ts +7 -16
  144. package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
  145. package/dist/components/form/expressions/useRenderExpression.js +50 -126
  146. package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
  147. package/dist/components/form/fields/Field.d.ts +18 -0
  148. package/dist/components/form/fields/Field.d.ts.map +1 -1
  149. package/dist/components/form/fields/Field.js +54 -8
  150. package/dist/components/form/fields/Field.js.map +1 -1
  151. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +11 -1
  152. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  153. package/dist/components/form/fields/allowed-values/AllowedValues.js +52 -8
  154. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  155. package/dist/components/form/fields/auto/AutoFormField.d.ts +7 -1
  156. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  157. package/dist/components/form/fields/auto/AutoFormField.js +91 -28
  158. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  159. package/dist/components/form/fields/date/Date.d.ts +1 -1
  160. package/dist/components/form/fields/date/Date.d.ts.map +1 -1
  161. package/dist/components/form/fields/date/Date.js +16 -2
  162. package/dist/components/form/fields/date/Date.js.map +1 -1
  163. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  164. package/dist/components/form/fields/long-string/LongString.js +14 -2
  165. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  166. package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
  167. package/dist/components/form/fields/multi-select/MultiSelectFormField.js +50 -4
  168. package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
  169. package/dist/components/form/fields/rich-text/RichText.d.ts +47 -2
  170. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  171. package/dist/components/form/fields/rich-text/RichText.js +153 -12
  172. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  173. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  174. package/dist/components/form/fields/select/Select.js +120 -20
  175. package/dist/components/form/fields/select/Select.js.map +1 -1
  176. package/dist/components/form/fields/select/SelectCollection.d.ts +166 -9
  177. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  178. package/dist/components/form/fields/select/SelectCollection.js +200 -7
  179. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  180. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +2 -1
  181. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  182. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +3 -2
  183. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  184. package/dist/components/form/fields/template/TemplateField.d.ts +34 -2
  185. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  186. package/dist/components/form/fields/template/TemplateField.js +606 -58
  187. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  188. package/dist/components/form/fields/template/TemplateText.d.ts +36 -0
  189. package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -0
  190. package/dist/components/form/fields/template/TemplateText.js +80 -0
  191. package/dist/components/form/fields/template/TemplateText.js.map +1 -0
  192. package/dist/components/form/index.d.ts +2 -0
  193. package/dist/components/form/index.d.ts.map +1 -1
  194. package/dist/components/form/index.js +4 -0
  195. package/dist/components/form/index.js.map +1 -1
  196. package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
  197. package/dist/components/smartEditor/SmartEditor.js +29 -8
  198. package/dist/components/smartEditor/SmartEditor.js.map +1 -1
  199. package/dist/components/smartEditor/useLspSession.d.ts +5 -1
  200. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  201. package/dist/components/smartEditor/useLspSession.js +16 -2
  202. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  203. package/dist/components/supportTicket/TicketReplyBox.d.ts +8 -4
  204. package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -1
  205. package/dist/components/supportTicket/TicketReplyBox.js.map +1 -1
  206. package/dist/helpers/common.d.ts.map +1 -1
  207. package/dist/helpers/common.js +7 -3
  208. package/dist/helpers/common.js.map +1 -1
  209. package/dist/helpers/dpqlDetection.d.ts +58 -0
  210. package/dist/helpers/dpqlDetection.d.ts.map +1 -0
  211. package/dist/helpers/dpqlDetection.js +164 -0
  212. package/dist/helpers/dpqlDetection.js.map +1 -0
  213. package/dist/helpers/optionUiTypes.d.ts +31 -3
  214. package/dist/helpers/optionUiTypes.d.ts.map +1 -1
  215. package/dist/helpers/optionUiTypes.js +36 -1
  216. package/dist/helpers/optionUiTypes.js.map +1 -1
  217. package/dist/helpers/options.d.ts +57 -0
  218. package/dist/helpers/options.d.ts.map +1 -1
  219. package/dist/helpers/options.js +97 -1
  220. package/dist/helpers/options.js.map +1 -1
  221. package/dist/helpers/templateItems.d.ts +47 -0
  222. package/dist/helpers/templateItems.d.ts.map +1 -0
  223. package/dist/helpers/templateItems.js +88 -0
  224. package/dist/helpers/templateItems.js.map +1 -0
  225. package/dist/helpers/templateText.d.ts +80 -0
  226. package/dist/helpers/templateText.d.ts.map +1 -0
  227. package/dist/helpers/templateText.js +291 -0
  228. package/dist/helpers/templateText.js.map +1 -0
  229. package/dist/helpers/templates.d.ts +30 -12
  230. package/dist/helpers/templates.d.ts.map +1 -1
  231. package/dist/helpers/templates.js +91 -33
  232. package/dist/helpers/templates.js.map +1 -1
  233. package/dist/helpers/validations.d.ts +17 -8
  234. package/dist/helpers/validations.d.ts.map +1 -1
  235. package/dist/helpers/validations.js +117 -22
  236. package/dist/helpers/validations.js.map +1 -1
  237. package/dist/hooks/useArgSchema.d.ts +2 -1
  238. package/dist/hooks/useArgSchema.d.ts.map +1 -1
  239. package/dist/hooks/useFetch/useFetch.d.ts +3 -1
  240. package/dist/hooks/useFetch/useFetch.d.ts.map +1 -1
  241. package/dist/hooks/useFetch/useFetch.js +47 -9
  242. package/dist/hooks/useFetch/useFetch.js.map +1 -1
  243. package/dist/hooks/useTemplates.d.ts +20 -0
  244. package/dist/hooks/useTemplates.d.ts.map +1 -1
  245. package/dist/hooks/useTemplates.js +34 -2
  246. package/dist/hooks/useTemplates.js.map +1 -1
  247. package/dist/index.d.ts +2 -1
  248. package/dist/index.d.ts.map +1 -1
  249. package/dist/index.js +5 -1
  250. package/dist/index.js.map +1 -1
  251. package/dist/utils/fetch.d.ts +151 -1
  252. package/dist/utils/fetch.d.ts.map +1 -1
  253. package/dist/utils/fetch.js +256 -44
  254. package/dist/utils/fetch.js.map +1 -1
  255. package/dist/utils/lspClient.d.ts +6 -0
  256. package/dist/utils/lspClient.d.ts.map +1 -1
  257. package/dist/utils/lspClient.js +62 -11
  258. package/dist/utils/lspClient.js.map +1 -1
  259. package/dist/utils/websocket.d.ts +6 -0
  260. package/dist/utils/websocket.d.ts.map +1 -1
  261. package/dist/utils/websocket.js +15 -7
  262. package/dist/utils/websocket.js.map +1 -1
  263. package/package.json +8 -4
  264. package/src/components/composer/Composer.tsx +7 -2
  265. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +3 -119
  266. package/src/components/dpqlEditor/DpqlEditor.tsx +5 -2
  267. package/src/components/dpqlEditor/dpqlHelpers.ts +20 -1
  268. package/src/components/dpqlEditor/dpqlProbe.ts +165 -0
  269. package/src/components/dpqlEditor/dpqlTags.ts +13 -0
  270. package/src/components/dpqlEditor/index.ts +4 -0
  271. package/src/components/dpqlEditor/types.ts +38 -2
  272. package/src/components/dpqlEditor/useDpqlProbe.ts +33 -0
  273. package/src/components/dpqlEditor/useDpqlSession.ts +20 -4
  274. package/src/components/form/engine/CompactRow.tsx +487 -160
  275. package/src/components/form/engine/CompactToolbar.tsx +10 -3
  276. package/src/components/form/engine/FormEngine.stories.tsx +1294 -161
  277. package/src/components/form/engine/FormEngine.tsx +916 -213
  278. package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +331 -0
  279. package/src/components/form/engine/FormFieldsSkeleton.tsx +77 -0
  280. package/src/components/form/engine/OptionFieldMessages.tsx +300 -14
  281. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +94 -3
  282. package/src/components/form/engine/compactRowContext.ts +15 -6
  283. package/src/components/form/engine/compactRowStyles.ts +56 -2
  284. package/src/components/form/engine/compactToolbarContext.ts +1 -1
  285. package/src/components/form/engine/optionActions.ts +89 -1
  286. package/src/components/form/engine/optionsContext.ts +24 -0
  287. package/src/components/form/engine/readFirst.ts +88 -8
  288. package/src/components/form/engine/rendererTypes.ts +48 -4
  289. package/src/components/form/engine/rowFocus.ts +101 -0
  290. package/src/components/form/engine/rowMenuContext.ts +159 -0
  291. package/src/components/form/engine/rowOpenPicker.ts +27 -0
  292. package/src/components/form/engine/typeChoices.ts +63 -0
  293. package/src/components/form/expressions/DpqlRendering.tsx +85 -0
  294. package/src/components/form/expressions/ExpressionField.stories.tsx +826 -48
  295. package/src/components/form/expressions/ExpressionField.tsx +269 -55
  296. package/src/components/form/expressions/argumentPresence.ts +213 -0
  297. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +38 -21
  298. package/src/components/form/expressions/builder/argumentLabel.tsx +10 -4
  299. package/src/components/form/expressions/builder/index.tsx +39 -81
  300. package/src/components/form/expressions/builder/renderTemplate.tsx +23 -56
  301. package/src/components/form/expressions/dpqlMockLanguage.ts +565 -0
  302. package/src/components/form/expressions/dpqlMockLsp.ts +109 -83
  303. package/src/components/form/expressions/mockExpressions.ts +8 -4
  304. package/src/components/form/expressions/renderExpressionToText.ts +112 -22
  305. package/src/components/form/expressions/types.ts +7 -0
  306. package/src/components/form/expressions/useExpressions.ts +5 -1
  307. package/src/components/form/expressions/useRenderExpression.ts +43 -127
  308. package/src/components/form/fields/Field.tsx +99 -20
  309. package/src/components/form/fields/allowed-values/AllowedValues.tsx +106 -44
  310. package/src/components/form/fields/auto/AutoFormField.stories.tsx +85 -18
  311. package/src/components/form/fields/auto/AutoFormField.tsx +97 -21
  312. package/src/components/form/fields/date/Date.tsx +17 -1
  313. package/src/components/form/fields/long-string/LongString.tsx +15 -3
  314. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +65 -6
  315. package/src/components/form/fields/rich-text/RichText.tsx +248 -30
  316. package/src/components/form/fields/select/Select.stories.tsx +392 -0
  317. package/src/components/form/fields/select/Select.tsx +164 -27
  318. package/src/components/form/fields/select/SelectCollection.tsx +350 -6
  319. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +4 -2
  320. package/src/components/form/fields/template/TemplateField.stories.tsx +93 -14
  321. package/src/components/form/fields/template/TemplateField.tsx +825 -131
  322. package/src/components/form/fields/template/TemplateText.tsx +115 -0
  323. package/src/components/form/index.tsx +4 -0
  324. package/src/components/log/Log.stories.tsx +2 -1
  325. package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +3 -3
  326. package/src/components/smartEditor/SmartEditor.tsx +41 -9
  327. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +52 -3
  328. package/src/components/smartEditor/useLspSession.ts +21 -3
  329. package/src/components/supportTicket/TicketReplyBox.tsx +8 -4
  330. package/src/components/ticketThread/TicketThread.stories.tsx +1 -0
  331. package/src/helpers/common.ts +7 -3
  332. package/src/helpers/dpqlDetection.ts +209 -0
  333. package/src/helpers/optionUiTypes.ts +38 -0
  334. package/src/helpers/options.ts +96 -0
  335. package/src/helpers/templateItems.ts +81 -0
  336. package/src/helpers/templateText.ts +350 -0
  337. package/src/helpers/templates.ts +94 -41
  338. package/src/helpers/validations.ts +138 -39
  339. package/src/hooks/useFetch/useFetch.stories.tsx +6 -5
  340. package/src/hooks/useFetch/useFetch.tsx +53 -7
  341. package/src/hooks/useStorage/useStorage.stories.tsx +2 -1
  342. package/src/hooks/useTemplates.ts +41 -0
  343. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +2 -1
  344. package/src/index.tsx +14 -1
  345. package/src/stores/currentUser/currentUser.stories.tsx +2 -1
  346. package/src/stories/storyNetwork.ts +92 -0
  347. package/src/utils/fetch.ts +311 -21
  348. package/src/utils/lspClient.ts +68 -11
  349. package/src/utils/websocket.ts +20 -9
  350. package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts +0 -73
  351. package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts.map +0 -1
  352. package/dist/components/form/engine/__fixtures__/basicFormOptions.js +0 -317
  353. package/dist/components/form/engine/__fixtures__/basicFormOptions.js.map +0 -1
  354. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts +0 -41
  355. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts.map +0 -1
  356. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js +0 -45
  357. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js.map +0 -1
  358. package/dist/components/form/expressions/dpqlMockLsp.d.ts +0 -3
  359. package/dist/components/form/expressions/dpqlMockLsp.d.ts.map +0 -1
  360. package/dist/components/form/expressions/dpqlMockLsp.js +0 -91
  361. package/dist/components/form/expressions/dpqlMockLsp.js.map +0 -1
  362. package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts +0 -2
  363. package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts.map +0 -1
  364. package/dist/components/form/fields/template/__fixtures__/longExampleValue.js +0 -9
  365. package/dist/components/form/fields/template/__fixtures__/longExampleValue.js.map +0 -1
  366. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts +0 -55
  367. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts.map +0 -1
  368. package/dist/components/smartEditor/__fixtures__/mockLspServer.js +0 -126
  369. package/dist/components/smartEditor/__fixtures__/mockLspServer.js.map +0 -1
  370. package/dist/stories/Data/fileFieldArgSchema.json +0 -86
@@ -0,0 +1,159 @@
1
+ // Copyright 2026 Qore Technologies, s.r.o.
2
+ import { IReqoreDropdownItem } from '@qoretechnologies/reqore/dist/components/Dropdown/list';
3
+ import {
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ useEffect,
8
+ useId,
9
+ useMemo,
10
+ useRef,
11
+ useState,
12
+ } from 'react';
13
+
14
+ /**
15
+ * SEAM (reqraft): an editor publishes its own actions into the row's ⋮ menu.
16
+ *
17
+ * A row already renders one overflow menu — Edit fullscreen, Remove field, and
18
+ * any `optionActions` the host injected — and the comment on it has always said
19
+ * why: *"this row already has a menu, so they reuse it rather than adding a
20
+ * second one beside it."* An EDITOR could not reach that menu, so an editor
21
+ * with affordances of its own had no choice but to draw a second ⋮ inside the
22
+ * value cell. The IDE's template field does exactly that, and the two menus
23
+ * ended up side by side on one control, at slightly different widths.
24
+ *
25
+ * `optionActions` does not solve it: that seam is host configuration, resolved
26
+ * from the option's name and schema before the editor exists, so it cannot know
27
+ * what the editor can offer *now* — whether its templates have loaded, whether
28
+ * the value is already an expression, which custom items the field was given.
29
+ *
30
+ * ## Why registration is keyed, and by whom
31
+ *
32
+ * Menu items carry `onClick` handlers, so they are a new array on every render
33
+ * and cannot be compared by value. An editor therefore publishes a `key`
34
+ * alongside them: a primitive describing WHICH items it is currently offering
35
+ * (`'expression,template'`). The row re-renders only when a publisher's key
36
+ * changes, so a re-rendering editor cannot drive the row into a state loop.
37
+ *
38
+ * Each registration also belongs to ONE publisher. A single shared slot let
39
+ * two publishers in the same row — an expression builder's operands — overwrite
40
+ * each other's key on every render, which re-rendered the row and both of them,
41
+ * which published again: a synchronous render loop that froze the page. And a
42
+ * slot that outlived its editor kept that editor's handlers after it unmounted,
43
+ * so a row closed and reopened offered items that did nothing. Registrations
44
+ * are therefore per publisher, withdrawn on unmount, and a click always reaches
45
+ * the handler from the publisher's latest render.
46
+ *
47
+ * Publish with `useRowMenuPublisher`; provide with `useRowMenuRegistry`.
48
+ */
49
+ export interface IRowMenuRegistration {
50
+ /**
51
+ * Publish a publisher's menu items into the containing row's ⋮.
52
+ *
53
+ * @param publisherId identifies the publishing editor (one per mounted editor)
54
+ * @param key a primitive describing which items are being offered; the row
55
+ * re-renders only when it changes
56
+ * @param items the items to merge, or an empty array to contribute none
57
+ */
58
+ registerRowMenuItems: (publisherId: string, key: string, items: IReqoreDropdownItem[]) => void;
59
+ /** Withdraw a publisher's items — when it unmounts or leaves the row. */
60
+ unregisterRowMenuItems: (publisherId: string) => void;
61
+ }
62
+
63
+ /**
64
+ * Absent outside a compact row — the classic (non-compact) render path has no
65
+ * row menu to merge into, and an editor there keeps drawing its own control.
66
+ */
67
+ export const RowMenuContext = createContext<IRowMenuRegistration | undefined>(undefined);
68
+
69
+ /**
70
+ * The row-menu channel for the row this editor is inside, or `undefined` when
71
+ * there is no row menu to publish into.
72
+ *
73
+ * An editor that finds it should render no menu of its own; one that does not
74
+ * must keep rendering its own, or its actions become unreachable.
75
+ */
76
+ export const useRowMenu = (): IRowMenuRegistration | undefined => useContext(RowMenuContext);
77
+
78
+ /**
79
+ * Publish `items` into `rowMenu` for as long as the calling editor is mounted.
80
+ * `rowMenu` is passed rather than read here so an editor can claim the channel
81
+ * and hide it from what it renders (see `TemplateField`).
82
+ */
83
+ export const useRowMenuPublisher = (
84
+ rowMenu: IRowMenuRegistration | undefined,
85
+ key: string,
86
+ items: IReqoreDropdownItem[]
87
+ ): void => {
88
+ const publisherId = useId();
89
+
90
+ useEffect(() => {
91
+ rowMenu?.registerRowMenuItems(publisherId, key, items);
92
+ }, [rowMenu, publisherId, key, items]);
93
+
94
+ useEffect(() => () => rowMenu?.unregisterRowMenuItems(publisherId), [rowMenu, publisherId]);
95
+ };
96
+
97
+ /**
98
+ * The row side of the channel: the registration to provide, and the items the
99
+ * row's ⋮ should list.
100
+ */
101
+ export const useRowMenuRegistry = (): {
102
+ rowMenu: IRowMenuRegistration;
103
+ items: IReqoreDropdownItem[];
104
+ } => {
105
+ // Which publishers are offering which item SET — the only state, so only a
106
+ // change of set re-renders the row.
107
+ const [keys, setKeys] = useState<Record<string, string>>({});
108
+ // Each publisher's items from its latest render, read at click time.
109
+ const latest = useRef<Record<string, IReqoreDropdownItem[]>>({});
110
+
111
+ const registerRowMenuItems = useCallback(
112
+ (publisherId: string, key: string, items: IReqoreDropdownItem[]) => {
113
+ latest.current[publisherId] = items;
114
+ setKeys((previous) =>
115
+ previous[publisherId] === key ? previous : { ...previous, [publisherId]: key }
116
+ );
117
+ },
118
+ []
119
+ );
120
+
121
+ const unregisterRowMenuItems = useCallback((publisherId: string) => {
122
+ delete latest.current[publisherId];
123
+ setKeys((previous) => {
124
+ if (!(publisherId in previous)) {
125
+ return previous;
126
+ }
127
+ const next = { ...previous };
128
+ delete next[publisherId];
129
+ return next;
130
+ });
131
+ }, []);
132
+
133
+ const rowMenu = useMemo(
134
+ () => ({ registerRowMenuItems, unregisterRowMenuItems }),
135
+ [registerRowMenuItems, unregisterRowMenuItems]
136
+ );
137
+
138
+ const items = useMemo(
139
+ () =>
140
+ Object.keys(keys).flatMap((publisherId) =>
141
+ (latest.current[publisherId] ?? []).map((item, index) =>
142
+ item.onClick
143
+ ? {
144
+ ...item,
145
+ // Same key, same item set, so the index still names this item;
146
+ // the handler is whatever the publisher rendered last.
147
+ onClick: ((...args: unknown[]) =>
148
+ (latest.current[publisherId]?.[index]?.onClick as
149
+ | ((...clickArgs: unknown[]) => unknown)
150
+ | undefined)?.(...args)) as IReqoreDropdownItem['onClick'],
151
+ }
152
+ : item
153
+ )
154
+ ),
155
+ [keys]
156
+ );
157
+
158
+ return { rowMenu, items };
159
+ };
@@ -0,0 +1,27 @@
1
+ import { createContext } from 'react';
2
+
3
+ /**
4
+ * "The row you are in has just been opened, and the control you are is the one
5
+ * it offers — so show the choices."
6
+ *
7
+ * A compact row is read-first: collapsed, it prints the value; clicked, it
8
+ * mounts the editor. For a PICKER the editor is a closed trigger printing the
9
+ * same value the read row had just printed, so the row opened and nothing on
10
+ * screen changed — the author had to click a second time to reach the list.
11
+ * Read-first is the collapsed row's job; it must not be the answer twice.
12
+ *
13
+ * The row decides, because only the row knows both things that matter: that the
14
+ * AUTHOR opened it (a row the form opens to show a value must not throw a list
15
+ * over it) and WHICH control it offers (`findRowFocusTarget` — the same scan
16
+ * that hands over the caret). The control obeys, because only the control knows
17
+ * how it opens.
18
+ *
19
+ * A one-shot pulse rather than a standing flag: it is `true` for exactly the
20
+ * commit in which the editor acts on it, and false again afterwards, so an
21
+ * editor that remounts later — a picker whose catalogue reloaded, after the
22
+ * author had closed it — does not reopen itself off a stale instruction.
23
+ *
24
+ * Exported so a host's own editor can obey it too: read it with
25
+ * `useContext(RowOpenPickerContext)` and open on the rising edge.
26
+ */
27
+ export const RowOpenPickerContext = createContext<boolean>(false);
@@ -0,0 +1,63 @@
1
+ // Copyright 2026 Qore Technologies, s.r.o.
2
+ /**
3
+ * Which options offer the per-type choices ("Integer", "Text", "Hash", …) in
4
+ * the row's menu.
5
+ *
6
+ * A field that pins no concrete type has to give the author some way to say
7
+ * what kind of value they mean, and the row menu is where that lives — the
8
+ * alternative, a standalone *"Please select data type"* control, replaces a
9
+ * typable field with a pick-only one.
10
+ *
11
+ * The rule was `ui_type === 'any'`, which is one of the three ways a schema
12
+ * says "untyped", so the choices went missing on the other two:
13
+ *
14
+ * - **`type: 'auto'` with no `ui_type` at all.** This is how the server
15
+ * declares an assertion's Expected Value, so that field never offered them.
16
+ * They appeared only inside an expression, where the OPERAND's schema does
17
+ * say `ui_type: 'any'` — so the same option offered them in the Visual view
18
+ * and not in the Text view, which reads as the menu losing items.
19
+ * - **A host's own untyped editor.** The IDE renders Expected Value through
20
+ * `test-reference`, a `ui_type` reqraft knows nothing about; the field is no
21
+ * less untyped for having a custom editor.
22
+ *
23
+ * `ui_type` is asked FIRST and on its own: a schema that names a concrete
24
+ * editor (`ui_type: 'string'`) has pinned the field even if its storage `type`
25
+ * is still `auto`.
26
+ */
27
+ import type { TQorusFormFieldSchema } from '@qoretechnologies/ts-toolkit';
28
+ import { firstDeclaredType, UNTYPED_OPTION_TYPES } from '../../../helpers/optionUiTypes';
29
+
30
+ /**
31
+ * The spellings that mean "no concrete type" wherever they appear.
32
+ *
33
+ * Re-exported from the type vocabulary in `helpers/optionUiTypes`, which is
34
+ * where it now lives so non-component code can ask the same question.
35
+ */
36
+ export const BuiltInAnyLikeTypes: readonly string[] = UNTYPED_OPTION_TYPES;
37
+
38
+ /**
39
+ * Does this option leave its type up to the author?
40
+ *
41
+ * @param option the option's schema entry
42
+ * @param extraUiTypes host `ui_type` names that are untyped editors of their
43
+ * own — see `FormEngine`'s `anyLikeUiTypes`
44
+ */
45
+ export const offersTypeChoices = (
46
+ option: TQorusFormFieldSchema | undefined,
47
+ extraUiTypes?: string[]
48
+ ): boolean => {
49
+ if (!option) {
50
+ return false;
51
+ }
52
+
53
+ const uiType: string | undefined = option.ui_type;
54
+
55
+ if (uiType) {
56
+ return BuiltInAnyLikeTypes.includes(uiType) || !!extraUiTypes?.includes(uiType);
57
+ }
58
+
59
+ // No `ui_type`: the storage type is the only thing that can pin the field,
60
+ // read as the field is rendered (`firstDeclaredType`).
61
+ const type = firstDeclaredType(option.type);
62
+ return type !== undefined && BuiltInAnyLikeTypes.includes(type);
63
+ };
@@ -0,0 +1,85 @@
1
+ // Copyright 2026 Qore Technologies, s.r.o.
2
+ // How a DPQL expression is shown when it is shown but not edited.
3
+ //
4
+ // ONE rendering for every read-only place an expression appears — the Explain
5
+ // panel, the Text view's Preview, the conversion a type-fit message suggests,
6
+ // a collapsed expression row — so they read the same everywhere: monospace,
7
+ // coloured by the language server's semantic tokens (the canonical tokenizer,
8
+ // see `useLspSemanticTokens`), template references as chips. Before, the same
9
+ // expression could be highlighted in one place, plain proportional text in the
10
+ // next and a bare `<code>` in a third, depending only on which component
11
+ // happened to draw it.
12
+ import { ReqoreMessage } from '@qoretechnologies/reqore';
13
+ import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
14
+ import { useAsync } from 'react-use';
15
+ import { DpqlEditor } from '../../dpqlEditor';
16
+ import { FormFieldsSkeleton } from '../engine/FormFieldsSkeleton';
17
+ import { IExpressionValue } from './types';
18
+ import { useRenderExpression } from './useRenderExpression';
19
+
20
+ const noop = (): void => undefined;
21
+
22
+ export interface IDpqlRenderingProps {
23
+ /** DPQL, or a readable rendering of it, to show. */
24
+ text: string;
25
+ /** The surface's template catalogue: a reference in it reads as its name. */
26
+ templates?: IReqoreFormTemplates;
27
+ 'data-testid'?: string;
28
+ }
29
+
30
+ /** Shows `text` as DPQL: monospace, server-coloured, references as chips. */
31
+ export const DpqlRendering = ({ text, templates, 'data-testid': testId }: IDpqlRenderingProps) => (
32
+ <div className='dpql-rendering' data-testid={testId} style={{ width: '100%', minWidth: 0 }}>
33
+ <DpqlEditor
34
+ value={text}
35
+ onChange={noop}
36
+ readOnly
37
+ // The text is a rendering, not something being written: nothing to
38
+ // diagnose, and a hover would describe tokens of a document nobody edits.
39
+ showDiagnostics={false}
40
+ enableHover={false}
41
+ templateTagsUseIntent
42
+ templates={templates}
43
+ // The text is already known; only its colours wait for the server, so
44
+ // nothing is hidden behind "Connecting to language server…".
45
+ loadingIndicator={null}
46
+ />
47
+ </div>
48
+ );
49
+
50
+ export interface IExpressionRenderingProps {
51
+ /** The expression AST to render. */
52
+ expression: IExpressionValue;
53
+ /** The surface's template catalogue: a reference in it reads as its name. */
54
+ templates?: IReqoreFormTemplates;
55
+ 'data-testid'?: string;
56
+ }
57
+
58
+ /**
59
+ * The server's readable rendering of `expression`, shown through
60
+ * `DpqlRendering`. It waits for the server — in the form's one waiting shape —
61
+ * and says so plainly if the server cannot render, rather than showing an
62
+ * approximation that reads like the real thing.
63
+ */
64
+ export const ExpressionRendering = ({
65
+ expression,
66
+ templates,
67
+ 'data-testid': testId,
68
+ }: IExpressionRenderingProps) => {
69
+ const { renderRich } = useRenderExpression();
70
+ const rendering = useAsync(() => renderRich(expression), [JSON.stringify(expression)]);
71
+
72
+ if (rendering.loading) {
73
+ return <FormFieldsSkeleton rows={1} reason='expression-rendering' />;
74
+ }
75
+
76
+ if (!rendering.value) {
77
+ return (
78
+ <ReqoreMessage size='small' intent='muted' flat opaque={false} data-testid={testId}>
79
+ This expression could not be rendered.
80
+ </ReqoreMessage>
81
+ );
82
+ }
83
+
84
+ return <DpqlRendering text={rendering.value.text} templates={templates} data-testid={testId} />;
85
+ };