@qoretechnologies/reqraft 0.10.66-pr.145.gcb1e59d → 0.10.66

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 (913) hide show
  1. package/README.md +53 -1
  2. package/dist/components/Description/AllowedValuesHelp.d.ts +20 -0
  3. package/dist/components/Description/AllowedValuesHelp.d.ts.map +1 -0
  4. package/dist/components/Description/AllowedValuesHelp.js +86 -0
  5. package/dist/components/Description/AllowedValuesHelp.js.map +1 -0
  6. package/dist/components/Description/describedControl.d.ts +54 -0
  7. package/dist/components/Description/describedControl.d.ts.map +1 -0
  8. package/dist/components/Description/describedControl.js +81 -0
  9. package/dist/components/Description/describedControl.js.map +1 -0
  10. package/dist/components/Description/index.d.ts.map +1 -1
  11. package/dist/components/Description/index.js +3 -2
  12. package/dist/components/Description/index.js.map +1 -1
  13. package/dist/components/colorValue/colorValue.d.ts +59 -0
  14. package/dist/components/colorValue/colorValue.d.ts.map +1 -0
  15. package/dist/components/colorValue/colorValue.js +245 -0
  16. package/dist/components/colorValue/colorValue.js.map +1 -0
  17. package/dist/components/colorValue/index.d.ts +34 -0
  18. package/dist/components/colorValue/index.d.ts.map +1 -0
  19. package/dist/components/colorValue/index.js +136 -0
  20. package/dist/components/colorValue/index.js.map +1 -0
  21. package/dist/components/colorValue/labels.d.ts +12 -0
  22. package/dist/components/colorValue/labels.d.ts.map +1 -0
  23. package/dist/components/colorValue/labels.js +11 -0
  24. package/dist/components/colorValue/labels.js.map +1 -0
  25. package/dist/components/composer/Composer.d.ts +1 -1
  26. package/dist/components/composer/Composer.d.ts.map +1 -1
  27. package/dist/components/composer/Composer.js +2 -2
  28. package/dist/components/composer/Composer.js.map +1 -1
  29. package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
  30. package/dist/components/dpqlEditor/DpqlEditor.js +156 -10
  31. package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
  32. package/dist/components/dpqlEditor/dpqlCompletions.d.ts +39 -0
  33. package/dist/components/dpqlEditor/dpqlCompletions.d.ts.map +1 -0
  34. package/dist/components/dpqlEditor/dpqlCompletions.js +294 -0
  35. package/dist/components/dpqlEditor/dpqlCompletions.js.map +1 -0
  36. package/dist/components/dpqlEditor/dpqlHelpers.d.ts +54 -5
  37. package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
  38. package/dist/components/dpqlEditor/dpqlHelpers.js +420 -63
  39. package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
  40. package/dist/components/dpqlEditor/dpqlInserter.d.ts.map +1 -1
  41. package/dist/components/dpqlEditor/dpqlInserter.js +67 -29
  42. package/dist/components/dpqlEditor/dpqlInserter.js.map +1 -1
  43. package/dist/components/dpqlEditor/dpqlTags.d.ts +17 -7
  44. package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
  45. package/dist/components/dpqlEditor/dpqlTags.js +44 -17
  46. package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
  47. package/dist/components/dpqlEditor/types.d.ts +94 -8
  48. package/dist/components/dpqlEditor/types.d.ts.map +1 -1
  49. package/dist/components/dpqlEditor/useDpqlSession.d.ts +7 -2
  50. package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
  51. package/dist/components/dpqlEditor/useDpqlSession.js +49 -17
  52. package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
  53. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  54. package/dist/components/form/engine/CompactRow.js +336 -243
  55. package/dist/components/form/engine/CompactRow.js.map +1 -1
  56. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  57. package/dist/components/form/engine/CompactToolbar.js +20 -57
  58. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  59. package/dist/components/form/engine/FormEngine.d.ts +67 -59
  60. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  61. package/dist/components/form/engine/FormEngine.js +606 -409
  62. package/dist/components/form/engine/FormEngine.js.map +1 -1
  63. package/dist/components/form/engine/HiddenFieldsNote.d.ts +28 -0
  64. package/dist/components/form/engine/HiddenFieldsNote.d.ts.map +1 -0
  65. package/dist/components/form/engine/HiddenFieldsNote.js +32 -0
  66. package/dist/components/form/engine/HiddenFieldsNote.js.map +1 -0
  67. package/dist/components/form/engine/OptionFieldMessages.d.ts +2 -18
  68. package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
  69. package/dist/components/form/engine/OptionFieldMessages.js +28 -25
  70. package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
  71. package/dist/components/form/engine/OptionsHelpDialog.d.ts.map +1 -1
  72. package/dist/components/form/engine/OptionsHelpDialog.js +19 -2
  73. package/dist/components/form/engine/OptionsHelpDialog.js.map +1 -1
  74. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts +2 -2
  75. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
  76. package/dist/components/form/engine/_structuredData/SchemaDataView.js +11 -31
  77. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
  78. package/dist/components/form/engine/compactRowContext.d.ts +30 -6
  79. package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
  80. package/dist/components/form/engine/compactRowContext.js.map +1 -1
  81. package/dist/components/form/engine/compactRowStyles.d.ts +56 -31
  82. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  83. package/dist/components/form/engine/compactRowStyles.js +121 -110
  84. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  85. package/dist/components/form/engine/compactToolbarColors.d.ts +16 -0
  86. package/dist/components/form/engine/compactToolbarColors.d.ts.map +1 -0
  87. package/dist/components/form/engine/compactToolbarColors.js +21 -0
  88. package/dist/components/form/engine/compactToolbarColors.js.map +1 -0
  89. package/dist/components/form/engine/compactToolbarContext.d.ts +0 -3
  90. package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
  91. package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
  92. package/dist/components/form/engine/inheritProps.d.ts +29 -0
  93. package/dist/components/form/engine/inheritProps.d.ts.map +1 -0
  94. package/dist/components/form/engine/inheritProps.js +43 -0
  95. package/dist/components/form/engine/inheritProps.js.map +1 -0
  96. package/dist/components/form/engine/operatorSummary.d.ts +26 -0
  97. package/dist/components/form/engine/operatorSummary.d.ts.map +1 -0
  98. package/dist/components/form/engine/operatorSummary.js +35 -0
  99. package/dist/components/form/engine/operatorSummary.js.map +1 -0
  100. package/dist/components/form/engine/readFirst.d.ts +26 -22
  101. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  102. package/dist/components/form/engine/readFirst.js +79 -115
  103. package/dist/components/form/engine/readFirst.js.map +1 -1
  104. package/dist/components/form/engine/readFirstColors.d.ts +30 -0
  105. package/dist/components/form/engine/readFirstColors.d.ts.map +1 -0
  106. package/dist/components/form/engine/readFirstColors.js +51 -0
  107. package/dist/components/form/engine/readFirstColors.js.map +1 -0
  108. package/dist/components/form/engine/rowFocus.d.ts +3 -9
  109. package/dist/components/form/engine/rowFocus.d.ts.map +1 -1
  110. package/dist/components/form/engine/rowFocus.js +30 -19
  111. package/dist/components/form/engine/rowFocus.js.map +1 -1
  112. package/dist/components/form/engine/typeChoices.d.ts +1 -1
  113. package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -1
  114. package/dist/components/form/engine/variants/VariantCalmTable.js +2 -1
  115. package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -1
  116. package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -1
  117. package/dist/components/form/engine/variants/VariantCards.js +2 -1
  118. package/dist/components/form/engine/variants/VariantCards.js.map +1 -1
  119. package/dist/components/form/engine/variants/VariantFocus.js +1 -1
  120. package/dist/components/form/engine/variants/VariantFocus.js.map +1 -1
  121. package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -1
  122. package/dist/components/form/engine/variants/VariantMinimal.js +2 -1
  123. package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -1
  124. package/dist/components/form/engine/variants/variantParts.d.ts +1 -1
  125. package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -1
  126. package/dist/components/form/engine/variants/variantParts.js +25 -17
  127. package/dist/components/form/engine/variants/variantParts.js.map +1 -1
  128. package/dist/components/form/expressions/DpqlRendering.d.ts +1 -1
  129. package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -1
  130. package/dist/components/form/expressions/DpqlRendering.js +7 -6
  131. package/dist/components/form/expressions/DpqlRendering.js.map +1 -1
  132. package/dist/components/form/expressions/ExpressionField.d.ts +67 -3
  133. package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
  134. package/dist/components/form/expressions/ExpressionField.js +536 -114
  135. package/dist/components/form/expressions/ExpressionField.js.map +1 -1
  136. package/dist/components/form/expressions/argumentPresence.d.ts +14 -0
  137. package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -1
  138. package/dist/components/form/expressions/argumentPresence.js +16 -1
  139. package/dist/components/form/expressions/argumentPresence.js.map +1 -1
  140. package/dist/components/form/expressions/builder/argumentDetail.d.ts.map +1 -1
  141. package/dist/components/form/expressions/builder/argumentDetail.js +4 -1
  142. package/dist/components/form/expressions/builder/argumentDetail.js.map +1 -1
  143. package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
  144. package/dist/components/form/expressions/builder/argumentLabel.js +30 -11
  145. package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
  146. package/dist/components/form/expressions/builder/argumentWrapper.d.ts.map +1 -1
  147. package/dist/components/form/expressions/builder/argumentWrapper.js +3 -1
  148. package/dist/components/form/expressions/builder/argumentWrapper.js.map +1 -1
  149. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts +9 -0
  150. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts.map +1 -1
  151. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js +30 -27
  152. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js.map +1 -1
  153. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts +1 -1
  154. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts.map +1 -1
  155. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js +7 -5
  156. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js.map +1 -1
  157. package/dist/components/form/expressions/builder/index.d.ts +34 -2
  158. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  159. package/dist/components/form/expressions/builder/index.js +170 -80
  160. package/dist/components/form/expressions/builder/index.js.map +1 -1
  161. package/dist/components/form/expressions/builder/item.d.ts +6 -2
  162. package/dist/components/form/expressions/builder/item.d.ts.map +1 -1
  163. package/dist/components/form/expressions/builder/item.js +19 -5
  164. package/dist/components/form/expressions/builder/item.js.map +1 -1
  165. package/dist/components/form/expressions/builder/renderTemplate.js +1 -1
  166. package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
  167. package/dist/components/form/expressions/dpqlMockRecordPath.d.ts +11 -0
  168. package/dist/components/form/expressions/dpqlMockRecordPath.d.ts.map +1 -0
  169. package/dist/components/form/expressions/dpqlMockRecordPath.js +254 -0
  170. package/dist/components/form/expressions/dpqlMockRecordPath.js.map +1 -0
  171. package/dist/components/form/expressions/expressionOperands.d.ts +16 -0
  172. package/dist/components/form/expressions/expressionOperands.d.ts.map +1 -0
  173. package/dist/components/form/expressions/expressionOperands.js +97 -0
  174. package/dist/components/form/expressions/expressionOperands.js.map +1 -0
  175. package/dist/components/form/expressions/fieldPath.d.ts +24 -0
  176. package/dist/components/form/expressions/fieldPath.d.ts.map +1 -0
  177. package/dist/components/form/expressions/fieldPath.js +152 -0
  178. package/dist/components/form/expressions/fieldPath.js.map +1 -0
  179. package/dist/components/form/expressions/loneValue.d.ts +17 -0
  180. package/dist/components/form/expressions/loneValue.d.ts.map +1 -0
  181. package/dist/components/form/expressions/loneValue.js +33 -0
  182. package/dist/components/form/expressions/loneValue.js.map +1 -0
  183. package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
  184. package/dist/components/form/expressions/mockExpressions.js +22 -5
  185. package/dist/components/form/expressions/mockExpressions.js.map +1 -1
  186. package/dist/components/form/expressions/renderExpressionToText.d.ts +2 -0
  187. package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
  188. package/dist/components/form/expressions/renderExpressionToText.js +37 -25
  189. package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
  190. package/dist/components/form/expressions/textOfExpression.d.ts +18 -0
  191. package/dist/components/form/expressions/textOfExpression.d.ts.map +1 -0
  192. package/dist/components/form/expressions/textOfExpression.js +49 -0
  193. package/dist/components/form/expressions/textOfExpression.js.map +1 -0
  194. package/dist/components/form/expressions/types.d.ts +12 -0
  195. package/dist/components/form/expressions/types.d.ts.map +1 -1
  196. package/dist/components/form/expressions/types.js +6 -1
  197. package/dist/components/form/expressions/types.js.map +1 -1
  198. package/dist/components/form/expressions/useExpressionType.d.ts +26 -0
  199. package/dist/components/form/expressions/useExpressionType.d.ts.map +1 -0
  200. package/dist/components/form/expressions/useExpressionType.js +181 -0
  201. package/dist/components/form/expressions/useExpressionType.js.map +1 -0
  202. package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
  203. package/dist/components/form/expressions/useRenderExpression.js +13 -9
  204. package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
  205. package/dist/components/form/expressions/wildcardExpressions.d.ts +27 -0
  206. package/dist/components/form/expressions/wildcardExpressions.d.ts.map +1 -0
  207. package/dist/components/form/expressions/wildcardExpressions.js +101 -0
  208. package/dist/components/form/expressions/wildcardExpressions.js.map +1 -0
  209. package/dist/components/form/fields/Field.d.ts.map +1 -1
  210. package/dist/components/form/fields/Field.js +39 -18
  211. package/dist/components/form/fields/Field.js.map +1 -1
  212. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +0 -7
  213. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  214. package/dist/components/form/fields/allowed-values/AllowedValues.js +46 -35
  215. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  216. package/dist/components/form/fields/allowed-values/choicePicture.d.ts +37 -0
  217. package/dist/components/form/fields/allowed-values/choicePicture.d.ts.map +1 -0
  218. package/dist/components/form/fields/allowed-values/choicePicture.js +64 -0
  219. package/dist/components/form/fields/allowed-values/choicePicture.js.map +1 -0
  220. package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
  221. package/dist/components/form/fields/array/ArrayAuto.js +24 -0
  222. package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
  223. package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
  224. package/dist/components/form/fields/array/ArrayAutoField.js +36 -13
  225. package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
  226. package/dist/components/form/fields/auto/AutoFormField.d.ts +30 -1
  227. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  228. package/dist/components/form/fields/auto/AutoFormField.js +123 -79
  229. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  230. package/dist/components/form/fields/auto/hostEditorValue.d.ts +30 -0
  231. package/dist/components/form/fields/auto/hostEditorValue.d.ts.map +1 -0
  232. package/dist/components/form/fields/auto/hostEditorValue.js +53 -0
  233. package/dist/components/form/fields/auto/hostEditorValue.js.map +1 -0
  234. package/dist/components/form/fields/binary/Binary.d.ts.map +1 -1
  235. package/dist/components/form/fields/binary/Binary.js +23 -3
  236. package/dist/components/form/fields/binary/Binary.js.map +1 -1
  237. package/dist/components/form/fields/boolean/Boolean.d.ts +5 -0
  238. package/dist/components/form/fields/boolean/Boolean.d.ts.map +1 -1
  239. package/dist/components/form/fields/boolean/Boolean.js +9 -1
  240. package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
  241. package/dist/components/form/fields/color/Color.d.ts +103 -16
  242. package/dist/components/form/fields/color/Color.d.ts.map +1 -1
  243. package/dist/components/form/fields/color/Color.js +616 -16
  244. package/dist/components/form/fields/color/Color.js.map +1 -1
  245. package/dist/components/form/fields/emittedValues.d.ts +34 -3
  246. package/dist/components/form/fields/emittedValues.d.ts.map +1 -1
  247. package/dist/components/form/fields/emittedValues.js +24 -1
  248. package/dist/components/form/fields/emittedValues.js.map +1 -1
  249. package/dist/components/form/fields/file/File.d.ts +1 -1
  250. package/dist/components/form/fields/file/File.d.ts.map +1 -1
  251. package/dist/components/form/fields/file/File.js +4 -2
  252. package/dist/components/form/fields/file/File.js.map +1 -1
  253. package/dist/components/form/fields/long-string/LongString.d.ts +1 -7
  254. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  255. package/dist/components/form/fields/long-string/LongString.js +30 -13
  256. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  257. package/dist/components/form/fields/markdown/MarkdownView.js +1 -1
  258. package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
  259. package/dist/components/form/fields/multi-select/MultiSelectFormField.js +10 -7
  260. package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
  261. package/dist/components/form/fields/number/Number.d.ts +7 -4
  262. package/dist/components/form/fields/number/Number.d.ts.map +1 -1
  263. package/dist/components/form/fields/number/Number.js +45 -18
  264. package/dist/components/form/fields/number/Number.js.map +1 -1
  265. package/dist/components/form/fields/object/Object.d.ts +1 -1
  266. package/dist/components/form/fields/object/Object.d.ts.map +1 -1
  267. package/dist/components/form/fields/object/Object.js +4 -2
  268. package/dist/components/form/fields/object/Object.js.map +1 -1
  269. package/dist/components/form/fields/pendingEdit.d.ts +52 -0
  270. package/dist/components/form/fields/pendingEdit.d.ts.map +1 -0
  271. package/dist/components/form/fields/pendingEdit.js +79 -0
  272. package/dist/components/form/fields/pendingEdit.js.map +1 -0
  273. package/dist/components/form/fields/radio-group/RadioGroup.d.ts.map +1 -1
  274. package/dist/components/form/fields/radio-group/RadioGroup.js +8 -13
  275. package/dist/components/form/fields/radio-group/RadioGroup.js.map +1 -1
  276. package/dist/components/form/fields/rich-text/RichText.d.ts +20 -1
  277. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  278. package/dist/components/form/fields/rich-text/RichText.js +426 -91
  279. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  280. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts +18 -0
  281. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts.map +1 -0
  282. package/dist/components/form/fields/rich-text/useTemplateTags.js +80 -0
  283. package/dist/components/form/fields/rich-text/useTemplateTags.js.map +1 -0
  284. package/dist/components/form/fields/schema-definition/CatalogLeafForm.d.ts.map +1 -1
  285. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js +4 -1
  286. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js.map +1 -1
  287. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.d.ts.map +1 -1
  288. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js +20 -5
  289. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js.map +1 -1
  290. package/dist/components/form/fields/schema-definition/TableEditor.d.ts.map +1 -1
  291. package/dist/components/form/fields/schema-definition/TableEditor.js +10 -2
  292. package/dist/components/form/fields/schema-definition/TableEditor.js.map +1 -1
  293. package/dist/components/form/fields/schema-definition/index.d.ts.map +1 -1
  294. package/dist/components/form/fields/schema-definition/index.js +8 -4
  295. package/dist/components/form/fields/schema-definition/index.js.map +1 -1
  296. package/dist/components/form/fields/select/Select.d.ts +10 -1
  297. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  298. package/dist/components/form/fields/select/Select.js +28 -14
  299. package/dist/components/form/fields/select/Select.js.map +1 -1
  300. package/dist/components/form/fields/select/SelectCollection.d.ts +5 -0
  301. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  302. package/dist/components/form/fields/select/SelectCollection.js +25 -12
  303. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  304. package/dist/components/form/fields/select/unavailableRow.d.ts +23 -0
  305. package/dist/components/form/fields/select/unavailableRow.d.ts.map +1 -0
  306. package/dist/components/form/fields/select/unavailableRow.js +55 -0
  307. package/dist/components/form/fields/select/unavailableRow.js.map +1 -0
  308. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +11 -5
  309. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  310. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +21 -5
  311. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  312. package/dist/components/form/fields/template/TemplateBrowser.d.ts +16 -0
  313. package/dist/components/form/fields/template/TemplateBrowser.d.ts.map +1 -0
  314. package/dist/components/form/fields/template/TemplateBrowser.js +89 -0
  315. package/dist/components/form/fields/template/TemplateBrowser.js.map +1 -0
  316. package/dist/components/form/fields/template/TemplateField.d.ts +105 -1
  317. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  318. package/dist/components/form/fields/template/TemplateField.js +706 -168
  319. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  320. package/dist/components/form/fields/template/TemplatePicker.d.ts +54 -0
  321. package/dist/components/form/fields/template/TemplatePicker.d.ts.map +1 -0
  322. package/dist/components/form/fields/template/TemplatePicker.js +459 -0
  323. package/dist/components/form/fields/template/TemplatePicker.js.map +1 -0
  324. package/dist/components/form/fields/template/TemplateText.d.ts +0 -17
  325. package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -1
  326. package/dist/components/form/fields/template/TemplateText.js +22 -16
  327. package/dist/components/form/fields/template/TemplateText.js.map +1 -1
  328. package/dist/components/form/fields/template/referenceNames.d.ts +63 -0
  329. package/dist/components/form/fields/template/referenceNames.d.ts.map +1 -0
  330. package/dist/components/form/fields/template/referenceNames.js +69 -0
  331. package/dist/components/form/fields/template/referenceNames.js.map +1 -0
  332. package/dist/components/form/fields/template/writtenAsText.d.ts +61 -0
  333. package/dist/components/form/fields/template/writtenAsText.d.ts.map +1 -0
  334. package/dist/components/form/fields/template/writtenAsText.js +204 -0
  335. package/dist/components/form/fields/template/writtenAsText.js.map +1 -0
  336. package/dist/components/form/index.d.ts +12 -2
  337. package/dist/components/form/index.d.ts.map +1 -1
  338. package/dist/components/form/index.js +25 -3
  339. package/dist/components/form/index.js.map +1 -1
  340. package/dist/components/form/typeSentenceForm.d.ts +17 -0
  341. package/dist/components/form/typeSentenceForm.d.ts.map +1 -0
  342. package/dist/components/form/typeSentenceForm.js +54 -0
  343. package/dist/components/form/typeSentenceForm.js.map +1 -0
  344. package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
  345. package/dist/components/imageLightbox/ImageLightbox.js +19 -9
  346. package/dist/components/imageLightbox/ImageLightbox.js.map +1 -1
  347. package/dist/components/log/Log.d.ts.map +1 -1
  348. package/dist/components/log/Log.js +20 -8
  349. package/dist/components/log/Log.js.map +1 -1
  350. package/dist/components/menu/Menu.d.ts.map +1 -1
  351. package/dist/components/menu/Menu.js +19 -10
  352. package/dist/components/menu/Menu.js.map +1 -1
  353. package/dist/components/smartEditor/CompletionMenu.d.ts +53 -0
  354. package/dist/components/smartEditor/CompletionMenu.d.ts.map +1 -0
  355. package/dist/components/smartEditor/CompletionMenu.js +302 -0
  356. package/dist/components/smartEditor/CompletionMenu.js.map +1 -0
  357. package/dist/components/smartEditor/MarkdownDoc.d.ts +1 -1
  358. package/dist/components/smartEditor/MarkdownDoc.js +3 -3
  359. package/dist/components/smartEditor/MarkdownDoc.js.map +1 -1
  360. package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
  361. package/dist/components/smartEditor/SmartEditor.js +616 -190
  362. package/dist/components/smartEditor/SmartEditor.js.map +1 -1
  363. package/dist/components/smartEditor/completionStyle.d.ts +28 -0
  364. package/dist/components/smartEditor/completionStyle.d.ts.map +1 -0
  365. package/dist/components/smartEditor/completionStyle.js +79 -0
  366. package/dist/components/smartEditor/completionStyle.js.map +1 -0
  367. package/dist/components/smartEditor/contextTitle.d.ts +10 -0
  368. package/dist/components/smartEditor/contextTitle.d.ts.map +1 -0
  369. package/dist/components/smartEditor/contextTitle.js +21 -0
  370. package/dist/components/smartEditor/contextTitle.js.map +1 -0
  371. package/dist/components/smartEditor/editingAids.d.ts +64 -0
  372. package/dist/components/smartEditor/editingAids.d.ts.map +1 -0
  373. package/dist/components/smartEditor/editingAids.js +213 -0
  374. package/dist/components/smartEditor/editingAids.js.map +1 -0
  375. package/dist/components/smartEditor/index.d.ts +6 -1
  376. package/dist/components/smartEditor/index.d.ts.map +1 -1
  377. package/dist/components/smartEditor/index.js +19 -1
  378. package/dist/components/smartEditor/index.js.map +1 -1
  379. package/dist/components/smartEditor/templateCompletions.d.ts +98 -0
  380. package/dist/components/smartEditor/templateCompletions.d.ts.map +1 -0
  381. package/dist/components/smartEditor/templateCompletions.js +380 -0
  382. package/dist/components/smartEditor/templateCompletions.js.map +1 -0
  383. package/dist/components/smartEditor/typedReferences.d.ts +34 -0
  384. package/dist/components/smartEditor/typedReferences.d.ts.map +1 -0
  385. package/dist/components/smartEditor/typedReferences.js +179 -0
  386. package/dist/components/smartEditor/typedReferences.js.map +1 -0
  387. package/dist/components/smartEditor/types.d.ts +116 -2
  388. package/dist/components/smartEditor/types.d.ts.map +1 -1
  389. package/dist/components/smartEditor/useEditingAids.d.ts +38 -0
  390. package/dist/components/smartEditor/useEditingAids.d.ts.map +1 -0
  391. package/dist/components/smartEditor/useEditingAids.js +392 -0
  392. package/dist/components/smartEditor/useEditingAids.js.map +1 -0
  393. package/dist/components/smartEditor/useLspAutocomplete.d.ts +106 -3
  394. package/dist/components/smartEditor/useLspAutocomplete.d.ts.map +1 -1
  395. package/dist/components/smartEditor/useLspAutocomplete.js +592 -149
  396. package/dist/components/smartEditor/useLspAutocomplete.js.map +1 -1
  397. package/dist/components/smartEditor/useLspHover.d.ts +33 -7
  398. package/dist/components/smartEditor/useLspHover.d.ts.map +1 -1
  399. package/dist/components/smartEditor/useLspHover.js +364 -35
  400. package/dist/components/smartEditor/useLspHover.js.map +1 -1
  401. package/dist/components/smartEditor/useLspSemanticTokens.js +1 -1
  402. package/dist/components/smartEditor/useLspSemanticTokens.js.map +1 -1
  403. package/dist/components/smartEditor/useLspSession.d.ts +6 -0
  404. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  405. package/dist/components/smartEditor/useLspSession.js +7 -6
  406. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  407. package/dist/components/smartEditor/useLspSignatureHelp.d.ts.map +1 -1
  408. package/dist/components/smartEditor/useLspSignatureHelp.js +6 -11
  409. package/dist/components/smartEditor/useLspSignatureHelp.js.map +1 -1
  410. package/dist/components/smartEditor/useTabCameIn.d.ts +10 -0
  411. package/dist/components/smartEditor/useTabCameIn.d.ts.map +1 -0
  412. package/dist/components/smartEditor/useTabCameIn.js +42 -0
  413. package/dist/components/smartEditor/useTabCameIn.js.map +1 -0
  414. package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -1
  415. package/dist/components/supportTicket/AttachmentChips.js +15 -5
  416. package/dist/components/supportTicket/AttachmentChips.js.map +1 -1
  417. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +2 -3
  418. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -1
  419. package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -1
  420. package/dist/components/supportTicket/ReferencePicker.d.ts +9 -3
  421. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
  422. package/dist/components/supportTicket/ReferencePicker.js +38 -23
  423. package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
  424. package/dist/components/supportTicket/TicketHeader.d.ts +3 -4
  425. package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -1
  426. package/dist/components/supportTicket/TicketHeader.js +21 -6
  427. package/dist/components/supportTicket/TicketHeader.js.map +1 -1
  428. package/dist/components/supportTicket/TicketMetaTags.d.ts +1 -1
  429. package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -1
  430. package/dist/components/supportTicket/TicketReplyBox.js +10 -29
  431. package/dist/components/supportTicket/TicketReplyBox.js.map +1 -1
  432. package/dist/components/supportTicket/useLoadedImages.d.ts +0 -10
  433. package/dist/components/supportTicket/useLoadedImages.d.ts.map +1 -1
  434. package/dist/components/supportTicket/useLoadedImages.js +1 -63
  435. package/dist/components/supportTicket/useLoadedImages.js.map +1 -1
  436. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
  437. package/dist/components/ticketReferences/TicketReferences.js +10 -9
  438. package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
  439. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
  440. package/dist/components/ticketThread/TicketThread.js +52 -21
  441. package/dist/components/ticketThread/TicketThread.js.map +1 -1
  442. package/dist/helpers/allowedValues.d.ts +21 -12
  443. package/dist/helpers/allowedValues.d.ts.map +1 -1
  444. package/dist/helpers/allowedValues.js +40 -20
  445. package/dist/helpers/allowedValues.js.map +1 -1
  446. package/dist/helpers/descriptionTooltip.d.ts +46 -0
  447. package/dist/helpers/descriptionTooltip.d.ts.map +1 -0
  448. package/dist/helpers/descriptionTooltip.js +76 -0
  449. package/dist/helpers/descriptionTooltip.js.map +1 -0
  450. package/dist/helpers/domProps.d.ts +5 -0
  451. package/dist/helpers/domProps.d.ts.map +1 -0
  452. package/dist/helpers/domProps.js +47 -0
  453. package/dist/helpers/domProps.js.map +1 -0
  454. package/dist/helpers/expressions.d.ts +115 -4
  455. package/dist/helpers/expressions.d.ts.map +1 -1
  456. package/dist/helpers/expressions.js +247 -29
  457. package/dist/helpers/expressions.js.map +1 -1
  458. package/dist/helpers/hoveringPointer.d.ts +26 -0
  459. package/dist/helpers/hoveringPointer.d.ts.map +1 -0
  460. package/dist/helpers/hoveringPointer.js +29 -0
  461. package/dist/helpers/hoveringPointer.js.map +1 -0
  462. package/dist/helpers/markdownText.d.ts +14 -0
  463. package/dist/helpers/markdownText.d.ts.map +1 -0
  464. package/dist/helpers/markdownText.js +160 -0
  465. package/dist/helpers/markdownText.js.map +1 -0
  466. package/dist/helpers/noDescription.d.ts +9 -0
  467. package/dist/helpers/noDescription.d.ts.map +1 -0
  468. package/dist/helpers/noDescription.js +13 -0
  469. package/dist/helpers/noDescription.js.map +1 -0
  470. package/dist/helpers/optionUiTypes.d.ts +2 -2
  471. package/dist/helpers/qorusTypeCatalogue.d.ts +147 -0
  472. package/dist/helpers/qorusTypeCatalogue.d.ts.map +1 -0
  473. package/dist/helpers/qorusTypeCatalogue.js +505 -0
  474. package/dist/helpers/qorusTypeCatalogue.js.map +1 -0
  475. package/dist/helpers/readableColors.d.ts +36 -0
  476. package/dist/helpers/readableColors.d.ts.map +1 -0
  477. package/dist/helpers/readableColors.js +116 -0
  478. package/dist/helpers/readableColors.js.map +1 -0
  479. package/dist/helpers/recordFieldReference.d.ts +15 -0
  480. package/dist/helpers/recordFieldReference.d.ts.map +1 -0
  481. package/dist/helpers/recordFieldReference.js +89 -0
  482. package/dist/helpers/recordFieldReference.js.map +1 -0
  483. package/dist/helpers/singleLineString.d.ts.map +1 -1
  484. package/dist/helpers/singleLineString.js +0 -1
  485. package/dist/helpers/singleLineString.js.map +1 -1
  486. package/dist/helpers/templateCatalogue.d.ts +104 -0
  487. package/dist/helpers/templateCatalogue.d.ts.map +1 -0
  488. package/dist/helpers/templateCatalogue.js +116 -0
  489. package/dist/helpers/templateCatalogue.js.map +1 -0
  490. package/dist/helpers/templateCatalogueContext.d.ts +19 -0
  491. package/dist/helpers/templateCatalogueContext.d.ts.map +1 -0
  492. package/dist/helpers/templateCatalogueContext.js +31 -0
  493. package/dist/helpers/templateCatalogueContext.js.map +1 -0
  494. package/dist/helpers/templateItems.d.ts +2 -2
  495. package/dist/helpers/templateItems.d.ts.map +1 -1
  496. package/dist/helpers/templateItems.js +6 -4
  497. package/dist/helpers/templateItems.js.map +1 -1
  498. package/dist/helpers/templateText.d.ts +1 -0
  499. package/dist/helpers/templateText.d.ts.map +1 -1
  500. package/dist/helpers/templateText.js +7 -3
  501. package/dist/helpers/templateText.js.map +1 -1
  502. package/dist/helpers/templateTree.d.ts +248 -0
  503. package/dist/helpers/templateTree.d.ts.map +1 -0
  504. package/dist/helpers/templateTree.js +892 -0
  505. package/dist/helpers/templateTree.js.map +1 -0
  506. package/dist/helpers/templateType.d.ts +28 -0
  507. package/dist/helpers/templateType.d.ts.map +1 -0
  508. package/dist/helpers/templateType.js +30 -0
  509. package/dist/helpers/templateType.js.map +1 -0
  510. package/dist/helpers/templates.d.ts +86 -16
  511. package/dist/helpers/templates.d.ts.map +1 -1
  512. package/dist/helpers/templates.js +305 -45
  513. package/dist/helpers/templates.js.map +1 -1
  514. package/dist/helpers/validations.d.ts +27 -0
  515. package/dist/helpers/validations.d.ts.map +1 -1
  516. package/dist/helpers/validations.js +169 -39
  517. package/dist/helpers/validations.js.map +1 -1
  518. package/dist/helpers/webLink.d.ts +8 -0
  519. package/dist/helpers/webLink.d.ts.map +1 -0
  520. package/dist/helpers/webLink.js +29 -0
  521. package/dist/helpers/webLink.js.map +1 -0
  522. package/dist/hooks/useQorusTypes.d.ts +12 -17
  523. package/dist/hooks/useQorusTypes.d.ts.map +1 -1
  524. package/dist/hooks/useQorusTypes.js +44 -172
  525. package/dist/hooks/useQorusTypes.js.map +1 -1
  526. package/dist/hooks/useReadableIntentShade.d.ts +9 -0
  527. package/dist/hooks/useReadableIntentShade.d.ts.map +1 -0
  528. package/dist/hooks/useReadableIntentShade.js +23 -0
  529. package/dist/hooks/useReadableIntentShade.js.map +1 -0
  530. package/dist/hooks/useReadableOpacity.d.ts +6 -0
  531. package/dist/hooks/useReadableOpacity.d.ts.map +1 -0
  532. package/dist/hooks/useReadableOpacity.js +17 -0
  533. package/dist/hooks/useReadableOpacity.js.map +1 -0
  534. package/dist/index.d.ts +8 -0
  535. package/dist/index.d.ts.map +1 -1
  536. package/dist/index.js +24 -1
  537. package/dist/index.js.map +1 -1
  538. package/dist/tracking/ui/ExperimentCard.d.ts +1 -1
  539. package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -1
  540. package/dist/tracking/ui/ExperimentCard.js +26 -10
  541. package/dist/tracking/ui/ExperimentCard.js.map +1 -1
  542. package/dist/tracking/ui/card.d.ts +2 -2
  543. package/dist/tracking/ui/card.d.ts.map +1 -1
  544. package/dist/tracking/ui/card.js +2 -2
  545. package/dist/tracking/ui/card.js.map +1 -1
  546. package/dist/tracking/ui/readable.d.ts +14 -0
  547. package/dist/tracking/ui/readable.d.ts.map +1 -0
  548. package/dist/tracking/ui/readable.js +60 -0
  549. package/dist/tracking/ui/readable.js.map +1 -0
  550. package/dist/utils/fetch.d.ts +9 -2
  551. package/dist/utils/fetch.d.ts.map +1 -1
  552. package/dist/utils/fetch.js +6 -5
  553. package/dist/utils/fetch.js.map +1 -1
  554. package/dist/utils/lspClient.types.d.ts +2 -0
  555. package/dist/utils/lspClient.types.d.ts.map +1 -1
  556. package/dist/utils/websocket.d.ts +65 -2
  557. package/dist/utils/websocket.d.ts.map +1 -1
  558. package/dist/utils/websocket.js +276 -44
  559. package/dist/utils/websocket.js.map +1 -1
  560. package/package.json +14 -6
  561. package/.claude/CLAUDE.md +0 -317
  562. package/.tasks/EXPORT_EXPRESSION_BUILDER.md +0 -38
  563. package/.tasks/EXPRESSION_BUILDER_REPORT.md +0 -149
  564. package/.tasks/EXPRESSION_FIELD_SEAMS.md +0 -66
  565. package/.tasks/FIELD_STACK_REPORT.md +0 -234
  566. package/.tasks/FORM_ENGINE_COMPACT_READ_FIRST.md +0 -558
  567. package/.tasks/FORM_ENGINE_EXPRESSIONS.md +0 -197
  568. package/.tasks/FORM_ENGINE_OPTIONS_SYNC.md +0 -95
  569. package/.tasks/FORM_FIELD_EXTRAS.md +0 -72
  570. package/.tasks/INDEX.md +0 -111
  571. package/.tasks/LSP_SHARED_CONNECTION.md +0 -75
  572. package/.tasks/QONSOLE_ASSIST_FEATURES.md +0 -306
  573. package/.tasks/RENDER_EXPRESSION_LSP.md +0 -159
  574. package/.tasks/REQRAFT_AUTO_FIELD.md +0 -176
  575. package/.tasks/SCHEMA_DEFINITION_FIELD.md +0 -250
  576. package/.tasks/SMART_EDITOR_CONTEXT_AND_POLISH.md +0 -340
  577. package/.tasks/SMART_EDITOR_LSP_FEATURES.md +0 -299
  578. package/.tasks/SMART_EDITOR_REVIEW_FOLLOWUPS.md +0 -280
  579. package/.tasks/SMART_EDITOR_UX_POLISH.md +0 -383
  580. package/.tasks/SMART_EDITOR_VISUAL_POLISH.md +0 -246
  581. package/.tasks/STORY_NETWORK_ISOLATION.md +0 -98
  582. package/.tasks/TEMPLATE_TOKEN_GRAMMAR.md +0 -72
  583. package/CODE_OF_CONDUCT.md +0 -105
  584. package/CONTRIBUTING.MD +0 -78
  585. package/SECURITY.md +0 -3
  586. package/chromatic.config.json +0 -5
  587. package/design/COMPACT_ENGINE_REDESIGN.md +0 -156
  588. package/design/COMPACT_INFO_DISPLAY.md +0 -87
  589. package/design/COMPACT_PARITY.md +0 -85
  590. package/design/EXPRESSION_BUILDER_REPORT_STRATEGY.md +0 -92
  591. package/design/FORM_ENGINE_COMPACT.md +0 -300
  592. package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +0 -353
  593. package/design/FORM_ENGINE_EXPRESSIONS.md +0 -257
  594. package/design/FORM_ENGINE_FIELD_MIGRATION.md +0 -419
  595. package/design/IDE_INTEGRATION.md +0 -64
  596. package/design/RENDER_EXPRESSION_TRANSPORT.md +0 -156
  597. package/design/SELECT_DIALOG_FLOOR.md +0 -86
  598. package/design/SMART_EDITOR_UX.md +0 -438
  599. package/design/TRACKING.md +0 -290
  600. package/design/UNAVAILABLE_ALLOWED_VALUES.md +0 -226
  601. package/dist/components/form/engine/formAppearance.d.ts +0 -49
  602. package/dist/components/form/engine/formAppearance.d.ts.map +0 -1
  603. package/dist/components/form/engine/formAppearance.js +0 -50
  604. package/dist/components/form/engine/formAppearance.js.map +0 -1
  605. package/dist/components/form/fields/ChoiceGroupHeading.d.ts +0 -21
  606. package/dist/components/form/fields/ChoiceGroupHeading.d.ts.map +0 -1
  607. package/dist/components/form/fields/ChoiceGroupHeading.js +0 -33
  608. package/dist/components/form/fields/ChoiceGroupHeading.js.map +0 -1
  609. package/dist/components/form/fields/allowed-values/savedValues.d.ts +0 -30
  610. package/dist/components/form/fields/allowed-values/savedValues.d.ts.map +0 -1
  611. package/dist/components/form/fields/allowed-values/savedValues.js +0 -39
  612. package/dist/components/form/fields/allowed-values/savedValues.js.map +0 -1
  613. package/dist/helpers/fieldDescription.d.ts +0 -16
  614. package/dist/helpers/fieldDescription.d.ts.map +0 -1
  615. package/dist/helpers/fieldDescription.js +0 -40
  616. package/dist/helpers/fieldDescription.js.map +0 -1
  617. package/src/components/Description/index.tsx +0 -254
  618. package/src/components/Description/markdownRendererContext.tsx +0 -29
  619. package/src/components/FocusedEditing/index.tsx +0 -50
  620. package/src/components/codeSize/index.tsx +0 -79
  621. package/src/components/composer/Composer.stories.tsx +0 -238
  622. package/src/components/composer/Composer.tsx +0 -554
  623. package/src/components/composer/helpers.ts +0 -74
  624. package/src/components/composer/index.ts +0 -2
  625. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +0 -1183
  626. package/src/components/dpqlEditor/DpqlEditor.tsx +0 -219
  627. package/src/components/dpqlEditor/dpqlHelpers.ts +0 -287
  628. package/src/components/dpqlEditor/dpqlInserter.ts +0 -121
  629. package/src/components/dpqlEditor/dpqlProbe.ts +0 -165
  630. package/src/components/dpqlEditor/dpqlTags.ts +0 -114
  631. package/src/components/dpqlEditor/index.ts +0 -41
  632. package/src/components/dpqlEditor/types.ts +0 -203
  633. package/src/components/dpqlEditor/useDpqlProbe.ts +0 -33
  634. package/src/components/dpqlEditor/useDpqlSession.ts +0 -411
  635. package/src/components/form/engine/CompactRow.tsx +0 -2740
  636. package/src/components/form/engine/CompactToolbar.tsx +0 -399
  637. package/src/components/form/engine/FormEngine.stories.tsx +0 -9934
  638. package/src/components/form/engine/FormEngine.tsx +0 -4891
  639. package/src/components/form/engine/FormEngineAppearance.stories.tsx +0 -609
  640. package/src/components/form/engine/FormEngineRemote.stories.tsx +0 -679
  641. package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +0 -335
  642. package/src/components/form/engine/FormFieldsSkeleton.tsx +0 -82
  643. package/src/components/form/engine/OptionFieldMessages.tsx +0 -548
  644. package/src/components/form/engine/OptionsHelpDialog.tsx +0 -29
  645. package/src/components/form/engine/__fixtures__/basicFormOptions.ts +0 -309
  646. package/src/components/form/engine/__fixtures__/fieldChromeOptions.ts +0 -45
  647. package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +0 -233
  648. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +0 -755
  649. package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +0 -85
  650. package/src/components/form/engine/_structuredData/StructuredDataView.tsx +0 -75
  651. package/src/components/form/engine/_structuredData/structuredData.ts +0 -145
  652. package/src/components/form/engine/compactRowContext.ts +0 -153
  653. package/src/components/form/engine/compactRowStyles.ts +0 -1087
  654. package/src/components/form/engine/compactToolbarContext.ts +0 -72
  655. package/src/components/form/engine/formAppearance.ts +0 -79
  656. package/src/components/form/engine/optionActions.ts +0 -128
  657. package/src/components/form/engine/optionsContext.ts +0 -24
  658. package/src/components/form/engine/readFirst.ts +0 -1090
  659. package/src/components/form/engine/rendererTypes.ts +0 -107
  660. package/src/components/form/engine/revealRow.ts +0 -123
  661. package/src/components/form/engine/rowFocus.ts +0 -112
  662. package/src/components/form/engine/rowMenuContext.ts +0 -159
  663. package/src/components/form/engine/rowOpenPicker.ts +0 -27
  664. package/src/components/form/engine/typeChoices.ts +0 -63
  665. package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +0 -159
  666. package/src/components/form/engine/variants/VariantCalmTable.tsx +0 -244
  667. package/src/components/form/engine/variants/VariantCards.tsx +0 -212
  668. package/src/components/form/engine/variants/VariantFocus.tsx +0 -382
  669. package/src/components/form/engine/variants/VariantMinimal.tsx +0 -170
  670. package/src/components/form/engine/variants/focusDemo.ts +0 -145
  671. package/src/components/form/engine/variants/variantModel.ts +0 -223
  672. package/src/components/form/engine/variants/variantParts.tsx +0 -313
  673. package/src/components/form/expressions/DpqlRendering.tsx +0 -85
  674. package/src/components/form/expressions/ExpressionField.stories.tsx +0 -1395
  675. package/src/components/form/expressions/ExpressionField.tsx +0 -503
  676. package/src/components/form/expressions/argumentPresence.ts +0 -213
  677. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +0 -1683
  678. package/src/components/form/expressions/builder/argumentDetail.tsx +0 -17
  679. package/src/components/form/expressions/builder/argumentLabel.tsx +0 -146
  680. package/src/components/form/expressions/builder/argumentSlot.tsx +0 -101
  681. package/src/components/form/expressions/builder/argumentWrapper.tsx +0 -243
  682. package/src/components/form/expressions/builder/confirmMismatchedTypesModal.tsx +0 -120
  683. package/src/components/form/expressions/builder/confirmUnsupportedTypeModal.tsx +0 -69
  684. package/src/components/form/expressions/builder/index.tsx +0 -1545
  685. package/src/components/form/expressions/builder/item.tsx +0 -89
  686. package/src/components/form/expressions/builder/moveToPositionStrip.tsx +0 -156
  687. package/src/components/form/expressions/builder/renderTemplate.tsx +0 -42
  688. package/src/components/form/expressions/dpqlMockLanguage.ts +0 -566
  689. package/src/components/form/expressions/dpqlMockLsp.ts +0 -126
  690. package/src/components/form/expressions/mockExpressions.ts +0 -317
  691. package/src/components/form/expressions/renderExpressionToText.ts +0 -152
  692. package/src/components/form/expressions/types.ts +0 -110
  693. package/src/components/form/expressions/useExpressions.ts +0 -101
  694. package/src/components/form/expressions/useRenderExpression.ts +0 -165
  695. package/src/components/form/fields/ChoiceGroupHeading.tsx +0 -38
  696. package/src/components/form/fields/Field.stories.tsx +0 -143
  697. package/src/components/form/fields/Field.tsx +0 -734
  698. package/src/components/form/fields/allowed-values/AllowedValues.tsx +0 -321
  699. package/src/components/form/fields/allowed-values/savedValues.ts +0 -64
  700. package/src/components/form/fields/array/ArrayAuto.tsx +0 -237
  701. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +0 -475
  702. package/src/components/form/fields/array/ArrayAutoField.tsx +0 -367
  703. package/src/components/form/fields/auto/AutoFormField.stories.tsx +0 -825
  704. package/src/components/form/fields/auto/AutoFormField.tsx +0 -1183
  705. package/src/components/form/fields/binary/Binary.stories.tsx +0 -122
  706. package/src/components/form/fields/binary/Binary.tsx +0 -91
  707. package/src/components/form/fields/boolean/Boolean.stories.tsx +0 -125
  708. package/src/components/form/fields/boolean/Boolean.tsx +0 -34
  709. package/src/components/form/fields/byte-size/ByteSize.stories.tsx +0 -87
  710. package/src/components/form/fields/byte-size/ByteSize.tsx +0 -58
  711. package/src/components/form/fields/color/Color.stories.tsx +0 -99
  712. package/src/components/form/fields/color/Color.tsx +0 -46
  713. package/src/components/form/fields/cron/Cron.stories.tsx +0 -68
  714. package/src/components/form/fields/cron/Cron.tsx +0 -80
  715. package/src/components/form/fields/date/Date.stories.tsx +0 -77
  716. package/src/components/form/fields/date/Date.tsx +0 -55
  717. package/src/components/form/fields/emittedValues.ts +0 -70
  718. package/src/components/form/fields/file/File.stories.tsx +0 -161
  719. package/src/components/form/fields/file/File.tsx +0 -227
  720. package/src/components/form/fields/long-string/LongString.stories.tsx +0 -147
  721. package/src/components/form/fields/long-string/LongString.tsx +0 -141
  722. package/src/components/form/fields/markdown/Markdown.stories.tsx +0 -76
  723. package/src/components/form/fields/markdown/Markdown.tsx +0 -81
  724. package/src/components/form/fields/markdown/MarkdownView.tsx +0 -222
  725. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +0 -140
  726. package/src/components/form/fields/number/Number.stories.tsx +0 -159
  727. package/src/components/form/fields/number/Number.tsx +0 -175
  728. package/src/components/form/fields/object/Object.stories.tsx +0 -398
  729. package/src/components/form/fields/object/Object.tsx +0 -255
  730. package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +0 -95
  731. package/src/components/form/fields/radio-group/RadioGroup.tsx +0 -52
  732. package/src/components/form/fields/radio-group/images/java-96x128.png +0 -0
  733. package/src/components/form/fields/radio-group/images/python-129x128.png +0 -0
  734. package/src/components/form/fields/radio-group/images/qore-106x128.png +0 -0
  735. package/src/components/form/fields/rich-text/RichText.stories.tsx +0 -260
  736. package/src/components/form/fields/rich-text/RichText.tsx +0 -537
  737. package/src/components/form/fields/schema-definition/CatalogLeafForm.tsx +0 -242
  738. package/src/components/form/fields/schema-definition/CatalogNodeEditor.tsx +0 -758
  739. package/src/components/form/fields/schema-definition/Hint.tsx +0 -22
  740. package/src/components/form/fields/schema-definition/InlineValidationBanner.tsx +0 -138
  741. package/src/components/form/fields/schema-definition/Loader.tsx +0 -20
  742. package/src/components/form/fields/schema-definition/MigrationsTab.tsx +0 -187
  743. package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +0 -286
  744. package/src/components/form/fields/schema-definition/TableEditor.tsx +0 -155
  745. package/src/components/form/fields/schema-definition/TablesTab.tsx +0 -138
  746. package/src/components/form/fields/schema-definition/catalog.ts +0 -237
  747. package/src/components/form/fields/schema-definition/helpers.ts +0 -90
  748. package/src/components/form/fields/schema-definition/index.tsx +0 -418
  749. package/src/components/form/fields/schema-definition/mockCatalog.ts +0 -325
  750. package/src/components/form/fields/schema-definition/mockDefinition.ts +0 -111
  751. package/src/components/form/fields/schema-definition/referenceSuggestions.tsx +0 -152
  752. package/src/components/form/fields/schema-definition/starterTemplate.ts +0 -68
  753. package/src/components/form/fields/schema-definition/types.ts +0 -185
  754. package/src/components/form/fields/schema-definition/useSchemaOptionCatalog.ts +0 -49
  755. package/src/components/form/fields/select/Select.stories.tsx +0 -872
  756. package/src/components/form/fields/select/Select.tsx +0 -624
  757. package/src/components/form/fields/select/SelectCollection.tsx +0 -594
  758. package/src/components/form/fields/string/String.stories.tsx +0 -86
  759. package/src/components/form/fields/string/String.tsx +0 -43
  760. package/src/components/form/fields/template/ExampleValueModal.stories.tsx +0 -114
  761. package/src/components/form/fields/template/ExampleValueModal.tsx +0 -99
  762. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +0 -47
  763. package/src/components/form/fields/template/TemplateField.stories.tsx +0 -1121
  764. package/src/components/form/fields/template/TemplateField.tsx +0 -1749
  765. package/src/components/form/fields/template/TemplateText.tsx +0 -115
  766. package/src/components/form/fields/template/__fixtures__/longExampleValue.ts +0 -7
  767. package/src/components/form/fields/template/__fixtures__/multiLevelTemplates.json +0 -147
  768. package/src/components/form/fields/template/__fixtures__/templates.json +0 -83
  769. package/src/components/form/fields/timeout/Timeout.stories.tsx +0 -228
  770. package/src/components/form/fields/timeout/Timeout.tsx +0 -87
  771. package/src/components/form/fields/url/Url.stories.tsx +0 -94
  772. package/src/components/form/fields/url/Url.tsx +0 -85
  773. package/src/components/form/index.tsx +0 -49
  774. package/src/components/imageLightbox/ImageLightbox.stories.tsx +0 -238
  775. package/src/components/imageLightbox/ImageLightbox.tsx +0 -238
  776. package/src/components/imageLightbox/index.ts +0 -1
  777. package/src/components/log/Log.stories.tsx +0 -333
  778. package/src/components/log/Log.tsx +0 -285
  779. package/src/components/menu/Menu.stories.tsx +0 -155
  780. package/src/components/menu/Menu.tsx +0 -312
  781. package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +0 -797
  782. package/src/components/qonsoleSmartInput/QonsoleSmartInput.tsx +0 -105
  783. package/src/components/qonsoleSmartInput/index.ts +0 -16
  784. package/src/components/qonsoleSmartInput/qonsoleInserter.ts +0 -77
  785. package/src/components/qonsoleSmartInput/types.ts +0 -133
  786. package/src/components/qonsoleSmartInput/useQonsoleSession.ts +0 -124
  787. package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +0 -62
  788. package/src/components/searchFilterBar/SearchFilterBar.tsx +0 -144
  789. package/src/components/searchFilterBar/index.ts +0 -1
  790. package/src/components/smartEditor/MarkdownDoc.tsx +0 -190
  791. package/src/components/smartEditor/SmartEditor.stories.tsx +0 -475
  792. package/src/components/smartEditor/SmartEditor.tsx +0 -808
  793. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +0 -205
  794. package/src/components/smartEditor/helpers.ts +0 -217
  795. package/src/components/smartEditor/index.ts +0 -35
  796. package/src/components/smartEditor/styling.ts +0 -45
  797. package/src/components/smartEditor/types.ts +0 -211
  798. package/src/components/smartEditor/useLspAutocomplete.ts +0 -758
  799. package/src/components/smartEditor/useLspDiagnosticDecorations.ts +0 -125
  800. package/src/components/smartEditor/useLspHover.ts +0 -230
  801. package/src/components/smartEditor/useLspSemanticTokens.ts +0 -298
  802. package/src/components/smartEditor/useLspSession.ts +0 -231
  803. package/src/components/smartEditor/useLspSignatureHelp.ts +0 -198
  804. package/src/components/supportTicket/AttachmentChips.stories.tsx +0 -171
  805. package/src/components/supportTicket/AttachmentChips.tsx +0 -147
  806. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +0 -257
  807. package/src/components/supportTicket/InterfaceReferenceTags.tsx +0 -130
  808. package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -580
  809. package/src/components/supportTicket/ReferencePicker.tsx +0 -573
  810. package/src/components/supportTicket/TicketConversation.stories.tsx +0 -120
  811. package/src/components/supportTicket/TicketHeader.stories.tsx +0 -183
  812. package/src/components/supportTicket/TicketHeader.tsx +0 -248
  813. package/src/components/supportTicket/TicketMetaTags.stories.tsx +0 -103
  814. package/src/components/supportTicket/TicketMetaTags.tsx +0 -85
  815. package/src/components/supportTicket/TicketReplyBox.stories.tsx +0 -357
  816. package/src/components/supportTicket/TicketReplyBox.tsx +0 -172
  817. package/src/components/supportTicket/__fixtures__/kindMarks.ts +0 -28
  818. package/src/components/supportTicket/attachmentAccess.ts +0 -97
  819. package/src/components/supportTicket/fileToAttachment.ts +0 -24
  820. package/src/components/supportTicket/index.ts +0 -10
  821. package/src/components/supportTicket/meta.ts +0 -206
  822. package/src/components/supportTicket/ticketModel.ts +0 -131
  823. package/src/components/supportTicket/useLoadedImages.ts +0 -93
  824. package/src/components/ticketReferences/TicketReferences.stories.tsx +0 -341
  825. package/src/components/ticketReferences/TicketReferences.tsx +0 -914
  826. package/src/components/ticketReferences/index.ts +0 -2
  827. package/src/components/ticketThread/TicketThread.stories.tsx +0 -898
  828. package/src/components/ticketThread/TicketThread.tsx +0 -706
  829. package/src/components/ticketThread/index.ts +0 -6
  830. package/src/contexts/FetchContext.tsx +0 -25
  831. package/src/contexts/ReqraftContext.tsx +0 -9
  832. package/src/contexts/StorageContext.tsx +0 -33
  833. package/src/global.d.ts +0 -4
  834. package/src/helpers/allowedValues.ts +0 -268
  835. package/src/helpers/choiceChip.ts +0 -227
  836. package/src/helpers/common.ts +0 -326
  837. package/src/helpers/dpqlDetection.ts +0 -209
  838. package/src/helpers/expressions.ts +0 -140
  839. package/src/helpers/fieldDescription.ts +0 -39
  840. package/src/helpers/optionUiTypes.ts +0 -199
  841. package/src/helpers/options.ts +0 -150
  842. package/src/helpers/providerValue.ts +0 -125
  843. package/src/helpers/scrollbar.ts +0 -32
  844. package/src/helpers/singleLineString.ts +0 -62
  845. package/src/helpers/templateItems.ts +0 -81
  846. package/src/helpers/templateText.ts +0 -350
  847. package/src/helpers/templates.ts +0 -602
  848. package/src/helpers/validations.ts +0 -2085
  849. package/src/hooks/useArgSchema.ts +0 -37
  850. package/src/hooks/useCoarsePointer.ts +0 -30
  851. package/src/hooks/useFetch/useFetch.stories.tsx +0 -379
  852. package/src/hooks/useFetch/useFetch.tsx +0 -154
  853. package/src/hooks/usePhoneViewport.ts +0 -34
  854. package/src/hooks/useQorusTypes.ts +0 -233
  855. package/src/hooks/useReqraftProperty.ts +0 -16
  856. package/src/hooks/useStorage/useStorage.stories.tsx +0 -168
  857. package/src/hooks/useStorage/useStorage.ts +0 -35
  858. package/src/hooks/useTemplates.ts +0 -123
  859. package/src/hooks/useValidation.ts +0 -9
  860. package/src/hooks/useWebSocket/useWebSocket.ts +0 -224
  861. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +0 -640
  862. package/src/hooks/useWhyDidYouUpdate.ts +0 -38
  863. package/src/index.tsx +0 -86
  864. package/src/providers/FetchProvider.tsx +0 -40
  865. package/src/providers/ReqraftProvider.tsx +0 -52
  866. package/src/providers/StorageProvider.tsx +0 -131
  867. package/src/stores/currentUser/currentUser.stories.tsx +0 -100
  868. package/src/stores/currentUser/currentUser.tsx +0 -94
  869. package/src/stories/Data/fileFieldArgSchema.json +0 -86
  870. package/src/stories/Tests/utils.ts +0 -320
  871. package/src/stories/storyNetwork.ts +0 -92
  872. package/src/stories/tracking.tsx +0 -206
  873. package/src/tracking/browser/attach.ts +0 -186
  874. package/src/tracking/browser/env.ts +0 -78
  875. package/src/tracking/core/consent.ts +0 -37
  876. package/src/tracking/core/engagement.ts +0 -47
  877. package/src/tracking/core/experiments.ts +0 -258
  878. package/src/tracking/core/hash.ts +0 -26
  879. package/src/tracking/core/ids.ts +0 -25
  880. package/src/tracking/core/observable.ts +0 -23
  881. package/src/tracking/core/queue.ts +0 -131
  882. package/src/tracking/core/sections.ts +0 -166
  883. package/src/tracking/core/storage.ts +0 -69
  884. package/src/tracking/core/tracker.ts +0 -417
  885. package/src/tracking/core/types.ts +0 -162
  886. package/src/tracking/core/utm.ts +0 -23
  887. package/src/tracking/index.ts +0 -72
  888. package/src/tracking/markup.ts +0 -17
  889. package/src/tracking/react/Experiment.tsx +0 -44
  890. package/src/tracking/react/TrackingProvider.tsx +0 -56
  891. package/src/tracking/react/hooks.ts +0 -106
  892. package/src/tracking/react/index.ts +0 -13
  893. package/src/tracking/testing.ts +0 -108
  894. package/src/tracking/ui/ExperimentCard.stories.tsx +0 -296
  895. package/src/tracking/ui/ExperimentCard.tsx +0 -667
  896. package/src/tracking/ui/ExperimentsOverlay.stories.tsx +0 -155
  897. package/src/tracking/ui/ExperimentsOverlay.tsx +0 -437
  898. package/src/tracking/ui/anchor.ts +0 -180
  899. package/src/tracking/ui/card.ts +0 -464
  900. package/src/tracking/ui/client.ts +0 -117
  901. package/src/tracking/ui/index.ts +0 -77
  902. package/src/tracking/ui/types.ts +0 -110
  903. package/src/tracking/ui/useExperimentsAdmin.ts +0 -103
  904. package/src/types/Form.ts +0 -29
  905. package/src/types.ts +0 -14
  906. package/src/utils/datetime.ts +0 -10
  907. package/src/utils/fetch.ts +0 -457
  908. package/src/utils/lspClient.ts +0 -711
  909. package/src/utils/lspClient.types.ts +0 -211
  910. package/src/utils/queryUnlessCancelled.ts +0 -28
  911. package/src/utils/websocket.ts +0 -293
  912. package/vite.config.ts +0 -58
  913. package/vitest.config.ts +0 -69
