@qoretechnologies/reqraft 0.10.55-pr.124.g77dd26c → 0.10.55

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 (375) 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 +273 -22
  54. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  55. package/dist/components/form/engine/FormEngine.js +669 -192
  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 +17 -2
  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 +21 -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/number/Number.d.ts +12 -1
  170. package/dist/components/form/fields/number/Number.d.ts.map +1 -1
  171. package/dist/components/form/fields/number/Number.js +6 -3
  172. package/dist/components/form/fields/number/Number.js.map +1 -1
  173. package/dist/components/form/fields/rich-text/RichText.d.ts +47 -2
  174. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  175. package/dist/components/form/fields/rich-text/RichText.js +153 -12
  176. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  177. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  178. package/dist/components/form/fields/select/Select.js +120 -20
  179. package/dist/components/form/fields/select/Select.js.map +1 -1
  180. package/dist/components/form/fields/select/SelectCollection.d.ts +166 -9
  181. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  182. package/dist/components/form/fields/select/SelectCollection.js +200 -7
  183. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  184. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +2 -1
  185. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  186. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +3 -2
  187. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  188. package/dist/components/form/fields/template/TemplateField.d.ts +34 -2
  189. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  190. package/dist/components/form/fields/template/TemplateField.js +606 -58
  191. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  192. package/dist/components/form/fields/template/TemplateText.d.ts +36 -0
  193. package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -0
  194. package/dist/components/form/fields/template/TemplateText.js +80 -0
  195. package/dist/components/form/fields/template/TemplateText.js.map +1 -0
  196. package/dist/components/form/index.d.ts +2 -0
  197. package/dist/components/form/index.d.ts.map +1 -1
  198. package/dist/components/form/index.js +4 -0
  199. package/dist/components/form/index.js.map +1 -1
  200. package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
  201. package/dist/components/smartEditor/SmartEditor.js +29 -8
  202. package/dist/components/smartEditor/SmartEditor.js.map +1 -1
  203. package/dist/components/smartEditor/useLspSession.d.ts +5 -1
  204. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  205. package/dist/components/smartEditor/useLspSession.js +16 -2
  206. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  207. package/dist/components/supportTicket/TicketReplyBox.d.ts +8 -4
  208. package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -1
  209. package/dist/components/supportTicket/TicketReplyBox.js.map +1 -1
  210. package/dist/helpers/common.d.ts.map +1 -1
  211. package/dist/helpers/common.js +7 -3
  212. package/dist/helpers/common.js.map +1 -1
  213. package/dist/helpers/dpqlDetection.d.ts +58 -0
  214. package/dist/helpers/dpqlDetection.d.ts.map +1 -0
  215. package/dist/helpers/dpqlDetection.js +164 -0
  216. package/dist/helpers/dpqlDetection.js.map +1 -0
  217. package/dist/helpers/optionUiTypes.d.ts +31 -3
  218. package/dist/helpers/optionUiTypes.d.ts.map +1 -1
  219. package/dist/helpers/optionUiTypes.js +36 -1
  220. package/dist/helpers/optionUiTypes.js.map +1 -1
  221. package/dist/helpers/options.d.ts +57 -0
  222. package/dist/helpers/options.d.ts.map +1 -1
  223. package/dist/helpers/options.js +97 -1
  224. package/dist/helpers/options.js.map +1 -1
  225. package/dist/helpers/templateItems.d.ts +47 -0
  226. package/dist/helpers/templateItems.d.ts.map +1 -0
  227. package/dist/helpers/templateItems.js +88 -0
  228. package/dist/helpers/templateItems.js.map +1 -0
  229. package/dist/helpers/templateText.d.ts +80 -0
  230. package/dist/helpers/templateText.d.ts.map +1 -0
  231. package/dist/helpers/templateText.js +291 -0
  232. package/dist/helpers/templateText.js.map +1 -0
  233. package/dist/helpers/templates.d.ts +30 -12
  234. package/dist/helpers/templates.d.ts.map +1 -1
  235. package/dist/helpers/templates.js +91 -33
  236. package/dist/helpers/templates.js.map +1 -1
  237. package/dist/helpers/validations.d.ts +35 -8
  238. package/dist/helpers/validations.d.ts.map +1 -1
  239. package/dist/helpers/validations.js +162 -25
  240. package/dist/helpers/validations.js.map +1 -1
  241. package/dist/hooks/useArgSchema.d.ts +2 -1
  242. package/dist/hooks/useArgSchema.d.ts.map +1 -1
  243. package/dist/hooks/useFetch/useFetch.d.ts +3 -1
  244. package/dist/hooks/useFetch/useFetch.d.ts.map +1 -1
  245. package/dist/hooks/useFetch/useFetch.js +47 -9
  246. package/dist/hooks/useFetch/useFetch.js.map +1 -1
  247. package/dist/hooks/useTemplates.d.ts +20 -0
  248. package/dist/hooks/useTemplates.d.ts.map +1 -1
  249. package/dist/hooks/useTemplates.js +34 -2
  250. package/dist/hooks/useTemplates.js.map +1 -1
  251. package/dist/index.d.ts +2 -1
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +5 -1
  254. package/dist/index.js.map +1 -1
  255. package/dist/utils/fetch.d.ts +151 -1
  256. package/dist/utils/fetch.d.ts.map +1 -1
  257. package/dist/utils/fetch.js +256 -44
  258. package/dist/utils/fetch.js.map +1 -1
  259. package/dist/utils/lspClient.d.ts +6 -0
  260. package/dist/utils/lspClient.d.ts.map +1 -1
  261. package/dist/utils/lspClient.js +62 -11
  262. package/dist/utils/lspClient.js.map +1 -1
  263. package/dist/utils/websocket.d.ts +6 -0
  264. package/dist/utils/websocket.d.ts.map +1 -1
  265. package/dist/utils/websocket.js +15 -7
  266. package/dist/utils/websocket.js.map +1 -1
  267. package/package.json +10 -6
  268. package/src/components/composer/Composer.tsx +7 -2
  269. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +3 -119
  270. package/src/components/dpqlEditor/DpqlEditor.tsx +5 -2
  271. package/src/components/dpqlEditor/dpqlHelpers.ts +20 -1
  272. package/src/components/dpqlEditor/dpqlProbe.ts +165 -0
  273. package/src/components/dpqlEditor/dpqlTags.ts +13 -0
  274. package/src/components/dpqlEditor/index.ts +4 -0
  275. package/src/components/dpqlEditor/types.ts +38 -2
  276. package/src/components/dpqlEditor/useDpqlProbe.ts +33 -0
  277. package/src/components/dpqlEditor/useDpqlSession.ts +20 -4
  278. package/src/components/form/engine/CompactRow.tsx +487 -160
  279. package/src/components/form/engine/CompactToolbar.tsx +10 -3
  280. package/src/components/form/engine/FormEngine.stories.tsx +1269 -211
  281. package/src/components/form/engine/FormEngine.tsx +922 -270
  282. package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +331 -0
  283. package/src/components/form/engine/FormFieldsSkeleton.tsx +77 -0
  284. package/src/components/form/engine/OptionFieldMessages.tsx +300 -14
  285. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +94 -3
  286. package/src/components/form/engine/compactRowContext.ts +15 -6
  287. package/src/components/form/engine/compactRowStyles.ts +56 -2
  288. package/src/components/form/engine/compactToolbarContext.ts +1 -1
  289. package/src/components/form/engine/optionActions.ts +89 -1
  290. package/src/components/form/engine/optionsContext.ts +24 -0
  291. package/src/components/form/engine/readFirst.ts +88 -8
  292. package/src/components/form/engine/rendererTypes.ts +48 -4
  293. package/src/components/form/engine/rowFocus.ts +101 -0
  294. package/src/components/form/engine/rowMenuContext.ts +159 -0
  295. package/src/components/form/engine/rowOpenPicker.ts +27 -0
  296. package/src/components/form/engine/typeChoices.ts +63 -0
  297. package/src/components/form/expressions/DpqlRendering.tsx +85 -0
  298. package/src/components/form/expressions/ExpressionField.stories.tsx +826 -48
  299. package/src/components/form/expressions/ExpressionField.tsx +269 -55
  300. package/src/components/form/expressions/argumentPresence.ts +213 -0
  301. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +38 -21
  302. package/src/components/form/expressions/builder/argumentLabel.tsx +10 -4
  303. package/src/components/form/expressions/builder/index.tsx +39 -81
  304. package/src/components/form/expressions/builder/renderTemplate.tsx +23 -56
  305. package/src/components/form/expressions/dpqlMockLanguage.ts +565 -0
  306. package/src/components/form/expressions/dpqlMockLsp.ts +109 -83
  307. package/src/components/form/expressions/mockExpressions.ts +8 -4
  308. package/src/components/form/expressions/renderExpressionToText.ts +112 -22
  309. package/src/components/form/expressions/types.ts +17 -2
  310. package/src/components/form/expressions/useExpressions.ts +5 -1
  311. package/src/components/form/expressions/useRenderExpression.ts +43 -127
  312. package/src/components/form/fields/Field.tsx +102 -20
  313. package/src/components/form/fields/allowed-values/AllowedValues.tsx +106 -44
  314. package/src/components/form/fields/auto/AutoFormField.stories.tsx +85 -18
  315. package/src/components/form/fields/auto/AutoFormField.tsx +97 -21
  316. package/src/components/form/fields/date/Date.tsx +17 -1
  317. package/src/components/form/fields/long-string/LongString.tsx +15 -3
  318. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +65 -6
  319. package/src/components/form/fields/number/Number.tsx +25 -0
  320. package/src/components/form/fields/rich-text/RichText.tsx +248 -30
  321. package/src/components/form/fields/select/Select.stories.tsx +392 -0
  322. package/src/components/form/fields/select/Select.tsx +164 -27
  323. package/src/components/form/fields/select/SelectCollection.tsx +350 -6
  324. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +4 -2
  325. package/src/components/form/fields/template/TemplateField.stories.tsx +93 -14
  326. package/src/components/form/fields/template/TemplateField.tsx +825 -131
  327. package/src/components/form/fields/template/TemplateText.tsx +115 -0
  328. package/src/components/form/index.tsx +4 -0
  329. package/src/components/log/Log.stories.tsx +2 -1
  330. package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +3 -3
  331. package/src/components/smartEditor/SmartEditor.tsx +41 -9
  332. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +52 -3
  333. package/src/components/smartEditor/useLspSession.ts +21 -3
  334. package/src/components/supportTicket/TicketReplyBox.tsx +8 -4
  335. package/src/components/ticketThread/TicketThread.stories.tsx +1 -0
  336. package/src/helpers/common.ts +7 -3
  337. package/src/helpers/dpqlDetection.ts +209 -0
  338. package/src/helpers/optionUiTypes.ts +38 -0
  339. package/src/helpers/options.ts +96 -0
  340. package/src/helpers/templateItems.ts +81 -0
  341. package/src/helpers/templateText.ts +350 -0
  342. package/src/helpers/templates.ts +94 -41
  343. package/src/helpers/validations.ts +203 -51
  344. package/src/hooks/useFetch/useFetch.stories.tsx +6 -5
  345. package/src/hooks/useFetch/useFetch.tsx +53 -7
  346. package/src/hooks/useStorage/useStorage.stories.tsx +2 -1
  347. package/src/hooks/useTemplates.ts +41 -0
  348. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +2 -1
  349. package/src/index.tsx +14 -1
  350. package/src/stores/currentUser/currentUser.stories.tsx +2 -1
  351. package/src/stories/storyNetwork.ts +92 -0
  352. package/src/utils/fetch.ts +311 -21
  353. package/src/utils/lspClient.ts +68 -11
  354. package/src/utils/websocket.ts +20 -9
  355. package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts +0 -73
  356. package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts.map +0 -1
  357. package/dist/components/form/engine/__fixtures__/basicFormOptions.js +0 -317
  358. package/dist/components/form/engine/__fixtures__/basicFormOptions.js.map +0 -1
  359. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts +0 -41
  360. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts.map +0 -1
  361. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js +0 -45
  362. package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js.map +0 -1
  363. package/dist/components/form/expressions/dpqlMockLsp.d.ts +0 -3
  364. package/dist/components/form/expressions/dpqlMockLsp.d.ts.map +0 -1
  365. package/dist/components/form/expressions/dpqlMockLsp.js +0 -91
  366. package/dist/components/form/expressions/dpqlMockLsp.js.map +0 -1
  367. package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts +0 -2
  368. package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts.map +0 -1
  369. package/dist/components/form/fields/template/__fixtures__/longExampleValue.js +0 -9
  370. package/dist/components/form/fields/template/__fixtures__/longExampleValue.js.map +0 -1
  371. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts +0 -55
  372. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts.map +0 -1
  373. package/dist/components/smartEditor/__fixtures__/mockLspServer.js +0 -126
  374. package/dist/components/smartEditor/__fixtures__/mockLspServer.js.map +0 -1
  375. package/dist/stories/Data/fileFieldArgSchema.json +0 -86
