cx 26.2.2 → 26.2.3

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 (324) hide show
  1. package/build/charts/Chart.d.ts.map +1 -1
  2. package/build/charts/Chart.js +5 -4
  3. package/build/charts/ColumnBarBase.d.ts +3 -3
  4. package/build/charts/ColumnBarBase.d.ts.map +1 -1
  5. package/build/charts/ColumnBarBase.js +1 -1
  6. package/build/charts/Legend.d.ts.map +1 -1
  7. package/build/charts/Legend.js +11 -4
  8. package/build/charts/Marker.d.ts +3 -3
  9. package/build/charts/Marker.d.ts.map +1 -1
  10. package/build/charts/MarkerLine.d.ts +7 -7
  11. package/build/charts/MarkerLine.d.ts.map +1 -1
  12. package/build/charts/MarkerLine.js +14 -10
  13. package/build/charts/PieChart.d.ts +4 -4
  14. package/build/charts/PieChart.d.ts.map +1 -1
  15. package/build/charts/PieChart.js +36 -14
  16. package/build/charts/PieLabel.d.ts.map +1 -1
  17. package/build/charts/PieLabel.js +2 -1
  18. package/build/charts/RangeMarker.d.ts +3 -3
  19. package/build/charts/RangeMarker.d.ts.map +1 -1
  20. package/build/charts/RangeMarker.js +1 -1
  21. package/build/charts/axis/TimeAxis.d.ts +3 -3
  22. package/build/charts/axis/TimeAxis.d.ts.map +1 -1
  23. package/build/charts/axis/TimeAxis.js +70 -21
  24. package/build/charts/helpers/ValueAtFinder.d.ts +1 -1
  25. package/build/charts/helpers/ValueAtFinder.d.ts.map +1 -1
  26. package/build/charts/helpers/ValueAtFinder.js +5 -2
  27. package/build/data/StructuredSelector.js +3 -4
  28. package/build/data/createAccessorModelProxy.d.ts +6 -11
  29. package/build/data/createAccessorModelProxy.d.ts.map +1 -1
  30. package/build/data/createAccessorModelProxy.js +1 -3
  31. package/build/svg/Ellipse.d.ts +5 -4
  32. package/build/svg/Ellipse.d.ts.map +1 -1
  33. package/build/svg/Ellipse.js +9 -6
  34. package/build/svg/Line.d.ts +1 -0
  35. package/build/svg/Line.d.ts.map +1 -1
  36. package/build/svg/Line.js +4 -1
  37. package/build/svg/Text.d.ts +12 -6
  38. package/build/svg/Text.d.ts.map +1 -1
  39. package/build/svg/Text.js +12 -4
  40. package/build/ui/Controller.d.ts +2 -0
  41. package/build/ui/Controller.d.ts.map +1 -1
  42. package/build/ui/Controller.js +3 -0
  43. package/build/ui/HoverSync.d.ts.map +1 -1
  44. package/build/ui/HoverSync.js +7 -2
  45. package/build/ui/Prop.d.ts +1 -1
  46. package/build/ui/Prop.d.ts.map +1 -1
  47. package/build/ui/Text.d.ts +3 -3
  48. package/build/ui/Text.d.ts.map +1 -1
  49. package/build/ui/Text.js +5 -5
  50. package/build/ui/adapter/GroupAdapter.d.ts.map +1 -1
  51. package/build/ui/adapter/GroupAdapter.js +20 -10
  52. package/build/ui/app/History.js +1 -1
  53. package/build/widgets/List.d.ts.map +1 -1
  54. package/build/widgets/List.js +6 -7
  55. package/build/widgets/drag-drop/DropZone.d.ts +3 -3
  56. package/build/widgets/drag-drop/DropZone.d.ts.map +1 -1
  57. package/build/widgets/form/Calendar.d.ts.map +1 -1
  58. package/build/widgets/form/Calendar.js +30 -11
  59. package/build/widgets/form/ColorField.d.ts.map +1 -1
  60. package/build/widgets/form/ColorField.js +16 -7
  61. package/build/widgets/form/DateTimeField.d.ts.map +1 -1
  62. package/build/widgets/form/DateTimeField.js +23 -10
  63. package/build/widgets/form/Field.d.ts +2 -0
  64. package/build/widgets/form/Field.d.ts.map +1 -1
  65. package/build/widgets/form/Field.js +11 -5
  66. package/build/widgets/form/LookupField.d.ts +1 -1
  67. package/build/widgets/form/LookupField.d.ts.map +1 -1
  68. package/build/widgets/form/LookupField.js +6 -6
  69. package/build/widgets/form/MonthField.d.ts.map +1 -1
  70. package/build/widgets/form/MonthField.js +15 -7
  71. package/build/widgets/form/MonthPicker.d.ts +1 -2
  72. package/build/widgets/form/MonthPicker.d.ts.map +1 -1
  73. package/build/widgets/form/MonthPicker.js +84 -41
  74. package/build/widgets/form/NumberField.d.ts +2 -0
  75. package/build/widgets/form/NumberField.d.ts.map +1 -1
  76. package/build/widgets/form/NumberField.js +45 -15
  77. package/build/widgets/form/TextField.d.ts +1 -9
  78. package/build/widgets/form/TextField.d.ts.map +1 -1
  79. package/build/widgets/form/TextField.js +1 -1
  80. package/build/widgets/grid/Grid.d.ts +2 -2
  81. package/build/widgets/grid/Grid.d.ts.map +1 -1
  82. package/build/widgets/grid/Grid.js +14 -11
  83. package/build/widgets/grid/Pagination.d.ts.map +1 -1
  84. package/build/widgets/grid/Pagination.js +4 -4
  85. package/build/widgets/grid/TreeNode.d.ts.map +1 -1
  86. package/build/widgets/grid/TreeNode.js +10 -2
  87. package/build/widgets/icons/folder.d.ts.map +1 -1
  88. package/build/widgets/icons/folder.js +1 -0
  89. package/build/widgets/icons/forward.d.ts.map +1 -1
  90. package/build/widgets/icons/forward.js +4 -3
  91. package/build/widgets/icons/loading.d.ts.map +1 -1
  92. package/build/widgets/icons/loading.js +6 -5
  93. package/build/widgets/icons/square.d.ts.map +1 -1
  94. package/build/widgets/icons/square.js +3 -3
  95. package/build/widgets/index.d.ts +3 -1
  96. package/build/widgets/index.d.ts.map +1 -1
  97. package/build/widgets/index.js +3 -1
  98. package/build/widgets/overlay/ContextMenu.d.ts.map +1 -1
  99. package/build/widgets/overlay/ContextMenu.js +2 -0
  100. package/build/widgets/overlay/Dropdown.d.ts +2 -1
  101. package/build/widgets/overlay/Dropdown.d.ts.map +1 -1
  102. package/build/widgets/overlay/Dropdown.js +75 -20
  103. package/build/widgets/overlay/MsgBox.d.ts +1 -0
  104. package/build/widgets/overlay/MsgBox.d.ts.map +1 -1
  105. package/build/widgets/overlay/MsgBox.js +2 -2
  106. package/build/widgets/overlay/Overlay.d.ts +32 -2
  107. package/build/widgets/overlay/Overlay.d.ts.map +1 -1
  108. package/build/widgets/overlay/Overlay.js +47 -16
  109. package/build/widgets/overlay/Toast.d.ts +1 -1
  110. package/build/widgets/overlay/Toast.d.ts.map +1 -1
  111. package/build/widgets/overlay/Toast.js +4 -1
  112. package/build/widgets/overlay/Tooltip.d.ts +6 -0
  113. package/build/widgets/overlay/Tooltip.d.ts.map +1 -1
  114. package/build/widgets/overlay/Tooltip.js +24 -9
  115. package/build/widgets/overlay/Window.d.ts.map +1 -1
  116. package/build/widgets/overlay/Window.js +24 -9
  117. package/dist/charts.css +325 -272
  118. package/dist/charts.js +11 -5
  119. package/dist/data.js +2 -2
  120. package/dist/manifest.js +821 -809
  121. package/dist/svg.css +14 -8
  122. package/dist/svg.js +9 -1
  123. package/dist/ui.js +29 -16
  124. package/dist/widgets.css +997 -294
  125. package/dist/widgets.js +319 -126
  126. package/package.json +1 -1
  127. package/src/charts/Bar.scss +13 -10
  128. package/src/charts/BarGraph.scss +31 -29
  129. package/src/charts/BubbleGraph.scss +11 -8
  130. package/src/charts/Chart.ts +5 -3
  131. package/src/charts/Column.scss +13 -10
  132. package/src/charts/ColumnBarBase.tsx +255 -230
  133. package/src/charts/ColumnGraph.scss +13 -11
  134. package/src/charts/Gridlines.scss +10 -8
  135. package/src/charts/Legend.scss +57 -50
  136. package/src/charts/Legend.tsx +257 -213
  137. package/src/charts/LegendEntry.scss +35 -29
  138. package/src/charts/LineGraph.scss +28 -25
  139. package/src/charts/Marker.scss +12 -10
  140. package/src/charts/Marker.tsx +3 -2
  141. package/src/charts/MarkerLine.scss +11 -8
  142. package/src/charts/MarkerLine.tsx +196 -177
  143. package/src/charts/PieChart.scss +12 -9
  144. package/src/charts/PieChart.tsx +717 -591
  145. package/src/charts/PieLabel.tsx +99 -81
  146. package/src/charts/Range.scss +11 -8
  147. package/src/charts/RangeMarker.tsx +204 -187
  148. package/src/charts/ScatterGraph.scss +12 -9
  149. package/src/charts/axis/Axis.scss +6 -5
  150. package/src/charts/axis/CategoryAxis.scss +10 -8
  151. package/src/charts/axis/NumericAxis.scss +9 -6
  152. package/src/charts/axis/TimeAxis.scss +9 -6
  153. package/src/charts/axis/TimeAxis.tsx +753 -637
  154. package/src/charts/axis/index.scss +4 -5
  155. package/src/charts/axis/variables.scss +4 -2
  156. package/src/charts/helpers/ValueAtFinder.ts +19 -5
  157. package/src/charts/index.scss +16 -19
  158. package/src/charts/maps.scss +0 -0
  159. package/src/charts/palette.scss +11 -31
  160. package/src/charts/palette.variables.scss +23 -0
  161. package/src/charts/variables.scss +35 -3
  162. package/src/data/StructuredSelector.ts +2 -2
  163. package/src/data/createAccessorModelProxy.ts +66 -74
  164. package/src/index.scss +5 -6
  165. package/src/maps.scss +5 -0
  166. package/src/svg/Ellipse.tsx +62 -55
  167. package/src/svg/Line.tsx +57 -42
  168. package/src/svg/Svg.scss +6 -6
  169. package/src/svg/Text.scss +19 -0
  170. package/src/svg/Text.tsx +172 -116
  171. package/src/svg/index.scss +3 -2
  172. package/src/svg/maps.scss +0 -0
  173. package/src/svg/variables.scss +0 -0
  174. package/src/ui/Container.spec.ts +59 -0
  175. package/src/ui/Controller.spec.tsx +30 -0
  176. package/src/ui/Controller.ts +5 -0
  177. package/src/ui/HoverSync.tsx +179 -147
  178. package/src/ui/Prop.ts +1 -1
  179. package/src/ui/Text.ts +12 -9
  180. package/src/ui/adapter/GroupAdapter.spec.ts +42 -0
  181. package/src/ui/adapter/GroupAdapter.ts +25 -14
  182. package/src/ui/app/History.ts +1 -1
  183. package/src/ui/index.scss +1 -1
  184. package/src/ui/layout/LabelsLeftLayout.scss +5 -7
  185. package/src/ui/layout/LabelsTopLayout.scss +4 -6
  186. package/src/ui/layout/index.scss +2 -3
  187. package/src/ui/maps.scss +0 -0
  188. package/src/ui/variables.scss +1 -2
  189. package/src/util/index.scss +4 -2
  190. package/src/util/maps.scss +1 -0
  191. package/src/util/scss/besm.scss +15 -0
  192. package/src/util/scss/calc.scss +103 -11
  193. package/src/util/scss/defaults.scss +24 -0
  194. package/src/util/scss/elements.scss +78 -0
  195. package/src/util/scss/global.scss +15 -0
  196. package/src/util/scss/include.scss +17 -9
  197. package/src/util/scss/index.scss +1 -9
  198. package/src/util/scss/maps.scss +2 -0
  199. package/src/util/scss/pad-size.scss +9 -0
  200. package/src/util/scss/padding.scss +6 -0
  201. package/src/util/scss/screen-size.scss +5 -0
  202. package/src/util/scss/variables.scss +6 -0
  203. package/src/util/variables.scss +1 -0
  204. package/src/variables.scss +5 -217
  205. package/src/widgets/Button.maps.scss +103 -0
  206. package/src/widgets/Button.scss +33 -9
  207. package/src/widgets/Button.variables.scss +8 -104
  208. package/src/widgets/CxCredit.scss +2 -0
  209. package/src/widgets/FlexBox.scss +16 -11
  210. package/src/widgets/Heading.scss +6 -0
  211. package/src/widgets/HighlightedSearchText.scss +8 -1
  212. package/src/widgets/Icon.scss +6 -0
  213. package/src/widgets/List.scss +7 -0
  214. package/src/widgets/List.tsx +6 -7
  215. package/src/widgets/ProgressBar.scss +9 -0
  216. package/src/widgets/Resizer.scss +9 -7
  217. package/src/widgets/Section.scss +53 -56
  218. package/src/widgets/animations.scss +4 -2
  219. package/src/widgets/box.scss +47 -0
  220. package/src/widgets/drag-drop/DragClone.scss +12 -4
  221. package/src/widgets/drag-drop/DragHandle.scss +12 -6
  222. package/src/widgets/drag-drop/DragSource.scss +12 -6
  223. package/src/widgets/drag-drop/DropZone.scss +9 -0
  224. package/src/widgets/drag-drop/DropZone.tsx +3 -3
  225. package/src/widgets/drag-drop/index.scss +4 -4
  226. package/src/widgets/drag-drop/maps.scss +7 -0
  227. package/src/widgets/drag-drop/variables.scss +8 -5
  228. package/src/widgets/form/Calendar.maps.scss +54 -0
  229. package/src/widgets/form/Calendar.scss +49 -11
  230. package/src/widgets/form/Calendar.tsx +755 -653
  231. package/src/widgets/form/Calendar.variables.scss +3 -46
  232. package/src/widgets/form/Checkbox.maps.scss +34 -0
  233. package/src/widgets/form/Checkbox.scss +14 -3
  234. package/src/widgets/form/Checkbox.variables.scss +4 -36
  235. package/src/widgets/form/ColorField.scss +21 -2
  236. package/src/widgets/form/ColorField.tsx +485 -431
  237. package/src/widgets/form/ColorPicker.maps.scss +21 -0
  238. package/src/widgets/form/ColorPicker.scss +26 -9
  239. package/src/widgets/form/ColorPicker.variables.scss +3 -16
  240. package/src/widgets/form/DateTimeField.scss +54 -21
  241. package/src/widgets/form/DateTimeField.tsx +697 -615
  242. package/src/widgets/form/DateTimePicker.scss +14 -4
  243. package/src/widgets/form/Field.maps.scss +122 -0
  244. package/src/widgets/form/Field.scss +54 -18
  245. package/src/widgets/form/Field.tsx +611 -504
  246. package/src/widgets/form/Field.variables.scss +46 -0
  247. package/src/widgets/form/HelpText.scss +8 -5
  248. package/src/widgets/form/Label.scss +10 -3
  249. package/src/widgets/form/LookupField.maps.scss +26 -0
  250. package/src/widgets/form/LookupField.scss +54 -24
  251. package/src/widgets/form/LookupField.tsx +25 -21
  252. package/src/widgets/form/MonthField.scss +48 -26
  253. package/src/widgets/form/MonthField.tsx +645 -567
  254. package/src/widgets/form/MonthPicker.maps.scss +50 -0
  255. package/src/widgets/form/MonthPicker.scss +44 -35
  256. package/src/widgets/form/MonthPicker.tsx +954 -724
  257. package/src/widgets/form/MonthPicker.variables.scss +24 -0
  258. package/src/widgets/form/NumberField.scss +19 -2
  259. package/src/widgets/form/NumberField.tsx +576 -466
  260. package/src/widgets/form/Radio.maps.scss +36 -0
  261. package/src/widgets/form/Radio.scss +12 -2
  262. package/src/widgets/form/Radio.variables.scss +3 -42
  263. package/src/widgets/form/Select.scss +25 -9
  264. package/src/widgets/form/Slider.scss +23 -14
  265. package/src/widgets/form/Switch.scss +18 -8
  266. package/src/widgets/form/TextArea.scss +14 -1
  267. package/src/widgets/form/TextField.scss +24 -3
  268. package/src/widgets/form/TextField.tsx +9 -21
  269. package/src/widgets/form/UploadButton.scss +14 -6
  270. package/src/widgets/form/ValidationError.scss +10 -6
  271. package/src/widgets/form/Wheel.scss +14 -4
  272. package/src/widgets/form/index.scss +22 -24
  273. package/src/widgets/form/maps.scss +81 -0
  274. package/src/widgets/form/variables.scss +111 -355
  275. package/src/widgets/grid/Grid.scss +19 -2
  276. package/src/widgets/grid/Grid.spec.ts +42 -0
  277. package/src/widgets/grid/Grid.tsx +18 -13
  278. package/src/widgets/grid/Pagination.scss +11 -2
  279. package/src/widgets/grid/Pagination.tsx +110 -102
  280. package/src/widgets/grid/TreeNode.scss +25 -8
  281. package/src/widgets/grid/TreeNode.tsx +127 -116
  282. package/src/widgets/grid/index.scss +3 -4
  283. package/src/widgets/grid/maps.scss +110 -0
  284. package/src/widgets/grid/variables.scss +48 -137
  285. package/src/widgets/icons/folder.tsx +1 -2
  286. package/src/widgets/icons/forward.tsx +23 -20
  287. package/src/widgets/icons/loading.tsx +22 -19
  288. package/src/widgets/icons/square.tsx +20 -17
  289. package/src/widgets/index.scss +16 -16
  290. package/src/widgets/index.ts +63 -58
  291. package/src/widgets/lists.scss +42 -0
  292. package/src/widgets/maps.scss +139 -0
  293. package/src/widgets/nav/Link.scss +14 -1
  294. package/src/widgets/nav/Menu.scss +13 -7
  295. package/src/widgets/nav/Menu.variables.scss +1 -12
  296. package/src/widgets/nav/MenuItem.scss +21 -6
  297. package/src/widgets/nav/Scroller.scss +11 -2
  298. package/src/widgets/nav/Tab.maps.scss +78 -0
  299. package/src/widgets/nav/Tab.scss +12 -6
  300. package/src/widgets/nav/Tab.variables.scss +7 -76
  301. package/src/widgets/nav/cover.scss +6 -4
  302. package/src/widgets/nav/index.scss +6 -6
  303. package/src/widgets/nav/maps.scss +32 -0
  304. package/src/widgets/nav/variables.scss +4 -11
  305. package/src/widgets/overlay/ContextMenu.ts +3 -0
  306. package/src/widgets/overlay/Dropdown.scss +47 -16
  307. package/src/widgets/overlay/Dropdown.tsx +851 -676
  308. package/src/widgets/overlay/MsgBox.tsx +125 -111
  309. package/src/widgets/overlay/Overlay.scss +60 -40
  310. package/src/widgets/overlay/Overlay.tsx +948 -800
  311. package/src/widgets/overlay/Toast.scss +42 -34
  312. package/src/widgets/overlay/Toast.ts +11 -1
  313. package/src/widgets/overlay/Tooltip.scss +27 -96
  314. package/src/widgets/overlay/Tooltip.tsx +376 -309
  315. package/src/widgets/overlay/Window.maps.scss +51 -0
  316. package/src/widgets/overlay/Window.scss +17 -17
  317. package/src/widgets/overlay/Window.tsx +291 -236
  318. package/src/widgets/overlay/Window.variables.scss +2 -43
  319. package/src/widgets/overlay/index.d.ts +11 -11
  320. package/src/widgets/overlay/index.scss +6 -15
  321. package/src/widgets/overlay/maps.scss +44 -0
  322. package/src/widgets/overlay/variables.scss +11 -42
  323. package/src/widgets/variables.scss +33 -117
  324. package/src/global.scss +0 -14
