@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,165 @@
1
+ // Copyright 2026 Qore Technologies, s.r.o.
2
+ /**
3
+ * One shared, lazily-opened DPQL document used to ask the server "is this
4
+ * text really an expression?" on behalf of plain form fields that have no
5
+ * editor of their own.
6
+ *
7
+ * ## Why a singleton, and why it is cheap
8
+ *
9
+ * `ReqraftLspClient` multiplexes every document over ONE socket per endpoint
10
+ * (`LspSharedConnection`), and `initialize` runs once for that socket. A
11
+ * probe is therefore not a new connection — it is one extra `didOpen`, and
12
+ * one `QorusDpqlActionSession` in the server's `uriToDpqlSession` map. Even
13
+ * so it is a single shared document rather than one per field: a form with
14
+ * forty expression-capable options would otherwise open forty of them to ask
15
+ * the same question.
16
+ *
17
+ * Nothing is opened until a field actually probes, so a form whose author
18
+ * never types anything expression-shaped costs nothing at all.
19
+ *
20
+ * The document is opened with NO provider context. Verified against the live
21
+ * server: `textDocument/didOpen` with `languageId: 'dpql'` and no metadata
22
+ * still builds a session, and `dpql/parse` answers on it. Record-field
23
+ * references (`@name`) do not resolve to a provider's fields without that
24
+ * context, which is fine — detection asks about the SHAPE of the expression,
25
+ * and the editor the author lands in binds the real context.
26
+ *
27
+ * No `target_type` is sent. Detection asks "is this an expression", not "is
28
+ * it the right type"; a type mismatch is a thing to show the author INSIDE
29
+ * the expression editor, not a reason to refuse to open it.
30
+ */
31
+ import { ReqraftLspClient } from '../../utils/lspClient';
32
+
33
+ /** What a probe answers. Never throws — a failure is `success: false`. */
34
+ export interface IDpqlProbeResult {
35
+ success: boolean;
36
+ expression: Record<string, any> | null;
37
+ diagnostics: Array<{ severity?: number | string; message?: string; code?: string | number }>;
38
+ }
39
+
40
+ const FAILED: IDpqlProbeResult = { success: false, expression: null, diagnostics: [] };
41
+
42
+ /** Opaque, non-secret document URI — the server keys its session by this. */
43
+ const PROBE_URI = 'dpql://probe/detection';
44
+
45
+ /**
46
+ * How many parsed texts to remember. Typing walks through many prefixes of
47
+ * the same expression, and an author re-typing a value should not re-ask.
48
+ */
49
+ const MAX_CACHE_ENTRIES = 200;
50
+
51
+ class DpqlProbe {
52
+ private client: ReqraftLspClient | null = null;
53
+ private opened: Promise<ReqraftLspClient> | null = null;
54
+ private users = 0;
55
+ private readonly cache = new Map<string, IDpqlProbeResult>();
56
+
57
+ /** Register a consumer; the document is still not opened until it probes. */
58
+ acquire(): void {
59
+ this.users += 1;
60
+ }
61
+
62
+ /** Drop a consumer, closing the shared document when the last one goes. */
63
+ release(): void {
64
+ this.users = Math.max(0, this.users - 1);
65
+
66
+ if (this.users === 0) {
67
+ this.close();
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Parse `text` on the shared probe document. Resolves to `FAILED` rather
73
+ * than rejecting, for any reason at all — a field must never break because
74
+ * the instance is unreachable.
75
+ */
76
+ async parse(text: string): Promise<IDpqlProbeResult> {
77
+ const cached = this.cache.get(text);
78
+
79
+ if (cached) {
80
+ return cached;
81
+ }
82
+
83
+ let result = FAILED;
84
+
85
+ try {
86
+ const client = await this.open();
87
+ const response = await client.customRequest<Partial<IDpqlProbeResult>>('dpql/parse', {
88
+ uri: PROBE_URI,
89
+ text,
90
+ });
91
+
92
+ result = {
93
+ success: response?.success ?? false,
94
+ expression: response?.expression ?? null,
95
+ diagnostics: response?.diagnostics ?? [],
96
+ };
97
+ } catch {
98
+ // Unreachable instance, closed socket, request timeout: the field
99
+ // simply learns nothing and leaves the typed text exactly as it is.
100
+ result = FAILED;
101
+ }
102
+
103
+ this.remember(text, result);
104
+
105
+ return result;
106
+ }
107
+
108
+ /** Open (once) and return the shared document's client. */
109
+ private open(): Promise<ReqraftLspClient> {
110
+ if (this.opened) {
111
+ return this.opened;
112
+ }
113
+
114
+ this.opened = (async (): Promise<ReqraftLspClient> => {
115
+ const client = new ReqraftLspClient({ languageId: 'dpql', uri: PROBE_URI });
116
+
117
+ await client.connect();
118
+ // `didOpen` is a notification on the same socket as the request that
119
+ // follows it, so the server has the session by the time the parse
120
+ // arrives — no readiness poll needed.
121
+ client.didOpen('');
122
+ this.client = client;
123
+
124
+ return client;
125
+ })().catch((error) => {
126
+ // Allow a later probe to retry a connection that failed once.
127
+ this.opened = null;
128
+ throw error;
129
+ });
130
+
131
+ return this.opened;
132
+ }
133
+
134
+ private remember(text: string, result: IDpqlProbeResult): void {
135
+ if (this.cache.size >= MAX_CACHE_ENTRIES) {
136
+ const oldest = this.cache.keys().next();
137
+
138
+ if (!oldest.done) {
139
+ this.cache.delete(oldest.value);
140
+ }
141
+ }
142
+
143
+ this.cache.set(text, result);
144
+ }
145
+
146
+ private close(): void {
147
+ const client = this.client;
148
+
149
+ this.client = null;
150
+ this.opened = null;
151
+ this.cache.clear();
152
+
153
+ try {
154
+ client?.disconnect();
155
+ } catch {
156
+ // best-effort teardown
157
+ }
158
+ }
159
+ }
160
+
161
+ /**
162
+ * The process-wide probe. Exported for tests, which reset it between cases;
163
+ * application code goes through `useDpqlProbe`.
164
+ */
165
+ export const dpqlProbe = new DpqlProbe();
@@ -3,6 +3,8 @@
3
3
  // `getTagProps` callback for ReqoreRichTextEditor.
4
4
 
5
5
  import { IReqoreTagProps } from '@qoretechnologies/reqore/dist/components/Tag';
6
+ import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
7
+ import { describeTemplateReference, templateTooltip } from '../../helpers/templates';
6
8
  import { ISlateElement } from '../smartEditor/types';
7
9
  import { IDpqlFieldMeta } from './useDpqlSession';
8
10
 
@@ -55,6 +57,13 @@ export interface IDpqlTagRendererOptions {
55
57
  * keeps the per-prefix palette for telling prefixes apart at a glance.
56
58
  */
57
59
  templateTagsUseIntent?: boolean;
60
+ /**
61
+ * The template catalogue the surface offers. A reference found in it reads
62
+ * as the name it was chosen by — `trim(Choices[0].message.content)` rather
63
+ * than the `$data:{…}` path — with the entry's description as its hover; one
64
+ * that is not found keeps its path.
65
+ */
66
+ templates?: IReqoreFormTemplates;
58
67
  }
59
68
 
60
69
  /**
@@ -88,8 +97,12 @@ export function makeDpqlTagRenderer(
88
97
  }
89
98
 
90
99
  if (tagValue.startsWith('$')) {
100
+ const named = options.templates && describeTemplateReference(options.templates, tagValue);
91
101
  return {
92
102
  icon: 'ExchangeDollarLine',
103
+ ...(named?.item ?
104
+ { label: named.label, tooltip: templateTooltip(options.templates, tagValue) }
105
+ : {}),
93
106
  ...(options.templateTagsUseIntent
94
107
  ? { intent: 'info' as const }
95
108
  : { color: getTemplatePrefixColor(tagValue) as `#${string}` }),
@@ -10,6 +10,10 @@ export type {
10
10
  ISlateText,
11
11
  TSlateNode,
12
12
  } from './types';
13
+ export { dpqlProbe } from './dpqlProbe';
14
+ export type { IDpqlProbeResult } from './dpqlProbe';
15
+ export { useDpqlProbe } from './useDpqlProbe';
16
+ export type { TDpqlProbeFn } from './useDpqlProbe';
13
17
  export { useDpqlSession } from './useDpqlSession';
14
18
  export type {
15
19
  IDpqlFieldMeta,
@@ -2,6 +2,7 @@
2
2
  // Type definitions for the DpqlEditor component. Slate node types
3
3
  // (`ISlateElement`, `ISlateText`, `TSlateNode`) live in the smartEditor
4
4
  // primitive's `types.ts` — re-export them here for backward compat.
5
+ import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
5
6
 
6
7
  export type {
7
8
  ISlateElement,
@@ -13,6 +14,24 @@ export type {
13
14
  export interface IDpqlParseResult {
14
15
  success: boolean;
15
16
  expression: Record<string, any> | null;
17
+ /** The type the server inferred for the expression's result. */
18
+ inferred_type?: string;
19
+ /** Echo of the `target_type` the request asked about, when one was sent. */
20
+ target_type?: string;
21
+ /** `true` when the inferred type already satisfies the target. */
22
+ type_compatible?: boolean;
23
+ /** `true` when a conversion to the target exists at all. */
24
+ auto_coercible?: boolean;
25
+ /**
26
+ * `true` when that conversion is only ATTEMPTED, not guaranteed — text used
27
+ * as a number, whose outcome depends on what the text turns out to hold.
28
+ * A total conversion (a number used as text) reports `false`, and the server
29
+ * emits no diagnostic for it: warning about something that cannot fail
30
+ * teaches authors to ignore the warnings that can.
31
+ */
32
+ coercion_may_fail?: boolean;
33
+ /** The conversion that would make the expression fit, when one would. */
34
+ suggested_fix?: { text: string; description?: string };
16
35
  diagnostics: Array<{
17
36
  range: {
18
37
  start: { line: number; character: number };
@@ -72,6 +91,17 @@ export interface IDpqlEditorProps {
72
91
  * palette, the editor's at-a-glance prefix coloring).
73
92
  */
74
93
  templateTagsUseIntent?: boolean;
94
+ /**
95
+ * The overlay shown while the language server connects. Forwarded to
96
+ * `SmartEditor`; pass `null` to show the text without one — a read-only
97
+ * rendering already has its text, and only its colours wait for the server.
98
+ */
99
+ loadingIndicator?: React.ReactNode;
100
+ /**
101
+ * The template catalogue the surface offers: a `$…` reference found in it
102
+ * is labelled by its catalogue name. See `IDpqlTagRendererOptions.templates`.
103
+ */
104
+ templates?: IReqoreFormTemplates;
75
105
  /** Called when the editor loses focus. */
76
106
  onBlur?: () => void;
77
107
  /**
@@ -150,8 +180,14 @@ export interface IDpqlEditorRef {
150
180
  * when the document has no diagnostics, otherwise an array of errors.
151
181
  */
152
182
  validate: () => Promise<{ valid: boolean; errors?: Array<{ message: string }> }>;
153
- /** Parse DPQL text into an expression AST via `dpql/parse`. */
154
- parse: (text: string) => Promise<IDpqlParseResult>;
183
+ /**
184
+ * Parse DPQL text into an expression AST via `dpql/parse`.
185
+ *
186
+ * `targetType` asks the server, in the same round trip, whether the
187
+ * expression's result can satisfy that type — see `coercion_may_fail` on
188
+ * the result. Omit it to ask only whether the text parses.
189
+ */
190
+ parse: (text: string, targetType?: string) => Promise<IDpqlParseResult>;
155
191
  /** Serialize an expression AST back to DPQL text via `dpql/serialize`. */
156
192
  serialize: (expression: Record<string, any>) => Promise<string>;
157
193
  }
@@ -0,0 +1,33 @@
1
+ // Copyright 2026 Qore Technologies, s.r.o.
2
+ // React access to the shared DPQL detection probe (`dpqlProbe`). The hook
3
+ // itself opens nothing: a field becomes a consumer of the shared document
4
+ // only once it actually asks a question, and stops being one when it
5
+ // unmounts. A form full of fields that never see expression-shaped text
6
+ // therefore never opens the document at all.
7
+ import { useCallback, useEffect, useRef } from 'react';
8
+ import { dpqlProbe, IDpqlProbeResult } from './dpqlProbe';
9
+
10
+ export type TDpqlProbeFn = (text: string) => Promise<IDpqlProbeResult>;
11
+
12
+ export const useDpqlProbe = (): TDpqlProbeFn => {
13
+ const acquired = useRef(false);
14
+
15
+ useEffect(
16
+ () => () => {
17
+ if (acquired.current) {
18
+ acquired.current = false;
19
+ dpqlProbe.release();
20
+ }
21
+ },
22
+ []
23
+ );
24
+
25
+ return useCallback((text: string): Promise<IDpqlProbeResult> => {
26
+ if (!acquired.current) {
27
+ acquired.current = true;
28
+ dpqlProbe.acquire();
29
+ }
30
+
31
+ return dpqlProbe.parse(text);
32
+ }, []);
33
+ };
@@ -50,8 +50,11 @@ export interface IUseDpqlSessionResult {
50
50
  fieldMeta: Record<string, IDpqlFieldMeta>;
51
51
  /** Most recent `publishDiagnostics`. */
52
52
  diagnostics: ILspDiagnostic[];
53
- /** `dpql/parse` — DPQL text → expression AST. */
54
- parse: (text: string) => Promise<IDpqlParseResult>;
53
+ /**
54
+ * `dpql/parse` — DPQL text → expression AST, and, when `targetType` is
55
+ * given, whether that result can satisfy the type the field declares.
56
+ */
57
+ parse: (text: string, targetType?: string) => Promise<IDpqlParseResult>;
55
58
  /** `dpql/serialize` — expression AST → DPQL text. */
56
59
  serialize: (expression: Record<string, any>) => Promise<string>;
57
60
  /**
@@ -314,18 +317,31 @@ export function useDpqlSession(
314
317
  );
315
318
 
316
319
  const parse = useCallback(
317
- async (text: string): Promise<IDpqlParseResult> => {
320
+ async (text: string, targetType?: string): Promise<IDpqlParseResult> => {
318
321
  if (!session.client) {
319
322
  return { success: false, expression: null, diagnostics: [] };
320
323
  }
321
324
  try {
322
325
  const result = await session.client.customRequest<Partial<IDpqlParseResult>>(
323
326
  'dpql/parse',
324
- { uri: session.uri, text }
327
+ {
328
+ uri: session.uri,
329
+ text,
330
+ // Only sent when the field declares one. Without it the server
331
+ // does no type analysis at all, which is the right answer for a
332
+ // caller that only wants to know whether the text parses.
333
+ ...(targetType ? { target_type: targetType } : {}),
334
+ }
325
335
  );
326
336
  return {
327
337
  success: result?.success ?? false,
328
338
  expression: result?.expression ?? null,
339
+ inferred_type: result?.inferred_type,
340
+ target_type: result?.target_type,
341
+ type_compatible: result?.type_compatible,
342
+ auto_coercible: result?.auto_coercible,
343
+ coercion_may_fail: result?.coercion_may_fail,
344
+ suggested_fix: result?.suggested_fix,
329
345
  diagnostics: result?.diagnostics ?? [],
330
346
  };
331
347
  } catch {