@@ -1,8 +1,10 @@
1
+ import { QueryClient, useQueryClient } from '@tanstack/react-query';
1
2
  import { useCallback, useMemo, useState } from 'react';
2
3
  import { useEffectOnce } from 'react-use';
3
4
  import { useContextSelector } from 'use-context-selector';
4
5
  import { FetchContext } from '../../contexts/FetchContext';
5
- import { IReqraftQueryConfig } from '../../utils/fetch';
6
+ import { ReqraftQueryClient } from '../../providers/ReqraftProvider';
7
+ import { IReqraftQueryConfig, reqraftCacheKey } from '../../utils/fetch';
6
8
 
7
9
  export interface IReqraftUseFetch<T> {
8
10
  data: T | undefined;
@@ -41,8 +43,40 @@ export function useFetch<T>({
41
43
  }
42
44
  });
43
45
 
44
- const [loading, setLoading] = useState(loadOnMount);
45
- const [data, setData] = useState<T | undefined>(defaultData);
46
+ /* An answer we ALREADY HAVE is not a loading state.
47
+ `loading` started at `loadOnMount` unconditionally, so every consumer that
48
+ mounted reported "loading" for at least one async turn even when the
49
+ response was sitting in the cache — and `FormEngine` renders its
50
+ `options-loading-skeleton` whenever any of its sources says that. So each
51
+ form appearing on a page flashed a skeleton whether or not anything was
52
+ actually fetched, which is what the repeated skeletons on an IDE page are:
53
+ measured on a fully warm SECOND visit to one page, three skeleton waves
54
+ against two requests, the last wave with no request anywhere near it.
55
+ Seeded from the query cache instead, so a resource already in hand renders
56
+ immediately. */
57
+ /* The provider is OPTIONAL here. `useQueryClient` THROWS when no
58
+ `QueryClientProvider` is above it, and plenty of consumers mount a form
59
+ with only a `FetchContext` — requiring one turned a rendering optimisation
60
+ into a hard dependency and took 131 tests down with it. `useContext` runs
61
+ before that throw, so hook order is unaffected and catching is safe. The
62
+ fallback is the same client `query` itself defaults to, so a cache hit is
63
+ found either way. */
64
+ let queryClient: QueryClient;
65
+ try {
66
+ queryClient = useQueryClient();
67
+ } catch {
68
+ queryClient = ReqraftQueryClient;
69
+ }
70
+
71
+ const cached = queryClient.getQueryData([
72
+ reqraftCacheKey({ url, method, body, noApiPrefix }),
73
+ ]) as { data?: T; ok?: boolean } | undefined;
74
+ const hasCachedAnswer = !!cached && cached.ok !== false && cached.data !== undefined;
75
+
76
+ const [loading, setLoading] = useState(!!loadOnMount && !hasCachedAnswer);
77
+ const [data, setData] = useState<T | undefined>(
78
+ hasCachedAnswer ? (cached?.data as T) : defaultData
79
+ );
46
80
  const [response, setResponse] = useState<Response | undefined>();