@@ -1,7 +1,11 @@
1
1
  /** @jsxImportSource react */
2
2
 
3
3
  import { Cx } from "../../ui/Cx";
4
- import { DropdownInstance, DropdownWidgetProps, Instance } from "../../ui/Instance";
4
+ import {
5
+ DropdownInstance,
6
+ DropdownWidgetProps,
7
+ Instance,
8
+ } from "../../ui/Instance";
5
9
  import type { RenderingContext } from "../../ui/RenderingContext";
6
10
  import { VDOM, Widget, getContent } from "../../ui/Widget";
7
11
  import { parseColor } from "../../util/color/parseColor";
@@ -14,57 +18,63 @@ import { BooleanProp, StringProp } from "../../ui/Prop";
14
18
  import { Config } from "../../ui/Prop";
15
19
 
16
20
  export interface ColorFieldConfig extends FieldConfig {
17
- /** Either `rgba`, `hsla` or `hex` value of the selected color. */
18
- value?: StringProp;
21
+ /** Either `rgba`, `hsla` or `hex` value of the selected color. */
22
+ value?: StringProp;
19
23
 
20
- /** Defaults to `false`. Used to make the field read-only. */
21
- readOnly?: BooleanProp;
24
+ /** Defaults to `false`. Used to make the field read-only. */
25
+ readOnly?: BooleanProp;
22
26
 
23
- /** The opposite of `disabled`. */
24
- enabled?: BooleanProp;
27
+ /** The opposite of `disabled`. */
28
+ enabled?: BooleanProp;
25
29
 
26
- /** Default text displayed when the field is empty. */
27
- placeholder?: StringProp;
30
+ /** Default text displayed when the field is empty. */
31
+ placeholder?: StringProp;
28
32
 
29
- /** Set to `true` to hide the clear button. Default value is `false`. */
30
- hideClear?: boolean;
33
+ /** Set to `true` to hide the clear button. Default value is `false`. */
34
+ hideClear?: boolean;
31
35
 
32
- /** Set to `false` to hide the clear button. Default value is `true`. */
33
- showClear?: boolean;
36
+ /** Set to `false` to hide the clear button. Default value is `true`. */
37
+ showClear?: boolean;
34
38
 
35
- /** Set to `true` to display the clear button even if `required` is set. Default is `false`. */
36
- alwaysShowClear?: boolean;
39
+ /** Set to `true` to display the clear button even if `required` is set. Default is `false`. */
40
+ alwaysShowClear?: boolean;
37
41
 
38
- /** Base CSS class to be applied to the element. Defaults to `colorfield`. */
39
- baseClass?: string;
42
+ /** Base CSS class to be applied to the element. Defaults to `colorfield`. */
43
+ baseClass?: string;
40
44
 
41
- /** Format of the color representation. Either `rgba`, `hsla` or `hex`. */
42
- format?: "rgba" | "hsla" | "hex";
45
+ /** Format of the color representation. Either `rgba`, `hsla` or `hex`. */
46
+ format?: "rgba" | "hsla" | "hex";
43
47
 
44
- /** Additional configuration to be passed to the dropdown, such as `style`, `positioning`, etc. */
45
- dropdownOptions?: Partial<DropdownConfig>;
48
+ /** Additional configuration to be passed to the dropdown, such as `style`, `positioning`, etc. */
49
+ dropdownOptions?: Partial<DropdownConfig>;
46
50
 
47
- /** Custom validation function. */
48
- onValidate?: string | ((value: string, instance: Instance, validationParams: Record<string, unknown>) => unknown);
51
+ /** Custom validation function. */
52
+ onValidate?:
53
+ | string
54
+ | ((
55
+ value: string,
56
+ instance: Instance,
57
+ validationParams: Record<string, unknown>,
58
+ ) => unknown);
49
59
  }
