cx 26.0.11 → 26.0.13

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 (366) hide show
  1. package/build/charts/ScatterGraph.d.ts +4 -4
  2. package/build/charts/ScatterGraph.js +2 -2
  3. package/build/data/ArrayElementView.spec.d.ts +1 -0
  4. package/build/data/ArrayElementView.spec.js +81 -0
  5. package/build/data/Binding.spec.d.ts +1 -0
  6. package/build/data/Binding.spec.js +61 -0
  7. package/build/data/Expression.spec.d.ts +1 -0
  8. package/build/data/Expression.spec.js +196 -0
  9. package/build/data/Grouper.spec.d.ts +1 -0
  10. package/build/data/Grouper.spec.js +48 -0
  11. package/build/data/Ref.spec.d.ts +1 -0
  12. package/build/data/Ref.spec.js +72 -0
  13. package/build/data/Selector.d.ts +1 -1
  14. package/build/data/Store.spec.d.ts +1 -0
  15. package/build/data/Store.spec.js +19 -0
  16. package/build/data/StoreRef.spec.d.ts +1 -0
  17. package/build/data/StoreRef.spec.js +22 -0
  18. package/build/data/StringTemplate.spec.d.ts +1 -0
  19. package/build/data/StringTemplate.spec.js +112 -0
  20. package/build/data/StructuredSelector.spec.d.ts +1 -0
  21. package/build/data/StructuredSelector.spec.js +102 -0
  22. package/build/data/View.spec.d.ts +1 -0
  23. package/build/data/View.spec.js +44 -0
  24. package/build/data/ZoomIntoPropertyView.spec.d.ts +1 -0
  25. package/build/data/ZoomIntoPropertyView.spec.js +54 -0
  26. package/build/data/comparer.spec.d.ts +1 -0
  27. package/build/data/comparer.spec.js +50 -0
  28. package/build/data/computable.d.ts +3 -6
  29. package/build/data/computable.spec.d.ts +1 -0
  30. package/build/data/computable.spec.js +56 -0
  31. package/build/data/createAccessorModelProxy.d.ts +5 -3
  32. package/build/data/createAccessorModelProxy.spec.d.ts +1 -0
  33. package/build/data/createAccessorModelProxy.spec.js +30 -0
  34. package/build/data/createStructuredSelector.spec.d.ts +1 -0
  35. package/build/data/createStructuredSelector.spec.js +42 -0
  36. package/build/data/diff/diffs.spec.d.ts +1 -0
  37. package/build/data/diff/diffs.spec.js +45 -0
  38. package/build/data/getAccessor.spec.d.ts +1 -0
  39. package/build/data/getAccessor.spec.js +10 -0
  40. package/build/data/getSelector.spec.d.ts +1 -0
  41. package/build/data/getSelector.spec.js +36 -0
  42. package/build/data/ops/append.spec.d.ts +1 -0
  43. package/build/data/ops/append.spec.js +24 -0
  44. package/build/data/ops/filter.spec.d.ts +1 -0
  45. package/build/data/ops/filter.spec.js +25 -0
  46. package/build/data/ops/findTreeNode.d.ts +1 -1
  47. package/build/data/ops/findTreeNode.js +1 -1
  48. package/build/data/ops/findTreeNode.spec.d.ts +1 -0
  49. package/build/data/ops/findTreeNode.spec.js +20 -0
  50. package/build/data/ops/findTreePath.d.ts +1 -1
  51. package/build/data/ops/merge.spec.d.ts +1 -0
  52. package/build/data/ops/merge.spec.js +23 -0
  53. package/build/data/ops/removeTreeNodes.d.ts +1 -1
  54. package/build/data/ops/removeTreeNodes.js +1 -1
  55. package/build/data/ops/removeTreeNodes.spec.d.ts +1 -0
  56. package/build/data/ops/removeTreeNodes.spec.js +35 -0
  57. package/build/data/ops/updateArray.spec.d.ts +1 -0
  58. package/build/data/ops/updateArray.spec.js +33 -0
  59. package/build/data/ops/updateTree.d.ts +1 -1
  60. package/build/data/ops/updateTree.spec.d.ts +1 -0
  61. package/build/data/ops/updateTree.spec.js +44 -0
  62. package/build/hooks/invokeCallback.spec.d.ts +1 -0
  63. package/build/hooks/invokeCallback.spec.js +44 -0
  64. package/build/hooks/resolveCallback.spec.d.ts +1 -0
  65. package/build/hooks/resolveCallback.spec.js +35 -0
  66. package/build/hooks/store.spec.d.ts +1 -0
  67. package/build/hooks/store.spec.js +48 -0
  68. package/build/hooks/useTrigger.spec.d.ts +1 -0
  69. package/build/hooks/useTrigger.spec.js +59 -0
  70. package/build/jsx-runtime.d.ts +10 -10
  71. package/build/jsx-runtime.js +6 -0
  72. package/build/svg/util/Rect.d.ts +1 -1
  73. package/build/ui/ContentResolver.d.ts +16 -6
  74. package/build/ui/Controller.d.ts +7 -0
  75. package/build/ui/Controller.js +2 -1
  76. package/build/ui/Controller.spec.d.ts +1 -0
  77. package/build/ui/Controller.spec.js +247 -0
  78. package/build/ui/Cx.spec.d.ts +1 -0
  79. package/build/ui/Cx.spec.js +153 -0
  80. package/build/ui/DataProxy.spec.d.ts +1 -0
  81. package/build/ui/DataProxy.spec.js +208 -0
  82. package/build/ui/Instance.d.ts +1 -1
  83. package/build/ui/Instance.js +10 -10
  84. package/build/ui/IsolatedScope.spec.d.ts +1 -0
  85. package/build/ui/IsolatedScope.spec.js +42 -0
  86. package/build/ui/Prop.d.ts +12 -1
  87. package/build/ui/PureContainer.spec.d.ts +1 -0
  88. package/build/ui/PureContainer.spec.js +149 -0
  89. package/build/ui/Repeater.d.ts +3 -3
  90. package/build/ui/Repeater.spec.d.ts +1 -0
  91. package/build/ui/Repeater.spec.js +109 -0
  92. package/build/ui/Rescope.spec.d.ts +1 -0
  93. package/build/ui/Rescope.spec.js +134 -0
  94. package/build/ui/Restate.spec.d.ts +1 -0
  95. package/build/ui/Restate.spec.js +257 -0
  96. package/build/ui/Text.d.ts +14 -2
  97. package/build/ui/Text.js +3 -0
  98. package/build/ui/adapter/ArrayAdapter.js +4 -1
  99. package/build/ui/adapter/ArrayAdapter.spec.d.ts +1 -0
  100. package/build/ui/adapter/ArrayAdapter.spec.js +44 -0
  101. package/build/ui/adapter/TreeAdapter.spec.d.ts +1 -0
  102. package/build/ui/adapter/TreeAdapter.spec.js +71 -0
  103. package/build/ui/app/Url.spec.d.ts +1 -0
  104. package/build/ui/app/Url.spec.js +43 -0
  105. package/build/ui/app/startHotAppLoop.js +1 -1
  106. package/build/ui/createFunctionalComponent.d.ts +14 -1
  107. package/build/ui/createFunctionalComponent.js +7 -4
  108. package/build/ui/createFunctionalComponent.spec.d.ts +1 -0
  109. package/build/ui/createFunctionalComponent.spec.js +272 -0
  110. package/build/ui/expr.d.ts +3 -1
  111. package/build/ui/exprHelpers.d.ts +32 -0
  112. package/build/ui/exprHelpers.js +61 -0
  113. package/build/ui/index.d.ts +1 -0
  114. package/build/ui/index.js +1 -0
  115. package/build/ui/layout/ContentPlaceholder.spec.d.ts +1 -0
  116. package/build/ui/layout/ContentPlaceholder.spec.js +333 -0
  117. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +1 -0
  118. package/build/ui/layout/FirstVisibleChildLayout.spec.js +101 -0
  119. package/build/ui/selection/KeySelection.d.ts +0 -8
  120. package/build/ui/selection/Selection.d.ts +9 -3
  121. package/build/util/Console.d.ts +1 -0
  122. package/build/util/Console.js +7 -3
  123. package/build/util/Format.spec.d.ts +1 -0
  124. package/build/util/Format.spec.js +58 -0
  125. package/build/util/TraversalStack.spec.d.ts +1 -0
  126. package/build/util/TraversalStack.spec.js +43 -0
  127. package/build/util/date/upperBoundCheck.spec.d.ts +1 -0
  128. package/build/util/date/upperBoundCheck.spec.js +22 -0
  129. package/build/util/getSearchQueryPredicate.spec.d.ts +1 -0
  130. package/build/util/getSearchQueryPredicate.spec.js +33 -0
  131. package/build/util/isValidIdentifierName.spec.d.ts +1 -0
  132. package/build/util/isValidIdentifierName.spec.js +28 -0
  133. package/build/util/routeAppend.spec.d.ts +1 -0
  134. package/build/util/routeAppend.spec.js +14 -0
  135. package/build/widgets/AccessorBindings.spec.d.ts +1 -0
  136. package/build/widgets/AccessorBindings.spec.js +40 -0
  137. package/build/widgets/Button.d.ts +3 -6
  138. package/build/widgets/Button.js +1 -1
  139. package/build/widgets/DocumentTitle.d.ts +2 -0
  140. package/build/widgets/Heading.d.ts +2 -2
  141. package/build/widgets/HtmlElement.d.ts +33 -8
  142. package/build/widgets/HtmlElement.js +7 -9
  143. package/build/widgets/HtmlElement.spec.d.ts +1 -0
  144. package/build/widgets/HtmlElement.spec.js +38 -0
  145. package/build/widgets/Icon.d.ts +3 -13
  146. package/build/widgets/List.d.ts +4 -0
  147. package/build/widgets/ReactElementWrapper.d.ts +29 -0
  148. package/build/widgets/ReactElementWrapper.js +59 -0
  149. package/build/widgets/drag-drop/DragSource.d.ts +3 -3
  150. package/build/widgets/drag-drop/DragSource.js +2 -3
  151. package/build/widgets/drag-drop/DropZone.d.ts +3 -3
  152. package/build/widgets/drag-drop/DropZone.js +2 -3
  153. package/build/widgets/form/Checkbox.d.ts +2 -0
  154. package/build/widgets/form/ColorField.d.ts +2 -0
  155. package/build/widgets/form/DateTimeField.d.ts +2 -0
  156. package/build/widgets/form/Field.d.ts +0 -2
  157. package/build/widgets/form/LabeledContainer.d.ts +9 -8
  158. package/build/widgets/form/LabeledContainer.js +9 -9
  159. package/build/widgets/form/LookupField.d.ts +57 -9
  160. package/build/widgets/form/MonthField.d.ts +2 -0
  161. package/build/widgets/form/NumberField.d.ts +2 -0
  162. package/build/widgets/form/Radio.d.ts +2 -0
  163. package/build/widgets/form/Select.d.ts +2 -0
  164. package/build/widgets/form/Slider.d.ts +3 -0
  165. package/build/widgets/form/Switch.d.ts +2 -0
  166. package/build/widgets/form/TextField.d.ts +34 -0
  167. package/build/widgets/form/TimeList.d.ts +16 -1
  168. package/build/widgets/form/TimeList.js +34 -62
  169. package/build/widgets/form/UploadButton.d.ts +34 -2
  170. package/build/widgets/form/UploadButton.js +3 -1
  171. package/build/widgets/form/ValidationGroup.spec.d.ts +1 -0
  172. package/build/widgets/form/ValidationGroup.spec.js +62 -0
  173. package/build/widgets/form/Validator.d.ts +33 -2
  174. package/build/widgets/form/Validator.js +3 -0
  175. package/build/widgets/grid/Grid.d.ts +9 -9
  176. package/build/widgets/grid/TreeNode.d.ts +6 -0
  177. package/build/widgets/index.d.ts +1 -0
  178. package/build/widgets/index.js +1 -0
  179. package/build/widgets/nav/MenuItem.d.ts +3 -2
  180. package/build/widgets/nav/Route.spec.d.ts +1 -0
  181. package/build/widgets/nav/Route.spec.js +15 -0
  182. package/build/widgets/nav/Scroller.d.ts +4 -6
  183. package/build/widgets/nav/Scroller.js +6 -3
  184. package/build/widgets/nav/Tab.d.ts +2 -2
  185. package/build/widgets/overlay/ContextMenu.d.ts +3 -3
  186. package/build/widgets/overlay/Overlay.d.ts +2 -1
  187. package/build/widgets/overlay/Overlay.js +1 -1
  188. package/build.js +133 -133
  189. package/dist/data.js +2 -2
  190. package/dist/jsx-runtime.js +6 -1
  191. package/dist/manifest.d.ts +1443 -0
  192. package/dist/manifest.js +852 -804
  193. package/dist/ui.js +91 -5
  194. package/dist/util.js +3 -0
  195. package/dist/widgets.js +520 -161
  196. package/package.json +46 -20
  197. package/src/charts/Chart.ts +108 -108
  198. package/src/charts/ScatterGraph.tsx +6 -6
  199. package/src/data/ArrayElementView.ts +90 -90
  200. package/src/data/AugmentedViewBase.ts +88 -88
  201. package/src/data/Binding.ts +104 -104
  202. package/src/data/ExposedRecordView.ts +95 -95
  203. package/src/data/ExposedValueView.ts +89 -89
  204. package/src/data/Expression.spec.ts +229 -229
  205. package/src/data/Expression.ts +233 -233
  206. package/src/data/Grouper.spec.ts +57 -57
  207. package/src/data/Grouper.ts +158 -158
  208. package/src/data/NestedDataView.ts +43 -43
  209. package/src/data/ReadOnlyDataView.ts +39 -39
  210. package/src/data/Ref.ts +104 -104
  211. package/src/data/Selector.ts +10 -10
  212. package/src/data/Store.ts +52 -52
  213. package/src/data/StoreProxy.ts +19 -19
  214. package/src/data/StoreRef.ts +66 -66
  215. package/src/data/StringTemplate.spec.ts +132 -132
  216. package/src/data/StringTemplate.ts +93 -93
  217. package/src/data/StructuredSelector.spec.ts +113 -113
  218. package/src/data/StructuredSelector.ts +146 -146
  219. package/src/data/SubscribableView.ts +63 -63
  220. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  221. package/src/data/ZoomIntoPropertyView.ts +45 -45
  222. package/src/data/computable.spec.ts +87 -62
  223. package/src/data/computable.ts +3 -6
  224. package/src/data/createAccessorModelProxy.spec.tsx +102 -1
  225. package/src/data/createAccessorModelProxy.ts +9 -3
  226. package/src/data/createStructuredSelector.ts +62 -62
  227. package/src/data/getAccessor.spec.ts +11 -11
  228. package/src/data/getAccessor.ts +74 -74
  229. package/src/data/getSelector.spec.ts +43 -43
  230. package/src/data/getSelector.ts +66 -66
  231. package/src/data/ops/filter.spec.ts +35 -35
  232. package/src/data/ops/filter.ts +9 -9
  233. package/src/data/ops/findTreeNode.ts +1 -5
  234. package/src/data/ops/findTreePath.ts +1 -1
  235. package/src/data/ops/merge.ts +13 -13
  236. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  237. package/src/data/ops/removeTreeNodes.ts +2 -2
  238. package/src/data/ops/updateArray.spec.ts +69 -69
  239. package/src/data/ops/updateArray.ts +31 -31
  240. package/src/data/ops/updateTree.ts +1 -1
  241. package/src/data/test-types.ts +7 -7
  242. package/src/hooks/resolveCallback.spec.tsx +30 -7
  243. package/src/hooks/useTrigger.ts +26 -26
  244. package/src/index.scss +6 -6
  245. package/src/jsx-dev-runtime.ts +4 -4
  246. package/src/jsx-runtime.spec.tsx +402 -0
  247. package/src/jsx-runtime.ts +26 -22
  248. package/src/svg/BoundedObject.ts +101 -101
  249. package/src/svg/util/Rect.ts +105 -105
  250. package/src/ui/CSSHelper.ts +17 -17
  251. package/src/ui/ContentResolver.spec.tsx +172 -19
  252. package/src/ui/ContentResolver.ts +16 -8
  253. package/src/ui/Controller.ts +15 -2
  254. package/src/ui/Culture.ts +159 -159
  255. package/src/ui/DataProxy.ts +55 -55
  256. package/src/ui/FocusManager.ts +171 -171
  257. package/src/ui/Instance.ts +866 -868
  258. package/src/ui/Prop.ts +140 -112
  259. package/src/ui/RenderingContext.ts +99 -99
  260. package/src/ui/Repeater.ts +3 -12
  261. package/src/ui/Rescope.ts +49 -49
  262. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  263. package/src/ui/Text.ts +21 -2
  264. package/src/ui/VDOM.ts +34 -34
  265. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  266. package/src/ui/adapter/ArrayAdapter.ts +4 -1
  267. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  268. package/src/ui/adapter/TreeAdapter.ts +185 -185
  269. package/src/ui/app/History.ts +133 -133
  270. package/src/ui/app/Url.spec.ts +50 -50
  271. package/src/ui/app/startHotAppLoop.ts +41 -41
  272. package/src/ui/createFunctionalComponent.spec.tsx +53 -0
  273. package/src/ui/createFunctionalComponent.ts +86 -65
  274. package/src/ui/expr.ts +4 -1
  275. package/src/ui/exprHelpers.spec.ts +379 -0
  276. package/src/ui/exprHelpers.ts +78 -0
  277. package/src/ui/index.ts +47 -46
  278. package/src/ui/layout/Content.ts +30 -30
  279. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +1 -1
  280. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  281. package/src/ui/selection/KeySelection.ts +0 -12
  282. package/src/ui/selection/PropertySelection.ts +87 -87
  283. package/src/ui/selection/Selection.ts +13 -3
  284. package/src/util/Console.ts +13 -11
  285. package/src/util/Format.ts +267 -267
  286. package/src/util/addEventListenerWithOptions.ts +41 -41
  287. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  288. package/src/util/color/rgbToHsl.ts +35 -35
  289. package/src/util/getActiveElement.ts +4 -4
  290. package/src/util/hasKey.ts +18 -18
  291. package/src/util/index.ts +55 -55
  292. package/src/util/innerTextTrim.ts +10 -10
  293. package/src/util/isArray.ts +3 -3
  294. package/src/util/isDataRecord.ts +5 -5
  295. package/src/util/isDefined.ts +3 -3
  296. package/src/util/isString.ts +3 -3
  297. package/src/widgets/AccessorBindings.spec.tsx +26 -0
  298. package/src/widgets/Button.tsx +5 -17
  299. package/src/widgets/DocumentTitle.ts +95 -92
  300. package/src/widgets/Heading.ts +2 -2
  301. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -0
  302. package/src/widgets/HtmlElement.spec.tsx +20 -12
  303. package/src/widgets/HtmlElement.tsx +82 -24
  304. package/src/widgets/Icon.ts +3 -17
  305. package/src/widgets/List.tsx +6 -0
  306. package/src/widgets/ReactElementWrapper.spec.tsx +452 -0
  307. package/src/widgets/ReactElementWrapper.tsx +108 -0
  308. package/src/widgets/Sandbox.ts +103 -103
  309. package/src/widgets/autoFocus.ts +9 -9
  310. package/src/widgets/cx.ts +63 -63
  311. package/src/widgets/drag-drop/DragSource.tsx +3 -4
  312. package/src/widgets/drag-drop/DropZone.tsx +3 -4
  313. package/src/widgets/form/Checkbox.tsx +3 -0
  314. package/src/widgets/form/ColorField.tsx +3 -0
  315. package/src/widgets/form/DateTimeField.tsx +5 -0
  316. package/src/widgets/form/Field.tsx +0 -3
  317. package/src/widgets/form/Label.tsx +1 -0
  318. package/src/widgets/form/LabeledContainer.ts +22 -26
  319. package/src/widgets/form/LookupField.spec.tsx +93 -0
  320. package/src/widgets/form/LookupField.tsx +104 -9
  321. package/src/widgets/form/MonthField.tsx +5 -0
  322. package/src/widgets/form/NumberField.tsx +3 -0
  323. package/src/widgets/form/Radio.tsx +5 -0
  324. package/src/widgets/form/Select.tsx +5 -0
  325. package/src/widgets/form/Slider.tsx +4 -0
  326. package/src/widgets/form/Switch.tsx +3 -0
  327. package/src/widgets/form/TextField.tsx +62 -0
  328. package/src/widgets/form/TimeList.tsx +84 -73
  329. package/src/widgets/form/UploadButton.tsx +53 -2
  330. package/src/widgets/form/Validator.ts +40 -3
  331. package/src/widgets/grid/Grid.tsx +9 -12
  332. package/src/widgets/grid/GridCell.ts +143 -143
  333. package/src/widgets/grid/TreeNode.tsx +9 -0
  334. package/src/widgets/icons/calendar.tsx +17 -17
  335. package/src/widgets/icons/check.tsx +13 -13
  336. package/src/widgets/icons/clear.tsx +15 -15
  337. package/src/widgets/icons/close.tsx +20 -20
  338. package/src/widgets/icons/cx.tsx +38 -38
  339. package/src/widgets/icons/drop-down.tsx +15 -15
  340. package/src/widgets/icons/file.tsx +13 -13
  341. package/src/widgets/icons/folder-open.tsx +15 -15
  342. package/src/widgets/icons/folder.tsx +13 -13
  343. package/src/widgets/icons/forward.tsx +22 -22
  344. package/src/widgets/icons/loading.tsx +24 -24
  345. package/src/widgets/icons/menu.tsx +17 -17
  346. package/src/widgets/icons/pixel-picker.tsx +18 -18
  347. package/src/widgets/icons/search.tsx +13 -13
  348. package/src/widgets/icons/sort-asc.tsx +14 -14
  349. package/src/widgets/icons/square.tsx +18 -18
  350. package/src/widgets/index.ts +1 -0
  351. package/src/widgets/nav/MenuItem.tsx +3 -2
  352. package/src/widgets/nav/Route.ts +142 -142
  353. package/src/widgets/nav/Scroller.tsx +8 -9
  354. package/src/widgets/nav/Tab.ts +2 -2
  355. package/src/widgets/overlay/ContextMenu.ts +42 -42
  356. package/src/widgets/overlay/Dropdown.tsx +762 -762
  357. package/src/widgets/overlay/MsgBox.tsx +141 -141
  358. package/src/widgets/overlay/Overlay.tsx +5 -4
  359. package/src/widgets/overlay/Toast.ts +111 -111
  360. package/src/widgets/overlay/Window.tsx +299 -299
  361. package/src/widgets/overlay/alerts.ts +46 -46
  362. package/src/widgets/overlay/captureMouse.ts +195 -195
  363. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
  364. package/src/widgets/overlay/index.d.ts +11 -11
  365. package/src/widgets/overlay/index.ts +11 -11
  366. package/src/widgets/overlay/tooltip-ops.ts +173 -173
