@qoretechnologies/reqraft 0.10.25 → 0.10.26

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 (310) hide show
  1. package/.claude/CLAUDE.md +52 -23
  2. package/design/COMPACT_ENGINE_REDESIGN.md +156 -0
  3. package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +353 -0
  4. package/dist/components/FocusedEditing/index.d.ts +9 -1
  5. package/dist/components/FocusedEditing/index.d.ts.map +1 -1
  6. package/dist/components/FocusedEditing/index.js +2 -2
  7. package/dist/components/FocusedEditing/index.js.map +1 -1
  8. package/dist/components/composer/Composer.d.ts +108 -0
  9. package/dist/components/composer/Composer.d.ts.map +1 -0
  10. package/dist/components/composer/Composer.js +238 -0
  11. package/dist/components/composer/Composer.js.map +1 -0
  12. package/dist/components/composer/helpers.d.ts +21 -0
  13. package/dist/components/composer/helpers.d.ts.map +1 -0
  14. package/dist/components/composer/helpers.js +75 -0
  15. package/dist/components/composer/helpers.js.map +1 -0
  16. package/dist/components/composer/index.d.ts +3 -0
  17. package/dist/components/composer/index.d.ts.map +1 -0
  18. package/dist/components/composer/index.js +19 -0
  19. package/dist/components/composer/index.js.map +1 -0
  20. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  21. package/dist/components/form/engine/CompactRow.js +307 -110
  22. package/dist/components/form/engine/CompactRow.js.map +1 -1
  23. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  24. package/dist/components/form/engine/CompactToolbar.js +123 -106
  25. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  26. package/dist/components/form/engine/FormEngine.d.ts +107 -11
  27. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  28. package/dist/components/form/engine/FormEngine.js +618 -179
  29. package/dist/components/form/engine/FormEngine.js.map +1 -1
  30. package/dist/components/form/engine/compactRowContext.d.ts +9 -0
  31. package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
  32. package/dist/components/form/engine/compactRowContext.js.map +1 -1
  33. package/dist/components/form/engine/compactRowStyles.d.ts +7 -3
  34. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  35. package/dist/components/form/engine/compactRowStyles.js +88 -51
  36. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  37. package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
  38. package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
  39. package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
  40. package/dist/components/form/engine/optionActions.d.ts +28 -0
  41. package/dist/components/form/engine/optionActions.d.ts.map +1 -0
  42. package/dist/components/form/engine/optionActions.js +18 -0
  43. package/dist/components/form/engine/optionActions.js.map +1 -0
  44. package/dist/components/form/engine/readFirst.d.ts +63 -2
  45. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  46. package/dist/components/form/engine/readFirst.js +121 -6
  47. package/dist/components/form/engine/readFirst.js.map +1 -1
  48. package/dist/components/form/engine/rendererTypes.d.ts +35 -0
  49. package/dist/components/form/engine/rendererTypes.d.ts.map +1 -0
  50. package/dist/components/form/engine/rendererTypes.js +63 -0
  51. package/dist/components/form/engine/rendererTypes.js.map +1 -0
  52. package/dist/components/form/engine/variants/VariantCalmTable.d.ts +6 -0
  53. package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -0
  54. package/dist/components/form/engine/variants/VariantCalmTable.js +94 -0
  55. package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -0
  56. package/dist/components/form/engine/variants/VariantCards.d.ts +6 -0
  57. package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -0
  58. package/dist/components/form/engine/variants/VariantCards.js +80 -0
  59. package/dist/components/form/engine/variants/VariantCards.js.map +1 -0
  60. package/dist/components/form/engine/variants/VariantFocus.d.ts +7 -0
  61. package/dist/components/form/engine/variants/VariantFocus.d.ts.map +1 -0
  62. package/dist/components/form/engine/variants/VariantFocus.js +138 -0
  63. package/dist/components/form/engine/variants/VariantFocus.js.map +1 -0
  64. package/dist/components/form/engine/variants/VariantMinimal.d.ts +6 -0
  65. package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -0
  66. package/dist/components/form/engine/variants/VariantMinimal.js +73 -0
  67. package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -0
  68. package/dist/components/form/engine/variants/focusDemo.d.ts +13 -0
  69. package/dist/components/form/engine/variants/focusDemo.d.ts.map +1 -0
  70. package/dist/components/form/engine/variants/focusDemo.js +139 -0
  71. package/dist/components/form/engine/variants/focusDemo.js.map +1 -0
  72. package/dist/components/form/engine/variants/variantModel.d.ts +70 -0
  73. package/dist/components/form/engine/variants/variantModel.d.ts.map +1 -0
  74. package/dist/components/form/engine/variants/variantModel.js +133 -0
  75. package/dist/components/form/engine/variants/variantModel.js.map +1 -0
  76. package/dist/components/form/engine/variants/variantParts.d.ts +79 -0
  77. package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -0
  78. package/dist/components/form/engine/variants/variantParts.js +191 -0
  79. package/dist/components/form/engine/variants/variantParts.js.map +1 -0
  80. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  81. package/dist/components/form/expressions/builder/index.js +13 -2
  82. package/dist/components/form/expressions/builder/index.js.map +1 -1
  83. package/dist/components/form/expressions/useExpressions.d.ts.map +1 -1
  84. package/dist/components/form/expressions/useExpressions.js +4 -1
  85. package/dist/components/form/expressions/useExpressions.js.map +1 -1
  86. package/dist/components/form/fields/Field.d.ts.map +1 -1
  87. package/dist/components/form/fields/Field.js +5 -3
  88. package/dist/components/form/fields/Field.js.map +1 -1
  89. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +2 -1
  90. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  91. package/dist/components/form/fields/allowed-values/AllowedValues.js +8 -26
  92. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  93. package/dist/components/form/fields/auto/AutoFormField.d.ts +3 -0
  94. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  95. package/dist/components/form/fields/auto/AutoFormField.js +42 -8
  96. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  97. package/dist/components/form/fields/binary/Binary.d.ts +15 -0
  98. package/dist/components/form/fields/binary/Binary.d.ts.map +1 -0
  99. package/dist/components/form/fields/binary/Binary.js +74 -0
  100. package/dist/components/form/fields/binary/Binary.js.map +1 -0
  101. package/dist/components/form/fields/boolean/Boolean.js +1 -1
  102. package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
  103. package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
  104. package/dist/components/form/fields/multi-select/MultiSelectFormField.js +5 -4
  105. package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
  106. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  107. package/dist/components/form/fields/select/Select.js +29 -12
  108. package/dist/components/form/fields/select/Select.js.map +1 -1
  109. package/dist/components/form/fields/select/SelectCollection.d.ts +8 -2
  110. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  111. package/dist/components/form/fields/select/SelectCollection.js +52 -16
  112. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  113. package/dist/components/form/index.d.ts +2 -0
  114. package/dist/components/form/index.d.ts.map +1 -1
  115. package/dist/components/form/index.js +2 -0
  116. package/dist/components/form/index.js.map +1 -1
  117. package/dist/components/imageLightbox/ImageLightbox.d.ts +21 -0
  118. package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -0
  119. package/dist/components/imageLightbox/ImageLightbox.js +169 -0
  120. package/dist/components/imageLightbox/ImageLightbox.js.map +1 -0
  121. package/dist/components/imageLightbox/index.d.ts +2 -0
  122. package/dist/components/imageLightbox/index.d.ts.map +1 -0
  123. package/dist/components/imageLightbox/index.js +18 -0
  124. package/dist/components/imageLightbox/index.js.map +1 -0
  125. package/dist/components/searchFilterBar/SearchFilterBar.d.ts +33 -0
  126. package/dist/components/searchFilterBar/SearchFilterBar.d.ts.map +1 -0
  127. package/dist/components/searchFilterBar/SearchFilterBar.js +76 -0
  128. package/dist/components/searchFilterBar/SearchFilterBar.js.map +1 -0
  129. package/dist/components/searchFilterBar/index.d.ts +2 -0
  130. package/dist/components/searchFilterBar/index.d.ts.map +1 -0
  131. package/dist/components/searchFilterBar/index.js +18 -0
  132. package/dist/components/searchFilterBar/index.js.map +1 -0
  133. package/dist/components/supportTicket/AttachmentChips.d.ts +10 -0
  134. package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -0
  135. package/dist/components/supportTicket/AttachmentChips.js +122 -0
  136. package/dist/components/supportTicket/AttachmentChips.js.map +1 -0
  137. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +43 -0
  138. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -0
  139. package/dist/components/supportTicket/InterfaceReferenceTags.js +31 -0
  140. package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -0
  141. package/dist/components/supportTicket/ReferencePicker.d.ts +87 -0
  142. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -0
  143. package/dist/components/supportTicket/ReferencePicker.js +295 -0
  144. package/dist/components/supportTicket/ReferencePicker.js.map +1 -0
  145. package/dist/components/supportTicket/TicketHeader.d.ts +86 -0
  146. package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -0
  147. package/dist/components/supportTicket/TicketHeader.js +149 -0
  148. package/dist/components/supportTicket/TicketHeader.js.map +1 -0
  149. package/dist/components/supportTicket/TicketMetaTags.d.ts +32 -0
  150. package/dist/components/supportTicket/TicketMetaTags.d.ts.map +1 -0
  151. package/dist/components/supportTicket/TicketMetaTags.js +21 -0
  152. package/dist/components/supportTicket/TicketMetaTags.js.map +1 -0
  153. package/dist/components/supportTicket/TicketReplyBox.d.ts +63 -0
  154. package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -0
  155. package/dist/components/supportTicket/TicketReplyBox.js +115 -0
  156. package/dist/components/supportTicket/TicketReplyBox.js.map +1 -0
  157. package/dist/components/supportTicket/attachmentAccess.d.ts +37 -0
  158. package/dist/components/supportTicket/attachmentAccess.d.ts.map +1 -0
  159. package/dist/components/supportTicket/attachmentAccess.js +132 -0
  160. package/dist/components/supportTicket/attachmentAccess.js.map +1 -0
  161. package/dist/components/supportTicket/fileToAttachment.d.ts +9 -0
  162. package/dist/components/supportTicket/fileToAttachment.d.ts.map +1 -0
  163. package/dist/components/supportTicket/fileToAttachment.js +28 -0
  164. package/dist/components/supportTicket/fileToAttachment.js.map +1 -0
  165. package/dist/components/supportTicket/index.d.ts +11 -0
  166. package/dist/components/supportTicket/index.d.ts.map +1 -0
  167. package/dist/components/supportTicket/index.js +27 -0
  168. package/dist/components/supportTicket/index.js.map +1 -0
  169. package/dist/components/supportTicket/meta.d.ts +71 -0
  170. package/dist/components/supportTicket/meta.d.ts.map +1 -0
  171. package/dist/components/supportTicket/meta.js +115 -0
  172. package/dist/components/supportTicket/meta.js.map +1 -0
  173. package/dist/components/supportTicket/ticketModel.d.ts +102 -0
  174. package/dist/components/supportTicket/ticketModel.d.ts.map +1 -0
  175. package/dist/components/supportTicket/ticketModel.js +3 -0
  176. package/dist/components/supportTicket/ticketModel.js.map +1 -0
  177. package/dist/components/ticketReferences/TicketReferences.d.ts +52 -0
  178. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -0
  179. package/dist/components/ticketReferences/TicketReferences.js +492 -0
  180. package/dist/components/ticketReferences/TicketReferences.js.map +1 -0
  181. package/dist/components/ticketReferences/index.d.ts +3 -0
  182. package/dist/components/ticketReferences/index.d.ts.map +1 -0
  183. package/dist/components/ticketReferences/index.js +6 -0
  184. package/dist/components/ticketReferences/index.js.map +1 -0
  185. package/dist/components/ticketThread/TicketThread.d.ts +57 -0
  186. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -0
  187. package/dist/components/ticketThread/TicketThread.js +299 -0
  188. package/dist/components/ticketThread/TicketThread.js.map +1 -0
  189. package/dist/components/ticketThread/index.d.ts +3 -0
  190. package/dist/components/ticketThread/index.d.ts.map +1 -0
  191. package/dist/components/ticketThread/index.js +7 -0
  192. package/dist/components/ticketThread/index.js.map +1 -0
  193. package/dist/helpers/common.d.ts +5 -0
  194. package/dist/helpers/common.d.ts.map +1 -1
  195. package/dist/helpers/common.js +20 -1
  196. package/dist/helpers/common.js.map +1 -1
  197. package/dist/helpers/scrollbar.d.ts +2 -0
  198. package/dist/helpers/scrollbar.d.ts.map +1 -0
  199. package/dist/helpers/scrollbar.js +25 -0
  200. package/dist/helpers/scrollbar.js.map +1 -0
  201. package/dist/index.d.ts +8 -1
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +10 -1
  204. package/dist/index.js.map +1 -1
  205. package/dist/providers/StorageProvider.d.ts +13 -0
  206. package/dist/providers/StorageProvider.d.ts.map +1 -1
  207. package/dist/providers/StorageProvider.js +29 -5
  208. package/dist/providers/StorageProvider.js.map +1 -1
  209. package/package.json +6 -5
  210. package/src/components/FocusedEditing/index.tsx +17 -2
  211. package/src/components/composer/Composer.stories.tsx +238 -0
  212. package/src/components/composer/Composer.tsx +545 -0
  213. package/src/components/composer/helpers.ts +74 -0
  214. package/src/components/composer/index.ts +2 -0
  215. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +74 -2
  216. package/src/components/form/engine/CompactRow.tsx +561 -283
  217. package/src/components/form/engine/CompactToolbar.tsx +216 -182
  218. package/src/components/form/engine/FormEngine.stories.tsx +1736 -162
  219. package/src/components/form/engine/FormEngine.tsx +886 -170
  220. package/src/components/form/engine/FormEngineRemote.stories.tsx +377 -0
  221. package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +8 -0
  222. package/src/components/form/engine/compactRowContext.ts +14 -0
  223. package/src/components/form/engine/compactRowStyles.ts +273 -146
  224. package/src/components/form/engine/compactToolbarContext.ts +1 -0
  225. package/src/components/form/engine/optionActions.ts +40 -0
  226. package/src/components/form/engine/readFirst.ts +169 -10
  227. package/src/components/form/engine/rendererTypes.ts +55 -0
  228. package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +159 -0
  229. package/src/components/form/engine/variants/VariantCalmTable.tsx +242 -0
  230. package/src/components/form/engine/variants/VariantCards.tsx +212 -0
  231. package/src/components/form/engine/variants/VariantFocus.tsx +382 -0
  232. package/src/components/form/engine/variants/VariantMinimal.tsx +170 -0
  233. package/src/components/form/engine/variants/focusDemo.ts +145 -0
  234. package/src/components/form/engine/variants/variantModel.ts +216 -0
  235. package/src/components/form/engine/variants/variantParts.tsx +313 -0
  236. package/src/components/form/expressions/ExpressionField.stories.tsx +84 -2
  237. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +213 -19
  238. package/src/components/form/expressions/builder/index.tsx +12 -1
  239. package/src/components/form/expressions/useExpressions.ts +4 -1
  240. package/src/components/form/fields/Field.stories.tsx +40 -0
  241. package/src/components/form/fields/Field.tsx +10 -1
  242. package/src/components/form/fields/allowed-values/AllowedValues.tsx +13 -36
  243. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +64 -0
  244. package/src/components/form/fields/auto/AutoFormField.stories.tsx +146 -2
  245. package/src/components/form/fields/auto/AutoFormField.tsx +42 -1
  246. package/src/components/form/fields/binary/Binary.stories.tsx +122 -0
  247. package/src/components/form/fields/binary/Binary.tsx +81 -0
  248. package/src/components/form/fields/boolean/Boolean.stories.tsx +58 -0
  249. package/src/components/form/fields/boolean/Boolean.tsx +1 -1
  250. package/src/components/form/fields/byte-size/ByteSize.stories.tsx +24 -0
  251. package/src/components/form/fields/color/Color.stories.tsx +30 -0
  252. package/src/components/form/fields/cron/Cron.stories.tsx +8 -0
  253. package/src/components/form/fields/date/Date.stories.tsx +22 -0
  254. package/src/components/form/fields/file/File.stories.tsx +48 -0
  255. package/src/components/form/fields/long-string/LongString.stories.tsx +24 -0
  256. package/src/components/form/fields/markdown/Markdown.stories.tsx +8 -0
  257. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +14 -10
  258. package/src/components/form/fields/number/Number.stories.tsx +31 -0
  259. package/src/components/form/fields/object/Object.stories.tsx +88 -0
  260. package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +24 -0
  261. package/src/components/form/fields/rich-text/RichText.stories.tsx +23 -0
  262. package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +72 -0
  263. package/src/components/form/fields/select/Select.stories.tsx +108 -0
  264. package/src/components/form/fields/select/Select.tsx +38 -12
  265. package/src/components/form/fields/select/SelectCollection.tsx +78 -17
  266. package/src/components/form/fields/string/String.stories.tsx +16 -0
  267. package/src/components/form/fields/template/TemplateField.stories.tsx +160 -0
  268. package/src/components/form/fields/url/Url.stories.tsx +24 -0
  269. package/src/components/form/index.tsx +2 -0
  270. package/src/components/imageLightbox/ImageLightbox.stories.tsx +238 -0
  271. package/src/components/imageLightbox/ImageLightbox.tsx +236 -0
  272. package/src/components/imageLightbox/index.ts +1 -0
  273. package/src/components/log/Log.stories.tsx +96 -0
  274. package/src/components/menu/Menu.stories.tsx +54 -0
  275. package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +83 -37
  276. package/src/components/searchFilterBar/SearchFilterBar.tsx +131 -0
  277. package/src/components/searchFilterBar/index.ts +1 -0
  278. package/src/components/smartEditor/SmartEditor.stories.tsx +32 -0
  279. package/src/components/supportTicket/AttachmentChips.stories.tsx +171 -0
  280. package/src/components/supportTicket/AttachmentChips.tsx +147 -0
  281. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +171 -0
  282. package/src/components/supportTicket/InterfaceReferenceTags.tsx +96 -0
  283. package/src/components/supportTicket/ReferencePicker.stories.tsx +519 -0
  284. package/src/components/supportTicket/ReferencePicker.tsx +563 -0
  285. package/src/components/supportTicket/TicketConversation.stories.tsx +121 -0
  286. package/src/components/supportTicket/TicketHeader.stories.tsx +183 -0
  287. package/src/components/supportTicket/TicketHeader.tsx +247 -0
  288. package/src/components/supportTicket/TicketMetaTags.stories.tsx +103 -0
  289. package/src/components/supportTicket/TicketMetaTags.tsx +85 -0
  290. package/src/components/supportTicket/TicketReplyBox.stories.tsx +351 -0
  291. package/src/components/supportTicket/TicketReplyBox.tsx +146 -0
  292. package/src/components/supportTicket/attachmentAccess.ts +97 -0
  293. package/src/components/supportTicket/fileToAttachment.ts +24 -0
  294. package/src/components/supportTicket/index.ts +10 -0
  295. package/src/components/supportTicket/meta.ts +185 -0
  296. package/src/components/supportTicket/ticketModel.ts +131 -0
  297. package/src/components/ticketReferences/TicketReferences.stories.tsx +315 -0
  298. package/src/components/ticketReferences/TicketReferences.tsx +886 -0
  299. package/src/components/ticketReferences/index.ts +2 -0
  300. package/src/components/ticketThread/TicketThread.stories.tsx +828 -0
  301. package/src/components/ticketThread/TicketThread.tsx +704 -0
  302. package/src/components/ticketThread/index.ts +6 -0
  303. package/src/helpers/common.ts +19 -0
  304. package/src/helpers/scrollbar.ts +32 -0
  305. package/src/hooks/useFetch/useFetch.stories.tsx +30 -0
  306. package/src/hooks/useStorage/useStorage.stories.tsx +82 -0
  307. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +127 -1
  308. package/src/index.tsx +8 -1
  309. package/src/providers/StorageProvider.tsx +30 -4
  310. package/src/stores/currentUser/currentUser.stories.tsx +49 -0