50
60
 
51
61
  export class ColorFieldInstance<F extends ColorField = ColorField>
52
- extends FieldInstance<F>
53
- implements DropdownWidgetProps
62
+ extends FieldInstance<F>
63
+ implements DropdownWidgetProps
54
64
  {
55
- lastDropdown?: Instance;
56
- dropdownOpen?: boolean;
57
- selectedIndex?: number;
65
+ lastDropdown?: Instance;
66
+ dropdownOpen?: boolean;
67
+ selectedIndex?: number;
58
68
  }
59
69
 
60
70
  import { stopPropagation } from "../../util/eventCallbacks";
61
71
  import { KeyCode } from "../../util/KeyCode";
62
72
  import {
63
- tooltipMouseLeave,
64
- tooltipMouseMove,
65
- tooltipParentDidMount,
66
- tooltipParentWillReceiveProps,
67
- tooltipParentWillUnmount,
73
+ tooltipMouseLeave,
74
+ tooltipMouseMove,
75
+ tooltipParentDidMount,
76
+ tooltipParentWillReceiveProps,
77
+ tooltipParentWillUnmount,
68
78
  } from "../overlay/tooltip-ops";
69
79
 
70
80
  import { Localization } from "../../ui/Localization";
@@ -74,86 +84,96 @@ import ClearIcon from "../icons/clear";
74
84
  import DropdownIcon from "../icons/drop-down";