@@ -1,1749 +0,0 @@
1
- // Verbatim port of qorus-ide `src/components/Field/template.tsx` (774 LOC,
2
- // FIELD_STACK_REPORT batch) — keep edits to the documented seams (leaf-API
3
- // onChange adapters, the reqraft `useExpressions` signature, dropped
4
- // SaveValueButton / useGetAppActionData). Full seam list:
5
- // `.tasks/FIELD_STACK_REPORT.md`.
6
- import {
7
- ReqoreButton,
8
- ReqoreControlGroup,
9
- ReqoreDropdown,
10
- ReqoreErrorBoundary,
11
- ReqoreMenu,
12
- ReqoreMenuItem,
13
- ReqoreMenuSection,
14
- ReqoreMessage,
15
- ReqorePopover,
16
- ReqoreSkeleton,
17
- } from '@qoretechnologies/reqore';
18
- import { IReqoreButtonProps } from '@qoretechnologies/reqore/dist/components/Button';
19
- import { IReqoreDropdownProps } from '@qoretechnologies/reqore/dist/components/Dropdown';
20
- import { IReqoreMenuItemProps } from '@qoretechnologies/reqore/dist/components/Menu/item';
21
- import { IReqoreIconName } from '@qoretechnologies/reqore/dist/types/icons';
22
- import ReqoreMenuDivider, {
23
- IReqoreMenuDividerProps,
24
- } from '@qoretechnologies/reqore/dist/components/Menu/divider';
25
- import { IReqoreRichTextEditorProps } from '@qoretechnologies/reqore/dist/components/RichTextEditor';
26
- import {
27
- IReqoreFormTemplates,
28
- IReqoreTextareaProps,
29
- } from '@qoretechnologies/reqore/dist/components/Textarea';
30
- import { IQorusFormFieldSchemaBase, TQorusType } from '@qoretechnologies/ts-toolkit';
31
- import { size } from 'lodash';
32
- import React, { memo, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
33
- import { useUpdateEffect } from 'react-use';
34
- import {
35
- filterTemplatesByType as templatesFilterFunc,
36
- getTemplateKey,
37
- getTemplateValue,
38
- isBracedTemplateToken,
39
- isCompleteTemplateToken,
40
- describeTemplateReference,
41
- isValueTemplate,
42
- } from '../../../../helpers/templates';
43
- import { classifyTypedText, mightBeDpqlExpression } from '../../../../helpers/dpqlDetection';
44
- import {
45
- renderTemplateItemDescriptions,
46
- templateItemsToShow,
47
- } from '../../../../helpers/templateItems';
48
- import { useMarkdownRenderer } from '../../../Description/markdownRendererContext';
49
- import { getTypeFromValue } from '../../../../helpers/validations';
50
- import { useDpqlProbe } from '../../../dpqlEditor/useDpqlProbe';
51
- import { useQorusTypes } from '../../../../hooks/useQorusTypes';
52
- import { useWhyDidYouUpdate } from '../../../../hooks/useWhyDidYouUpdate';
53
- import { ExpressionBuilder, IExpressionBuilderProps } from '../../expressions/builder';
54
- // Direct import — the cycle (TemplateField → ExpressionField → builder →
55
- // TemplateField) is render-time only, safe like the other Field cycles.
56
- import { ExpressionField } from '../../expressions/ExpressionField';
57
- import { IExpression, TExpressionReorder } from '../../expressions/types';
58
- import { useExpressions } from '../../expressions/useExpressions';
59
- import { AutoFormField as Auto, IQorusType as IQorusFormType } from '../auto/AutoFormField';
60
- import BooleanFormField from '../boolean/Boolean';
61
- import { DateFormField } from '../date/Date';
62
- import { ReqraftFileFormField } from '../file/File';
63
- import LongStringFormField from '../long-string/LongString';
64
- import NumberFormField from '../number/Number';
65
- import { ReadOnlyTemplateTag } from './ReadOnlyTemplateTag';
66
- import { RichTextFormField } from '../rich-text/RichText';
67
- import { richtextToString } from '../../../../helpers/common';
68
- import { isSingleLineStringType } from '../../../../helpers/singleLineString';
69
- import { isUntypedOptionType } from '../../../../helpers/optionUiTypes';
70
- import {
71
- IRowMenuRegistration,
72
- RowMenuContext,
73
- useRowMenu,
74
- useRowMenuPublisher,
75
- } from '../../engine/rowMenuContext';
76
- import { SavedValuesContext } from '../allowed-values/savedValues';
77
-
78
- // Re-export template utilities for consumers
79
- export { getTemplateKey, getTemplateValue, isValueTemplate };
80
- export type { IQorusFormType as IQorusType };
81
-
82
- /**
83
- * How long the author must pause before typed text is sent to the DPQL
84
- * probe. Long enough that a probe is not sent for every prefix of what is
85
- * being typed, short enough that the offer appears while they are still
86
- * looking at the field.
87
- */
88
- const DPQL_DETECT_DEBOUNCE_MS = 400;
89
-
90
- export const TemplatesListProps: IReqoreDropdownProps = {
91
- useTargetWidth: true,
92
- handler: 'focus',
93
- minWidth: '300px',
94
- listCustomTheme: {
95
- main: '#1e0d29',
96
- },
97
- };
98
-
99
- // IDE leaf-field modules take `onChange(name, value)` and a `name` prop;
100
- // reqraft leaf fields are single-arg. These wrappers restore the IDE API for
101
- // the ComponentMap (and the template-string editor below) so the ported
102
- // markup stays verbatim. `type`/`level`/`allowTemplates` are destructured
103
- // only to keep them off the underlying ReQore component / DOM.
104
- /* eslint-disable @typescript-eslint/no-unused-vars */
105
- // `type` is FORWARDED here, unlike the other wrappers below: the long-string
106
- // field consumes it to decide whether it holds one line (a `string` does, a
107
- // `long-string`, `hash` or `list` does not) and never spreads it to the DOM.
108
- // Dropping it made every string field in every FormEngine form a growing
109
- // textarea, so an alert rule's Internal Name took Enter.
110
- const LongStringField = ({ name, onChange, type, level, allowTemplates, ...rest }: any) => (
111
- <LongStringFormField
112
- {...rest}
113
- type={type}
114
- onChange={(value: string) => onChange?.(name, value)}
115
- />
116
- );
117
- const Number = ({ name, onChange, type, level, allowTemplates, ...rest }: any) => (
118
- <NumberFormField {...rest} onChange={(value: number | string) => onChange?.(name, value)} />
119
- );
120
- const BooleanField = ({ name, onChange, value, type, level, allowTemplates, ...rest }: any) => (
121
- <BooleanFormField
122
- {...rest}
123
- checked={!!value}
124
- onChange={(checked: boolean) => onChange?.(name, checked)}
125
- />
126
- );
127
- const DateField = ({ name, onChange, type, level, allowTemplates, ...rest }: any) => (
128
- <DateFormField {...rest} onChange={(value: string) => onChange?.(name, value)} />
129
- );
130
- const RichTextField = ({ name, onChange, type, level, ...rest }: any) => (
131
- <RichTextFormField {...rest} onChange={(value: any) => onChange?.(name, value)} />
132
- );
133
- const FileField = ({ name, onChange, type, level, allowTemplates, ...rest }: any) => (
134
- <ReqraftFileFormField {...rest} onChange={(value: any) => onChange?.(name, value)} />
135
- );
136
- /* eslint-enable @typescript-eslint/no-unused-vars */
137
-
138
- export interface ITemplateFieldProps extends Partial<
139
- Omit<IQorusFormFieldSchemaBase, 'default_value'>
140
- > {
141
- value?: any;
142
- name?: string;
143
- uniqueName?: string;
144
- label?: string;
145
- onChange?: (name: string, value: any, type?: TQorusType, isFunction?: boolean) => void;
146
- // React element
147
- component?: React.FC<any>;
148
- interfaceContext?: string;
149
- allowTemplates?: boolean;
150
- templates?: IReqoreTextareaProps['templates'];
151
- componentFromType?: boolean;
152
- allowCustomValues?: boolean;
153
- allowFunctions?: boolean;
154
-
155
- filterTemplatesByType?: boolean;
156
- filterTemplatesFunc?: (templates: IReqoreFormTemplates) => IReqoreFormTemplates;
157
- returnType?: TQorusType | IQorusFormType[];
158
- level?: number;
159
- className?: string;
160
-
161
- isFunction?: boolean;
162
- isDefaultFunction?: boolean;
163
- isDefaultTemplate?: boolean;
164
- menuItems?: TCustomTemplateItems;
165
- /**
166
- * SEAM (reqraft, additive): a collapsed section in the field's `⋮` menu,
167
- * rendered before "Set Custom Value"; a row click closes the menu. The
168
- * expression builder puts its operand reorder actions here.
169
- */
170
- menuActions?: ITemplateMenuActions;
171
- /**
172
- * SEAM (reqraft, additive): rows appended at the end of the `⋮` menu, after
173
- * a divider — where an operand's destructive action goes on a phone, whose
174
- * row has no room for it inline. Clicking a row closes the menu.
175
- */
176
- menuTrailingItems?: IReqoreMenuItemProps[];
177
- /** SEAM (reqraft, additive): forwarded to a nested expression builder. */
178
- reorder?: TExpressionReorder;
179
- /**
180
- * SEAM (reqraft, additive): render expression mode through the
181
- * `ExpressionField` shell — Visual (the ported builder) + Text (the
182
- * net-new DPQL editor) — instead of the IDE's bare builder. FormEngine
183
- * turns this on for its (top-level) fields; nested operands (builder
184
- * arguments, array items) never receive it and stay IDE-verbatim.
185
- */
186
- allowTextExpressions?: boolean;
187
- /**
188
- * SEAM (reqraft): host-injected per-card actions for the expression editor
189
- * this field renders in expression mode (the IDE's AI-assist button).
190
- * Declared here — not left to the index signature — so it is destructured
191
- * out of `rest` and never spread onto a leaf input.
192
- */
193
- extraActions?: IExpressionBuilderProps['extraActions'];
194
- /**
195
- * SEAM (reqraft): the host's per-`ui_type` editors, forwarded to the field
196
- * component and to the expression editor's operand rows. Declared here — not
197
- * left to the index signature — for the same reason as `extraActions` above:
198
- * so it is destructured out of `rest` and never spread onto a leaf input or a
199
- * Reqore layout component, both of which pass unknown props to the DOM.
200
- */
201
- componentOverrides?: Record<string, React.FC<any>>;
202
- [key: string]: any;
203
- default_value?: unknown;
204
- }
205
-
206
- export const ComponentMap = {
207
- string: LongStringField,
208
- number: Number,
209
- int: Number,
210
- float: Number,
211
- list: LongStringField,
212
- hash: LongStringField,
213
- binary: LongStringField,
214
- bool: BooleanField,
215
- boolean: BooleanField,
216
- date: DateField,
217
- richtext: RichTextField,
218
- file: FileField,
219
- };
220
-
221
- export interface ITemplateDropdownSelectorProps extends IReqoreDropdownProps {
222
- onRemoveClick?: IReqoreButtonProps['onClick'];
223
- allowCustomValues?: boolean;
224
- hasOnlyAllowedValues?: boolean;
225
- templates?: IReqoreFormTemplates;
226
- value?: string;
227
- size?: IReqoreButtonProps['size'];
228
- }
229
-
230
- export type TCustomTemplateItems = (
231
- | (Omit<IReqoreButtonProps, 'onClick'> & {
232
- onClick?: (e?: React.MouseEvent<HTMLButtonElement>, removeTemplate?: () => void) => void;
233
- })
234
- | (IReqoreMenuDividerProps & { isDivider?: true })
235
- )[];
236
-
237
- /**
238
- * The `menuActions` seam: a collapsed section of menu items, dividers, nested
239
- * sections, or custom content — rendered with the popover's close callback so
240
- * an inline control can shut the menu after acting.
241
- */
242
- export interface ITemplateMenuActions {
243
- label: string;
244
- icon?: IReqoreIconName;
245
- className?: string;
246
- items: (
247
- | IReqoreMenuItemProps
248
- | (IReqoreMenuDividerProps & { isDivider: true })
249
- | (ITemplateMenuActions & { isSection: true })
250
- | { isCustom: true; content: (closePopover?: () => void) => React.ReactNode }
251
- )[];
252
- }
253
-
254
- const renderMenuActionRows = (
255
- actions: ITemplateMenuActions,
256
- closePopover: (() => void) | undefined,
257
- size: IReqoreButtonProps['size']
258
- ): React.ReactNode =>
259
- actions.items.map((item, index) => {
260
- if ('isDivider' in item) {
261
- return <ReqoreMenuDivider key={index} {...item} />;
262
- }
263
-
264
- if ('isCustom' in item) {
265
- return <React.Fragment key={index}>{item.content(closePopover)}</React.Fragment>;
266
- }
267
-
268
- if ('isSection' in item) {
269
- return (
270
- <ReqoreMenuSection
271
- key={index}
272
- label={item.label}
273
- icon={item.icon}
274
- className={item.className}
275
- isCollapsed
276
- transparent
277
- size={size}
278
- >
279
- {renderMenuActionRows(item, closePopover, size)}
280
- </ReqoreMenuSection>
281
- );
282
- }
283
-
284
- // The menu hands its size to direct children only; rows inside a
285
- // section get it from here, or they render at the default size next to
286
- // rows that do not.
287
- return (
288
- <ReqoreMenuItem
289
- size={size}
290
- {...item}
291
- key={index}
292
- onClick={(event, itemId) => {
293
- item.onClick?.(event, itemId, closePopover);
294
- closePopover?.();
295
- }}
296
- />
297
- );
298
- });
299
-
300
- // The `menuTrailingItems` rows: last in the menu, behind a divider. A direct
301
- // child of `ReqoreMenu` for the same reason as `MenuActionsSection` below.
302
- const MenuTrailingItems = memo(
303
- ({
304
- items,
305
- closePopover,
306
- size,
307
- }: {
308
- items: IReqoreMenuItemProps[];
309
- closePopover?: () => void;
310
- size?: IReqoreButtonProps['size'];
311
- }) => (
312
- <>
313
- <ReqoreMenuDivider size={size} />
314
- {items.map((item, index) => (
315
- <ReqoreMenuItem
316
- size={size}
317
- {...item}
318
- key={index}
319
- onClick={(event, itemId) => {
320
- item.onClick?.(event, itemId);
321
- closePopover?.();
322
- }}
323
- />
324
- ))}
325
- </>
326
- )
327
- );
328
-
329
- // A direct child of `ReqoreMenu`, like `CustomMenuItems`, so the menu hands it
330
- // the popover's `closePopover` — a section does not pass it on to its rows.
331
- const MenuActionsSection = memo(
332
- ({
333
- actions,
334
- closePopover,
335
- size,
336
- startExpanded,
337
- ...rest
338
- }: {
339
- actions: ITemplateMenuActions;
340
- closePopover?: () => void;
341
- size?: IReqoreButtonProps['size'];
342
- /** @see `loneSectionStartsExpanded` — the menu's only group opens itself. */
343
- startExpanded?: boolean;
344
- }) => (
345
- <ReqoreMenuSection
346
- label={actions.label}
347
- icon={actions.icon}
348
- isCollapsed={!startExpanded}
349
- transparent
350
- className='template-menu-actions'
351
- size={size}
352
- {...rest}
353
- >
354
- {renderMenuActionRows(actions, closePopover, size)}
355
- </ReqoreMenuSection>
356
- )
357
- );
358
-
359
- export const CustomMenuItems = memo(
360
- ({
361
- items,
362
- closePopover,
363
- setIsTemplate,
364
- setTemplateValue,
365
- startExpanded,
366
- ...rest
367
- }: {
368
- items: TCustomTemplateItems | undefined;
369
- closePopover?: () => void;
370
- setIsTemplate: React.Dispatch<React.SetStateAction<boolean>>;
371
- setTemplateValue: React.Dispatch<React.SetStateAction<string | null>>;
372
- /** @see `loneSectionStartsExpanded` — the menu's only group opens itself. */
373
- startExpanded?: boolean;
374
- }) => {
375
- return (
376
- <ReqoreMenuSection
377
- label='Set Custom Value'
378
- isCollapsed={!startExpanded}
379
- transparent
380
- icon='Text'
381
- {...rest}
382
- >
383
- {items.map((menuItem, index) =>
384
- 'isDivider' in menuItem ?
385
- <ReqoreMenuDivider key={index} {...menuItem} />
386
- : <ReqoreButton
387
- {...(rest as any)}
388
- {...menuItem}
389
- key={index}
390
- onClick={(e) => {
391
- (menuItem as any).onClick?.(e, () => {
392
- setIsTemplate(false);
393
- setTemplateValue(null);
394
- closePopover?.();
395
- });
396
- }}
397
- />
398
- )}
399
- </ReqoreMenuSection>
400
- );
401
- }
402
- );
403
-
404
- export const TemplateDropdownSelector = memo(
405
- ({
406
- onItemSelect,
407
- onRemoveClick,
408
- items,
409
- templates,
410
- allowCustomValues,
411
- hasOnlyAllowedValues,
412
- value,
413
- size,
414
- ...rest
415
- }: ITemplateDropdownSelectorProps) => {
416
- /* The LAST hop before Reqore, which is the only place a drawn description
417
- may be made: `filteredTemplates` upstream is a `JSON.stringify` memo key,
418
- and an element in it throws on its own circular owner. */
419
- const renderMarkdown = useMarkdownRenderer();
420
- const shownItems = useMemo(
421
- () => renderTemplateItemDescriptions(templateItemsToShow(items), renderMarkdown),
422
- [items, renderMarkdown]
423
- );
424
-
425
- // One resolver for every surface that names a reference — the picker chip
426
- // here, the read-only tag, and the compact row's expression summary. The
427
- // row and this editor must agree: a reference that reads as its path when
428
- // the row is closed cannot read as `$data:{…}` the moment it is opened.
429
- const resolved = describeTemplateReference(templates, value);
430
- const template = resolved.item;
431
- const label = resolved.label || rest.label || 'Select Template';
432
- const leftIconProps = useMemo(
433
- (): IReqoreButtonProps['leftIconProps'] => ({
434
- image: template?.metadata?.image,
435
- icon: 'ExchangeDollarLine',
436
- }),
437
- [template]
438
- );
439
- // SEAM (reqraft): the IDE resolves the template's app/action via
440
- // `useGetAppActionData` and renders the action's display name as a badge
441
- // here — the app catalogue is IDE-only, so the badge is dropped.
442
-
443
- return (
444
- <ReqoreControlGroup vertical fluid>
445
- {hasOnlyAllowedValues && (
446
- <ReqoreMessage intent='warning' size='small' opaque={false}>
447
- This field has pre-defined allowed values, make sure the template you select is
448
- compatible with those
449
- </ReqoreMessage>
450
- )}
451
- <ReqoreControlGroup stack>
452
- <ReqoreDropdown
453
- className='template-selector'
454
- customTheme={TemplatesListProps.listCustomTheme}
455
- minimal
456
- compact
457
- onItemSelect={onItemSelect}
458
- items={shownItems}
459
- label={label}
460
- leftIconProps={leftIconProps}
461
- caretPosition='right'
462
- filterable
463
- size={size}
464
- {...TemplatesListProps}
465
- />
466
- {allowCustomValues || value ?
467
- <ReqoreButton
468
- customTheme={TemplatesListProps.listCustomTheme}
469
- fixed
470
- icon='CloseLine'
471
- tooltip='Remove template value'
472
- minimal
473
- className='template-remove'
474
- compact
475
- size={size}
476
- onClick={onRemoveClick}
477
- />
478
- : null}
479
- </ReqoreControlGroup>
480
- </ReqoreControlGroup>
481
- );
482
- }
483
- );
484
-
485
- /**
486
- * `ui_type`s whose OWN editor renders templates as chips inline.
487
- *
488
- * For these the template SELECTOR must not take over: it replaces a control the
489
- * author can type in with one they can only pick from. A Qorus test assertion's
490
- * `Value` is the case this was written for — the IDE's own `auto.tsx` already
491
- * renders it as template rich text (type freely, references become chips), and
492
- * the same field reached through this form engine offered a dropdown and no way
493
- * to type at all.
494
- *
495
- * `richtext` is reqraft's own; a consumer adds its types through the
496
- * `templateAwareUiTypes` prop, exactly as it adds `rendererOnlyUiTypes`.
497
- */
498
- export const BuiltInTemplateAwareUiTypes = ['richtext'];
499
-
500
- export const isTemplateAwareUiType = (uiType?: string, extra?: string[]): boolean =>
501
- !!uiType && [...BuiltInTemplateAwareUiTypes, ...(extra ?? [])].includes(uiType);
502
-
503
- /**
504
- * One entry of the "set a value of this type" menu an untyped field offers.
505
- *
506
- * `onClick` is typed by what the caller actually invokes it with — the chosen
507
- * value and a reset callback — rather than as `Function`, which accepts a class
508
- * declaration as readily as a handler and gives no help at the call site.
509
- */
510
- interface IUntypedFieldMenuItem {
511
- label?: unknown;
512
- description?: unknown;
513
- isDivider?: boolean;
514
- onClick?: (value: unknown, reset: () => void) => void;
515
- }
516
-
517
- const TemplateFieldImpl = memo(
518
- ({
519
- rowMenu,
520
- value,
521
- name,
522
- onChange,
523
- component: Comp = Auto,
524
- templates,
525
- interfaceContext, // eslint-disable-line @typescript-eslint/no-unused-vars
526
- allowTemplates = true,
527
- allowFunctions,
528
- allowTextExpressions,
529
- extraActions,
530
- componentOverrides,
531
- allowCustomValues = true,
532
- filterTemplatesByType = true,
533
- filterTemplatesFunc,
534
- componentFromType,
535
- isFunction,
536
- isDefaultFunction,
537
- isDefaultTemplate,
538
- returnType,
539
- level,
540
- className,
541
- menuItems,
542
- menuActions,
543
- menuTrailingItems,
544
- reorder,
545
- label,
546
- ...rest
547
- }: ITemplateFieldProps & { rowMenu?: IRowMenuRegistration }) => {
548
- const qorusTypes = useQorusTypes();
549
- const functions = useExpressions({
550
- allow: !!allowFunctions,
551
- expressionsUrl: rest.expressions_url,
552
- extraExpressions: rest.expressions,
553
- });
554
- const type = rest.ui_type || rest.type || rest.defaultType;
555
-
556
- /* The type an EXPRESSION must return, and is stored with, is a DATA type.
557
- `type` above deliberately prefers `ui_type`, because that is what decides
558
- which editor to render — but a ui_type says how a value is EDITED, not
559
- what it is. The IDE's reference fields carry `ui_type: 'test-reference'`
560
- (a rich-text editor that turns `$.` paths into chips), and feeding that
561
- to the expression builder asked it for an expression RETURNING
562
- `test-reference`: no expression returns one, so every choice was refused
563
- with *"the expected return type is test-reference"*, and the ui_type was
564
- then stored on the saved expression as its declared type.
565
-
566
- The declared data type is the constraint; the ui_type is only a fallback
567
- for a field that declares no type at all. */
568
- const expressionDataType = rest.type || rest.defaultType || rest.ui_type;
569
-
570
- const filteredTemplates = useMemo<IReqoreFormTemplates>(():
571
- IReqoreFormTemplates | undefined => {
572
- if (!allowTemplates) {
573
- return undefined;
574
- }
575
-
576
- let result: IReqoreFormTemplates = templates;
577
-
578
- if (filterTemplatesByType) {
579
- result = templatesFilterFunc(templates, type, !!rest.arg_schema);
580
- }
581
-
582
- if (filterTemplatesFunc) {
583
- result = filterTemplatesFunc(result);
584
- }
585
-
586
- /* A lone category is opened, once, HERE — where this control resolves the
587
- templates every one of its pickers then reads: the "Select Template"
588
- dropdown, the in-editor `$` list, the numeric field's focus dropdown and
589
- the expression builder's argument picker. Applying it per picker meant
590
- each new one had to remember, and the ones that forgot made the author
591
- click through a header naming the only category on offer to reach the
592
- only values on offer.
593
-
594
- LAST, after both filters. `filterTemplatesFunc` is given the grouped
595
- shape on purpose — the Qog expression builder filters top-level items by
596
- `metadata.dataRole`, which is a property of the CATEGORY — so flattening
597
- before it would hand it values and quietly change what it keeps. This
598
- only changes what is finally shown. */
599
- return { ...result, items: templateItemsToShow(result?.items) };
600
- }, [
601
- JSON.stringify(templates),
602
- type,
603
- allowTemplates,
604
- filterTemplatesByType,
605
- JSON.stringify(rest.arg_schema),
606
- filterTemplatesFunc,
607
- ]);
608
-
609
- // An `any`-typed field has no editor of its own until a concrete type is
610
- // chosen, so it opened on the TYPE PICKER: before an author could say what
611
- // they meant, they had to answer a question about storage — "is this a Text
612
- // or a Number?" — that they often cannot answer, because the value they
613
- // want is a reference to something else whose type is not theirs to pick.
614
- //
615
- // So an untyped field that accepts templates now opens on the template
616
- // selector, which is the answer most of them want, and "Set Custom Value"
617
- // in the ⋮ menu is the way to a literal of a chosen type. That is the
618
- // reverse of the old default, and it is the right way round: choosing a
619
- // template is picking from a list, choosing a literal is a decision.
620
- //
621
- // Only while the field is EMPTY. A field already holding a literal must
622
- // open showing that literal — flipping to the template view would hide a
623
- // value the author put there and make it look lost.
624
- //
625
- // A field that may hold a custom value opens there whether or not templates
626
- // are on offer, and whether or not they have ARRIVED: template mode gives it
627
- // a typable editor, which offers the list once there is one. Waiting for the
628
- // list decided the landing from data that is async — on a cold load the
629
- // type-filtered list did not exist at mount, so the field fell to the type
630
- // picker and stayed there. A pick-only field (no custom values) is in
631
- // template mode regardless, by the `!allowCustomValues` term.
632
- const typeIsAnyLike = isUntypedOptionType(type);
633
- /* An EMPTY field, for the purpose of offering the template selector.
634
-
635
- `null` is deliberately not empty. It is the DPQL null literal — a value
636
- an author writes to say "this is nothing", and the only way to assert
637
- that a call returned no value. Counted as emptiness here, an argument
638
- holding it was treated as a field the author had just cleared: with a
639
- type of `any` and templates on offer, the selector-restore effect below
640
- flipped the field into template mode with a null template value, and
641
- that reported the field as cleared — so writing `null` in the Text tab
642
- and switching to Visual silently erased it, leaving `{type: "any"}` in
643
- the draft and the message "Value for argument 1 ("any") is invalid:
644
- Value is empty".
645
-
646
- `undefined` is the cleared state; `null` is a value. Same rule as
647
- `expressions/argumentPresence`, which states it canonically. */
648
- const isEmptyValue = value === undefined || value === '';
649
- const hasTemplatesOnOffer = !!size(filteredTemplates?.items);
650
- /* The field's own editor already renders templates inline, so the selector
651
- is not merely unnecessary here — it is a downgrade, swapping a typable
652
- control for a pick-only one. Derived rather than folded into the state
653
- below so every `setIsTemplate` path keeps working untouched; they simply
654
- stop having anything to say for these fields. */
655
- const editorHandlesTemplates =
656
- !!allowTemplates && isTemplateAwareUiType(type as string, (rest as any).templateAwareUiTypes);
657
-
658
- const hasOnlyAllowedValues = useMemo(
659
- () => !!size(rest.allowed_values) && !rest.allowed_values_creatable,
660
- [rest.allowed_values, rest.allowed_values_creatable]
661
- );
662
-
663
- /** Where this field lands when it is empty: an untyped one in template mode — see above. */
664
- const emptyLandsOnTemplates =
665
- typeIsAnyLike && (hasTemplatesOnOffer || (!!allowCustomValues && !hasOnlyAllowedValues));
666
- const opensOnTemplates = isEmptyValue && emptyLandsOnTemplates;
667
-
668
- const [isTemplateState, setIsTemplate] = useState<boolean>(
669
- (isDefaultTemplate || isValueTemplate(value) || !allowCustomValues || opensOnTemplates) &&
670
- allowTemplates
671
- );
672
-
673
- const isTemplate = editorHandlesTemplates ? false : isTemplateState;
674
- const [internalIsFunction, setInternalIsFunction] = useState<boolean>(
675
- !!isDefaultFunction && !!allowFunctions
676
- );
677
- const [templateValue, setTemplateValue] = useState<string | null>(value);
678
-
679
- // Typed text that turned out to be an expression the author may accept.
680
- const [dpqlOffer, setDpqlOffer] = useState<{ text: string; expression: any } | null>(null);
681
- // The literal this field held before typed text switched it into
682
- // expression mode — kept so the switch is undoable, and so the editor
683
- // opens on the Text view the author was already writing in.
684
- const [expressionFromText, setExpressionFromText] = useState<string | null>(null);
685
- // Texts the author has said no to. Without this, dismissing an offer (or
686
- // undoing a switch) would re-detect the same text on the next render and
687
- // ask again forever.
688
- const declinedTexts = useRef<Set<string>>(new Set());
689
- const detectTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
690
- const probeDpql = useDpqlProbe();
691
-
692
- const effectiveIsFunction = isFunction || internalIsFunction;
693
-
694
- useWhyDidYouUpdate(`Template field ${name}`, {
695
- name,
696
- onChange,
697
- value,
698
- ...rest,
699
- });
700
-
701
- useEffect(() => {
702
- if (isTemplate && isValueTemplate(value)) {
703
- setTemplateValue(value);
704
- }
705
- }, [JSON.stringify(value)]);
706
-
707
- /* Clearing an untyped field returns it to the template selector, which is
708
- where mounting it empty already lands.
709
-
710
- The rule above that opens an `any`-like field on the template selector is
711
- a `useState` INITIALISER, so it only ever ran on mount. Clearing a value
712
- in place does not remount anything, so the field fell through to the TYPE
713
- picker and demanded `string`/`int`/`hash` before it would let the author
714
- name a value they had already captured -- the very question that rule
715
- exists to stop asking. Reloading the page fixed it, which is the tell:
716
- same field, same empty value, different landing, because only one of the
717
- two paths ran the rule.
718
-
719
- Watched as a TRANSITION from a value to no value, not as "the value is
720
- empty": an author who picks `Set Custom Value` on an empty field is
721
- asking for the type picker, and re-asserting the template view on every
722
- render while the field sat empty would take it away again immediately. */
723
- const hadValue = useRef(!isEmptyValue);
724
- /* A clear is REMEMBERED rather than acted on in the same render.
725
-
726
- While the field holds a value its resolved type is that VALUE's type — a
727
- reference reads as `test-reference`, not `auto` — and clearing reverts it
728
- to the schema's `auto` one render LATER than the value empties. Acting
729
- only on the transition therefore ran while `typeIsAnyLike` was still
730
- false and did nothing, and by the time the type settled the transition
731
- had passed. Measured in the live IDE at the moment of the clear:
732
- `{ wasCleared: true, typeIsAnyLike: false, type: "test-reference",
733
- hasTemplatesOnOffer: true }`, then `typeIsAnyLike: true` on the very next
734
- render with `wasCleared` already false. */
735
- const restoreSelectorWhenSettled = useRef(false);
736
- /** Set by the template control's own `×`, which is an author saying "not a
737
- * template" — that clear must not be answered with the selector again. */
738
- const suppressSelectorRestore = useRef(false);
739
-
740
- useEffect(() => {
741
- if (hadValue.current && isEmptyValue) {
742
- restoreSelectorWhenSettled.current = !suppressSelectorRestore.current;
743
- suppressSelectorRestore.current = false;
744
- }
745
- if (!isEmptyValue) {
746
- // A value arrived: whatever the author did, they are not sitting on an
747
- // empty field waiting to be offered the list.
748
- restoreSelectorWhenSettled.current = false;
749
- }
750
- hadValue.current = !isEmptyValue;
751
-
752
- if (
753
- restoreSelectorWhenSettled.current &&
754
- opensOnTemplates &&
755
- allowTemplates &&
756
- !effectiveIsFunction
757
- ) {
758
- restoreSelectorWhenSettled.current = false;
759
- setTemplateValue(null);
760
- setIsTemplate(true);
761
- }
762
- }, [isEmptyValue, opensOnTemplates, allowTemplates, effectiveIsFunction]);
763
-
764
- useEffect(() => {
765
- if (allowCustomValues && isTemplate && value && !isValueTemplate(value)) {
766
- setIsTemplate(false);
767
- }
768
- }, [allowCustomValues]);
769
-
770
- useEffect(() => {
771
- if (!isTemplate && isValueTemplate(value) && allowTemplates) {
772
- // In auto mode, leave user-typed dollar-strings alone ('$foo: hello'
773
- // passes the loose check) — but a string that IS one well-formed token
774
- // ($data:{…}, $config:item) must still flip into template mode, or an
775
- // arg whose value hydrates after mount is stuck rendering raw text.
776
- if (
777
- type === 'auto' &&
778
- getTypeFromValue(value) === 'string' &&
779
- !isCompleteTemplateToken(value)
780
- ) {
781
- return;
782
- }
783
-
784
- // A template reference with an OPERATOR on it (`$local:count + 1`) is
785
- // an expression, not a template. The loose check above passes it —
786
- // it starts with `$` and has a colon — so without this every such
787
- // string was swallowed into template mode, where the arithmetic is
788
- // dead text and no affordance can reach it. A token standing alone
789
- // (`$local:count`, `$data:{1.field}`) has no operator and still
790
- // flips, which is the case template mode is for.
791
- if (!isCompleteTemplateToken(value) && mightBeDpqlExpression(value)) {
792
- return;
793
- }
794
-
795
- setIsTemplate(true);
796
- setTemplateValue(value);
797
- }
798
- }, [JSON.stringify(value), allowTemplates]);
799
-
800
- // When template key or template value change run the onChange function
801
- useUpdateEffect(() => {
802
- if (templateValue) {
803
- onChange?.(name, templateValue, type as TQorusType, effectiveIsFunction);
804
- }
805
- }, [JSON.stringify(templateValue)]);
806
-
807
- // an editor that takes templates into its own text has no template mode to switch to: "Use Template"
808
- // there emptied the field and showed nothing in its place
809
- const showTemplateToggle =
810
- allowCustomValues && allowTemplates && !rest.arg_schema && !editorHandlesTemplates;
811
-
812
- // Only a BRACED context ref (`$data:{…}` — machine-written, nobody types
813
- // one) renders as the picker chip (named via `resolveTemplateLabel`)
814
- // rather than as its raw text in a string editor. Plain word-path tokens
815
- // (`$local:id`) are typeable, so per the build #123 review they keep the
816
- // input that offers templates while typing. Mixed text-and-token strings
817
- // keep the string editor too; the chip-in-editor treatment arrives with
818
- // the rich-text string mode.
819
- const templateValueIsBracedToken = isBracedTemplateToken(templateValue);
820
-
821
- /* An UNTYPED field can be typed into as well as picked from.
822
-
823
- Template mode has a typable editor whenever the field's type can hold
824
- arbitrary text, and `any`/`auto` can — it is the type that has not been
825
- narrowed yet, not a type that excludes text. Restricting this to
826
- `string` meant an empty untyped field opened on template mode with no
827
- editor to offer, so it fell through to the pick-only "Select Template"
828
- dropdown: a control that can only choose from a list, on exactly the
829
- fields where an author most often needs to write something the list
830
- cannot hold — a deeper walk, a literal, or an expression.
831
-
832
- Reported against a Qorus assertion's Expected Value, and it was never
833
- specific to that field: every empty untyped field with templates on
834
- offer got the same downgrade. The editor still offers the same templates
835
- on focus, so nothing is lost by being able to type as well. */
836
- const templateSupportsCustomValues =
837
- allowCustomValues && (type === 'string' || typeIsAnyLike) && !hasOnlyAllowedValues;
838
- const showTemplatesDropdown =
839
- allowTemplates && (!allowCustomValues || (isTemplate && !templateSupportsCustomValues));
840
- const hasOnlyExpressions = !allowCustomValues && !allowTemplates && allowFunctions;
841
- // True when some input control renders besides the ⋮ menu. When nothing
842
- // does (an empty `any` field: custom values are disallowed and the value's
843
- // type is picked FROM the menu), the menu trigger is the field's only
844
- // affordance and gets a label — a bare ⋮ alone reads as a broken editor.
845
- const hasInputAffordance =
846
- (!isTemplate && allowCustomValues) ||
847
- (isTemplate && templateSupportsCustomValues) ||
848
- showTemplatesDropdown;
849
-
850
- const Component = componentFromType ? ComponentMap[type] : Comp;
851
- // Only a ComponentMap component gets `type`: it is ours and CONSUMES the
852
- // prop (the long-string field needs it to know whether it holds one line)
853
- // rather than spreading it onto the DOM. A caller-supplied `Comp` is someone
854
- // else's, which is why `type` was kept off this call in the first place.
855
- const componentTypeProp = componentFromType ? { type } : {};
856
- const fieldAriaLabel = rest['aria-label'] ?? label ?? rest.display_name ?? name;
857
-
858
- const handleTemplateFieldChange = useCallback(
859
- (_name: string, val: string) => {
860
- if (!val) {
861
- /* Emptying the text leaves the field where an empty field lands. For
862
- an untyped field that is THIS editor: switching to custom mode here
863
- mounted a different editor in its place, so deleting the last
864
- character lost the cursor. */
865
- if (!(emptyLandsOnTemplates && allowTemplates)) {
866
- setIsTemplate(false);
867
- }
868
- setTemplateValue(null);
869
- onChange(name, undefined);
870
- } else {
871
- setTemplateValue(val);
872
- }
873
- },
874
- [name, onChange, emptyLandsOnTemplates, allowTemplates]
875
- );
876
-
877
- const handleTemplateTextChange = useCallback(
878
- (val: unknown) => handleTemplateFieldChange(name, typeof val === 'string' ? val : ''),
879
- [handleTemplateFieldChange, name]
880
- );
881
-
882
- const handleSelectTemplateFromList = useCallback(
883
- // If the field has allowed values and supports templates, we do not want to overwrite the field type with the template type
884
- (item) => {
885
- // If the template type is richtext, we need to wrap the template value in the richtext template format
886
- const value =
887
- item.badge === 'richtext' ?
888
- ([
889
- {
890
- type: 'paragraph',
891
- /* The empty text nodes on either side are load-bearing. A
892
- chip is an inline VOID: it holds no text of its own, so the
893
- only places a cursor can go are the text nodes AROUND it.
894
- Slate treats that as an invariant and repairs it during
895
- normalisation, which runs on edits but NOT on a document
896
- handed in whole as a controlled value — which is what this
897
- is. Without them the picked template renders as a chip that
898
- cannot be typed after, so it can never be extended by hand. */
899
- children: [
900
- { text: '' },
901
- {
902
- children: [{ text: '' }],
903
- label: item.label,
904
- type: 'tag',
905
- value: item.value,
906
- metadata: item.metadata,
907
- },
908
- { text: '' },
909
- ],
910
- },
911
- ] as IReqoreRichTextEditorProps['value'])
912
- : item.value;
913
-
914
- onChange(
915
- name,
916
- value,
917
- hasOnlyAllowedValues ? (type as TQorusType) : (item.badge as TQorusType)
918
- );
919
- },
920
- [name, onChange]
921
- );
922
-
923
- /* Saving a value for reuse goes to the HOST, which keeps saved values and
924
- asks what to call this one (`SavedValuesContext`). Offered where a value
925
- can be typed in — a field of fixed choices has nothing of its own to
926
- save, and neither does a yes/no — and only once there is a value. */
927
- const savedValues = useContext(SavedValuesContext);
928
- const canSaveValue =
929
- !!rest.allowSaving &&
930
- !!savedValues?.saveValue &&
931
- (!rest.allowed_values || !!rest.allowed_values_creatable) &&
932
- type !== 'bool' &&
933
- type !== 'boolean' &&
934
- !rest.readonly &&
935
- !rest.disabled &&
936
- value !== undefined &&
937
- value !== null &&
938
- value !== '';
939
-
940
- const handleRemoveTemplateClick = useCallback(() => {
941
- /* This is the `×` ON the template control, and it means "I do not want a
942
- template here" — on a field whose menu offers no `Set Custom Value` it
943
- is the ONLY way to reach a literal. So it still drops to the custom
944
- value editor, and it tells the empty-field rule below to keep its hands
945
- off this particular clear: that rule watches the value going away, and
946
- this handler clears the value too, so without the flag it would send
947
- the author straight back to the selector they just dismissed. */
948
- if (allowCustomValues) {
949
- suppressSelectorRestore.current = true;
950
- setIsTemplate(false);
951
- }
952
-
953
- setTemplateValue(null);
954
- onChange?.(name, undefined);
955
- }, [allowCustomValues, name, onChange]);
956
-
957
- const handleSelectFunctionChange = useCallback(() => {
958
- setInternalIsFunction(true);
959
- setIsTemplate(false);
960
- setTemplateValue(null);
961
-
962
- let firstArg: IExpression;
963
-
964
- if (type !== 'bool' && value !== undefined && value !== rest.default_value) {
965
- firstArg = {
966
- type: type as TQorusType,
967
- value,
968
- };
969
- }
970
-
971
- onChange?.(
972
- name,
973
- {
974
- args: [firstArg],
975
- },
976
- undefined,
977
- true
978
- );
979
- }, [
980
- JSON.stringify(functions.expressions),
981
- JSON.stringify(qorusTypes.value),
982
- name,
983
- onChange,
984
- type,
985
- value,
986
- ]);
987
-
988
- /* Leaving template mode from the ⋮ — the counterpart of "Use Template".
989
- Template mode's editor has no `×` of its own, so without this the author
990
- who switched to a template had no way back and no menu to ask with. */
991
- const handleUseCustomValueClick = useCallback(() => {
992
- setIsTemplate(false);
993
- /* A reference cannot stay in the custom editor: the field reads it as a
994
- template again and switches straight back. Anything else is text the
995
- author wrote, and it survives the switch. */
996
- if (isValueTemplate(value as string) || isCompleteTemplateToken(templateValue)) {
997
- /* Only where the value is actually cleared. The flag is read by the
998
- "emptied" effect, which never runs when the text survives — setting
999
- it unconditionally left it armed to swallow the NEXT genuine clear's
1000
- selector restore. */
1001
- suppressSelectorRestore.current = true;
1002
- setTemplateValue(null);
1003
- onChange?.(name, undefined);
1004
- }
1005
- }, [name, onChange, value, templateValue]);
1006
-
1007
- const handleTemplateToggleClick = useCallback(() => {
1008
- setInternalIsFunction(false);
1009
- onChange(name, undefined, undefined, false);
1010
- setTemplateValue(null);
1011
- setIsTemplate(true);
1012
- }, [onChange, name]);
1013
-
1014
- const handleExpressionChange = useCallback(
1015
- (expressionValue: IExpression | undefined, remove: boolean) => {
1016
- if (remove) {
1017
- setInternalIsFunction(false);
1018
- // The expression is gone, so there is no longer a switch to undo.
1019
- setExpressionFromText(null);
1020
- }
1021
- onChange(name, expressionValue?.value, expressionDataType as TQorusType, !remove);
1022
- },
1023
- [name, onChange, expressionDataType, value]
1024
- );
1025
-
1026
- // ─── Text typed into a plain field that is really a DPQL expression ───
1027
- //
1028
- // A field that accepts expressions still gets DPQL TYPED into it, in the
1029
- // ordinary editor, by an author who never opened the expression view.
1030
- // What happens then depends on the field's own type, and the asymmetry is
1031
- // deliberate: text that could stand as a literal here is only ever
1032
- // OFFERED, because silently rewriting the string `a + b` into a
1033
- // concatenation would destroy a value the author meant. Text that could
1034
- // NOT be a literal here was already an error the moment it was typed, so
1035
- // switching costs nothing and explains the error.
1036
- //
1037
- // The server decides whether the text is an expression at all — see
1038
- // `helpers/dpqlDetection` for why a successful parse alone means nothing.
1039
- const validationField = useMemo(
1040
- () => ({
1041
- validation_regex: rest.validation_regex,
1042
- has_to_be_valid_identifier: rest.has_to_be_valid_identifier,
1043
- has_to_have_value: rest.has_to_have_value,
1044
- rules: rest.rules,
1045
- arg_schema: rest.arg_schema,
1046
- }),
1047
- [
1048
- rest.validation_regex,
1049
- rest.has_to_be_valid_identifier,
1050
- rest.has_to_have_value,
1051
- JSON.stringify(rest.rules),
1052
- JSON.stringify(rest.arg_schema),
1053
- ]
1054
- );
1055
-
1056
- const enterExpressionFromText = useCallback(
1057
- (text: string, expression: any) => {
1058
- setDpqlOffer(null);
1059
- setExpressionFromText(text);
1060
- setInternalIsFunction(true);
1061
- setIsTemplate(false);
1062
- setTemplateValue(null);
1063
- // `dpql/parse` answers with the field-ready envelope
1064
- // (`{is_expression, value}`); this field stores the inner AST and
1065
- // signals the flag through `onChange`'s fourth argument, exactly as
1066
- // `handleExpressionChange` does.
1067
- onChange?.(name, expression?.value ?? expression, expressionDataType as TQorusType, true);
1068
- },
1069
- [name, onChange, expressionDataType]
1070
- );
1071
-
1072
- const undoExpressionFromText = useCallback(() => {
1073
- if (expressionFromText === null) {
1074
- return;
1075
- }
1076
-
1077
- declinedTexts.current.add(expressionFromText);
1078
- setInternalIsFunction(false);
1079
- setExpressionFromText(null);
1080
- onChange?.(name, expressionFromText, type as TQorusType, false);
1081
- }, [expressionFromText, name, onChange, type]);
1082
-
1083
- const declineDpqlOffer = useCallback(() => {
1084
- if (dpqlOffer) {
1085
- declinedTexts.current.add(dpqlOffer.text);
1086
- }
1087
-
1088
- setDpqlOffer(null);
1089
- }, [dpqlOffer]);
1090
-
1091
- const acceptDpqlOffer = useCallback(() => {
1092
- if (dpqlOffer) {
1093
- enterExpressionFromText(dpqlOffer.text, dpqlOffer.expression);
1094
- }
1095
- }, [dpqlOffer, enterExpressionFromText]);
1096
-
1097
- // Held in a ref so the debounce below does not depend on it. `onChange`
1098
- // comes from the host form and can be a fresh function on any render;
1099
- // with the callback in the effect's deps, a re-render caused by a
1100
- // DIFFERENT field would restart this field's timer, and a form the
1101
- // author is typing in re-renders constantly.
1102
- const enterExpressionRef = useRef(enterExpressionFromText);
1103
- useEffect(() => {
1104
- enterExpressionRef.current = enterExpressionFromText;
1105
- }, [enterExpressionFromText]);
1106
-
1107
- // Detection only runs on a field that could hold an expression and is
1108
- // currently showing a plain editor — never on a read-only field, a
1109
- // fixed-value list, or one already in template or expression mode.
1110
- const canDetectDpql =
1111
- !!allowFunctions &&
1112
- !!allowTextExpressions &&
1113
- !effectiveIsFunction &&
1114
- !isTemplate &&
1115
- !hasOnlyAllowedValues &&
1116
- !rest.readonly &&
1117
- !rest.readOnly &&
1118
- !rest.disabled;
1119
-
1120
- useEffect(() => {
1121
- if (detectTimer.current) {
1122
- clearTimeout(detectTimer.current);
1123
- detectTimer.current = null;
1124
- }
1125
-
1126
- /* A richtext field is still text. It hands its value back as a Slate
1127
- DOCUMENT rather than a flattened string — deliberately, so a chosen
1128
- reference cannot fuse with text typed beside it — and reading only
1129
- `typeof value === 'string'` here silently switched detection off for
1130
- every one of them the moment the field changed shape. A test
1131
- assertion's Value is exactly that field, and `1 + 2` typed into it
1132
- stopped being offered as an expression.
1133
-
1134
- `richtextToString` flattens a tag to its raw value, so a document
1135
- holding only a chosen reference reads as `$.result` — no operator, so
1136
- `mightBeDpqlExpression` rejects it below and the server is never
1137
- asked. */
1138
- const text =
1139
- typeof value === 'string' ? value
1140
- : Array.isArray(value) ? richtextToString(value as never)
1141
- : undefined;
1142
-
1143
- if (
1144
- !canDetectDpql ||
1145
- !text ||
1146
- declinedTexts.current.has(text) ||
1147
- !mightBeDpqlExpression(text)
1148
- ) {
1149
- setDpqlOffer(null);
1150
- return undefined;
1151
- }
1152
-
1153
- let cancelled = false;
1154
-
1155
- detectTimer.current = setTimeout(() => {
1156
- detectTimer.current = null;
1157
-
1158
- void probeDpql(text)
1159
- .then((parsed) => {
1160
- if (cancelled) {
1161
- return;
1162
- }
1163
-
1164
- const outcome = classifyTypedText({ text, type, field: validationField, parsed });
1165
-
1166
- if (outcome === 'switch') {
1167
- enterExpressionRef.current(text, parsed.expression);
1168
- } else if (outcome === 'offer') {
1169
- setDpqlOffer({ text, expression: parsed.expression });
1170
- } else {
1171
- setDpqlOffer(null);
1172
- }
1173
- })
1174
- .catch(() => {
1175
- // Detection is an offer of help, never a reason for a field to
1176
- // break: an unreachable instance or a classifier that threw leaves
1177
- // the author's text exactly where they put it.
1178
- if (!cancelled) {
1179
- setDpqlOffer(null);
1180
- }
1181
- });
1182
- }, DPQL_DETECT_DEBOUNCE_MS);
1183
-
1184
- return () => {
1185
- cancelled = true;
1186
-
1187
- if (detectTimer.current) {
1188
- clearTimeout(detectTimer.current);
1189
- detectTimer.current = null;
1190
- }
1191
- };
1192
- }, [value, canDetectDpql, type, validationField, probeDpql]);
1193
-
1194
- const canOfferExpression =
1195
- allowFunctions && !hasOnlyAllowedValues && !rest.readonly && !internalIsFunction;
1196
- const canOfferTemplate = showTemplateToggle && !isTemplate;
1197
- /* The way back out, published on the same terms the field's own ⋮ draws it.
1198
- A field inside a form ROW draws no menu of its own — it publishes into
1199
- the row's — so leaving this out of the published list meant template mode
1200
- was a one-way door on the surface most options are edited from. */
1201
- const canOfferCustomValue = showTemplateToggle && isTemplate && templateSupportsCustomValues;
1202
-
1203
- const publishedItems = useMemo(
1204
- () => [
1205
- ...(canOfferExpression && !hasOnlyExpressions && !functions.loading
1206
- ? [
1207
- {
1208
- label: 'Use Expression',
1209
- icon: 'Functions' as const,
1210
- tooltip: 'Run a function on this value',
1211
- onClick: handleSelectFunctionChange,
1212
- },
1213
- ]
1214
- : []),
1215
- ...(canOfferTemplate
1216
- ? [
1217
- {
1218
- label: 'Use Template',
1219
- icon: 'MoneyDollarCircleLine' as const,
1220
- tooltip: 'Use a template',
1221
- onClick: handleTemplateToggleClick,
1222
- },
1223
- ]
1224
- : []),
1225
- ...(canOfferCustomValue
1226
- ? [
1227
- {
1228
- label: 'Use Custom Value',
1229
- icon: 'EditLine' as const,
1230
- tooltip: 'Write the value here instead of choosing a template',
1231
- onClick: handleUseCustomValueClick,
1232
- },
1233
- ]
1234
- : []),
1235
- ...(canSaveValue
1236
- ? [
1237
- {
1238
- label: savedValues?.saveLabel ?? 'Save value',
1239
- icon: 'SaveLine' as const,
1240
- onClick: () => savedValues?.saveValue?.({ value, type }),
1241
- },
1242
- ]
1243
- : []),
1244
- /* The "set a value of this type" choices an untyped field offers.
1245
- Dividers are dropped: they grouped items in a menu this field drew
1246
- itself, and in the row's shared menu they would divide other
1247
- people's. */
1248
- ...((menuItems ?? []) as IUntypedFieldMenuItem[])
1249
- .filter((item) => !('isDivider' in item))
1250
- .map((item) => ({
1251
- label: item.label as string,
1252
- description: item.description as string | undefined,
1253
- onClick: () =>
1254
- item.onClick?.(undefined, () => {
1255
- setIsTemplate(false);
1256
- setTemplateValue(null);
1257
- }),
1258
- })),
1259
- ],
1260
- [
1261
- canOfferExpression,
1262
- functions.loading,
1263
- canOfferTemplate,
1264
- canOfferCustomValue,
1265
- menuItems,
1266
- handleSelectFunctionChange,
1267
- handleTemplateToggleClick,
1268
- handleUseCustomValueClick,
1269
- canSaveValue,
1270
- savedValues,
1271
- value,
1272
- type,
1273
- hasOnlyExpressions,
1274
- ]
1275
- );
1276
-
1277
- /* Keyed on WHICH items are offered, never on the items: they carry
1278
- handlers, so they are a new array every render and a row comparing them
1279
- by value would loop. */
1280
- const publishedKey = [
1281
- canOfferExpression && !hasOnlyExpressions && !functions.loading ? 'expression' : '',
1282
- canOfferTemplate ? 'template' : '',
1283
- canOfferCustomValue ? 'custom-value' : '',
1284
- canSaveValue ? 'save-value' : '',
1285
- `custom:${((menuItems ?? []) as { label?: unknown }[]).map((item) => String(item.label ?? '')).join('|')}`,
1286
- ].join(',');
1287
-
1288
- useRowMenuPublisher(rowMenu, publishedKey, publishedItems as never);
1289
-
1290
- const renderControls = useCallback(() => {
1291
- const showFunctionsDropdown =
1292
- allowFunctions && !hasOnlyAllowedValues && !rest.readonly && !internalIsFunction;
1293
- const showTemplatesButton = showTemplateToggle && !isTemplate;
1294
- // The way back out of template mode, where the editor draws no `×`.
1295
- const showCustomValueButton = showTemplateToggle && isTemplate && templateSupportsCustomValues;
1296
- // The "Set value" label promises a way to set one — reorder rows alone don't.
1297
- const hasValueRows =
1298
- showFunctionsDropdown || showTemplatesButton || showCustomValueButton || size(menuItems) > 0;
1299
-
1300
- /* A lone group opens itself. Two of the menu's groups are collapsed
1301
- sections, so a menu holding nothing but one of them asked for a click
1302
- to reach the only thing on offer — on an untyped field, "Set Custom
1303
- Value" hiding the type rows behind it. Expanded, it still names what
1304
- its rows are and can still be collapsed. The same rule the template
1305
- list follows for a lone category, and the row menu already publishes
1306
- these rows flat. */
1307
- const loneSectionStartsExpanded =
1308
- [
1309
- showFunctionsDropdown,
1310
- showTemplatesButton,
1311
- showCustomValueButton,
1312
- size(menuActions?.items) > 0,
1313
- size(menuItems) > 0,
1314
- ].filter(Boolean).length === 1;
1315
-
1316
- /* A field that takes nothing BUT an expression has one way in, and it is
1317
- its editor, not a menu item — so it is drawn in a form row too. Behind
1318
- the row's ⋮ the field read as having nowhere to write anything. */
1319
- if (hasOnlyExpressions) {
1320
- return (
1321
- showFunctionsDropdown ?
1322
- functions.loading ?
1323
- <ReqoreSkeleton size={rest.size} />
1324
- : <ReqoreButton
1325
- compact
1326
- minimal
1327
- label='Create New Expression'
1328
- className='function-selector'
1329
- icon='Functions'
1330
- tooltip='This field only accepts expressions'
1331
- onClick={() => {
1332
- setIsTemplate(false);
1333
- setTemplateValue(null);
1334
- onChange?.(
1335
- name,
1336
- {
1337
- args: [],
1338
- },
1339
- undefined,
1340
- true
1341
- );
1342
- }}
1343
- />
1344
- : null
1345
- );
1346
- }
1347
-
1348
- /* ONE menu per control. Where this field sits in a form ROW, the row
1349
- already renders a ⋮ of its own, and drawing a second one beside it
1350
- put two menus of slightly different widths on the same control —
1351
- with the type choices an `any` field offers hidden in the narrower
1352
- one. The items are published to the row instead (see
1353
- `rowMenuContext`); outside a row there is nothing to publish into,
1354
- so the field goes on drawing its own. */
1355
- if (rowMenu) {
1356
- return null;
1357
- }
1358
-
1359
- if (hasValueRows || size(menuActions?.items) > 0 || size(menuTrailingItems) > 0) {
1360
- return (
1361
- <ReqorePopover
1362
- component={ReqoreButton}
1363
- closeOnTargetClick
1364
- closeOnInsideClick={false}
1365
- isReqoreComponent
1366
- noWrapper
1367
- noArrow
1368
- placement='bottom-end'
1369
- componentProps={
1370
- {
1371
- icon: 'More2Fill',
1372
- className: 'template-more',
1373
- compact: true,
1374
- transparent: true,
1375
- size: rest.size,
1376
- fixed: true,
1377
- /* Centre the trailing menu in its flex line so it lines up
1378
- with sibling action buttons (reqore alignSelf; replaces a
1379
- reqraft `align-self !important` override of this button).
1380
-
1381
- Centring is only right beside a ONE-LINE editor. The
1382
- expression shell is a toolbar with an editor, a type message
1383
- and a preview stacked under it, so centring put this menu
1384
- somewhere down the side of that block — level with nothing,
1385
- over the editor, and a long way from the Undo it belongs
1386
- beside. There it goes to the top, which is where the shell's
1387
- own toolbar is. */
1388
- alignSelf: effectiveIsFunction ? 'flex-start' : 'center',
1389
- label: hasInputAffordance || !hasValueRows ? undefined : 'Set value',
1390
- style:
1391
- hasInputAffordance ?
1392
- {
1393
- paddingLeft: 0,
1394
- paddingRight: 0,
1395
- minWidth: '10px',
1396
- }
1397
- : undefined,
1398
- effect: {
1399
- gradient: {
1400
- direction: 'to bottom right',
1401
- colors: {
1402
- 0: '#444444',
1403
- 40: '#161616',
1404
- 60: '#161616',
1405
- 100: '#444444',
1406
- },
1407
- },
1408
- },
1409
- } as IReqoreButtonProps
1410
- }
1411
- handler='click'
1412
- content={
1413
- <ReqoreMenu size={rest.size} maxHeight='400px' style={{ overflow: 'auto' }}>
1414
- {showFunctionsDropdown ?
1415
- functions.loading ?
1416
- <ReqoreSkeleton size={rest.size} />
1417
- : <ReqoreButton
1418
- compact
1419
- transparent
1420
- label='Use Expression'
1421
- className='function-selector'
1422
- icon='Functions'
1423
- tooltip='Run a function on this value'
1424
- onClick={handleSelectFunctionChange}
1425
- />
1426
-
1427
- : null}
1428
-
1429
- {showTemplatesButton ?
1430
- <ReqoreButton
1431
- transparent
1432
- icon='MoneyDollarCircleLine'
1433
- className='template-toggle'
1434
- tooltip={'Use a template'}
1435
- compact
1436
- size={rest.size}
1437
- onClick={handleTemplateToggleClick}
1438
- >
1439
- {' '}
1440
- Use Template{' '}
1441
- </ReqoreButton>
1442
- : null}
1443
-
1444
- {showCustomValueButton ?
1445
- <ReqoreButton
1446
- transparent
1447
- icon='EditLine'
1448
- className='template-custom-value'
1449
- tooltip='Write the value here instead of choosing a template'
1450
- compact
1451
- size={rest.size}
1452
- onClick={handleUseCustomValueClick}
1453
- >
1454
- {' '}
1455
- Use Custom Value{' '}
1456
- </ReqoreButton>
1457
- : null}
1458
-
1459
- {size(menuActions?.items) > 0 ?
1460
- <MenuActionsSection
1461
- actions={menuActions}
1462
- size={rest.size}
1463
- startExpanded={loneSectionStartsExpanded}
1464
- />
1465
- : null}
1466
-
1467
- {size(menuItems) > 0 ?
1468
- <CustomMenuItems
1469
- items={menuItems}
1470
- setIsTemplate={setIsTemplate}
1471
- setTemplateValue={setTemplateValue}
1472
- startExpanded={loneSectionStartsExpanded}
1473
- />
1474
- : null}
1475
-
1476
- {size(menuTrailingItems) > 0 ?
1477
- <MenuTrailingItems items={menuTrailingItems} size={rest.size} />
1478
- : null}
1479
- </ReqoreMenu>
1480
- }
1481
- />
1482
- );
1483
- }
1484
-
1485
- return null;
1486
- }, [
1487
- allowFunctions,
1488
- functions.expressions,
1489
- handleSelectFunctionChange,
1490
- handleTemplateToggleClick,
1491
- handleUseCustomValueClick,
1492
- hasOnlyAllowedValues,
1493
- isTemplate,
1494
- rest.readonly,
1495
- rest.size,
1496
- showTemplateToggle,
1497
- // reaches the menu through `templateSupportsCustomValues`
1498
- allowCustomValues,
1499
- hasOnlyExpressions,
1500
- type,
1501
- value,
1502
- menuItems,
1503
- menuActions,
1504
- menuTrailingItems,
1505
- internalIsFunction,
1506
- effectiveIsFunction,
1507
- hasInputAffordance,
1508
- // the row decides whether this field draws a menu at all
1509
- rowMenu,
1510
- ]);
1511
-
1512
- // When the type is a list, and it has an element type - that element type is different
1513
- // from the field type, so we need to send down the full templates object
1514
- // and the actual rendered field will filter it's own templates
1515
- // This is a special case only for lists with element types
1516
- /* `undefined` when nothing is on offer, rather than a list with no items:
1517
- an editor given a list draws the control that opens it, so a field whose
1518
- templates were all filtered out by type opened an EMPTY menu. */
1519
- const componentTemplates = useMemo(() => {
1520
- if (type === 'list' && (rest.ui_element_type || rest.element_type)) {
1521
- return templates;
1522
- }
1523
- return size(filteredTemplates?.items) ?
1524
- {
1525
- ...filteredTemplates,
1526
- ...TemplatesListProps,
1527
- }
1528
- : undefined;
1529
- }, [
1530
- JSON.stringify(filteredTemplates),
1531
- // the list-with-element-type branch hands this back untouched
1532
- templates,
1533
- rest.ui_element_type,
1534
- rest.element_type,
1535
- type,
1536
- ]);
1537
-
1538
- if (effectiveIsFunction && !hasOnlyAllowedValues) {
1539
- // SEAM (reqraft): `allowTextExpressions` swaps the IDE's bare builder
1540
- // for the ExpressionField shell (Visual = the same builder, Text = the
1541
- // DPQL editor). `handleExpressionChange` serves both — the shell emits
1542
- // the identical `({ is_expression, value }, remove)` contract.
1543
- if (allowTextExpressions) {
1544
- return (
1545
- <ReqoreControlGroup>
1546
- <ReqoreErrorBoundary>
1547
- <ExpressionField
1548
- value={{
1549
- is_expression: true,
1550
- value,
1551
- }}
1552
- // The host's per-ui_type editors reach this field through the
1553
- // rest-spread; the expression shell needs them explicitly or the
1554
- // builder's operands render "Unknown type!" for any consumer
1555
- // ui_type (an assertion's `test-reference` Value, for one).
1556
- componentOverrides={componentOverrides}
1557
- localTemplates={templates}
1558
- type={type as string}
1559
- returnType={(returnType || expressionDataType) as any}
1560
- onChange={handleExpressionChange}
1561
- readOnly={rest.readOnly || rest.disabled}
1562
- expressions={rest.expressions}
1563
- expressionsUrl={rest.expressions_url}
1564
- // the record's fields for the Text view, from the field's schema (`dpql_fields`)
1565
- fields={rest.dpql_fields}
1566
- serverHandled={rest.server_expression_handling}
1567
- extraActions={extraActions}
1568
- size={rest.size}
1569
- // An author who typed the expression as text is already
1570
- // writing in that language — dropping them into the visual
1571
- // builder would make them find their own sentence again.
1572
- defaultMode={expressionFromText !== null ? 'text' : 'visual'}
1573
- reorder={reorder}
1574
- />
1575
- </ReqoreErrorBoundary>
1576
- {expressionFromText !== null ?
1577
- <ReqoreButton
1578
- fixed
1579
- compact
1580
- minimal
1581
- icon='ArrowGoBackLine'
1582
- // No `intent` with `minimal`: a Reqore intent is a FILL, and
1583
- // `muted` as TEXT is 1.3:1 on the app surface.
1584
- size={rest.size}
1585
- className='dpql-detected-undo'
1586
- tooltip={`Keep "${expressionFromText}" as plain text instead`}
1587
- onClick={undoExpressionFromText}
1588
- >
1589
- Undo
1590
- </ReqoreButton>
1591
- : null}
1592
- {renderControls()}
1593
- </ReqoreControlGroup>
1594
- );
1595
- }
1596
-
1597
- return (
1598
- <ReqoreControlGroup>
1599
- <ReqoreErrorBoundary>
1600
- <ExpressionBuilder
1601
- value={{
1602
- is_expression: true,
1603
- value,
1604
- }}
1605
- componentOverrides={componentOverrides}
1606
- localTemplates={templates}
1607
- level={level}
1608
- type={type as string}
1609
- returnType={(returnType || expressionDataType) as any}
1610
- onChange={handleExpressionChange}
1611
- readOnly={rest.readOnly || rest.disabled}
1612
- expressions={rest.expressions}
1613
- expressionsUrl={rest.expressions_url}
1614
- serverHandled={rest.server_expression_handling}
1615
- extraActions={extraActions}
1616
- reorder={reorder}
1617
- />
1618
- </ReqoreErrorBoundary>
1619
- {renderControls()}
1620
- </ReqoreControlGroup>
1621
- );
1622
- }
1623
-
1624
- if (rest.disabled) {
1625
- if (isTemplate) {
1626
- // SEAM (reqraft): the IDE renders a bare `<ReqoreTag label={templateValue}/>`
1627
- // here; reqraft upgrades the read-only template to a proper picker chip —
1628
- // the $-dollar icon + resolved display name + app image, coloured by the
1629
- // IDE's intent scheme. Shared with the compact read-first row.
1630
- return <ReadOnlyTemplateTag value={templateValue} templates={templates} size={rest.size} />;
1631
- }
1632
-
1633
- return (
1634
- <Comp
1635
- value={value}
1636
- onChange={onChange}
1637
- name={name}
1638
- {...rest}
1639
- componentOverrides={componentOverrides}
1640
- />
1641
- );
1642
- }
1643
-
1644
- return (
1645
- <ReqoreControlGroup
1646
- fluid={rest.fluid}
1647
- fixed={rest.fixed}
1648
- size={rest.size}
1649
- {...rest}
1650
- stack={false}
1651
- verticalAlign='flex-start'
1652
- >
1653
- {!isTemplate && allowCustomValues ?
1654
- <Component
1655
- value={value}
1656
- allowTemplates={allowTemplates}
1657
- onChange={onChange}
1658
- name={name}
1659
- level={level}
1660
- {...rest}
1661
- componentOverrides={componentOverrides}
1662
- {...componentTypeProp}
1663
- aria-label={fieldAriaLabel}
1664
- className={`${className} template-selector`}
1665
- templates={componentTemplates}
1666
- />
1667
- : null}
1668
-
1669
- {/* Template mode's editor for a value that can also be typed: each
1670
- reference in it is a chip named as the catalogue names it, while the
1671
- field still stores the plain string. A textarea spelled a chosen
1672
- template `$local:name` wherever it was edited — in the Visual
1673
- builder's operands, in every string field that takes templates. */}
1674
- {isTemplate && templateSupportsCustomValues && !templateValueIsBracedToken ?
1675
- <RichTextFormField
1676
- className='template-selector'
1677
- valueFormat='text'
1678
- singleLine={isSingleLineStringType('string')}
1679
- value={typeof templateValue === 'string' ? templateValue : ''}
1680
- templates={filteredTemplates}
1681
- allowTemplates
1682
- onChange={handleTemplateTextChange}
1683
- {...rest}
1684
- aria-label={fieldAriaLabel}
1685
- />
1686
- : null}
1687
-
1688
- {dpqlOffer ?
1689
- <ReqoreControlGroup fixed stack size={rest.size}>
1690
- <ReqoreButton
1691
- compact
1692
- icon='Functions'
1693
- intent='info'
1694
- className='dpql-detected-offer'
1695
- tooltip={`"${dpqlOffer.text}" reads as an expression. It is also valid text here, so nothing has been changed — use it as an expression?`}
1696
- onClick={acceptDpqlOffer}
1697
- >
1698
- Use as expression
1699
- </ReqoreButton>
1700
- <ReqoreButton
1701
- compact
1702
- icon='CloseLine'
1703
- intent='info'
1704
- className='dpql-detected-dismiss'
1705
- tooltip='Keep it as plain text'
1706
- onClick={declineDpqlOffer}
1707
- />
1708
- </ReqoreControlGroup>
1709
- : null}
1710
-
1711
- {(
1712
- showTemplatesDropdown ||
1713
- (isTemplate && templateSupportsCustomValues && templateValueIsBracedToken)
1714
- ) ?
1715
- <TemplateDropdownSelector
1716
- allowCustomValues={allowCustomValues}
1717
- templates={templates}
1718
- value={templateValue}
1719
- items={filteredTemplates?.items}
1720
- onItemSelect={handleSelectTemplateFromList}
1721
- onRemoveClick={handleRemoveTemplateClick}
1722
- size={rest.size}
1723
- label={label}
1724
- hasOnlyAllowedValues={hasOnlyAllowedValues}
1725
- />
1726
- : null}
1727
-
1728
- {renderControls()}
1729
- </ReqoreControlGroup>
1730
- );
1731
- }
1732
- );
1733
-
1734
- /**
1735
- * The row channel belongs to the row's OWN editor: this field. It is read here
1736
- * and hidden from everything this field renders, so a field nested inside it —
1737
- * an expression operand, a list item — keeps drawing its own menu instead of
1738
- * publishing actions into a row menu that cannot say which value they act on.
1739
- * `undefined` outside a row, where this field draws its own menu too.
1740
- */
1741
- export const TemplateField = memo((props: ITemplateFieldProps) => {
1742
- const rowMenu = useRowMenu();
1743
-
1744
- return (
1745
- <RowMenuContext.Provider value={undefined}>
1746
- <TemplateFieldImpl {...props} rowMenu={rowMenu} />
1747
- </RowMenuContext.Provider>
1748
- );
1749
- });