@@ -3,19 +3,16 @@ import {
3
3
  ReqoreControlGroup,
4
4
  ReqoreDropdown,
5
5
  ReqoreInput,
6
- ReqoreMessage,
7
- ReqoreProgress,
8
- ReqoreSpan,
9
- ReqoreTag,
10
6
  } from '@qoretechnologies/reqore';
11
7
  import { IReqoreControlGroupProps } from '@qoretechnologies/reqore/dist/components/ControlGroup';
12
8
  import {
13
9
  IReqoreDropdownItem,
14
10
  TReqoreDropdownItems,
15
11
  } from '@qoretechnologies/reqore/dist/components/Dropdown/list';
12
+ import { useReqoreTheme } from '@qoretechnologies/reqore/dist/hooks/useTheme';
16
13
  import React, { memo } from 'react';
17
- import { useContext } from 'use-context-selector';
18
14
  import styled from 'styled-components';
15
+ import { useContext } from 'use-context-selector';
19
16
  import { CompactToolbarContext, TCompactSort } from './compactToolbarContext';
20
17
 
21
18
  // Field sort modes, listed in the Fields menu's "Sort by" submenu. 'schema' is
@@ -28,20 +25,79 @@ const SORT_MODES: { value: TCompactSort; label: string; tooltip: string }[] = [
28
25
  { value: 'invalid', label: 'Invalid first', tooltip: 'Fields needing attention first' },
29
26
  ];