75
85
 
76
86
  interface ColorInputProps {
77
- key?: string;
78
- instance: ColorFieldInstance;
79
- data: Record<string, unknown>;
80
- picker: {
81
- value: unknown;
82
- format: string;
83
- };
84
- label?: React.ReactNode;
85
- help?: React.ReactNode;
87
+ key?: string;
88
+ instance: ColorFieldInstance;
89
+ data: Record<string, unknown>;
90
+ picker: {
91
+ value: unknown;
92
+ format: string;
93
+ };
94
+ label?: React.ReactNode;
95
+ help?: React.ReactNode;
86
96
  }
87
97
 
88
98
  interface ColorInputState {
89
- dropdownOpen: boolean;
90
- focus: boolean;
99
+ dropdownOpen: boolean;
100
+ focus: boolean;
91
101
  }
92
102
 
93
103
  export class ColorField extends Field<ColorFieldConfig> {
94
- declare public baseClass: string;
95
- declare public showClear?: boolean;
96
- declare public alwaysShowClear?: boolean;
97
- declare public hideClear?: boolean;
98
- declare public format: string;
99
- declare public lastDropdown?: string;
100
- declare public value?: string;
101
- declare public dropdownOptions?: Partial<DropdownConfig>;
102
-
103
- constructor(config?: ColorFieldConfig) {
104
- super(config);
105
- }
106
-
107
- declareData(...args: Record<string, unknown>[]): void {
108
- super.declareData(
109
- {
110
- value: this.emptyValue,
111
- disabled: undefined,
112
- readOnly: undefined,
113
- enabled: undefined,
114
- placeholder: undefined,
115
- required: undefined,
116
- format: undefined,
117
- },
118
- ...args,
119
- );
120
- }
121
-
122
- init(): void {
123
- if (isDefined(this.hideClear)) this.showClear = !this.hideClear;
124
-
125
- if (this.alwaysShowClear) this.showClear = true;
126
-
127
- super.init();
128
- }
129
-
130
- prepareData(context: RenderingContext, instance: ColorFieldInstance): void {
131
- let { data } = instance;
132
- data.stateMods = [
133
- data.stateMods,
134
- {
135
- empty: !data.value,
136
- },
137
- ];
138
- instance.lastDropdown = context.lastDropdown;
139
- super.prepareData(context, instance);
140
- }
141
-
142
- renderInput(context: RenderingContext, instance: ColorFieldInstance, key: string): React.ReactNode {
143
- return (
144
- <ColorInput
145
- key={key}
146
- instance={instance}
147
- data={instance.data}
148
- picker={{
149
- value: this.value,
150
- format: this.format,
151
- }}
152
- label={this.labelPlacement && getContent(this.renderLabel(context, instance, "label"))}
153
- help={this.helpPlacement && getContent(this.renderHelp(context, instance, "help"))}
154
- />
155
- );
156
- }
104
+ declare public baseClass: string;
105
+ declare public showClear?: boolean;
106
+ declare public alwaysShowClear?: boolean;
107
+ declare public hideClear?: boolean;
108
+ declare public format: string;
109
+ declare public lastDropdown?: string;
110
+ declare public value?: string;
111
+ declare public dropdownOptions?: Partial<DropdownConfig>;
112
+
113
+ constructor(config?: ColorFieldConfig) {
114
+ super(config);
115
+ }
116
+
117
+ declareData(...args: Record<string, unknown>[]): void {
118
+ super.declareData(
119
+ {
120
+ value: this.emptyValue,
121
+ disabled: undefined,
122
+ readOnly: undefined,
123
+ enabled: undefined,
124
+ placeholder: undefined,
125
+ required: undefined,
126
+ format: undefined,
127
+ },
128
+ ...args,
129
+ );
130
+ }
131
+
132
+ init(): void {
133
+ if (isDefined(this.hideClear)) this.showClear = !this.hideClear;
134
+
135
+ if (this.alwaysShowClear) this.showClear = true;
136
+
137
+ super.init();
138
+ }
139
+
140
+ prepareData(context: RenderingContext, instance: ColorFieldInstance): void {
141
+ let { data } = instance;
142
+ data.stateMods = [
143
+ data.stateMods,
144
+ {
145
+ empty: !data.value,
146
+ },
147
+ ];
148
+ instance.lastDropdown = context.lastDropdown;
149
+ super.prepareData(context, instance);
150
+ }
151
+
152
+ renderInput(
153
+ context: RenderingContext,
154
+ instance: ColorFieldInstance,
155
+ key: string,
156
+ ): React.ReactNode {
157
+ return (
158
+ <ColorInput
159
+ key={key}
160
+ instance={instance}
161
+ data={instance.data}
162
+ picker={{
163
+ value: this.value,
164
+ format: this.format,
165
+ }}
166
+ label={
167
+ this.labelPlacement &&
168
+ getContent(this.renderLabel(context, instance, "label"))
169
+ }
170
+ help={
171
+ this.helpPlacement &&
172
+ getContent(this.renderHelp(context, instance, "help"))
173
+ }
174
+ />
175
+ );
176
+ }
157
177
  }
