@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
@@ -4,31 +4,141 @@ import {
4
4
  } from '@qoretechnologies/reqore/dist/components/RichTextEditor';
5
5
  import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
6
6
  import { IReqoreTagProps } from '@qoretechnologies/reqore/dist/components/Tag';
7
+ import { IReqoreTooltip } from '@qoretechnologies/reqore/dist/types/global';
7
8
  import { isEqual, size } from 'lodash';
8
- import { memo, useCallback, useEffect, useMemo, useState } from 'react';
9
+ import { KeyboardEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
10
  import { useDebounce } from 'react-use';
10
- import { getTemplateTagStyle } from '../../../../helpers/templates';
11
+ import { flattenToSingleLine, hasLineBreak } from '../../../../helpers/singleLineString';
12
+ import {
13
+ renderTemplateItemDescriptions,
14
+ templateItemsToShow,
15
+ } from '../../../../helpers/templateItems';
16
+ import {
17
+ templateChipLabel,
18
+ templateNodesToText,
19
+ templateTextToNodes,
20
+ } from '../../../../helpers/templateText';
21
+ import {
22
+ describeTemplateReference,
23
+ getTemplateTagStyle,
24
+ templateTooltip,
25
+ TTemplateMeta,
26
+ } from '../../../../helpers/templates';
27
+ import { useMarkdownRenderer } from '../../../Description/markdownRendererContext';
11
28
 
12
29
  export interface IRichTextFormFieldProps extends Omit<
13
30
  IReqoreRichTextEditorProps,
14
- 'onChange' | 'value'
31
+ 'onChange' | 'value' | 'tags' | 'actions'
15
32
  > {
33
+ /**
34
+ * A form field's OWN chips — not the editor's template catalogue, which this
35
+ * component computes from `templates`.
36
+ *
37
+ * The two are different things wearing one name: the editor's `tags` is a
38
+ * record of offered template values, a field's is a list of chips to show. A
39
+ * field spreading its props here used to hand the first where the second was
40
+ * expected, so the template list vanished — call sites patched it one by one
41
+ * with `omit(rest, 'tags')`. It is accepted here and deliberately not
42
+ * forwarded, so a field can spread its props without either patch or type
43
+ * error.
44
+ */
45
+ tags?: unknown;
16
46
  value?: string | IReqoreRichTextEditorProps['value'];
17
47
  onChange?: (value: string | IReqoreRichTextEditorProps['value']) => void;
18
48
  allowTemplates?: boolean;
19
49
  templates?: IReqoreFormTemplates;
50
+ /**
51
+ * What the value is. `richtext` (the default) stores the editor's document.
52
+ * `text` stores a plain string: each template reference in it is drawn as a
53
+ * chip named from `templates`, and what is emitted is the string again — for
54
+ * a string field whose value may hold references (`Dear $local:name`).
55
+ */
56
+ valueFormat?: 'richtext' | 'text';
57
+ /** With `valueFormat: 'text'`: the value holds one line, so Enter adds none. */
58
+ singleLine?: boolean;
59
+ /**
60
+ * With `valueFormat: 'text'`: the token grammar the value's references are
61
+ * WRITTEN in, when the host speaks one of its own.
62
+ *
63
+ * The field schema's `templateToken` (`TFieldWithOwnTemplates`), which the
64
+ * read-only renderings already take. Without it this editor knew only
65
+ * reqraft's built-in `$key:{path}`, so a host's own spelling — a Qorus test's
66
+ * `$._case.mode` — was a named chip on the collapsed row and raw text in the
67
+ * editor that row opens. Declared here, and deliberately NOT forwarded to
68
+ * Reqore's editor, which has no such prop.
69
+ */
70
+ templateToken?: RegExp | string;
20
71
  }
21
72
 
73
+ /**
74
+ * What each offered template value is FOR, keyed by the value itself.
75
+ *
76
+ * Built from the templates a field was already given rather than from the
77
+ * chip's metadata, which carries only `image` / `displayName` / style flags —
78
+ * putting a description there would mean threading one through every producer
79
+ * of a template list.
80
+ *
81
+ * Exported so the mapping is assertable without rendering a Slate editor.
82
+ */
83
+ export const getChipTooltipDescriptions = (
84
+ templates?: IReqoreFormTemplates
85
+ ): Record<string, string> => {
86
+ const out: Record<string, string> = {};
87
+
88
+ /* BOTH shapes, because this list arrives in either one. A picker's items are
89
+ normally grouped by category, but a LONE category is opened onto its values
90
+ where the templates are resolved (`templateItemsToShow`), so a field with
91
+ one category hands down a FLAT list of leaves. Walking only groups made
92
+ that the common case and silently lost every tooltip on it — one category
93
+ is the ordinary shape for a field, not the exception.
94
+
95
+ Recursive rather than two-level: a leaf is recognised by carrying a value
96
+ rather than by its depth, so a deeper catalogue works too. */
97
+ const collect = (items: any[] | undefined): void => {
98
+ items?.forEach((item: any) => {
99
+ const value = typeof item?.value === 'object' ? item?.value?.value : item?.value;
100
+ const description = item?.description ?? item?.short_desc;
101
+ if (typeof value === 'string' && typeof description === 'string' && description) {
102
+ out[value] = description;
103
+ }
104
+ collect(item?.items);
105
+ });
106
+ };
107
+
108
+ collect((templates as any)?.items);
109
+
110
+ return out;
111
+ };
112
+
22
113
  export const RichTextFormField = memo(({
23
114
  value,
24
115
  onChange,
25
116
  allowTemplates,
26
117
  templates,
118
+ valueFormat = 'richtext',
119
+ singleLine,
120
+ templateToken,
27
121
  ...rest
28
122
  }: IRichTextFormFieldProps) => {
29
- const [localValue, setLocalValue] = useState<any>(value);
123
+ const isText = valueFormat === 'text';
124
+ const [localValue, setLocalValue] = useState<any>(() =>
125
+ isText ? templateTextToNodes(String(value ?? ''), templates, templateToken) : value
126
+ );
127
+ /* In text mode, the string the editor's document stands for. The value that
128
+ comes back from the parent is usually that same string, and rebuilding the
129
+ document from it would hand the editor a new tree on every keystroke —
130
+ which it answers by replacing its content and moving the cursor to the end. */
131
+ const lastTextRef = useRef(isText ? String(value ?? '') : '');
30
132
 
31
133
  useEffect(() => {
134
+ if (isText) {
135
+ const text = String(value ?? '');
136
+ if (text !== lastTextRef.current) {
137
+ lastTextRef.current = text;
138
+ setLocalValue(templateTextToNodes(text, templates, templateToken));
139
+ }
140
+ return;
141
+ }
32
142
  if (JSON.stringify(value) !== JSON.stringify(localValue)) {
33
143
  setLocalValue(value);
34
144
  }
@@ -36,6 +146,12 @@ export const RichTextFormField = memo(({
36
146
 
37
147
  useDebounce(
38
148
  () => {
149
+ if (isText) {
150
+ if (lastTextRef.current !== String(value ?? '')) {
151
+ onChange?.(lastTextRef.current);
152
+ }
153
+ return;
154
+ }
39
155
  if (!isEqual(localValue, value)) {
40
156
  onChange?.(localValue);
41
157
  }
@@ -50,6 +166,19 @@ export const RichTextFormField = memo(({
50
166
  );
51
167
 
52
168
  const handleChange = (val: any): void => {
169
+ if (isText) {
170
+ const text = templateNodesToText(val);
171
+ // A line break also arrives by paste and by drag-and-drop; Enter alone is
172
+ // stopped below. Flattened text is shown as the one line it now is.
173
+ if (singleLine && hasLineBreak(text)) {
174
+ lastTextRef.current = flattenToSingleLine(text);
175
+ setLocalValue(templateTextToNodes(lastTextRef.current, templates, templateToken));
176
+ return;
177
+ }
178
+ lastTextRef.current = text;
179
+ setLocalValue(val);
180
+ return;
181
+ }
53
182
  if (JSON.stringify(val) === '[{"type":"paragraph","children":[{"text":""}]}]') {
54
183
  setLocalValue(undefined);
55
184
  return;
@@ -57,26 +186,91 @@ export const RichTextFormField = memo(({
57
186
  setLocalValue(val);
58
187
  };
59
188
 
60
- const handleGetTagProps = useCallback((tag: any): IReqoreTagProps => {
61
- const tagValue = tag.value?.toString();
189
+ // One renderer for both surfaces below — the chip's hover and the picker rows
190
+ // show the same strings, so they must be drawn the same way.
191
+ const renderMarkdown = useMarkdownRenderer();
62
192
 
63
- if (!tagValue) {
64
- return {};
65
- }
193
+ const descriptionByValue = useMemo(() => getChipTooltipDescriptions(templates), [
194
+ JSON.stringify(templates),
195
+ ]);
66
196
 
67
- if (tagValue.startsWith('$')) {
68
- return {
69
- icon: 'ExchangeDollarLine',
70
- leftIconProps: {
71
- image: tag.metadata?.image,
72
- },
73
- labelKey: tag.metadata?.displayName,
74
- ...getTemplateTagStyle(tag.metadata),
75
- };
76
- }
197
+ const handleGetTagProps = useCallback(
198
+ (tag: any): IReqoreTagProps => {
199
+ const tagValue = tag.value?.toString();
200
+
201
+ if (!tagValue) {
202
+ return {};
203
+ }
77
204
 
78
- return {};
79
- }, []);
205
+ /* A reference in a string is drawn exactly as the collapsed row draws the
206
+ same value (`ReadOnlyTemplateTag`): named from the catalogue, its
207
+ description on hover. Read at render, so a catalogue that arrives
208
+ after the value still names it. */
209
+ if (isText && tagValue.startsWith('$')) {
210
+ const { item } = describeTemplateReference(templates, tagValue);
211
+ const metadata = item?.metadata as TTemplateMeta | undefined;
212
+ return {
213
+ icon: 'ExchangeDollarLine',
214
+ leftIconProps: { image: metadata?.image },
215
+ label: templateChipLabel(templates, tagValue),
216
+ tooltip: templateTooltip(templates, tagValue),
217
+ ...getTemplateTagStyle(metadata),
218
+ };
219
+ }
220
+
221
+ if (tagValue.startsWith('$')) {
222
+ return {
223
+ icon: 'ExchangeDollarLine',
224
+ leftIconProps: {
225
+ image: tag.metadata?.image,
226
+ },
227
+ labelKey: tag.metadata?.displayName,
228
+ /* Hovering a chip says what the value IS, not how it is spelled.
229
+ Reqore otherwise falls back to the tag's own value, so a chip
230
+ reading "result" reported `$.result` on hover — the reference the
231
+ author already chose, restating the label in engine syntax instead
232
+ of telling them anything. The path stays discoverable in the
233
+ field's help and in the picker row for an unlabelled value. */
234
+ /* Drawn, for the same reason the picker row is: this description is
235
+ the SAME string the row shows, so leaving it raw here would print
236
+ the punctuation the row no longer prints. A tooltip's `content`
237
+ takes a node, and without a host renderer it stays the plain
238
+ string it always was. */
239
+ /* Drawn, for the same reason the picker row is: this is the SAME
240
+ string the row shows, so leaving it raw here would print the
241
+ punctuation the row no longer prints. A drawn description travels
242
+ as the tooltip's `content` — the prop itself is `string |
243
+ IReqoreTooltip`, and only the object form takes a node. Without a
244
+ host renderer it stays the plain string it always was. */
245
+ tooltip:
246
+ descriptionByValue[tagValue] ?
247
+ renderMarkdown ?
248
+ {
249
+ content: renderMarkdown({
250
+ value: descriptionByValue[tagValue],
251
+ compact: true,
252
+ }) as IReqoreTooltip['content'],
253
+ }
254
+ : descriptionByValue[tagValue]
255
+ : undefined,
256
+ ...getTemplateTagStyle(tag.metadata),
257
+ };
258
+ }
259
+
260
+ return {};
261
+ },
262
+ [descriptionByValue, renderMarkdown, isText, templates]
263
+ );
264
+
265
+ const handleKeyDown = useCallback(
266
+ (event: KeyboardEvent<HTMLTextAreaElement>): void => {
267
+ if (isText && singleLine && event.key === 'Enter') {
268
+ event.preventDefault();
269
+ }
270
+ (rest as { onKeyDown?: (event: KeyboardEvent<HTMLTextAreaElement>) => void }).onKeyDown?.(event);
271
+ },
272
+ [isText, singleLine, (rest as { onKeyDown?: unknown }).onKeyDown]
273
+ );
80
274
 
81
275
  const tags = useMemo<IReqoreRichTextEditorProps['tags']>((): IReqoreRichTextEditorProps['tags'] => {
82
276
  const _tags: IReqoreRichTextEditorProps['tags'] = {};
@@ -87,12 +281,20 @@ export const RichTextFormField = memo(({
87
281
  label: 'Templates',
88
282
  flat: false,
89
283
  description: 'Universal values that can be used in multiple places',
90
- items: templates?.items,
284
+ /* The in-editor list already nests everything under "Templates", so a
285
+ lone category makes the author drill through TWO headers to reach
286
+ the only values on offer. Hoist it. */
287
+ /* Drawn here, at the hand-off to Reqore. A description is prose written
288
+ in the same markdown as every other description this package shows,
289
+ and printing its punctuation at the reader was the last surface still
290
+ doing that. Never made further up: the list is a `JSON.stringify`
291
+ memo key in `TemplateField`. */
292
+ items: renderTemplateItemDescriptions(templateItemsToShow(templates?.items), renderMarkdown),
91
293
  };
92
294
  }
93
295
 
94
296
  return _tags;
95
- }, [allowTemplates, templates]);
297
+ }, [allowTemplates, templates, renderMarkdown]);
96
298
 
97
299
  const formattedValue: IReqoreRichTextEditorProps['value'] =
98
300
  typeof localValue !== 'object' ? [{ type: 'paragraph', children: [{ text: String(localValue ?? '') }] }]
@@ -103,17 +305,32 @@ export const RichTextFormField = memo(({
103
305
  // disables tag click/remove) when `readOnly` is set. Honour the field-level
104
306
  // flags — the IDE Options model passes `readonly`, the compact form passes
105
307
  // `readOnly` + `disabled` — so a read-only form renders the formatted content
106
- // rather than an editable box, and the toolbar actions are dropped to match.
308
+ // rather than an editable box.
107
309
  const readOnly = !!(
108
310
  (rest as { readOnly?: boolean }).readOnly ||
109
311
  (rest as { readonly?: boolean }).readonly ||
110
312
  (rest as { disabled?: boolean }).disabled
111
313
  );
112
314
 
315
+ /* Everything the caller passed, minus its own `tags` — see the prop's doc
316
+ above: on a form field that name means the chips to show, while the
317
+ editor's `tags` is the template catalogue this component computes. */
318
+ const editorProps = { ...rest };
319
+ delete (editorProps as { tags?: unknown }).tags;
320
+
113
321
  return (
114
322
  <ReqoreRichTextEditor
115
323
  value={formattedValue}
116
324
  onChange={handleChange}
325
+ /* `rest` is spread BEFORE everything this component computes. It used to
326
+ come after, so a caller's prop of the same name silently replaced the
327
+ computed one — and `tags` is exactly such a name twice over: on a form
328
+ field it means the field's own chips, while the editor's `tags` are its
329
+ template catalogue. A field passing chips therefore erased the template
330
+ list, which two call sites had each patched with `omit(rest, 'tags')`.
331
+ The three props below already fold in whatever `rest` carried for
332
+ them. */
333
+ {...editorProps}
117
334
  tagsListProps={{
118
335
  useTargetWidth: true,
119
336
  minWidth: '300px',
@@ -126,13 +343,14 @@ export const RichTextFormField = memo(({
126
343
  getTagProps={handleGetTagProps}
127
344
  tags={tags}
128
345
  panelProps={{ fluid: true, style: { minWidth: '150px', ...rest.panelProps?.style } }}
129
- {...rest}
130
346
  readOnly={readOnly}
131
- actions={
132
- readOnly ?
133
- { undo: false, redo: false, styling: false }
134
- : { redo: true, undo: true, styling: false }
135
- }
347
+ onKeyDown={handleKeyDown}
348
+ /* A form field carries no document toolbar. Styling was already off, so
349
+ the bar held only undo and redo — drawn by Reqore as a panel as wide as
350
+ the tag list, which under a field reads as an empty 600px menu with two
351
+ greyed icons in it (they are disabled until there is history to walk).
352
+ Both still work from the keyboard, where every other text field's do. */
353
+ actions={{ undo: false, redo: false, styling: false }}
136
354
  />
137
355
  );
138
356
  });