30
27
 
31
- // Custom flex, not ReqoreControlGroup: the meter needs the middle bar to absorb
32
- // all width changes while the fixed-width labels never shrink/truncate and a
33
- // 12px gap that isn't on ReqoreControlGroup's gapSize scale (5 or 18). The
34
- // `flex: 1; min-width: 0` makes only the bar yield as the row narrows.
28
+ // "Focus" header: a summary line ({pct}% complete · {set}/{total} set ·
29
+ // {attention} need attention →) above a SEGMENTED metera green run (set) then
30
+ // an amber run (needs attention) then the empty remainder.
35
31
  const StyledCompletion = styled.div`
36
32
  display: flex;
37
- align-items: center;
38
- gap: 12px;
33
+ flex-flow: column;
34
+ gap: 8px;
39
35
  padding: 0 2px;
40
- & > .reqore-progress {
41
- flex: 1;
42
- min-width: 0;
36
+ `;
37
+ const StyledCompletionLine = styled.div`
38
+ display: flex;
39
+ align-items: baseline;
40
+ gap: 10px;
41
+ flex-wrap: wrap;
42
+ `;
43
+ const StyledMeter = styled.div<{
44
+ $set: number;
45
+ $attention: number;
46
+ $track: string;
47
+ $set_c: string;
48
+ $att_c: string;
49
+ }>`
50
+ position: relative;
51
+ height: 4px;
52
+ border-radius: 3px;
53
+ width: 100%;
54
+ overflow: hidden;
55
+ background: ${({ $track }) => $track};
56
+ /* No per-segment radius — the container's overflow:hidden + radius rounds only
57
+ the OUTER corners, so the green/amber runs meet flush (no notch). */
58
+ &::before,
59
+ &::after {
60
+ content: '';
61
+ position: absolute;
62
+ top: 0;
63
+ bottom: 0;
64
+ }
65
+ /* green run: 0 → set% */
66
+ &::before {
67
+ left: 0;
68
+ width: ${({ $set }) => $set}%;
69
+ background: ${({ $set_c }) => $set_c};
70
+ }
71
+ /* amber run: set% → set%+attention% */
72
+ &::after {
73
+ left: ${({ $set }) => $set}%;
74
+ width: ${({ $attention }) => $attention}%;
75
+ background: ${({ $att_c }) => $att_c};
76
+ }
77
+ `;
78
+ // One shared text size for the whole summary line, so "Draft", "1/6 set" and
79
+ // "N need attention" all read at the same scale (no chips, no size jumps).
80
+ const StyledSummary = styled.span<{ $color?: string }>`
81
+ font-size: 13px;
82
+ white-space: nowrap;
83
+ color: ${({ $color }) => $color || 'inherit'};
84
+ `;
85
+ const StyledAttentionLink = styled.span<{ $color: string }>`
86
+ color: ${({ $color }) => $color};
87
+ font-size: 13px;
88
+ cursor: pointer;
89
+ white-space: nowrap;
90
+ &:hover {
91
+ text-decoration: underline;
43
92
  }
44
93
  `;