158
178
 
159
179
  ColorField.prototype.baseClass = "colorfield";
@@ -166,332 +186,366 @@ Widget.alias("color-field", ColorField);
166
186
  Localization.registerPrototype("cx/widgets/ColorField", ColorField);
167
187
 
168
188
  class ColorInput extends VDOM.Component<ColorInputProps, ColorInputState> {
169
- data: Record<string, unknown>;
170
- dropdown?: Widget;
171
- input!: HTMLInputElement;
172
- openDropdownOnFocus: boolean = false;
173
- scrollableParents?: Element[];
174
- updateDropdownPosition: () => void;
175
-
176
- constructor(props: ColorInputProps) {
177
- super(props);
178
- let { data } = this.props;
179
- this.data = data;
180
- this.state = {
181
- dropdownOpen: false,
182
- focus: false,
183
- };
184
- this.updateDropdownPosition = () => {};
185
- }
186
-
187
- getDropdown(): Widget {
188
- if (this.dropdown) return this.dropdown;
189
-
190
- let { widget, lastDropdown } = this.props.instance as DropdownInstance;
191
- const colorFieldWidget = widget as ColorField;
192
-
193
- let dropdown = {
194
- scrollTracking: true,
195
- autoFocus: true, //put focus on the dropdown to prevent opening the keyboard
196
- focusable: true,
197
- inline: !isTouchDevice() || !!lastDropdown,
198
- touchFriendly: true,
199
- placementOrder:
200
- " down down-left down-right up up-left up-right right right-up right-down left left-up left-down",
201
- ...colorFieldWidget.dropdownOptions,
202
- type: Dropdown,
203
- relatedElement: this.input,
204
- items: {
205
- type: ColorPicker,
206
- ...this.props.picker,
207
- onColorClick: (e: React.MouseEvent) => {
208
- e.stopPropagation();
209
- e.preventDefault();
210
- let touch = isTouchEvent();
211
- this.closeDropdown(e, () => {
212
- if (!touch) this.input.focus();
213
- });
214
- },
215
- },
216
- onFocusOut: () => {
217
- this.closeDropdown();
218
- },
219
- dismissAfterScroll: () => {
220
- this.closeDropdown();
221
- },
222
- firstChildDefinesHeight: true,
223
- firstChildDefinesWidth: true,
224
- };
225
-
226
- return (this.dropdown = Widget.create(dropdown));
227
- }
228
-
229
- render(): React.ReactNode {
230
- let { instance, label, help, data } = this.props;
231
- let { widget, state } = instance;
232
- let { CSS, baseClass, suppressErrorsUntilVisited, showClear, alwaysShowClear } = widget as ColorField;
233
-
234
- let insideButton;
235
- if (!data.readOnly && !data.disabled) {
236
- if (showClear && (((!data.required || alwaysShowClear) && !data.empty) || instance.state?.inputError))
237
- insideButton = (
238
- <div
239
- className={CSS.element(baseClass, "clear")}
240
- onMouseDown={(e) => {
241
- e.preventDefault();
242
- e.stopPropagation();
243
- }}
244
- onClick={(e) => {
245
- this.onClearClick(e);
246
- }}
247
- >
248
- <ClearIcon className={CSS.element(baseClass, "icon")} />
249
- </div>
250
- );
251
- else
252
- insideButton = (
253
- <div className={CSS.element(baseClass, "right-icon")}>
254
- <DropdownIcon className={CSS.element(baseClass, "icon")} />
255
- </div>
256
- );
257
- }
258
-
259
- let well = (
260
- <div className={CSS.element(baseClass, "left-icon")}>
261
- <div style={{ backgroundColor: data.value as string }}></div>
262
- </div>
189
+ data: Record<string, unknown>;
190
+ dropdown?: Widget;
191
+ input!: HTMLInputElement;
192
+ openDropdownOnFocus: boolean = false;
193
+ scrollableParents?: Element[];
194
+ updateDropdownPosition: () => void;
195
+
196
+ constructor(props: ColorInputProps) {
197
+ super(props);
198
+ let { data } = this.props;
199
+ this.data = data;
200
+ this.state = {
201
+ dropdownOpen: false,
202
+ focus: false,
203
+ };
204
+ this.updateDropdownPosition = () => {};
205
+ }
206
+
207
+ getDropdown(): Widget {
208
+ if (this.dropdown) return this.dropdown;
209
+
210
+ let { widget, lastDropdown } = this.props.instance as DropdownInstance;
211
+ const colorFieldWidget = widget as ColorField;
212
+
213
+ let dropdown = {
214
+ scrollTracking: true,
215
+ autoFocus: true, //put focus on the dropdown to prevent opening the keyboard
216
+ focusable: true,
217
+ inline: !isTouchDevice() || !!lastDropdown,
218
+ touchFriendly: true,
219
+ placementOrder:
220
+ " down down-left down-right up up-left up-right right right-up right-down left left-up left-down",
221
+ ...colorFieldWidget.dropdownOptions,
222
+ type: Dropdown,
223
+ relatedElement: this.input,
224
+ items: {
225
+ type: ColorPicker,
226
+ mod: "dropdown",
227
+ ...this.props.picker,
228
+ onColorClick: (e: React.MouseEvent) => {
229
+ e.stopPropagation();
230
+ e.preventDefault();
231
+ let touch = isTouchEvent();
232
+ this.closeDropdown(e, () => {
233
+ if (!touch) this.input.focus();
234
+ });
235
+ },
236
+ },
237
+ onFocusOut: () => {
238
+ this.closeDropdown();
239
+ },
240
+ dismissAfterScroll: () => {
241
+ this.closeDropdown();
242
+ },
243
+ firstChildDefinesHeight: true,
244
+ firstChildDefinesWidth: true,
245
+ };
246
+
247
+ return (this.dropdown = Widget.create(dropdown));
248
+ }
249
+
250
+ render(): React.ReactNode {
251
+ let { instance, label, help, data } = this.props;
252
+ let { widget, state } = instance;
253
+ let {
254
+ CSS,
255
+ baseClass,
256
+ suppressErrorsUntilVisited,
257
+ showClear,
258
+ alwaysShowClear,
259
+ } = widget as ColorField;
260
+
261
+ let insideButton;
262
+ if (!data.readOnly && !data.disabled) {
263
+ if (
264
+ showClear &&
265
+ (((!data.required || alwaysShowClear) && !data.empty) ||
266
+ instance.state?.inputError)
267
+ )
268
+ insideButton = (
269
+ <div
270
+ className={CSS.element(baseClass, "clear")}
271
+ onMouseDown={(e) => {
272
+ e.preventDefault();
273
+ e.stopPropagation();
274
+ }}
275
+ onClick={(e) => {
276
+ this.onClearClick(e);
277
+ }}
278
+ >
279
+ <ClearIcon className={CSS.element(baseClass, "icon")} />
280
+ </div>
281
+ );
282
+ else
283
+ insideButton = (
284
+ <div className={CSS.element(baseClass, "right-icon")}>
285
+ <DropdownIcon className={CSS.element(baseClass, "icon")} />
286
+ </div>
287
+ );
288
+ }
289
+
290
+ let well = (
291
+ <div className={CSS.element(baseClass, "left-icon")}>
292
+ <div style={{ backgroundColor: data.value as string }}></div>
293
+ </div>
294
+ );
295
+
296
+ let dropdown: React.ReactNode | false = false;
297
+ if (this.state.dropdownOpen)
298
+ dropdown = (
299
+ <Cx
300
+ widget={this.getDropdown()}
301
+ parentInstance={instance}
302
+ options={{ name: "colorfield-dropdown" }}
303
+ subscribe
304
+ />
263
305
  );
264
306
 
265
- let dropdown: React.ReactNode | false = false;
266
- if (this.state.dropdownOpen)
267
- dropdown = (
268
- <Cx
269
- widget={this.getDropdown()}
270
- parentInstance={instance}
271
- options={{ name: "colorfield-dropdown" }}
272
- subscribe
273
- />
274
- );
275
-
276
- let empty = this.input ? !this.input.value : data.empty;
277
-
278
- return (
279
- <div
280
- className={CSS.expand(
281
- data.classNames,
282
- CSS.state({
283
- visited: state?.visited,
284
- focus: this.state.focus || this.state.dropdownOpen,
285
- icon: true,
286
- empty: empty && !data.placeholder,
287
- error: data.error && (state?.visited || !suppressErrorsUntilVisited || !empty),
288
- }),
289
- )}
290
- style={data.style as React.CSSProperties}
291
- onMouseDown={this.onMouseDown.bind(this)}
292
- onTouchStart={stopPropagation}
293
- onClick={stopPropagation}
294
- >
295
- <input
296
- id={data.id as string}
297
- ref={(el) => {
298
- this.input = el!;
299
- }}
300
- type="text"
301
- className={CSS.expand(CSS.element(baseClass, "input"), data.inputClass)}
302
- style={data.inputStyle as React.CSSProperties}
303
- defaultValue={this.trim((data.value as string) || "")}
304
- disabled={data.disabled as boolean}
305
- readOnly={data.readOnly as boolean}
306
- tabIndex={data.tabIndex as number}
307
- placeholder={data.placeholder as string}
308
- {...(data.inputAttrs as Record<string, any>)}
309
- onInput={(e: React.ChangeEvent<HTMLInputElement>) =>
310
- this.onChange((e.target as HTMLInputElement).value, "input")
311
- }
312
- onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
313
- this.onChange((e.target as HTMLInputElement).value, "change")
314
- }
315
- onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => this.onKeyDown(e)}
316
- onBlur={(e: React.FocusEvent<HTMLInputElement>) => {
317
- this.onBlur(e);
318
- }}
319
- onFocus={(e: React.FocusEvent<HTMLInputElement>) => {
320
- this.onFocus(e);
321
- }}
322
- onMouseMove={(e: React.MouseEvent<HTMLInputElement>) => {
323
- const tooltip = getFieldTooltip(instance);
324
- tooltipMouseMove(e, tooltip[0], tooltip[1]);
325
- }}
326
- onMouseLeave={(e: React.MouseEvent<HTMLInputElement>) => {
327
- const tooltip = getFieldTooltip(instance);
328
- tooltipMouseLeave(e, tooltip[0], tooltip[1]);
329
- }}
330
- />
331
- {well}
332
- {insideButton}
333
- {dropdown}
334
- {label}
335
- {help}
336
- </div>
337
- );
338
- }
339
-
340
- onMouseDown(e: React.MouseEvent): void {
341
- e.stopPropagation();
342
- if (this.state.dropdownOpen) this.closeDropdown(e);
343
- else {
344
- this.openDropdownOnFocus = true;
345
- }
346
-
347
- //icon click
348
- if (e.target != this.input) {
349
- e.preventDefault();
350
- if (!this.state.dropdownOpen) this.openDropdown(e);
351
- else this.input.focus();
352
- }
353
- }
354
-
355
- onFocus(e: React.FocusEvent): void {
356
- if (this.openDropdownOnFocus) this.openDropdown(e);
357
-
358
- let { instance } = this.props;
359
- let { widget } = instance;
360
- const colorFieldWidget = widget as ColorField;
361
-
362
- if (colorFieldWidget.trackFocus) {
363
- this.setState({
364
- focus: true,
365
- });
366
- }
367
- }
368
-
369
- onKeyDown(e: React.KeyboardEvent): void {
370
- let { instance } = this.props;
371
- if ((instance.widget as ColorField).handleKeyDown(e, instance) === false) return;
372
-
373
- switch (e.keyCode) {
374
- case KeyCode.enter:
375
- e.stopPropagation();
376
- this.onChange((e.target as HTMLInputElement).value, "enter");
377
- break;
378
-
379
- case KeyCode.esc:
380
- if (this.state.dropdownOpen) {
381
- e.stopPropagation();
382
- this.closeDropdown(e, () => {
383
- this.input.focus();
384
- });
385
- }
386
- break;
387
-
388
- case KeyCode.left:
389
- case KeyCode.right:
390
- e.stopPropagation();
391
- break;
392
-
393
- case KeyCode.down:
394
- this.openDropdown(e);
395
- e.stopPropagation();
396
- e.preventDefault();
397
- break;
398
- }
399
- }
400
-
401
- onBlur(e: React.FocusEvent): void {
402
- if (this.state.focus)
403
- this.setState({
404
- focus: false,
405
- });
406
- this.onChange((e.target as HTMLInputElement).value, "blur");
407
- }
408
-
409
- closeDropdown(e?: React.KeyboardEvent | React.MouseEvent, callback?: () => void): void {
410
- if (this.state.dropdownOpen) {
411
- if (this.scrollableParents)
412
- this.scrollableParents.forEach((el) => {
413
- el.removeEventListener("scroll", this.updateDropdownPosition);
414
- });
415
-
416
- this.setState({ dropdownOpen: false }, callback);
417
- } else if (callback) callback();
418
- }
419
-
420
- openDropdown(e: React.KeyboardEvent | React.FocusEvent | React.MouseEvent): void {
421
- let { data } = this.props;
422
- this.openDropdownOnFocus = false;
423
-
424
- if (!this.state.dropdownOpen && !(data.disabled || data.readOnly)) {
425
- this.setState({ dropdownOpen: true });
426
- }
427
- }
428
-
429
- trim(value: string): string {
430
- return value.replace(/\s/g, "");
431
- }
432
-
433
- UNSAFE_componentWillReceiveProps(props: ColorInputProps): void {
434
- let { data, instance } = props;
435
- let { state } = instance;
436
- let nv = this.trim((data.value as string) || "");
437
- if (nv != this.input.value && (this.data.value != data.value || !state?.inputError)) {
438
- this.input.value = nv;
439
- instance.setState({
440
- inputError: false,
441
- });
442
- }
443
- this.data = data;
444
-
445
- const tooltip1 = getFieldTooltip(instance);
446
- tooltipParentWillReceiveProps(this.input, tooltip1[0], tooltip1[1]);
447
- }
448
-
449
- componentDidMount(): void {
450
- const tooltip2 = getFieldTooltip(this.props.instance);
451
- tooltipParentDidMount(this.input, tooltip2[0], tooltip2[1]);
452
- if ((this.props.instance.widget as ColorField).autoFocus && !isTouchDevice()) this.input.focus();
453
- }
454
-
455
- componentWillUnmount(): void {
456
- if (this.input == getActiveElement() && this.input.value != this.props.data.value) {
457
- this.onChange(this.input.value, "blur");
458
- }
459
- tooltipParentWillUnmount(this.props.instance);
460
- }
461
-
462
- onClearClick(e: React.MouseEvent): void {
463
- let { instance } = this.props;
464
- instance.set("value", (instance.widget as ColorField).emptyValue);
307
+ let empty = this.input ? !this.input.value : data.empty;
308
+
309
+ return (
310
+ <div
311
+ className={CSS.expand(
312
+ data.classNames,
313
+ CSS.state({
314
+ visited: state?.visited,
315
+ focus: this.state.focus || this.state.dropdownOpen,
316
+ icon: true,
317
+ empty: empty && !data.placeholder,
318
+ error:
319
+ data.error &&
320
+ (state?.visited || !suppressErrorsUntilVisited || !empty),
321
+ }),
322
+ )}
323
+ style={data.style as React.CSSProperties}
324
+ onMouseDown={this.onMouseDown.bind(this)}
325
+ onTouchStart={stopPropagation}
326
+ onClick={stopPropagation}
327
+ >
328
+ <input
329
+ id={data.id as string}
330
+ ref={(el) => {
331
+ this.input = el!;
332
+ }}
333
+ type="text"
334
+ className={CSS.expand(
335
+ CSS.element(baseClass, "input"),
336
+ data.inputClass,
337
+ )}
338
+ style={data.inputStyle as React.CSSProperties}
339
+ defaultValue={this.trim((data.value as string) || "")}
340
+ disabled={data.disabled as boolean}
341
+ readOnly={data.readOnly as boolean}
342
+ tabIndex={data.tabIndex as number}
343
+ placeholder={data.placeholder as string}
344
+ {...(data.inputAttrs as Record<string, any>)}
345
+ onInput={(e: React.ChangeEvent<HTMLInputElement>) =>
346
+ this.onChange((e.target as HTMLInputElement).value, "input")
347
+ }
348
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
349
+ this.onChange((e.target as HTMLInputElement).value, "change")
350
+ }
351
+ onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) =>
352
+ this.onKeyDown(e)
353
+ }
354
+ onBlur={(e: React.FocusEvent<HTMLInputElement>) => {
355
+ this.onBlur(e);
356
+ }}
357
+ onFocus={(e: React.FocusEvent<HTMLInputElement>) => {
358
+ this.onFocus(e);
359
+ }}
360
+ onMouseMove={(e: React.MouseEvent<HTMLInputElement>) => {
361
+ const tooltip = getFieldTooltip(instance);
362
+ tooltipMouseMove(e, tooltip[0], tooltip[1]);
363
+ }}
364
+ onMouseLeave={(e: React.MouseEvent<HTMLInputElement>) => {
365
+ const tooltip = getFieldTooltip(instance);
366
+ tooltipMouseLeave(e, tooltip[0], tooltip[1]);
367
+ }}
368
+ />
369
+ {well}
370
+ {insideButton}
371
+ {dropdown}
372
+ {label}
373
+ {help}
374
+ </div>
375
+ );
376
+ }
377
+
378
+ onMouseDown(e: React.MouseEvent): void {
379
+ e.stopPropagation();
380
+ if (this.state.dropdownOpen) this.closeDropdown(e);
381
+ else {
382
+ this.openDropdownOnFocus = true;
383
+ }
384
+
385
+ //icon click
386
+ if (e.target != this.input) {
387
+ e.preventDefault();
388
+ if (!this.state.dropdownOpen) this.openDropdown(e);
389
+ else this.input.focus();
390
+ }
391
+ }
392
+
393
+ onFocus(e: React.FocusEvent): void {
394
+ if (this.openDropdownOnFocus) this.openDropdown(e);
395
+
396
+ let { instance } = this.props;
397
+ let { widget } = instance;
398
+ const colorFieldWidget = widget as ColorField;
399
+
400
+ if (colorFieldWidget.trackFocus) {
401
+ this.setState({
402
+ focus: true,
403
+ });
404
+ }
405
+ }
406
+
407
+ onKeyDown(e: React.KeyboardEvent): void {
408
+ let { instance } = this.props;
409
+ if ((instance.widget as ColorField).handleKeyDown(e, instance) === false)
410
+ return;
411
+
412
+ switch (e.keyCode) {
413
+ case KeyCode.enter:
414
+ e.stopPropagation();
415
+ this.onChange((e.target as HTMLInputElement).value, "enter");
416
+ break;
417
+
418
+ case KeyCode.esc:
419
+ if (this.state.dropdownOpen) {
420
+ e.stopPropagation();
421
+ this.closeDropdown(e, () => {
422
+ this.input.focus();
423
+ });
424
+ }
425
+ break;
426
+
427
+ case KeyCode.left:
428
+ case KeyCode.right:
429
+ e.stopPropagation();
430
+ break;
431
+
432
+ case KeyCode.down:
433
+ this.openDropdown(e);
434
+ e.stopPropagation();
435
+ e.preventDefault();
436
+ break;
437
+ }
438
+ }
439
+
440
+ onBlur(e: React.FocusEvent): void {
441
+ if (this.state.focus)
442
+ this.setState({
443
+ focus: false,
444
+ });
445
+ this.onChange((e.target as HTMLInputElement).value, "blur");
446
+ }
447
+
448
+ closeDropdown(
449
+ e?: React.KeyboardEvent | React.MouseEvent,
450
+ callback?: () => void,
451
+ ): void {
452
+ if (this.state.dropdownOpen) {
453
+ if (this.scrollableParents)
454
+ this.scrollableParents.forEach((el) => {
455
+ el.removeEventListener("scroll", this.updateDropdownPosition);
456
+ });
457
+
458
+ this.setState({ dropdownOpen: false }, callback);
459
+ } else if (callback) callback();
460
+ }
461
+
462
+ openDropdown(
463
+ e: React.KeyboardEvent | React.FocusEvent | React.MouseEvent,
464
+ ): void {
465
+ let { data } = this.props;
466
+ this.openDropdownOnFocus = false;
467
+
468
+ if (!this.state.dropdownOpen && !(data.disabled || data.readOnly)) {
469
+ this.setState({ dropdownOpen: true });
470
+ }
471
+ }
472
+
473
+ trim(value: string): string {
474
+ return value.replace(/\s/g, "");
475
+ }
476
+
477
+ UNSAFE_componentWillReceiveProps(props: ColorInputProps): void {
478
+ let { data, instance } = props;
479
+ let { state } = instance;
480
+ let nv = this.trim((data.value as string) || "");
481
+ if (
482
+ nv != this.input.value &&
483
+ (this.data.value != data.value || !state?.inputError)
484
+ ) {
485
+ this.input.value = nv;
465
486
  instance.setState({
466
- inputError: false,
487
+ inputError: false,
467
488
  });
468
- e.stopPropagation();
469
- e.preventDefault();
470
- }
471
-
472
- onChange(inputValue: string, eventType: string): void {
473
- let { instance, data } = this.props;
474
- let { widget } = instance;
475
-
476
- if (eventType == "blur") {
477
- instance.setState({ visited: true });
478
- }
479
-
480
- let isValid;
481
- try {
482
- parseColor(inputValue);
483
- isValid = true;
484
- } catch (e) {
485
- isValid = false;
486
- }
487
-
488
- if (eventType == "blur" || eventType == "enter") {
489
- let value = inputValue || (widget as ColorField).emptyValue;
490
- if (isValid && value !== data.value) instance.set("value", value);
491
-
492
- instance.setState({
493
- inputError: !isValid && "Invalid color entered.",
494
- });
495
- }
496
- }
489
+ }
490
+ this.data = data;
491
+
492
+ const tooltip1 = getFieldTooltip(instance);
493
+ tooltipParentWillReceiveProps(this.input, tooltip1[0], tooltip1[1]);
494
+ }
495
+
496
+ componentDidMount(): void {
497
+ const tooltip2 = getFieldTooltip(this.props.instance);
498
+ tooltipParentDidMount(this.input, tooltip2[0], tooltip2[1]);
499
+ if (
500
+ (this.props.instance.widget as ColorField).autoFocus &&
501
+ !isTouchDevice()
502
+ )
503
+ this.input.focus();
504
+ }
505
+
506
+ componentWillUnmount(): void {
507
+ if (
508
+ this.input == getActiveElement() &&
509
+ this.input.value != this.props.data.value
510
+ ) {
511
+ this.onChange(this.input.value, "blur");
512
+ }
513
+ tooltipParentWillUnmount(this.props.instance);
514
+ }
515
+
516
+ onClearClick(e: React.MouseEvent): void {
517
+ let { instance } = this.props;
518
+ instance.set("value", (instance.widget as ColorField).emptyValue);
519
+ instance.setState({
520
+ inputError: false,
521
+ });
522
+ e.stopPropagation();
523
+ e.preventDefault();
524
+ }
525
+
526
+ onChange(inputValue: string, eventType: string): void {
527
+ let { instance, data } = this.props;
528
+ let { widget } = instance;
529
+
530
+ if (eventType == "blur") {
531
+ instance.setState({ visited: true });
532
+ }
533
+
534
+ let isValid;
535
+ try {
536
+ parseColor(inputValue);
537
+ isValid = true;
538
+ } catch (e) {
539
+ isValid = false;
540
+ }
541
+
542
+ if (eventType == "blur" || eventType == "enter") {
543
+ let value = inputValue || (widget as ColorField).emptyValue;
544
+ if (isValid && value !== data.value) instance.set("value", value);
545
+
546
+ instance.setState({
547
+ inputError: !isValid && "Invalid color entered.",
548
+ });
549
+ }
550
+ }
497
551
  }