@@ -1,11 +1,11 @@
1
- import { isSelector } from '../../data/isSelector';
2
- import { Widget } from '../../ui/Widget';
3
- import { FieldGroup } from './FieldGroup';
4
- import { Label } from './Label';
1
+ import { isSelector } from "../../data/isSelector";
2
+ import { Widget } from "../../ui/Widget";
3
+ import { FieldGroup } from "./FieldGroup";
4
+ import { Label } from "./Label";
5
5
  export class LabeledContainer extends FieldGroup {
6
6
  declareData(...args) {
7
7
  super.declareData(...args, {
8
- label: undefined
8
+ label: undefined,
9
9
  });
10
10
  }
11
11
  init() {
@@ -15,7 +15,7 @@ export class LabeledContainer extends FieldGroup {
15
15
  disabled: this.disabled,
16
16
  mod: this.mod,
17
17
  asterisk: this.asterisk,
18
- required: true
18
+ required: true,
19
19
  };
20
20
  if (this.label.isComponentType)
21
21
  labelConfig = this.label;
@@ -29,7 +29,7 @@ export class LabeledContainer extends FieldGroup {
29
29
  }
30
30
  initComponents(context, instance, ...args) {
31
31
  return super.initComponents(context, instance, ...args, {
32
- label: this.label
32
+ label: this.label,
33
33
  });
34
34
  }
35
35
  renderLabel(context, instance, key) {
@@ -40,9 +40,9 @@ export class LabeledContainer extends FieldGroup {
40
40
  render(context, instance, key) {
41
41
  return {
42
42
  label: this.renderLabel(context, instance),
43
- content: this.renderChildren(context, instance)
43
+ content: this.renderChildren(context, instance),
44
44
  };
45
45
  }
46
46
  }
47
47
  LabeledContainer.prototype.styled = true;
48
- Widget.alias('labeled-container', LabeledContainer);
48
+ Widget.alias("labeled-container", LabeledContainer);
@@ -4,61 +4,109 @@ import { DropdownConfig } from "../overlay/Dropdown";
4
4
  import type { CxChild, RenderingContext } from "../../ui/RenderingContext";
5
5
  import type { Instance } from "../../ui/Instance";
6
6
  import { FieldConfig } from "./Field";
7
- import { Prop, BooleanProp, StringProp, DataRecord } from "../../ui/Prop";
7
+ import { Prop, BooleanProp, StringProp, StructuredProp, DataRecord } from "../../ui/Prop";
8
8
  export interface LookupBinding {
9
9
  local: string;
10
10
  remote: string;
11
11
  key?: boolean;
12
12
  }
13
- export interface LookupFieldConfig extends FieldConfig {
13
+ export interface LookupFieldConfig<TOption = unknown, TRecord = unknown> extends FieldConfig {
14
+ /** Defaults to `false`. Set to `true` to enable multiple selection. */
14
15
  multiple?: BooleanProp;
16
+ /** Selected value. Used only if `multiple` is set to `false`. */
15
17
  value?: Prop<number | string>;
18
+ /** A list of selected ids. Used only if `multiple` is set to `true`. */
16
19
  values?: Prop<(number | string)[]>;
17
- records?: Prop<Record<string, any>[]>;
20
+ /** A list of selected records. Used only if `multiple` is set to `true`. */
21
+ records?: Prop<TRecord[]>;
22
+ /** Text associated with the selection. Used only if `multiple` is set to `false`. */
18
23
  text?: StringProp;
24
+ /** The opposite of `disabled`. */
19
25
  enabled?: BooleanProp;
26
+ /** Defaults to `false`. Used to make the field read-only. */
27
+ readOnly?: BooleanProp;
28
+ /** Default text displayed when the field is empty. */
20
29
  placeholder?: StringProp;
21
- options?: Prop<Record<string, any>[]>;
30
+ /** A list of available options. */
31
+ options?: Prop<TOption[]>;
32
+ /** Set to `true` to hide the clear button. Default value is `false`. */
22
33
  hideClear?: boolean;
34
+ /** Set to `false` to hide the clear button. Default value is `true`. */
23
35
  showClear?: boolean;
36
+ /** Set to `true` to display the clear button even if `required` is set. Default is `false`. */
24
37
  alwaysShowClear?: boolean;
38
+ /** Base CSS class to be applied to the field. Defaults to `lookupfield`. */
25
39
  baseClass?: string;
40
+ /** Name or configuration of the icon to be put on the left side of the input. */
41
+ icon?: StringProp | Record<string, any>;
42
+ /** Additional config to be applied to all items. */
26
43
  itemConfig?: any;
44
+ /** An array of objects describing the mapping of option data to store data. */
27
45
  bindings?: LookupBinding[];
46
+ /** A delay in milliseconds between typing stop and query. Default is `150`. */
28
47
  queryDelay?: number;
48
+ /** Minimal number of characters required before query is made. */
29
49
  minQueryLength?: number;
50
+ /** Set to `true` to hide the search field. */
30
51
  hideSearchField?: boolean;
52
+ /** Number of options required to show search field. Defaults to `7`. */
31
53
  minOptionsForSearchField?: number;
54
+ /** Text to display while data is being loaded. */
32
55
  loadingText?: string;
56
+ /** Error message displayed if server query throws an exception. */
33
57
  queryErrorText?: string;
58
+ /** Message to be displayed if no entries match the user query. */
34
59
  noResultsText?: string;
60
+ /** Name of the field which holds the id of the option. Default is `id`. */
35
61
  optionIdField?: string;
62
+ /** Name of the field which holds the display text of the option. Default is `text`. */
36
63
  optionTextField?: string;
64
+ /** Name of the field to store id of selected value in multiple mode. Default is `id`. */
37
65
  valueIdField?: string;
66
+ /** Name of the field to store display text of selected value. Default is `text`. */
38
67
  valueTextField?: string;
68
+ /** `onQuery` will be called once to fetch all options; filtering occurs client-side. */
39
69
  fetchAll?: boolean;
70
+ /** When set with `fetchAll`, fetched options are cached for widget lifetime. */
40
71
  cacheAll?: boolean;
72
+ /** Close the dropdown after selection. Default is `true`. */
41
73
  closeOnSelect?: boolean;
74
+ /** Message displayed if the entered search query is too short. */
42
75
  minQueryLengthMessageText?: string;
76
+ /** Query function called to fetch options. */
43
77
  onQuery?: string | ((query: string | {
44
78
  query: string;
45
79
  page: number;
46
80
  pageSize: number;
47
- }, instance: Instance) => Record<string, any>[] | Promise<Record<string, any>[]>);
81
+ }, instance: Instance) => TOption[] | Promise<TOption[]>);
82
+ /** Set to `true` to sort dropdown options. */
48
83
  sort?: boolean;
84
+ /** Additional list options, such as grouping configuration, custom sorting, etc. */
49
85
  listOptions?: Record<string, any>;
86
+ /** Show dropdown immediately after component mount; useful for cell editing. */
50
87
  autoOpen?: BooleanProp;
88
+ /** Allow enter key events to propagate; useful for forms or grid cell editors. */
51
89
  submitOnEnterKey?: BooleanProp;
90
+ /** Allow dropdown enter key events to propagate for form submission. */
52
91
  submitOnDropdownEnterKey?: BooleanProp;
92
+ /** Number of additional items loaded in `infinite` mode. Default is `100`. */
53
93
  pageSize?: number;
94
+ /** Set to `true` to enable loading additional options when scroll reaches end. */
54
95
  infinite?: boolean;
96
+ /** Allow quick selection of all displayed items on `Ctrl + A` key combination. */
55
97
  quickSelectAll?: boolean;
56
- onGetRecordDisplayText?: ((record: Record<string, any>, instance: Instance) => string) | null;
57
- onCreateVisibleOptionsFilter?: string | ((filterParams: unknown, instance: Instance) => (option: Record<string, any>) => boolean);
58
- /** Additional configuration to be passed to the dropdown. */
98
+ /** Parameters that affect filtering. */
99
+ filterParams?: StructuredProp;
100
+ /** Used in multiple selection lookups to construct display text from multiple fields. */
101
+ onGetRecordDisplayText?: ((record: TRecord, instance: Instance) => string) | null;
102
+ /** Callback to create a filter function for given filter params. */
103
+ onCreateVisibleOptionsFilter?: string | ((filterParams: unknown, instance: Instance) => (option: TOption) => boolean);
104
+ /** Additional configuration to be passed to the dropdown, such as `style`, `positioning`, etc. */
59
105
  dropdownOptions?: Partial<DropdownConfig>;
106
+ /** Custom validation function. */
107
+ onValidate?: string | ((value: number | string, instance: Instance, validationParams: Record<string, unknown>) => unknown);
60
108
  }
61
- export declare class LookupField<Config extends LookupFieldConfig = LookupFieldConfig> extends Field<Config> {
109
+ export declare class LookupField<TOption = unknown, TRecord = unknown> extends Field<LookupFieldConfig<TOption, TRecord>> {
62
110
  baseClass: string;
63
111
  multiple: boolean;
64
112
  hideClear?: boolean;
@@ -64,6 +64,8 @@ export interface MonthFieldConfig extends FieldConfig {
64
64
  inclusiveTo?: boolean;
65
65
  /** Optional configuration options for the MonthPicker component rendered within the dropdown. */
66
66
  monthPickerOptions?: Config;
67
+ /** Custom validation function. */
68
+ onValidate?: string | ((value: string | Date, instance: Instance, validationParams: Record<string, unknown>) => unknown);
67
69
  }
68
70
  export declare class MonthField<Config extends MonthFieldConfig = MonthFieldConfig> extends Field<Config, MonthFieldInstance> {
69
71
  baseClass: string;
@@ -31,6 +31,8 @@ export interface NumberFieldConfig extends FieldConfig {
31
31
  inputErrorText?: string;
32
32
  scale?: number;
33
33
  offset?: number;
34
+ /** Custom validation function. */
35
+ onValidate?: string | ((value: number, instance: Instance, validationParams: Record<string, unknown>) => unknown);
34
36
  }
35
37
  export declare class NumberField<Config extends NumberFieldConfig = NumberFieldConfig> extends Field<Config> {
36
38
  baseClass: string;
@@ -21,6 +21,8 @@ export interface RadioConfig extends FieldConfig {
21
21
  native?: boolean;
22
22
  /** Set to `true` to make the radio initially selected. */
23
23
  default?: boolean;
24
+ /** Custom validation function. */
25
+ onValidate?: string | ((value: number | string | boolean, instance: Instance, validationParams: Record<string, unknown>) => unknown);
24
26
  }
25
27
  export declare class Radio extends Field<RadioConfig> {
26
28
  selection?: Prop<number | string | boolean>;
@@ -17,6 +17,8 @@ export interface SelectConfig extends FieldConfig {
17
17
  multiple?: boolean;
18
18
  convertValues?: boolean;
19
19
  nullString?: string;
20
+ /** Custom validation function. */
21
+ onValidate?: string | ((value: number | string, instance: Instance, validationParams: Record<string, unknown>) => unknown);
20
22
  }
21
23
  export declare class Select<Config extends SelectConfig = SelectConfig> extends Field<Config> {
22
24
  baseClass: string;
@@ -3,6 +3,7 @@ import { BooleanProp, NumberProp, StringProp, StructuredProp, StyleProp } from "
3
3
  import type { RenderingContext } from "../../ui/RenderingContext";
4
4
  import { type TooltipConfig } from "../overlay/tooltip-ops";
5
5
  import { Field, FieldConfig, FieldInstance } from "./Field";
6
+ import type { Instance } from "../../ui/Instance";
6
7
  export interface SliderConfig extends FieldConfig {
7
8
  /** Low value of the slider range. */
8
9
  from?: NumberProp;
@@ -42,6 +43,8 @@ export interface SliderConfig extends FieldConfig {
42
43
  incrementPercentage?: number;
43
44
  /** Set to `true` to make the slider read-only. */
44
45
  readOnly?: BooleanProp;
46
+ /** Custom validation function. */
47
+ onValidate?: string | ((value: number, instance: Instance, validationParams: Record<string, unknown>) => unknown);
45
48
  }
46
49
  export declare class Slider extends Field<SliderConfig, FieldInstance<Slider>> {
47
50
  baseClass: string;
@@ -23,6 +23,8 @@ export interface SwitchConfig extends FieldConfig {
23
23
  baseClass?: string;
24
24
  /** Determines if button should receive focus on mousedown event. Default is `false`. */
25
25
  focusOnMouseDown?: boolean;
26
+ /** Custom validation function. */
27
+ onValidate?: string | ((value: boolean, instance: Instance, validationParams: Record<string, unknown>) => unknown);
26
28
  }
27
29
  export declare class Switch extends Field<SwitchConfig> {
28
30
  on?: unknown;
@@ -3,30 +3,64 @@ import { Field, FieldConfig } from "./Field";
3
3
  import { BooleanProp, NumberProp, Prop, StringProp } from "../../ui/Prop";
4
4
  import { Instance } from "../../ui/Instance";
5
5
  export interface TextFieldConfig extends FieldConfig {
6
+ /** Textual value of the input field. */
6
7
  value?: Prop<any>;
8
+ /** Default text displayed when the field is empty. */
7
9
  placeholder?: StringProp;
10
+ /** Defaults to `false`. Set to `true` to disable the field. */
8
11
  disabled?: BooleanProp;
12
+ /** The opposite of `disabled`. */
13
+ enabled?: BooleanProp;
14
+ /** Defaults to `false`. Used to make the field read-only. */
9
15
  readOnly?: BooleanProp;
16
+ /** Defaults to `false`. Used to make the field required. */
10
17
  required?: BooleanProp;
18
+ /** Minimal length of the input text. */
11
19
  minLength?: NumberProp;
20
+ /** Maximal length of the input text. */
12
21
  maxLength?: NumberProp;
22
+ /** Regular expression used to validate the user's input. */
13
23
  validationRegExp?: Prop<RegExp>;
24
+ /** Error message displayed upon validation failure. */
14
25
  validationErrorText?: StringProp;
26
+ /** Error message displayed when input text is too short. */
15
27
  minLengthValidationErrorText?: StringProp;
28
+ /** Error message displayed when input text is too long. */
16
29
  maxLengthValidationErrorText?: StringProp;
30
+ /** Event triggering value updates. Possible values are `input` (default), `enter`, or `blur`. Multiple values can be separated by space. */
17
31
  reactOn?: StringProp;
32
+ /** Input type. Defaults to `text`. Other common value is `password`. */
18
33
  inputType?: StringProp;
34
+ /** Base CSS class to be applied to the field. Defaults to `textfield`. */
35
+ baseClass?: string;
36
+ /** Keyboard shortcut used to focus the field. */
19
37
  keyboardShortcut?: StringProp;
38
+ /** Set to `true` to remove leading and trailing whitespace. Default is `false`. */
20
39
  trim?: BooleanProp;
40
+ /** Set to `true` to hide the clear button. Default value is `false`. */
21
41
  hideClear?: BooleanProp;
42
+ /** Set to `false` to hide the clear button. Default value is `true`. */
22
43
  showClear?: BooleanProp;
44
+ /** Set to `true` to display the clear button even if `required` is set. Default is `false`. */
23
45
  alwaysShowClear?: BooleanProp;
46
+ /** Name or configuration of the icon to be put on the left side of the input. */
24
47
  icon?: Prop<any>;
48
+ /** Additional attributes to be passed to the input element. */
25
49
  inputAttrs?: Prop<any>;
50
+ /** If `trackFocus` is set, this value will be set when the field receives or loses focus. */
51
+ focused?: BooleanProp;
52
+ /** Callback invoked when the value changes. */
26
53
  onChange?: string | ((value: any, instance: Instance) => void);
54
+ /** Callback invoked on each input event. */
27
55
  onInput?: string | ((value: any, instance: Instance) => void);
56
+ /** Callback invoked when the field receives focus. */
28
57
  onFocus?: string | ((e: FocusEvent, instance: Instance) => void);
58
+ /** Callback invoked when the field loses focus. */
29
59
  onBlur?: string | ((e: FocusEvent, instance: Instance) => void);
60
+ /** Handler triggered on key down events. Return `false` to prevent default behavior. */
61
+ onKeyDown?: string | ((e: KeyboardEvent, instance: Instance) => boolean | void);
62
+ /** Custom validation function. */
63
+ onValidate?: string | ((value: string, instance: Instance, validationParams: any) => string | undefined | false);
30
64
  }
31
65
  export interface TextFieldProps extends TextFieldConfig {
32
66
  }
@@ -1 +1,16 @@
1
- export declare const TimeList: any;
1
+ import type { Instance } from "../../ui/Instance";
2
+ export interface TimeListProps {
3
+ /** Selected time value. Should be a Date object or a valid date string. */
4
+ value?: unknown;
5
+ /** Time step in minutes. Default is `15`. */
6
+ step?: number;
7
+ /** Time format string. Default is `datetime;HHmm`. */
8
+ format?: string;
9
+ /** Function to encode the Date object before storing. */
10
+ encoding?: (date: Date) => unknown;
11
+ /** Callback invoked when a time is selected. */
12
+ onSelect?: string | ((e: React.MouseEvent, instance: Instance, date: Date) => void);
13
+ /** Additional properties passed to the underlying component. */
14
+ [key: string]: unknown;
15
+ }
16
+ export declare const TimeList: import("../../ui").CxFunctionalComponent<TimeListProps>;
@@ -1,4 +1,4 @@
1
- /** @jsxImportSource react */
1
+ import { jsx as _jsx } from "cx/jsx-runtime";
2
2
  import { ContentResolver } from "../../ui/ContentResolver";
3
3
  import { DataProxy } from "../../ui/DataProxy";
4
4
  import { List } from "../List";
@@ -10,13 +10,7 @@ import { Culture } from "../../ui/Culture";
10
10
  import { isString } from "../../util/isString";
11
11
  import { isFunction } from "../../util/isFunction";
12
12
  import { bind } from "../../ui/bind";
13
- import { Widget } from "../../ui/Widget";
14
- import { HtmlElement } from "../HtmlElement";
15
- export const TimeList = createFunctionalComponent(({ value, step, format, encoding, onSelect, ...props }) => {
16
- return Widget.create({
17
- type: ContentResolver,
18
- params: { step, format, dummy: true },
19
- onResolve: ({ step, format }) => {
13
+ export const TimeList = createFunctionalComponent(({ value, step, format, encoding, onSelect, ...props }) => (_jsx("cx", { children: _jsx(ContentResolver, { params: { step, format, dummy: true }, onResolve: ({ step, format }) => {
20
14
  let max = 24 * 60;
21
15
  if (!step)
22
16
  step = 15;
@@ -32,58 +26,36 @@ export const TimeList = createFunctionalComponent(({ value, step, format, encodi
32
26
  });
33
27
  }
34
28
  let stepMs = step * 60 * 1000;
35
- return Widget.create({
36
- type: DataProxy,
37
- data: { $value: value },
38
- immutable: true,
39
- children: Widget.create({
40
- type: DataProxy,
41
- data: {
42
- $selection: {
43
- get: ({ $value }) => {
44
- if ($value == null)
45
- return null;
46
- let selectionDate = new Date($value);
47
- let selectionTime = selectionDate.valueOf() - zeroTime(selectionDate).valueOf();
48
- return (Math.round(selectionTime / stepMs) * stepMs) % 86400000;
29
+ return (_jsx("cx", { children: _jsx(DataProxy, { data: { $value: value }, immutable: true, children: _jsx(DataProxy, { data: {
30
+ $selection: {
31
+ get: ({ $value }) => {
32
+ if ($value == null)
33
+ return null;
34
+ let selectionDate = new Date($value);
35
+ let selectionTime = selectionDate.valueOf() - zeroTime(selectionDate).valueOf();
36
+ return (Math.round(selectionTime / stepMs) * stepMs) % 86400000;
37
+ },
38
+ set: (value, instance) => {
39
+ let { store } = instance;
40
+ let $value = store.get("$value");
41
+ let copy = $value ? new Date($value) : new Date();
42
+ let today = zeroTime(new Date()).valueOf();
43
+ let date = new Date(today + value);
44
+ copy.setHours(date.getHours());
45
+ copy.setMinutes(date.getMinutes());
46
+ copy.setSeconds(date.getSeconds());
47
+ copy.setMilliseconds(0);
48
+ let encode = encoding || Culture.getDefaultDateEncoding();
49
+ store.set("$value", encode(copy));
50
+ },
49
51
  },
50
- set: (value, instance) => {
51
- let { store } = instance;
52
- let $value = store.get("$value");
53
- let copy = $value ? new Date($value) : new Date();
54
- let today = zeroTime(new Date()).valueOf();
55
- let date = new Date(today + value);
56
- copy.setHours(date.getHours());
57
- copy.setMinutes(date.getMinutes());
58
- copy.setSeconds(date.getSeconds());
59
- copy.setMilliseconds(0);
60
- let encode = encoding || Culture.getDefaultDateEncoding();
61
- store.set("$value", encode(copy));
62
- },
63
- },
64
- },
65
- children: Widget.create({
66
- type: List,
67
- records: times,
68
- recordAlias: "$time",
69
- selection: {
70
- type: KeySelection,
71
- selection: { bind: "$selection" },
72
- },
73
- ...props,
74
- onItemClick: (e, instance) => {
75
- if (!onSelect)
76
- return;
77
- let date = new Date(instance.store.get('$value'));
78
- if (isString(onSelect))
79
- instance.invokeControllerMethod(onSelect, e, instance, date);
80
- else if (isFunction(onSelect))
81
- onSelect(e, instance, date);
82
- },
83
- children: HtmlElement.create("div", { text: bind("$time.text") }),
84
- }),
85
- }),
86
- });
87
- },
88
- });
89
- });
52
+ }, children: _jsx(List, { records: times, recordAlias: "$time", selection: { type: KeySelection, selection: bind("$selection") }, ...props, onItemClick: (e, instance) => {
53
+ if (!onSelect)
54
+ return;
55
+ let date = new Date(instance.store.get("$value"));
56
+ if (isString(onSelect))
57
+ instance.invokeControllerMethod(onSelect, e, instance, date);
58
+ else if (isFunction(onSelect))
59
+ onSelect(e, instance, date);
60
+ }, children: _jsx("div", { text: bind("$time.text") }) }) }) }) }));
61
+ } }) })));
@@ -1,8 +1,39 @@
1
1
  /** @jsxImportSource react */
2
- import { Field, FieldInstance } from "./Field";
2
+ import { Field, FieldConfig, FieldInstance } from "./Field";
3
3
  import type { RenderingContext } from "../../ui/RenderingContext";
4
4
  import type { Instance } from "../../ui/Instance";
5
- export declare class UploadButton extends Field {
5
+ import { StringProp } from "../../ui/Prop";
6
+ export interface UploadButtonConfig extends FieldConfig {
7
+ /** Set to `true` to allow multiple file selection. Default is `false`. */
8
+ multiple?: boolean;
9
+ /** HTTP method used for upload. Default is `POST`. */
10
+ method?: string;
11
+ /** Set to `true` to abort uploads when the component is destroyed. Default is `false`. */
12
+ abortOnDestroy?: boolean;
13
+ /** Text displayed while upload is in progress. */
14
+ uploadInProgressText?: string;
15
+ /** URL to upload files to. */
16
+ url?: StringProp;
17
+ /** Text displayed on the button. */
18
+ text?: StringProp;
19
+ /** Name or configuration of the icon to be displayed on the button. */
20
+ icon?: StringProp;
21
+ /** File types accepted for upload. E.g. `image/*`, `.pdf`, etc. */
22
+ accept?: StringProp;
23
+ /** Base CSS class to be applied to the button. Defaults to `uploadbutton`. */
24
+ baseClass?: string;
25
+ /** Callback to resolve the upload URL for each file. */
26
+ onResolveUrl?: string | ((file: File, instance: Instance) => string | Promise<string>);
27
+ /** Callback invoked before upload starts. Return `false` to cancel the upload. */
28
+ onUploadStarting?: string | ((xhr: XMLHttpRequest, instance: Instance, file: File, formData: FormData) => boolean | Promise<boolean>);
29
+ /** Callback invoked when upload completes successfully. */
30
+ onUploadComplete?: string | ((xhr: XMLHttpRequest, instance: Instance, file: File, formData: FormData) => void);
31
+ /** Callback invoked to report upload progress. */
32
+ onUploadProgress?: string | ((event: ProgressEvent, instance: Instance, file: File, formData: FormData) => void);
33
+ /** Callback invoked when an upload error occurs. */
34
+ onUploadError?: string | ((error: unknown, instance: Instance, file: File, formData: FormData) => void);
35
+ }
36
+ export declare class UploadButton extends Field<UploadButtonConfig> {
6
37
  multiple: boolean;
7
38
  method: string;
8
39
  abortOnDestroy: boolean;
@@ -12,6 +43,7 @@ export declare class UploadButton extends Field {
12
43
  onUploadComplete?: string | ((xhr: XMLHttpRequest, instance: Instance, file: File, formData: FormData) => void);
13
44
  onUploadProgress?: string | ((event: ProgressEvent, instance: Instance, file: File, formData: FormData) => void);
14
45
  onUploadError?: string | ((error: unknown, instance: Instance, file: File, formData: FormData) => void);
46
+ constructor(config?: UploadButtonConfig);
15
47
  declareData(...args: Record<string, unknown>[]): void;
16
48
  renderInput(context: RenderingContext, instance: FieldInstance<UploadButton>, key: string): React.ReactNode;
17
49
  }
@@ -6,8 +6,10 @@ import { Field } from "./Field";
6
6
  import { Url } from "../../ui/app/Url";
7
7
  import { Localization } from "../../ui/Localization";
8
8
  import { isNonEmptyArray } from "../../util/isNonEmptyArray";
9
- //TODO: Implement UploadStatus which will enable canceling
10
9
  export class UploadButton extends Field {
10
+ constructor(config) {
11
+ super(config);
12
+ }
11
13
  declareData(...args) {
12
14
  super.declareData({
13
15
  disabled: undefined,
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "cx/jsx-runtime";
2
+ import { Store } from "../../data/Store";
3
+ import { ValidationGroup } from "./ValidationGroup";
4
+ import { Validator } from "./Validator";
5
+ import { bind } from "../../ui/bind";
6
+ import { createTestRenderer } from "../../util/test/createTestRenderer";
7
+ import assert from "assert";
8
+ describe("ValidationGroup", () => {
9
+ it("performs validation and sets the flags", () => {
10
+ let widget = (_jsx("cx", { children: _jsxs(ValidationGroup, { invalid: bind("invalid"), valid: bind("valid"), children: [_jsx(Validator, { onValidate: () => "Something is wrong..." }), _jsx("div", { visible: bind("invalid"), children: "Invalid" })] }) }));
11
+ let store = new Store();
12
+ const component = createTestRenderer(store, widget);
13
+ let tree = component.toJSON();
14
+ assert(tree && !Array.isArray(tree));
15
+ assert.equal(tree.type, "div");
16
+ assert.equal(store.get("invalid"), true);
17
+ assert.equal(store.get("valid"), false);
18
+ });
19
+ it("nested validation works", () => {
20
+ let widget = (_jsx("cx", { children: _jsx("div", { children: _jsxs(ValidationGroup, { invalid: bind("invalid"), children: [_jsx(ValidationGroup, { invalid: bind("invalid1"), children: _jsx(Validator, { onValidate: () => "Something is wrong..." }) }), _jsx(ValidationGroup, { invalid: bind("invalid2"), children: _jsx(Validator, { onValidate: () => false }) })] }) }) }));
21
+ let store = new Store();
22
+ const component = createTestRenderer(store, widget);
23
+ let tree = component.toJSON();
24
+ assert.equal(store.get("invalid"), true);
25
+ assert.equal(store.get("invalid1"), true);
26
+ assert.equal(store.get("invalid2"), false);
27
+ });
28
+ it("isolated validation group does not affect the parent", () => {
29
+ let widget = (_jsx("cx", { children: _jsx("div", { children: _jsxs(ValidationGroup, { invalid: bind("invalid"), children: [_jsx(ValidationGroup, { invalid: bind("invalid1"), isolated: true, children: _jsx(Validator, { onValidate: () => "Something is wrong..." }) }), _jsx(ValidationGroup, { invalid: bind("invalid2"), children: _jsx(Validator, { onValidate: () => false }) })] }) }) }));
30
+ let store = new Store();
31
+ const component = createTestRenderer(store, widget);
32
+ let tree = component.toJSON();
33
+ assert.equal(store.get("invalid"), false);
34
+ assert.equal(store.get("invalid1"), true);
35
+ assert.equal(store.get("invalid2"), false);
36
+ });
37
+ it("visited flag is propagated into nested validation groups", () => {
38
+ let visited = false;
39
+ let widget = (_jsx("cx", { children: _jsx("div", { children: _jsx(ValidationGroup, { visited: true, children: _jsx(ValidationGroup, { children: _jsx("div", { onExplore: (context, instance) => {
40
+ if (context.parentVisited)
41
+ visited = true;
42
+ } }) }) }) }) }));
43
+ let store = new Store();
44
+ const component = createTestRenderer(store, widget);
45
+ let tree = component.toJSON();
46
+ assert(visited);
47
+ });
48
+ it("disabled flag can be overruled by the field props", () => {
49
+ let widget = (_jsx("cx", { children: _jsx("div", { children: _jsx(ValidationGroup, { invalid: bind("invalid"), disabled: true, children: _jsx(Validator, { onValidate: () => "Something is wrong...", disabled: false }) }) }) }));
50
+ let store = new Store();
51
+ const component = createTestRenderer(store, widget);
52
+ let tree = component.toJSON();
53
+ assert.equal(store.get("invalid"), true);
54
+ });
55
+ it("strict flag is used to enforce disabled flag", () => {
56
+ let widget = (_jsx("cx", { children: _jsx("div", { children: _jsx(ValidationGroup, { invalid: bind("invalid"), disabled: true, strict: true, children: _jsx(Validator, { onValidate: () => "Something is wrong...", disabled: false }) }) }) }));
57
+ let store = new Store();
58
+ const component = createTestRenderer(store, widget);
59
+ let tree = component.toJSON();
60
+ assert.equal(store.get("invalid"), false);
61
+ });
62
+ });
@@ -1,7 +1,38 @@
1
- import { Field } from "./Field";
1
+ import { Field, FieldConfig } from "./Field";
2
2
  import type { RenderingContext } from "../../ui/RenderingContext";
3
3
  import type { Instance } from "../../ui/Instance";
4
- export declare class Validator extends Field {
4
+ import type { StructuredProp, ResolvePropType } from "../../ui/Prop";
5
+ /**
6
+ * Configuration for Validator widget.
7
+ *
8
+ * The value type parameter enables type inference for the onValidate callback:
9
+ * - Literal values preserve their types
10
+ * - AccessorChain<T> resolves to T
11
+ * - Bind/Tpl/Expr resolve to any
12
+ * - Structured props (objects) have each property resolved individually
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * <Validator
17
+ * value={{
18
+ * password: model.user.password,
19
+ * confirmPassword: model.user.confirmPassword
20
+ * }}
21
+ * onValidate={(value) => {
22
+ * if (value.password !== value.confirmPassword)
23
+ * return "Passwords do not match";
24
+ * }}
25
+ * />
26
+ * ```
27
+ */
28
+ export interface ValidatorConfig<V = StructuredProp> extends FieldConfig {
29
+ /** The value to be validated. Can be a structured object with multiple fields. */
30
+ value?: V;
31
+ /** Custom validation function. */
32
+ onValidate?: string | ((value: ResolvePropType<V>, instance: Instance, validationParams: Record<string, unknown>) => unknown);
33
+ }
34
+ export declare class Validator<V = StructuredProp> extends Field<ValidatorConfig<V>> {
35
+ constructor(config?: ValidatorConfig<V>);
5
36
  declareData(...args: Record<string, unknown>[]): void;
6
37
  isEmpty(data: Record<string, unknown>): boolean;
7
38
  render(context: RenderingContext, instance: Instance, key: string): any;
@@ -1,5 +1,8 @@
1
1
  import { Field } from "./Field";
2
2
  export class Validator extends Field {
3
+ constructor(config) {
4
+ super(config);
5
+ }
3
6
  declareData(...args) {
4
7
  return super.declareData(...args, {
5
8
  value: {