94
+ // The percentage, pushed to the far right of the summary line.
95
+ const StyledPct = styled.span`
96
+ margin-left: auto;
97
+ font-weight: 700;
98
+ font-size: 17px;
99
+ white-space: nowrap;
100
+ `;
45
101
 
46
102
  /**
47
103
  * The compact form's sticky toolbar (completion meter + field filter + "Fields"
@@ -55,8 +111,8 @@ export const CompactToolbar = memo((reqoreProps: Partial<IReqoreControlGroupProp
55
111
  const {
56
112
  readOnly,
57
113
  invalidCount,
114
+ attentionCount,
58
115
  completion,
59
- showInvalidOnly,
60
116
  onToggleInvalidOnly,
61
117
  hasMultipleOptions,
62
118
  compactQuery,
@@ -70,7 +126,6 @@ export const CompactToolbar = memo((reqoreProps: Partial<IReqoreControlGroupProp
70
126
  showAllDescriptions,
71
127
  onToggleAllDescriptions,
72
128
  filteredCount,
73
- optionalFields,
74
129
  canRevert,
75
130
  onAddOptionalField,
76
131
  onAddAll,
@@ -78,188 +133,167 @@ export const CompactToolbar = memo((reqoreProps: Partial<IReqoreControlGroupProp
78
133
  onRevertAll,
79
134
  } = useContext(CompactToolbarContext);
80
135
 
136
+ const theme = useReqoreTheme();
137
+ const intents = (theme.intents || {}) as Record<string, string>;
138
+ const cSuccess = intents.success || '#4a7110';
139
+ const cWarning = intents.warning || '#d17c29';
140
+ const cText = (theme.text?.color as string) || '#e8e8e8';
141
+ const cTrack = `${cText}1f`;
142
+ const setPct = completion.total ? (completion.set / completion.total) * 100 : 0;
143
+ const attentionPct = completion.total ? (attentionCount / completion.total) * 100 : 0;
144
+
81
145
  return (
82
146
  <ReqoreControlGroup {...reqoreProps} vertical fluid fixed={false} gapSize='big'>
83
147
  {completion.total ?
84
148
  <StyledCompletion className='options-readfirst-completion'>
85
- {!readOnly ?
86
- invalidCount ?
87
- <ReqoreTag
88
- className='options-readfirst-status'
89
- label='Draft'
90
- intent='warning'
91
- icon='EditLine'
92
- minimal
93
- flat
94
- size='tiny'
95
- compact
96
- fixed
97
- effect={{ uppercase: true, spaced: 1 }}
98
- />
99
- : <ReqoreTag
149
+ <StyledCompletionLine>
150
+ {!readOnly ?
151
+ <StyledSummary
100
152
  className='options-readfirst-status'
101
- label='Ready'
102
- intent='success'
103
- icon='CheckLine'
104
- minimal
105
- flat
106
- size='tiny'
107
- compact
108
- fixed
109
- effect={{ uppercase: true, spaced: 1 }}
110
- />
111
-
112
- : null}
113
- <ReqoreSpan size='small' effect={{ opacity: 0.7, noWrap: true }}>
114
- {completion.set} / {completion.total} fields set
115
- </ReqoreSpan>
116
- <ReqoreProgress
153
+ $color={invalidCount ? cWarning : cSuccess}
154
+ style={{ fontWeight: 600 }}
155
+ >
156
+ {invalidCount ? 'Draft' : 'Ready'}
157
+ </StyledSummary>
158
+ : null}
159
+ <StyledSummary style={{ opacity: 0.5 }}>
160
+ {!readOnly ? '· ' : ''}
161
+ {completion.set}/{completion.total} set
162
+ {!readOnly && attentionCount ? ' ·' : ''}
163
+ </StyledSummary>
164
+ {!readOnly && attentionCount ?
165
+ <StyledAttentionLink
166
+ $color={cWarning}
167
+ className='options-readfirst-attention-link'
168
+ onClick={onToggleInvalidOnly}
169
+ >
170
+ {attentionCount} need attention →
171
+ </StyledAttentionLink>
172
+ : null}
173
+ <StyledPct>{completion.pct}%</StyledPct>
174
+ </StyledCompletionLine>
175
+ <StyledMeter
117
176
  className='options-readfirst-completion-bar'
118
- value={completion.pct}
119
- intent={completion.set === completion.total ? 'success' : 'info'}
120
- size='normal'
121
- flat
177
+ $set={setPct}
178
+ $attention={attentionPct}
179
+ $track={cTrack}
180
+ $set_c={cSuccess}
181
+ $att_c={cWarning}
122
182
  />
123
- <ReqoreSpan size='small' effect={{ opacity: 0.7, noWrap: true }}>
124
- {completion.pct}%
125
- </ReqoreSpan>
126
183
  </StyledCompletion>
127
184
  : null}
128
185
 
129
186
  {hasMultipleOptions || (invalidCount && !readOnly) ?
130
187
  <ReqoreControlGroup vertical fluid gapSize='normal'>
131
188
  {hasMultipleOptions ?
132
- <ReqoreControlGroup fluid verticalAlign='center'>
133
- <ReqoreInput
134
- fluid
135
- pill
136
- icon='Search2Line'
137
- iconColor='muted'
138
- placeholder='Filter fields...'
139
- value={compactQuery}
140
- intent={compactQuery ? 'info' : undefined}
141
- className='options-readfirst-search'
142
- onChange={(event: React.FormEvent<HTMLInputElement>) =>
143
- setCompactQuery(event.currentTarget.value)
144
- }
145
- onClearClick={() => setCompactQuery('')}
146
- />
147
- {!readOnly ?
148
- <ReqoreDropdown
149
- fixed
150
- minimal
151
- filterable
152
- icon='Filter3Line'
153
- label='Fields'
154
- className='options-readfirst-fields'
155
- intent={requiredOnly ? 'info' : undefined}
156
- badge={requiredOnly ? 'Required only' : undefined}
157
- onItemSelect={(item: IReqoreDropdownItem) =>
158
- item.value && onAddOptionalField(item.value)
159
- }
160
- items={
161
- [
162
- {
163
- label: 'Required only',
164
- selected: requiredOnly,
165
- icon: requiredOnly ? 'CheckboxCircleLine' : 'CheckboxBlankCircleLine',
166
- tooltip: 'Show only required fields',
167
- onClick: () => setRequiredOnly((value) => !value),
168
- },
169
- {
170
- label: 'Show field types',
171
- selected: showFieldTypes,
172
- icon: showFieldTypes ? 'CheckboxCircleLine' : 'CheckboxBlankCircleLine',
173
- tooltip: 'Annotate each field with its type',
174
- onClick: onToggleFieldTypes,
175
- },
176
- // Sort by — a submenu (collapsed by default) so the five modes
177
- // don't crowd the Fields menu. Reorders fields WITHIN each group
178
- // (groups + required-group rails preserved); the active non-
179
- // default mode shows as a badge on the parent.
180
- {
181
- label: 'Sort by',
182
- icon: 'ArrowUpDownLine',
183
- intent: compactSort !== 'schema' ? 'info' : undefined,
184
- badge:
185
- compactSort !== 'schema' ?
186
- SORT_MODES.find((mode) => mode.value === compactSort)?.label
187
- : undefined,
188
- items: SORT_MODES.map((mode) => ({
189
- label: mode.label,
190
- tooltip: mode.tooltip,
191
- selected: compactSort === mode.value,
192
- icon:
193
- compactSort === mode.value ?
194
- 'CheckboxCircleLine'
195
- : 'CheckboxBlankCircleLine',
196
- onClick: () => setCompactSort(mode.value),
197
- })),
198
- },
199
- {
200
- label: 'Select all',
201
- icon: 'MenuAddLine',
202
- tooltip: 'Add every optional field',
203
- disabled: filteredCount === 0,
204
- onClick: onAddAll,
205
- },
206
- {
207
- label: 'Default fields',
208
- icon: 'RestartLine',
209
- tooltip: 'Reset to the default set of fields',
210
- onClick: onResetDefaults,
211
- },
212
- {
213
- label: 'Revert all changes',
214
- icon: 'HistoryLine',
215
- tooltip: 'Undo all edits back to the loaded values',
216
- disabled: !canRevert,
217
- onClick: onRevertAll,
218
- },
219
- ...(filteredCount ?
189
+ <ReqoreControlGroup fluid verticalAlign='center'>
190
+ <ReqoreInput
191
+ fluid
192
+ pill
193
+ icon='Search2Line'
194
+ iconColor='muted'
195
+ placeholder='Filter fields...'
196
+ value={compactQuery}
197
+ intent={compactQuery ? 'info' : undefined}
198
+ className='options-readfirst-search'
199
+ onChange={(event: React.FormEvent<HTMLInputElement>) =>
200
+ setCompactQuery(event.currentTarget.value)
201
+ }
202
+ onClearClick={() => setCompactQuery('')}
203
+ />
204
+ {!readOnly ?
205
+ <ReqoreDropdown
206
+ fixed
207
+ flat
208
+ filterable
209
+ icon='Filter3Line'
210
+ tooltip='Fields'
211
+ className='options-readfirst-fields'
212
+ intent={requiredOnly ? 'info' : undefined}
213
+ badge={requiredOnly ? 'Required only' : undefined}
214
+ onItemSelect={(item: IReqoreDropdownItem) =>
215
+ item.value && onAddOptionalField(item.value)
216
+ }
217
+ items={
220
218
  [
221
219
  {
222
- label: 'Add optional fields',
223
- readOnly: true,
224
- disabled: true,
225
- icon: 'AddLine',
220
+ label: 'Required only',
221
+ selected: requiredOnly,
222
+ icon: requiredOnly ? 'CheckboxCircleLine' : 'CheckboxBlankCircleLine',
223
+ tooltip: 'Show only required fields',
224
+ onClick: () => setRequiredOnly((value) => !value),
226
225
  },
227
- ]
228
- : []),
229
- ...optionalFields.map((field) => ({
230
- label: field.display_name || field.value,
231
- value: field.value,
232
- description: field.short_desc,
233
- disabled: field.disabled,
234
- })),
235
- ] as TReqoreDropdownItems
236
- }
237
- />
238
- : null}
239
- <ReqoreButton
240
- fixed
241
- minimal
242
- icon={showAllDescriptions ? 'InformationFill' : 'InformationLine'}
243
- className='options-readfirst-descriptions'
244
- active={showAllDescriptions}
245
- intent={showAllDescriptions ? 'info' : undefined}
246
- tooltip={showAllDescriptions ? 'Hide all field information' : 'Show all field information'}
247
- onClick={onToggleAllDescriptions}
248
- />
249
- </ReqoreControlGroup>
250
- : null}
251
- {invalidCount && !readOnly ?
252
- <ReqoreMessage
253
- intent={showInvalidOnly ? 'info' : 'danger'}
254
- opaque={false}
255
- size='small'
256
- className='options-readfirst-invalid-banner'
257
- onClick={onToggleInvalidOnly}
258
- >
259
- {showInvalidOnly ?
260
- 'Showing invalid fields only. Click here again to show all fields.'
261
- : `${invalidCount < 2 ? 'A field is not valid and requires' : `${invalidCount} fields are not valid and require`} attention. Click here to only show invalid fields.`}
262
- </ReqoreMessage>
226
+ {
227
+ label: 'Show field types',
228
+ selected: showFieldTypes,
229
+ icon: showFieldTypes ? 'CheckboxCircleLine' : 'CheckboxBlankCircleLine',
230
+ tooltip: 'Annotate each field with its type',
231
+ onClick: onToggleFieldTypes,
232
+ },
233
+ // Sort by — a submenu (collapsed by default) so the five modes
234
+ // don't crowd the Fields menu. Reorders fields WITHIN each group
235
+ // (groups + required-group rails preserved); the active non-
236
+ // default mode shows as a badge on the parent.
237
+ {
238
+ label: 'Sort by',
239
+ icon: 'ArrowUpDownLine',
240
+ intent: compactSort !== 'schema' ? 'info' : undefined,
241
+ badge:
242
+ compactSort !== 'schema' ?
243
+ SORT_MODES.find((mode) => mode.value === compactSort)?.label
244
+ : undefined,
245
+ items: SORT_MODES.map((mode) => ({
246
+ label: mode.label,
247
+ tooltip: mode.tooltip,
248
+ selected: compactSort === mode.value,
249
+ icon:
250
+ compactSort === mode.value ?
251
+ 'CheckboxCircleLine'
252
+ : 'CheckboxBlankCircleLine',
253
+ onClick: () => setCompactSort(mode.value),
254
+ })),
255
+ },
256
+ {
257
+ label: 'Select all',
258
+ icon: 'MenuAddLine',
259
+ tooltip: 'Add every optional field',
260
+ disabled: filteredCount === 0,
261
+ onClick: onAddAll,
262
+ },
263
+ {
264
+ label: 'Default fields',
265
+ icon: 'RestartLine',
266
+ tooltip: 'Reset to the default set of fields',
267
+ onClick: onResetDefaults,
268
+ },
269
+ {
270
+ label: 'Revert all changes',
271
+ icon: 'HistoryLine',
272
+ tooltip: 'Undo all edits back to the loaded values',
273
+ disabled: !canRevert,
274
+ onClick: onRevertAll,
275
+ },
276
+ // The individual not-yet-added fields are no longer listed here —
277
+ // they render as addable rows in the Optional box instead. The
278
+ // menu keeps only the bulk actions above (Select all / Default
279
+ // fields / filters).
280
+ ] as TReqoreDropdownItems
281
+ }
282
+ />
283
+ : null}
284
+ <ReqoreButton
285
+ fixed
286
+ flat
287
+ minimal={showAllDescriptions === true}
288
+ icon={showAllDescriptions ? 'InformationFill' : 'InformationLine'}
289
+ className='options-readfirst-descriptions'
290
+ intent={showAllDescriptions ? 'info' : undefined}
291
+ tooltip={
292
+ showAllDescriptions ? 'Hide all field information' : 'Show all field information'
293
+ }
294
+ onClick={onToggleAllDescriptions}
295
+ />
296
+ </ReqoreControlGroup>
263
297
  : null}
264
298
  </ReqoreControlGroup>
265
299
  : null}