47
81
  const [error, setError] = useState<Error | undefined>();
48
82
  const [errorData, setErrorData] = useState<any>();
@@ -51,13 +85,23 @@ export function useFetch<T>({
51
85
  async ({
52
86
  body: customBody,
53
87
  mergeBodies,
54
- }: { body?: Record<string | number, any>; mergeBodies?: boolean } = {}) => {
55
- setLoading(true);
88
+ silent,
89
+ }: {
90
+ body?: Record<string | number, any>;
91
+ mergeBodies?: boolean;
92
+ /** Revalidate without announcing a loading state — see the note above. */
93
+ silent?: boolean;
94
+ } = {}) => {
95
+ if (!silent) {
96
+ setLoading(true);
97
+ }
56
98
 
57
99
  const _body = mergeBodies ? { ...body, ...customBody } : customBody || body;
58
100
  const response = await query<T>({ url, body: _body, cache, noApiPrefix });
59
101
 
60
- setLoading(false);
102
+ if (!silent) {
103
+ setLoading(false);
104
+ }
61
105
 
62
106
  if (response.ok) {
63
107
  setError(undefined);
@@ -75,7 +119,9 @@ export function useFetch<T>({
75
119
 
76
120
  useEffectOnce(() => {
77
121
  if (loadOnMount) {
78
- load();
122
+ // Still revalidates when the entry is cached — `query` honours its own
123
+ // staleness — but silently, so a cached answer never flashes a skeleton.
124
+ load({ silent: hasCachedAnswer });
79
125
  }
80
126
  });
81
127
 
@@ -4,6 +4,7 @@ import { useRef } from 'react';
4
4
  import { fireEvent, within } from 'storybook/test';
5
5
  import { storiesStorageMock } from '../../../__tests__/ mock';
6
6
  import { testsWaitForText } from '../../../__tests__/utils';
7
+ import { storyApiUrl } from '../../stories/storyNetwork';
7
8
  import { StoryMeta } from '../../types';
8
9
  import { useReqraftStorage } from './useStorage';
9
10
 
@@ -44,7 +45,7 @@ export const DefaultValue: Story = {
44
45
  },
45
46
  mockData: [
46
47
  {
47
- url: 'https://hq.qoretechnologies.com:8092/api/latest/users?action=current',
48
+ url: storyApiUrl('users?action=current'),
48
49
  method: 'GET',
49
50
  status: 200,
50
51
  response: {},
@@ -13,6 +13,39 @@ export interface IUseTemplates {
13
13
 
14
14
  export const TemplatesCache = new Map<string, IReqoreFormTemplates>();
15
15
 
16
+ /**
17
+ * Hand this hook a `getContextData` payload the host has already fetched.
18
+ *
19
+ * The host and this library keep SEPARATE caches over one API, so a page that
20
+ * has already paid for the context data pays again here — and, worse, waits for
21
+ * it: `FormEngine` will not render a field before its templates exist, because
22
+ * an any-typed field with no templates falls back to the type picker and asks
23
+ * the author to choose `string`/`int`/`hash` for a value they already captured.
24
+ *
25
+ * Measured on the live alert rule: three form sections were placeholders from
26
+ * 1459ms to 2039ms and, when they cleared, 193 elements that had been on screen
27
+ * for ~590ms dropped 67px, because the placeholder is not the height of the
28
+ * form it stands in for. Seeded, the form has its templates on its FIRST render
29
+ * and there is no placeholder to swap out at all.
30
+ *
31
+ * Same shape as `seedQueryCache` for the type catalogue, and deliberately
32
+ * first-write-wins: a real fetch that has already answered is not overwritten.
33
+ */
34
+ export const seedTemplatesCache = (
35
+ interfaceContext: string,
36
+ payload: ITemplatesPayload
37
+ ): void => {
38
+ if (!interfaceContext || TemplatesCache.has(interfaceContext)) {
39
+ return;
40
+ }
41
+
42
+ const templates = buildTemplates(payload);
43
+
44
+ if (templates) {
45
+ TemplatesCache.set(interfaceContext, templates);
46
+ }
47
+ };
48
+
16
49
  /**
17
50
  * Templates for form fields. Ported from qorus-ide `useTemplates` with one
18
51
  * deliberate difference: fetching `system/getContextData` is **opt-in** via
@@ -29,6 +62,14 @@ export const useTemplates = (
29
62
 
30
63
  const globalTemplates = useAsyncRetry(async () => {
31
64
  if (shouldFetch) {
65
+ /* Already answered — by a previous mount or by the host seeding it. The
66
+ cache was consulted for `loading` and for the value but not here, so a
67
+ seeded page still issued the request it had been handed the answer to. */
68
+ const cached = TemplatesCache.get(interfaceContext!);
69
+ if (cached) {
70
+ return cached;
71
+ }
72
+
32
73
  const serverTemplates = await query<ITemplatesPayload>({
33
74
  url: `system/getContextData?interface_context=${interfaceContext}`,
34
75
  method: 'PUT',
@@ -6,6 +6,7 @@ import { Server } from 'mock-socket';
6
6
  import { useEffect, useState } from 'react';
7
7
  import { useMount } from 'react-use';
8
8
  import { sleep, testsClickButton, testsWaitForText } from '../../../__tests__/utils';
9
+ import { storySocketUrl } from '../../stories/storyNetwork';
9
10
  import { StoryMeta } from '../../types';
10
11
  import { ReqraftWebSocketsManager } from '../../utils/websocket';
11
12
  import { IUseReqraftWebSocketOptions, useReqraftWebSocket } from './useWebSocket';
@@ -40,7 +41,7 @@ const CompWithHook = (args: IUseReqraftWebSocketOptions) => {
40
41
  const meta = {
41
42
  title: 'Hooks/useWebSocket',
42
43
  async beforeEach({ parameters }: { parameters: Record<string, any> }) {
43
- const url = `wss://hq.qoretechnologies.com:8092/log-test?token=${process.env.REACT_APP_QORUS_TOKEN}`;
44
+ const url = storySocketUrl('log-test');
44
45
  let server = new Server(url);
45
46
  let killTimeout: NodeJS.Timeout;
46
47
  /** Set while the server is dead: every connection that lands is closed. */
package/src/index.tsx CHANGED
@@ -36,7 +36,20 @@ export type {
36
36
  ICurrentUser,
37
37
  ICurrentUserStore,
38
38
  } from './stores/currentUser/currentUser';
39
- export { fetchConfig, query } from './utils/fetch';
39
+ export {
40
+ fetchConfig,
41
+ query,
42
+ queryRaw,
43
+ reqraftApiPath,
44
+ reqraftCacheKey,
45
+ setupFetch,
46
+ } from './utils/fetch';
47
+ export type {
48
+ IReqraftFetchConfig,
49
+ IReqraftFetchResponse,
50
+ IReqraftQueryConfig,
51
+ IReqraftRawResponse,
52
+ } from './utils/fetch';
40
53
  export * from './utils/websocket';
41
54
  export { ReqraftLspClient } from './utils/lspClient';
42
55
  export type { IReqraftLspClientOptions } from './utils/lspClient';
@@ -1,6 +1,7 @@
1
1
  import { ReqoreP, ReqoreSpinner, ReqoreTree } from '@qoretechnologies/reqore';
2
2
  import { StoryObj } from '@storybook/react-vite';
3
3
  import { testsWaitForText } from '../../../__tests__/utils';
4
+ import { storyApiUrl } from '../../stories/storyNetwork';
4
5
  import { StoryMeta } from '../../types';
5
6
  import { currentUserStore } from './currentUser';
6
7
 
@@ -9,7 +10,7 @@ const meta = {
9
10
  parameters: {
10
11
  mockData: [
11
12
  {
12
- url: 'https://hq.qoretechnologies.com:8092/api/latest/users?action=current',
13
+ url: storyApiUrl('users?action=current'),
13
14
  method: 'GET',
14
15
  status: 200,
15
16
  response: {
@@ -0,0 +1,92 @@
1
+ // Copyright 2026 Qore Technologies, s.r.o.
2
+ // Where a story's network goes: the instance its Reqraft points at, the URLs
3
+ // its mocks must intercept, and the requests every story is mocked for.
4
+ //
5
+ // `query()` and `ReqraftWebSocket` build absolute URLs from the configured
6
+ // instance, and both mock layers match on the host as well as the path —
7
+ // storybook-addon-mock keys on `host + pathname`, mock-socket on the URL minus
8
+ // its query. A mock written against a hard-coded host stops matching the moment
9
+ // the instance is overridden, and the request goes out to the real network
10
+ // instead, silently. Build mock URLs with the helpers below.
11
+ import { defaultQorusTypes } from '../hooks/useQorusTypes';
12
+ import { buildReqraftApiUrl } from '../utils/fetch';
13
+ import { buildReqraftSocketUrl } from '../utils/websocket';
14
+
15
+ /**
16
+ * What storybook-addon-mock accepts as a response. Anything else — a bare
17
+ * number or string — fails the addon's validation and the entry is kept but
18
+ * never matched, so the request goes out to the network with no warning.
19
+ */
20
+ export type TStoryMockResponse = object | ((request: unknown) => unknown);
21
+
22
+ export interface IStoryMockRequest {
23
+ url: string;
24
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
25
+ status: number;
26
+ response: TStoryMockResponse;
27
+ }
28
+
29
+ /**
30
+ * The instance every story's Reqraft is initialized with. Override it with
31
+ * `REACT_APP_QORUS_INSTANCE` (or `QORUS_INSTANCE`) to run live stories against
32
+ * your own Qorus; mocks built from it follow the override.
33
+ */
34
+ export const STORY_QORUS_INSTANCE =
35
+ process.env.REACT_APP_QORUS_INSTANCE || 'https://hq.qoretechnologies.com:8092/';
36
+
37
+ /** The URL `query()` requests for `path`. */
38
+ export const storyApiUrl = (path: string): string =>
39
+ buildReqraftApiUrl(STORY_QORUS_INSTANCE, path);
40
+
41
+ /**
42
+ * The URL `ReqraftWebSocket` dials for `path`, token omitted — mock-socket
43
+ * matches servers without the query string.
44
+ */
45
+ export const storySocketUrl = (path: string): string =>
46
+ buildReqraftSocketUrl(STORY_QORUS_INSTANCE, path);
47
+
48
+ /** A GET of `path` answered with `response`. */
49
+ const mockGet = (path: string, response: TStoryMockResponse): IStoryMockRequest[] => [
50
+ { url: storyApiUrl(path), method: 'GET', status: 200, response },
51
+ ];
52
+
53
+ /**
54
+ * The type catalogue, pinned to the built-in list. `useQorusTypes` uses a
55
+ * reachable server's list *instead of* the built-in one, so an unmocked story
56
+ * renders whichever labels that server happens to have — and every FormEngine
57
+ * shows its loading skeleton until the request settles, which against an
58
+ * unreachable instance is never.
59
+ */
60
+ const QORUS_TYPE_INFO_MOCK_DATA = mockGet('system/qorus-type-info', defaultQorusTypes);
61
+
62
+ /**
63
+ * The system expression catalogue, empty. `useExpressions` fetches it whenever
64
+ * functions are allowed — even when the story passes its own list, which is
65
+ * merged in as extras — and TemplateField shows a skeleton in place of "Use
66
+ * Expression" until it arrives. Stories that need functions provide them
67
+ * (`expressions`, or their own `mockData` for this URL).
68
+ */
69
+ const EXPRESSIONS_CATALOGUE_MOCK_DATA = mockGet('system?action=expressions&context=ui', []);
70
+
71
+ /**
72
+ * `ReqraftWebSocket`'s server probe, which every reconnect attempt awaits
73
+ * before it dials. Unanswered, no attempt is ever made — a mock socket server
74
+ * that comes back is never reconnected to, and one that stays down is never
75
+ * given up on. The probe only needs an answer; its body is not read.
76
+ */
77
+ const SERVER_STATUS_MOCK_DATA = mockGet('system/pid', {});
78
+
79
+ /**
80
+ * Requests components make on their own, whatever the story is about —
81
+ * mounting a FormEngine fetches the type catalogue; allowing functions fetches
82
+ * the expression catalogue; a reconnecting socket probes the server.
83
+ * Registered for every story as storybook-addon-mock's `globalMockData`
84
+ * (`.storybook/preview.tsx`, and mirrored for the Vitest run in
85
+ * `.storybook/vitest.setup.ts`); a story's own `mockData` entry for the same
86
+ * URL takes precedence.
87
+ */
88
+ export const GLOBAL_STORY_MOCK_DATA: IStoryMockRequest[] = [
89
+ ...QORUS_TYPE_INFO_MOCK_DATA,
90
+ ...EXPRESSIONS_CATALOGUE_MOCK_DATA,
91
+ ...SERVER_STATUS_MOCK_DATA,
92
+ ];