cx 25.10.1 → 26.0.1

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 (1247) hide show
  1. package/.mocharc.json +5 -0
  2. package/LICENSE-THIRD-PARTY.md +91 -91
  3. package/LICENSE.md +7 -7
  4. package/README.md +46 -46
  5. package/build.js +129 -0
  6. package/dist/charts.css +250 -250
  7. package/dist/charts.js +2421 -3102
  8. package/dist/data.js +857 -1063
  9. package/dist/hooks.js +48 -59
  10. package/dist/jsx-runtime.js +24 -0
  11. package/dist/manifest.js +959 -953
  12. package/dist/svg.js +266 -432
  13. package/dist/ui.js +1935 -2388
  14. package/dist/util.js +587 -557
  15. package/dist/widgets.css +6 -6
  16. package/dist/widgets.js +7543 -9909
  17. package/package.json +39 -5
  18. package/src/charts/Bar.scss +5 -3
  19. package/src/charts/Bar.ts +114 -0
  20. package/src/charts/BarGraph.scss +4 -3
  21. package/src/charts/BarGraph.tsx +145 -0
  22. package/src/charts/BubbleGraph.scss +5 -3
  23. package/src/charts/BubbleGraph.tsx +165 -0
  24. package/src/charts/Chart.ts +108 -0
  25. package/src/charts/ColorMap.ts +150 -0
  26. package/src/charts/Column.scss +5 -3
  27. package/src/charts/Column.ts +124 -0
  28. package/src/charts/ColumnBarBase.tsx +284 -0
  29. package/src/charts/ColumnBarGraphBase.tsx +229 -0
  30. package/src/charts/ColumnGraph.scss +5 -3
  31. package/src/charts/ColumnGraph.tsx +153 -0
  32. package/src/charts/Grid.ts +5 -0
  33. package/src/charts/Gridlines.scss +5 -3
  34. package/src/charts/Gridlines.tsx +88 -0
  35. package/src/charts/Legend.scss +5 -3
  36. package/src/charts/Legend.tsx +270 -0
  37. package/src/charts/LegendEntry.scss +5 -3
  38. package/src/charts/LegendEntry.tsx +197 -0
  39. package/src/charts/LineGraph.scss +4 -3
  40. package/src/charts/LineGraph.tsx +441 -0
  41. package/src/charts/Marker.scss +5 -3
  42. package/src/charts/Marker.tsx +483 -0
  43. package/src/charts/MarkerLine.scss +5 -3
  44. package/src/charts/MarkerLine.tsx +214 -0
  45. package/src/charts/MouseTracker.tsx +112 -0
  46. package/src/charts/Pie.ts +8 -0
  47. package/src/charts/PieChart.scss +5 -3
  48. package/src/charts/PieChart.tsx +717 -0
  49. package/src/charts/PieLabel.tsx +106 -0
  50. package/src/charts/PieLabelsContainer.ts +68 -0
  51. package/src/charts/Range.scss +4 -3
  52. package/src/charts/Range.tsx +318 -0
  53. package/src/charts/RangeMarker.scss +5 -3
  54. package/src/charts/RangeMarker.tsx +233 -0
  55. package/src/charts/ScatterGraph.scss +5 -3
  56. package/src/charts/ScatterGraph.tsx +245 -0
  57. package/src/charts/Swimlane.scss +5 -3
  58. package/src/charts/Swimlane.tsx +195 -0
  59. package/src/charts/Swimlanes.scss +5 -3
  60. package/src/charts/Swimlanes.tsx +179 -0
  61. package/src/charts/axis/Axis.scss +22 -22
  62. package/src/charts/axis/Axis.tsx +444 -0
  63. package/src/charts/axis/CategoryAxis.scss +5 -3
  64. package/src/charts/axis/CategoryAxis.tsx +313 -0
  65. package/src/charts/axis/NumericAxis.scss +5 -3
  66. package/src/charts/axis/NumericAxis.tsx +437 -0
  67. package/src/charts/axis/Stack.ts +61 -0
  68. package/src/charts/axis/TimeAxis.scss +4 -3
  69. package/src/charts/axis/TimeAxis.tsx +718 -0
  70. package/src/charts/axis/index.scss +5 -5
  71. package/src/charts/axis/index.ts +4 -0
  72. package/src/charts/axis/variables.scss +2 -2
  73. package/src/charts/helpers/MinMaxFinder.ts +66 -0
  74. package/src/charts/helpers/PointReducer.ts +135 -0
  75. package/src/charts/helpers/SnapPointFinder.ts +136 -0
  76. package/src/charts/helpers/ValueAtFinder.ts +72 -0
  77. package/src/charts/helpers/index.ts +4 -0
  78. package/src/charts/index.scss +22 -22
  79. package/src/charts/palette.scss +7 -5
  80. package/src/charts/shapes.tsx +86 -0
  81. package/src/charts/variables.scss +2 -1
  82. package/src/core.d.ts +182 -310
  83. package/src/data/AggregateFunction.ts +171 -0
  84. package/src/data/ArrayElementView.spec.ts +88 -0
  85. package/src/data/ArrayElementView.ts +90 -0
  86. package/src/data/ArrayRef.ts +35 -0
  87. package/src/data/AugmentedViewBase.ts +88 -0
  88. package/src/data/Binding.ts +104 -0
  89. package/src/data/ExposedRecordView.ts +95 -0
  90. package/src/data/ExposedValueView.ts +89 -0
  91. package/src/data/Expression.spec.ts +229 -0
  92. package/src/data/Expression.ts +233 -0
  93. package/src/data/Grouper.spec.ts +57 -0
  94. package/src/data/Grouper.ts +158 -0
  95. package/src/data/NestedDataView.ts +43 -0
  96. package/src/data/ReadOnlyDataView.ts +39 -0
  97. package/src/data/Ref.spec.ts +79 -0
  98. package/src/data/Ref.ts +104 -0
  99. package/src/data/Selector.ts +10 -0
  100. package/src/data/Store.spec.ts +22 -0
  101. package/src/data/Store.ts +52 -0
  102. package/src/data/StoreProxy.ts +19 -0
  103. package/src/data/StoreRef.spec.ts +24 -0
  104. package/src/data/StoreRef.ts +66 -0
  105. package/src/data/StringTemplate.spec.ts +132 -0
  106. package/src/data/StringTemplate.ts +93 -0
  107. package/src/data/StructuredSelector.spec.ts +113 -0
  108. package/src/data/StructuredSelector.ts +146 -0
  109. package/src/data/SubscribableView.ts +63 -0
  110. package/src/data/View.ts +289 -0
  111. package/src/data/ZoomIntoPropertyView.spec.ts +64 -0
  112. package/src/data/ZoomIntoPropertyView.ts +45 -0
  113. package/src/data/comparer.ts +78 -0
  114. package/src/data/computable.spec.ts +62 -0
  115. package/src/data/computable.ts +72 -0
  116. package/src/data/createAccessorModelProxy.ts +60 -0
  117. package/src/data/createStructuredSelector.spec.ts +45 -0
  118. package/src/data/createStructuredSelector.ts +62 -0
  119. package/src/data/defaultCompare.ts +15 -0
  120. package/src/data/diff/diffArrays.ts +49 -0
  121. package/src/data/diff/diffs.spec.ts +49 -0
  122. package/src/data/diff/index.ts +1 -0
  123. package/src/data/enableFatArrowExpansion.ts +6 -0
  124. package/src/data/getAccessor.spec.ts +11 -0
  125. package/src/data/getAccessor.ts +74 -0
  126. package/src/data/getSelector.spec.ts +43 -0
  127. package/src/data/getSelector.ts +66 -0
  128. package/src/data/index.ts +30 -0
  129. package/src/data/isSelector.ts +26 -0
  130. package/src/data/ops/append.spec.ts +28 -0
  131. package/src/data/ops/append.ts +5 -0
  132. package/src/data/ops/filter.spec.ts +35 -0
  133. package/src/data/ops/filter.ts +9 -0
  134. package/src/data/ops/findTreeNode.spec.ts +23 -0
  135. package/src/data/ops/findTreeNode.ts +18 -0
  136. package/src/data/ops/findTreePath.ts +23 -0
  137. package/src/data/ops/insertElement.ts +3 -0
  138. package/src/data/ops/merge.spec.ts +27 -0
  139. package/src/data/ops/merge.ts +13 -0
  140. package/src/data/ops/moveElement.ts +21 -0
  141. package/src/data/ops/removeTreeNodes.spec.ts +37 -0
  142. package/src/data/ops/removeTreeNodes.ts +15 -0
  143. package/src/data/ops/updateArray.spec.ts +69 -0
  144. package/src/data/ops/updateArray.ts +31 -0
  145. package/src/data/ops/updateTree.spec.ts +54 -0
  146. package/src/data/ops/updateTree.ts +23 -0
  147. package/src/data/test-types.ts +7 -0
  148. package/src/global.scss +13 -13
  149. package/src/hooks/createLocalStorageRef.ts +21 -0
  150. package/src/hooks/invokeCallback.spec.tsx +59 -0
  151. package/src/hooks/invokeCallback.ts +8 -0
  152. package/src/hooks/resolveCallback.spec.tsx +48 -0
  153. package/src/hooks/resolveCallback.ts +16 -0
  154. package/src/hooks/store.spec.tsx +67 -0
  155. package/src/hooks/store.ts +46 -0
  156. package/src/hooks/useEffect.ts +14 -0
  157. package/src/hooks/useInterval.ts +8 -0
  158. package/src/hooks/useState.ts +20 -0
  159. package/src/hooks/useTrigger.spec.tsx +99 -0
  160. package/src/hooks/useTrigger.ts +26 -0
  161. package/src/jsx-runtime.ts +72 -0
  162. package/src/locale/de-de.ts +76 -0
  163. package/src/locale/en-us.ts +75 -0
  164. package/src/locale/es-es.ts +76 -0
  165. package/src/locale/fr-fr.ts +76 -0
  166. package/src/locale/nl-nl.ts +76 -0
  167. package/src/locale/pt-pt.ts +76 -0
  168. package/src/locale/sr-latn-ba.ts +76 -0
  169. package/src/svg/BoundedObject.ts +101 -0
  170. package/src/svg/ClipRect.tsx +29 -0
  171. package/src/svg/Ellipse.tsx +69 -0
  172. package/src/svg/Line.tsx +58 -0
  173. package/src/svg/NonOverlappingRect.ts +26 -0
  174. package/src/svg/NonOverlappingRectGroup.ts +49 -0
  175. package/src/svg/Rectangle.tsx +91 -0
  176. package/src/svg/Svg.scss +5 -4
  177. package/src/svg/Svg.tsx +241 -0
  178. package/src/svg/Text.tsx +134 -0
  179. package/src/svg/TextualBoundedObject.ts +35 -0
  180. package/src/svg/index.scss +8 -8
  181. package/src/svg/util/Rect.ts +105 -0
  182. package/src/ui/CSS.ts +87 -0
  183. package/src/ui/CSSHelper.ts +17 -0
  184. package/src/ui/Container.tsx +216 -0
  185. package/src/ui/ContentResolver.spec.tsx +430 -0
  186. package/src/ui/ContentResolver.ts +124 -0
  187. package/src/ui/Controller.spec.tsx +566 -0
  188. package/src/ui/Controller.ts +189 -0
  189. package/src/ui/Culture.ts +159 -0
  190. package/src/ui/Cx.spec.tsx +208 -0
  191. package/src/ui/Cx.tsx +386 -0
  192. package/src/ui/DataProxy.spec.tsx +337 -0
  193. package/src/ui/DataProxy.ts +55 -0
  194. package/src/ui/DetachedScope.tsx +159 -0
  195. package/src/ui/FocusManager.ts +171 -0
  196. package/src/ui/Format.ts +108 -0
  197. package/src/ui/HoverSync.tsx +189 -0
  198. package/src/ui/Instance.ts +868 -0
  199. package/src/ui/IsolatedScope.spec.tsx +55 -0
  200. package/src/ui/IsolatedScope.ts +50 -0
  201. package/src/ui/Localization.ts +70 -0
  202. package/src/ui/Prop.ts +112 -0
  203. package/src/ui/PureContainer.spec.tsx +230 -0
  204. package/src/ui/PureContainer.tsx +19 -0
  205. package/src/ui/RenderingContext.ts +99 -0
  206. package/src/ui/Repeater.spec.tsx +141 -0
  207. package/src/ui/Repeater.ts +203 -0
  208. package/src/ui/Rescope.spec.tsx +199 -0
  209. package/src/ui/Rescope.ts +49 -0
  210. package/src/ui/ResizeManager.ts +31 -0
  211. package/src/ui/Restate.spec.tsx +418 -0
  212. package/src/ui/Restate.tsx +217 -0
  213. package/src/ui/StaticText.ts +11 -0
  214. package/src/ui/StructuredInstanceDataAccessor.ts +32 -0
  215. package/src/ui/Text.ts +30 -0
  216. package/src/ui/VDOM.ts +34 -0
  217. package/src/ui/Widget.spec.tsx +53 -0
  218. package/src/ui/Widget.tsx +308 -0
  219. package/src/ui/ZIndexManager.ts +11 -0
  220. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -0
  221. package/src/ui/adapter/ArrayAdapter.ts +226 -0
  222. package/src/ui/adapter/DataAdapter.ts +52 -0
  223. package/src/ui/adapter/GroupAdapter.ts +235 -0
  224. package/src/ui/adapter/TreeAdapter.spec.ts +76 -0
  225. package/src/ui/adapter/TreeAdapter.ts +185 -0
  226. package/src/ui/app/History.ts +133 -0
  227. package/src/ui/app/Url.spec.ts +50 -0
  228. package/src/ui/app/Url.ts +102 -0
  229. package/src/ui/app/startAppLoop.tsx +74 -0
  230. package/src/ui/app/startHotAppLoop.ts +40 -0
  231. package/src/ui/batchUpdates.ts +77 -0
  232. package/src/ui/bind.ts +10 -0
  233. package/src/ui/createFunctionalComponent.spec.tsx +399 -0
  234. package/src/ui/createFunctionalComponent.ts +65 -0
  235. package/src/ui/expr.ts +44 -0
  236. package/src/ui/flattenProps.ts +21 -0
  237. package/src/ui/index.scss +2 -2
  238. package/src/ui/index.ts +45 -0
  239. package/src/ui/keyboardShortcuts.ts +40 -0
  240. package/src/ui/layout/Content.ts +30 -0
  241. package/src/ui/layout/ContentPlaceholder.spec.tsx +587 -0
  242. package/src/ui/layout/ContentPlaceholder.ts +133 -0
  243. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +195 -0
  244. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -0
  245. package/src/ui/layout/LabelsLeftLayout.scss +6 -4
  246. package/src/ui/layout/LabelsLeftLayout.tsx +76 -0
  247. package/src/ui/layout/LabelsTopLayout.scss +5 -4
  248. package/src/ui/layout/LabelsTopLayout.tsx +156 -0
  249. package/src/ui/layout/UseParentLayout.ts +8 -0
  250. package/src/ui/layout/exploreChildren.ts +38 -0
  251. package/src/ui/layout/index.scss +3 -3
  252. package/src/ui/layout/variables.scss +2 -2
  253. package/src/ui/selection/KeySelection.ts +165 -0
  254. package/src/ui/selection/PropertySelection.ts +87 -0
  255. package/src/ui/selection/Selection.ts +118 -0
  256. package/src/ui/tpl.ts +5 -0
  257. package/src/ui/variables.scss +1 -1
  258. package/src/util/Component.spec.ts +381 -0
  259. package/src/util/Component.ts +296 -0
  260. package/src/util/Console.ts +11 -0
  261. package/src/util/DOM.ts +88 -0
  262. package/src/util/Debug.ts +71 -0
  263. package/src/util/Format.spec.ts +69 -0
  264. package/src/util/Format.ts +267 -0
  265. package/src/util/GlobalCacheIdentifier.ts +11 -0
  266. package/src/util/KeyCode.ts +21 -0
  267. package/src/util/SubscriberList.ts +87 -0
  268. package/src/util/Timing.ts +59 -0
  269. package/src/util/TraversalStack.spec.ts +54 -0
  270. package/src/util/TraversalStack.ts +48 -0
  271. package/src/util/addEventListenerWithOptions.ts +41 -0
  272. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -0
  273. package/src/util/calculateNaturalElementHeight.ts +22 -0
  274. package/src/util/call-once.scss +6 -6
  275. package/src/util/capitalize.ts +4 -0
  276. package/src/util/coalesce.ts +6 -0
  277. package/src/util/color/hslToRgb.ts +34 -0
  278. package/src/util/color/parseColor.ts +173 -0
  279. package/src/util/color/rgbToHex.ts +15 -0
  280. package/src/util/color/rgbToHsl.ts +36 -0
  281. package/src/util/date/dateDiff.ts +9 -0
  282. package/src/util/date/diff.ts +13 -0
  283. package/src/util/date/encodeDate.ts +8 -0
  284. package/src/util/date/encodeDateWithTimezoneOffset.ts +19 -0
  285. package/src/util/date/lowerBoundCheck.ts +13 -0
  286. package/src/util/date/maxDate.ts +14 -0
  287. package/src/util/date/minDate.ts +14 -0
  288. package/src/util/date/monthStart.ts +8 -0
  289. package/src/util/date/parseDateInvariant.ts +20 -0
  290. package/src/util/date/sameDate.ts +11 -0
  291. package/src/util/date/upperBoundCheck.ts +13 -0
  292. package/src/util/date/zeroTime.ts +9 -0
  293. package/src/util/debounce.ts +26 -0
  294. package/src/util/dummyCallback.ts +1 -0
  295. package/src/util/escapeSpecialRegexCharacters.ts +8 -0
  296. package/src/util/eventCallbacks.ts +12 -0
  297. package/src/util/expandFatArrows.ts +118 -0
  298. package/src/util/findScrollableParent.ts +15 -0
  299. package/src/util/getActiveElement.ts +4 -0
  300. package/src/util/getParentFrameBoundingClientRect.ts +13 -0
  301. package/src/util/getScrollerBoundingClientRect.ts +12 -0
  302. package/src/util/getSearchQueryPredicate.ts +58 -0
  303. package/src/util/getTopLevelBoundingClientRect.ts +7 -0
  304. package/src/util/getVendorPrefix.ts +33 -0
  305. package/src/util/hasKey.ts +18 -0
  306. package/src/util/index.scss +10 -10
  307. package/src/util/index.ts +55 -0
  308. package/src/util/innerTextTrim.ts +10 -0
  309. package/src/util/isArray.ts +3 -0
  310. package/src/util/isDataRecord.ts +5 -0
  311. package/src/util/isDefined.ts +3 -0
  312. package/src/util/isDigit.ts +8 -0
  313. package/src/util/isFunction.ts +3 -0
  314. package/src/util/isNonEmptyArray.ts +3 -0
  315. package/src/util/isNumber.ts +3 -0
  316. package/src/util/isObject.ts +3 -0
  317. package/src/util/isPromise.ts +6 -0
  318. package/src/util/isString.ts +3 -0
  319. package/src/util/isTextInputElement.ts +3 -0
  320. package/src/util/isTouchDevice.ts +7 -0
  321. package/src/util/isTouchEvent.ts +64 -0
  322. package/src/util/isUndefined.ts +3 -0
  323. package/src/util/isValidIdentifierName.ts +5 -0
  324. package/src/util/onIdleCallback.ts +10 -0
  325. package/src/util/parseStyle.ts +29 -0
  326. package/src/util/quote.ts +6 -0
  327. package/src/util/reverseSlice.ts +10 -0
  328. package/src/util/routeAppend.ts +16 -0
  329. package/src/util/scrollElementIntoView.ts +40 -0
  330. package/src/util/scss/add-rules.scss +7 -5
  331. package/src/util/scss/calc.scss +12 -8
  332. package/src/util/scss/call-once.scss +5 -3
  333. package/src/util/scss/clockwise.scss +20 -18
  334. package/src/util/scss/colors.scss +4 -2
  335. package/src/util/scss/deep-get.scss +3 -1
  336. package/src/util/scss/deep-merge.scss +6 -3
  337. package/src/util/scss/divide.scss +3 -3
  338. package/src/util/scss/include.scss +6 -5
  339. package/src/util/scss/index.scss +9 -9
  340. package/src/util/shallowEquals.ts +43 -0
  341. package/src/util/test/createTestRenderer.tsx +12 -0
  342. package/src/util/throttle.ts +21 -0
  343. package/src/util/validatedDebounce.ts +23 -0
  344. package/src/variables.scss +217 -217
  345. package/src/widgets/AccessorBindings.spec.tsx +64 -66
  346. package/src/widgets/Button.scss +6 -4
  347. package/src/widgets/Button.tsx +201 -0
  348. package/src/widgets/Button.variables.scss +13 -10
  349. package/src/widgets/CxCredit.scss +6 -4
  350. package/src/widgets/CxCredit.tsx +46 -0
  351. package/src/widgets/DocumentTitle.ts +92 -0
  352. package/src/widgets/FlexBox.scss +7 -5
  353. package/src/widgets/FlexBox.tsx +169 -0
  354. package/src/widgets/Heading.scss +6 -4
  355. package/src/widgets/Heading.ts +43 -0
  356. package/src/widgets/HighlightedSearchText.scss +6 -4
  357. package/src/widgets/HighlightedSearchText.tsx +54 -0
  358. package/src/widgets/HtmlElement.spec.tsx +79 -0
  359. package/src/widgets/HtmlElement.tsx +349 -0
  360. package/src/widgets/Icon.scss +6 -4
  361. package/src/widgets/Icon.ts +78 -0
  362. package/src/widgets/List.scss +6 -4
  363. package/src/widgets/List.tsx +787 -0
  364. package/src/widgets/ProgressBar.scss +5 -4
  365. package/src/widgets/ProgressBar.tsx +66 -0
  366. package/src/widgets/Resizer.scss +5 -4
  367. package/src/widgets/Resizer.tsx +200 -0
  368. package/src/widgets/Sandbox.ts +103 -0
  369. package/src/widgets/Section.scss +5 -4
  370. package/src/widgets/Section.tsx +187 -0
  371. package/src/widgets/animations.scss +10 -10
  372. package/src/widgets/autoFocus.ts +9 -0
  373. package/src/widgets/cx.ts +63 -0
  374. package/src/widgets/drag-drop/DragClone.scss +6 -4
  375. package/src/widgets/drag-drop/DragHandle.scss +6 -4
  376. package/src/widgets/drag-drop/DragHandle.tsx +47 -0
  377. package/src/widgets/drag-drop/DragSource.scss +6 -4
  378. package/src/widgets/drag-drop/DragSource.tsx +238 -0
  379. package/src/widgets/drag-drop/DropZone.scss +6 -4
  380. package/src/widgets/drag-drop/DropZone.tsx +354 -0
  381. package/src/widgets/drag-drop/index.scss +3 -3
  382. package/src/widgets/drag-drop/ops.tsx +422 -0
  383. package/src/widgets/drag-drop/variables.scss +4 -1
  384. package/src/widgets/enableAllInternalDependencies.ts +11 -0
  385. package/src/widgets/form/Calendar.scss +8 -5
  386. package/src/widgets/form/Calendar.tsx +760 -0
  387. package/src/widgets/form/Calendar.variables.scss +63 -63
  388. package/src/widgets/form/Checkbox.scss +5 -3
  389. package/src/widgets/form/Checkbox.tsx +285 -0
  390. package/src/widgets/form/Checkbox.variables.scss +39 -39
  391. package/src/widgets/form/ColorField.scss +5 -3
  392. package/src/widgets/form/ColorField.tsx +491 -0
  393. package/src/widgets/form/ColorPicker.scss +5 -3
  394. package/src/widgets/form/ColorPicker.tsx +544 -0
  395. package/src/widgets/form/ColorPicker.variables.scss +22 -22
  396. package/src/widgets/form/DateField.ts +21 -0
  397. package/src/widgets/form/DateTimeField.scss +5 -3
  398. package/src/widgets/form/DateTimeField.tsx +723 -0
  399. package/src/widgets/form/DateTimePicker.scss +6 -4
  400. package/src/widgets/form/DateTimePicker.tsx +431 -0
  401. package/src/widgets/form/Field.scss +4 -2
  402. package/src/widgets/form/Field.tsx +611 -0
  403. package/src/widgets/form/FieldGroup.ts +10 -0
  404. package/src/widgets/form/FieldIcon.ts +61 -0
  405. package/src/widgets/form/HelpText.scss +5 -4
  406. package/src/widgets/form/HelpText.ts +15 -0
  407. package/src/widgets/form/Label.scss +5 -4
  408. package/src/widgets/form/Label.tsx +116 -0
  409. package/src/widgets/form/LabeledContainer.ts +81 -0
  410. package/src/widgets/form/LookupField.scss +5 -3
  411. package/src/widgets/form/LookupField.tsx +1326 -0
  412. package/src/widgets/form/MonthField.scss +4 -3
  413. package/src/widgets/form/MonthField.tsx +665 -0
  414. package/src/widgets/form/MonthPicker.scss +8 -5
  415. package/src/widgets/form/MonthPicker.tsx +822 -0
  416. package/src/widgets/form/NumberField.scss +5 -3
  417. package/src/widgets/form/NumberField.tsx +540 -0
  418. package/src/widgets/form/Radio.scss +5 -3
  419. package/src/widgets/form/Radio.tsx +245 -0
  420. package/src/widgets/form/Radio.variables.scss +45 -45
  421. package/src/widgets/form/Select.scss +6 -4
  422. package/src/widgets/form/Select.tsx +322 -0
  423. package/src/widgets/form/Slider.scss +6 -3
  424. package/src/widgets/form/Slider.tsx +461 -0
  425. package/src/widgets/form/Switch.scss +5 -3
  426. package/src/widgets/form/Switch.tsx +174 -0
  427. package/src/widgets/form/TextArea.scss +6 -4
  428. package/src/widgets/form/TextArea.tsx +229 -0
  429. package/src/widgets/form/TextField.scss +6 -4
  430. package/src/widgets/form/TextField.tsx +345 -0
  431. package/src/widgets/form/TimeField.ts +10 -0
  432. package/src/widgets/form/TimeList.tsx +94 -0
  433. package/src/widgets/form/UploadButton.scss +5 -3
  434. package/src/widgets/form/UploadButton.tsx +256 -0
  435. package/src/widgets/form/ValidationError.scss +4 -3
  436. package/src/widgets/form/ValidationError.tsx +72 -0
  437. package/src/widgets/form/ValidationGroup.spec.tsx +147 -0
  438. package/src/widgets/form/ValidationGroup.ts +141 -0
  439. package/src/widgets/form/Validator.ts +23 -0
  440. package/src/widgets/form/Wheel.scss +9 -7
  441. package/src/widgets/form/Wheel.tsx +315 -0
  442. package/src/widgets/form/index.scss +24 -24
  443. package/src/widgets/form/variables.scss +3 -1
  444. package/src/widgets/grid/Grid.scss +6 -4
  445. package/src/widgets/grid/Grid.tsx +4247 -0
  446. package/src/widgets/grid/GridCell.ts +143 -0
  447. package/src/widgets/grid/GridCellEditor.tsx +52 -0
  448. package/src/widgets/grid/GridRow.ts +302 -0
  449. package/src/widgets/grid/GridRowLine.ts +49 -0
  450. package/src/widgets/grid/Pagination.scss +5 -3
  451. package/src/widgets/grid/Pagination.tsx +126 -0
  452. package/src/widgets/grid/TreeNode.scss +6 -4
  453. package/src/widgets/grid/TreeNode.tsx +145 -0
  454. package/src/widgets/grid/createGridCellEditor.tsx +18 -0
  455. package/src/widgets/grid/index.scss +3 -3
  456. package/src/widgets/grid/index.ts +17 -0
  457. package/src/widgets/grid/variables.scss +8 -4
  458. package/src/widgets/icons/arrow-down.svg +3 -3
  459. package/src/widgets/icons/arrow-right.svg +2 -2
  460. package/src/widgets/icons/base.svg +104 -104
  461. package/src/widgets/icons/calendar-old.svg +169 -169
  462. package/src/widgets/icons/calendar.svg +187 -187
  463. package/src/widgets/icons/calendar.tsx +17 -0
  464. package/src/widgets/icons/check.tsx +13 -0
  465. package/src/widgets/icons/clear.svg +74 -74
  466. package/src/widgets/icons/clear.tsx +15 -0
  467. package/src/widgets/icons/close.svg +74 -74
  468. package/src/widgets/icons/close.tsx +20 -0
  469. package/src/widgets/icons/cx.tsx +38 -0
  470. package/src/widgets/icons/drop-down.tsx +15 -0
  471. package/src/widgets/icons/dropdown-arrow.svg +61 -61
  472. package/src/widgets/icons/file.svg +4 -4
  473. package/src/widgets/icons/file.tsx +13 -0
  474. package/src/widgets/icons/folder-open.svg +5 -5
  475. package/src/widgets/icons/folder-open.tsx +15 -0
  476. package/src/widgets/icons/folder.svg +58 -58
  477. package/src/widgets/icons/folder.tsx +13 -0
  478. package/src/widgets/icons/forward.svg +67 -67
  479. package/src/widgets/icons/forward.tsx +22 -0
  480. package/src/widgets/icons/loading.svg +4 -4
  481. package/src/widgets/icons/loading.tsx +24 -0
  482. package/src/widgets/icons/menu.tsx +17 -0
  483. package/src/widgets/icons/pixel-picker.tsx +18 -0
  484. package/src/widgets/icons/registry.ts +57 -0
  485. package/src/widgets/icons/search.svg +107 -107
  486. package/src/widgets/icons/search.tsx +13 -0
  487. package/src/widgets/icons/sort-asc.svg +3 -3
  488. package/src/widgets/icons/sort-asc.tsx +14 -0
  489. package/src/widgets/icons/square.tsx +18 -0
  490. package/src/widgets/index.d.ts +55 -55
  491. package/src/widgets/index.scss +16 -16
  492. package/src/widgets/nav/Link.scss +5 -3
  493. package/src/widgets/nav/Link.ts +12 -0
  494. package/src/widgets/nav/LinkButton.ts +176 -0
  495. package/src/widgets/nav/Menu.scss +7 -5
  496. package/src/widgets/nav/Menu.tsx +489 -0
  497. package/src/widgets/nav/Menu.variables.scss +3 -1
  498. package/src/widgets/nav/MenuItem.scss +6 -4
  499. package/src/widgets/nav/MenuItem.tsx +523 -0
  500. package/src/widgets/nav/MenuSpacer.ts +19 -0
  501. package/src/widgets/nav/RedirectRoute.ts +50 -0
  502. package/src/widgets/nav/Route.spec.tsx +24 -0
  503. package/src/widgets/nav/Route.ts +142 -0
  504. package/src/widgets/nav/Scroller.scss +5 -3
  505. package/src/widgets/nav/Scroller.tsx +253 -0
  506. package/src/widgets/nav/Submenu.ts +6 -0
  507. package/src/widgets/nav/Tab.scss +5 -4
  508. package/src/widgets/nav/Tab.ts +120 -0
  509. package/src/widgets/nav/Tab.variables.scss +84 -84
  510. package/src/widgets/nav/cover.scss +5 -4
  511. package/src/widgets/nav/index.scss +5 -5
  512. package/src/widgets/nav/variables.scss +3 -1
  513. package/src/widgets/overlay/ContextMenu.ts +42 -0
  514. package/src/widgets/overlay/Dropdown.scss +11 -9
  515. package/src/widgets/overlay/Dropdown.tsx +762 -0
  516. package/src/widgets/overlay/FlyweightTooltipTracker.ts +57 -0
  517. package/src/widgets/overlay/MsgBox.tsx +141 -0
  518. package/src/widgets/overlay/Overlay.scss +5 -3
  519. package/src/widgets/overlay/Overlay.tsx +942 -0
  520. package/src/widgets/overlay/Toast.scss +8 -7
  521. package/src/widgets/overlay/Toast.ts +111 -0
  522. package/src/widgets/overlay/Tooltip.scss +6 -4
  523. package/src/widgets/overlay/Tooltip.tsx +393 -0
  524. package/src/widgets/overlay/Window.scss +6 -4
  525. package/src/widgets/overlay/Window.tsx +299 -0
  526. package/src/widgets/overlay/Window.variables.scss +62 -62
  527. package/src/widgets/overlay/alerts.ts +46 -0
  528. package/src/widgets/overlay/captureMouse.scss +13 -13
  529. package/src/widgets/overlay/captureMouse.ts +195 -0
  530. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -0
  531. package/src/widgets/overlay/index.scss +15 -15
  532. package/src/widgets/overlay/index.ts +11 -0
  533. package/src/widgets/overlay/tooltip-ops.ts +173 -0
  534. package/src/widgets/overlay/variables.scss +3 -1
  535. package/src/widgets/variables.scss +3 -1
  536. package/tsconfig.compile.json +4 -0
  537. package/tsconfig.json +34 -0
  538. package/tsconfig.mocha.json +14 -0
  539. package/charts.d.ts +0 -1
  540. package/charts.js +0 -1
  541. package/data.d.ts +0 -1
  542. package/data.js +0 -1
  543. package/hooks.d.ts +0 -1
  544. package/hooks.js +0 -1
  545. package/index.js +0 -17
  546. package/locale/de-de.js +0 -75
  547. package/locale/en-us.js +0 -75
  548. package/locale/es-es.js +0 -75
  549. package/locale/fr-fr.js +0 -75
  550. package/locale/nl-nl.js +0 -75
  551. package/locale/pt-pt.js +0 -75
  552. package/locale/sr-latn-ba.js +0 -75
  553. package/manifest.js +0 -1
  554. package/src/charts/Bar.d.ts +0 -28
  555. package/src/charts/Bar.js +0 -90
  556. package/src/charts/BarGraph.d.ts +0 -15
  557. package/src/charts/BarGraph.js +0 -112
  558. package/src/charts/BubbleGraph.js +0 -93
  559. package/src/charts/Chart.d.ts +0 -12
  560. package/src/charts/Chart.js +0 -75
  561. package/src/charts/ColorMap.d.ts +0 -21
  562. package/src/charts/ColorMap.js +0 -97
  563. package/src/charts/Column.d.ts +0 -29
  564. package/src/charts/Column.js +0 -88
  565. package/src/charts/ColumnBarBase.d.ts +0 -64
  566. package/src/charts/ColumnBarBase.js +0 -176
  567. package/src/charts/ColumnBarGraphBase.d.ts +0 -73
  568. package/src/charts/ColumnBarGraphBase.js +0 -114
  569. package/src/charts/ColumnGraph.d.ts +0 -18
  570. package/src/charts/ColumnGraph.js +0 -120
  571. package/src/charts/Grid.js +0 -5
  572. package/src/charts/Gridlines.d.ts +0 -25
  573. package/src/charts/Gridlines.js +0 -49
  574. package/src/charts/Legend.d.ts +0 -45
  575. package/src/charts/Legend.js +0 -187
  576. package/src/charts/LegendEntry.d.ts +0 -54
  577. package/src/charts/LegendEntry.js +0 -128
  578. package/src/charts/LineGraph.d.ts +0 -101
  579. package/src/charts/LineGraph.js +0 -300
  580. package/src/charts/Marker.d.ts +0 -110
  581. package/src/charts/Marker.js +0 -311
  582. package/src/charts/MarkerLine.d.ts +0 -56
  583. package/src/charts/MarkerLine.js +0 -128
  584. package/src/charts/MouseTracker.d.ts +0 -17
  585. package/src/charts/MouseTracker.js +0 -81
  586. package/src/charts/Pie.js +0 -8
  587. package/src/charts/PieChart.d.ts +0 -92
  588. package/src/charts/PieChart.js +0 -530
  589. package/src/charts/PieLabel.d.ts +0 -26
  590. package/src/charts/PieLabel.js +0 -71
  591. package/src/charts/PieLabelsContainer.d.ts +0 -6
  592. package/src/charts/PieLabelsContainer.js +0 -55
  593. package/src/charts/Range.d.ts +0 -75
  594. package/src/charts/Range.js +0 -206
  595. package/src/charts/RangeMarker.d.ts +0 -35
  596. package/src/charts/RangeMarker.js +0 -159
  597. package/src/charts/ScatterGraph.d.ts +0 -64
  598. package/src/charts/ScatterGraph.js +0 -164
  599. package/src/charts/Swimlane.d.ts +0 -24
  600. package/src/charts/Swimlane.js +0 -140
  601. package/src/charts/Swimlanes.d.ts +0 -41
  602. package/src/charts/Swimlanes.js +0 -114
  603. package/src/charts/axis/Axis.d.ts +0 -113
  604. package/src/charts/axis/Axis.js +0 -288
  605. package/src/charts/axis/CategoryAxis.d.ts +0 -30
  606. package/src/charts/axis/CategoryAxis.js +0 -241
  607. package/src/charts/axis/NumericAxis.d.ts +0 -46
  608. package/src/charts/axis/NumericAxis.js +0 -351
  609. package/src/charts/axis/Stack.d.ts +0 -11
  610. package/src/charts/axis/Stack.js +0 -55
  611. package/src/charts/axis/TimeAxis.d.ts +0 -31
  612. package/src/charts/axis/TimeAxis.js +0 -611
  613. package/src/charts/axis/index.d.ts +0 -4
  614. package/src/charts/axis/index.js +0 -4
  615. package/src/charts/helpers/MinMaxFinder.d.ts +0 -22
  616. package/src/charts/helpers/MinMaxFinder.js +0 -36
  617. package/src/charts/helpers/PointReducer.d.ts +0 -24
  618. package/src/charts/helpers/PointReducer.js +0 -61
  619. package/src/charts/helpers/SnapPointFinder.d.ts +0 -30
  620. package/src/charts/helpers/SnapPointFinder.js +0 -69
  621. package/src/charts/helpers/ValueAtFinder.d.ts +0 -16
  622. package/src/charts/helpers/ValueAtFinder.js +0 -46
  623. package/src/charts/helpers/index.d.ts +0 -4
  624. package/src/charts/helpers/index.js +0 -4
  625. package/src/charts/index.d.ts +0 -27
  626. package/src/charts/shapes.d.ts +0 -23
  627. package/src/charts/shapes.js +0 -79
  628. package/src/data/AggregateFunction.d.ts +0 -20
  629. package/src/data/AggregateFunction.js +0 -145
  630. package/src/data/ArrayElementView.d.ts +0 -13
  631. package/src/data/ArrayElementView.js +0 -64
  632. package/src/data/ArrayElementView.spec.js +0 -88
  633. package/src/data/ArrayRef.d.ts +0 -15
  634. package/src/data/ArrayRef.js +0 -35
  635. package/src/data/AugmentedViewBase.d.ts +0 -18
  636. package/src/data/AugmentedViewBase.js +0 -77
  637. package/src/data/Binding.d.ts +0 -19
  638. package/src/data/Binding.js +0 -76
  639. package/src/data/ExposedRecordView.d.ts +0 -14
  640. package/src/data/ExposedRecordView.js +0 -75
  641. package/src/data/ExposedValueView.d.ts +0 -19
  642. package/src/data/ExposedValueView.js +0 -73
  643. package/src/data/Expression.d.ts +0 -17
  644. package/src/data/Expression.js +0 -229
  645. package/src/data/Expression.spec.js +0 -229
  646. package/src/data/Grouper.d.ts +0 -21
  647. package/src/data/Grouper.js +0 -144
  648. package/src/data/Grouper.spec.js +0 -57
  649. package/src/data/NestedDataView.d.ts +0 -19
  650. package/src/data/NestedDataView.js +0 -22
  651. package/src/data/ReadOnlyDataView.d.ts +0 -14
  652. package/src/data/ReadOnlyDataView.js +0 -27
  653. package/src/data/Ref.d.ts +0 -24
  654. package/src/data/Ref.js +0 -79
  655. package/src/data/Ref.spec.js +0 -79
  656. package/src/data/Store.d.ts +0 -14
  657. package/src/data/Store.js +0 -46
  658. package/src/data/Store.spec.js +0 -22
  659. package/src/data/StoreProxy.d.ts +0 -5
  660. package/src/data/StoreProxy.js +0 -17
  661. package/src/data/StoreRef.js +0 -54
  662. package/src/data/StoreRef.spec.js +0 -24
  663. package/src/data/StringTemplate.d.ts +0 -15
  664. package/src/data/StringTemplate.js +0 -92
  665. package/src/data/StringTemplate.spec.js +0 -132
  666. package/src/data/StructuredDataAccessor.d.ts +0 -7
  667. package/src/data/StructuredSelector.d.ts +0 -17
  668. package/src/data/StructuredSelector.js +0 -132
  669. package/src/data/StructuredSelector.spec.js +0 -113
  670. package/src/data/SubscribableView.d.ts +0 -11
  671. package/src/data/SubscribableView.js +0 -54
  672. package/src/data/View.d.ts +0 -155
  673. package/src/data/View.js +0 -182
  674. package/src/data/ZoomIntoPropertyView.d.ts +0 -11
  675. package/src/data/ZoomIntoPropertyView.js +0 -33
  676. package/src/data/ZoomIntoPropertyView.spec.js +0 -65
  677. package/src/data/comparer.d.ts +0 -7
  678. package/src/data/comparer.js +0 -54
  679. package/src/data/computable.d.ts +0 -125
  680. package/src/data/computable.js +0 -56
  681. package/src/data/computable.spec.js +0 -55
  682. package/src/data/createAccessorModelProxy.d.ts +0 -6
  683. package/src/data/createAccessorModelProxy.js +0 -43
  684. package/src/data/createStructuredSelector.d.ts +0 -3
  685. package/src/data/createStructuredSelector.js +0 -43
  686. package/src/data/createStructuredSelector.spec.js +0 -46
  687. package/src/data/defaultCompare.d.ts +0 -1
  688. package/src/data/defaultCompare.js +0 -15
  689. package/src/data/diff/diffArrays.d.ts +0 -15
  690. package/src/data/diff/diffArrays.js +0 -41
  691. package/src/data/diff/diffs.spec.js +0 -49
  692. package/src/data/diff/index.d.ts +0 -1
  693. package/src/data/diff/index.js +0 -1
  694. package/src/data/enableFatArrowExpansion.d.ts +0 -1
  695. package/src/data/enableFatArrowExpansion.js +0 -6
  696. package/src/data/getAccessor.d.ts +0 -9
  697. package/src/data/getAccessor.js +0 -61
  698. package/src/data/getAccessor.spec.js +0 -11
  699. package/src/data/getSelector.d.ts +0 -3
  700. package/src/data/getSelector.js +0 -49
  701. package/src/data/getSelector.spec.js +0 -43
  702. package/src/data/index.d.ts +0 -30
  703. package/src/data/index.js +0 -29
  704. package/src/data/isSelector.d.ts +0 -1
  705. package/src/data/isSelector.js +0 -26
  706. package/src/data/ops/append.d.ts +0 -1
  707. package/src/data/ops/append.js +0 -7
  708. package/src/data/ops/append.spec.js +0 -28
  709. package/src/data/ops/filter.d.ts +0 -1
  710. package/src/data/ops/filter.js +0 -8
  711. package/src/data/ops/filter.spec.js +0 -29
  712. package/src/data/ops/findTreeNode.d.ts +0 -1
  713. package/src/data/ops/findTreeNode.js +0 -15
  714. package/src/data/ops/findTreeNode.spec.js +0 -24
  715. package/src/data/ops/findTreePath.d.ts +0 -6
  716. package/src/data/ops/findTreePath.js +0 -16
  717. package/src/data/ops/index.d.ts +0 -10
  718. package/src/data/ops/insertElement.d.ts +0 -1
  719. package/src/data/ops/insertElement.js +0 -3
  720. package/src/data/ops/merge.d.ts +0 -3
  721. package/src/data/ops/merge.js +0 -9
  722. package/src/data/ops/merge.spec.js +0 -27
  723. package/src/data/ops/moveElement.d.ts +0 -1
  724. package/src/data/ops/moveElement.js +0 -14
  725. package/src/data/ops/removeTreeNodes.d.ts +0 -5
  726. package/src/data/ops/removeTreeNodes.js +0 -5
  727. package/src/data/ops/removeTreeNodes.spec.js +0 -28
  728. package/src/data/ops/updateArray.d.ts +0 -6
  729. package/src/data/ops/updateArray.js +0 -24
  730. package/src/data/ops/updateArray.spec.js +0 -38
  731. package/src/data/ops/updateTree.d.ts +0 -7
  732. package/src/data/ops/updateTree.js +0 -25
  733. package/src/data/ops/updateTree.spec.js +0 -36
  734. package/src/hooks/createLocalStorageRef.d.ts +0 -3
  735. package/src/hooks/createLocalStorageRef.js +0 -20
  736. package/src/hooks/index.js +0 -8
  737. package/src/hooks/invokeCallback.d.ts +0 -5
  738. package/src/hooks/invokeCallback.js +0 -7
  739. package/src/hooks/invokeCallback.spec.js +0 -53
  740. package/src/hooks/resolveCallback.d.ts +0 -3
  741. package/src/hooks/resolveCallback.js +0 -12
  742. package/src/hooks/resolveCallback.spec.js +0 -54
  743. package/src/hooks/store.d.ts +0 -8
  744. package/src/hooks/store.js +0 -32
  745. package/src/hooks/store.spec.js +0 -73
  746. package/src/hooks/useEffect.d.ts +0 -3
  747. package/src/hooks/useEffect.js +0 -15
  748. package/src/hooks/useInterval.d.ts +0 -1
  749. package/src/hooks/useInterval.js +0 -8
  750. package/src/hooks/useState.d.ts +0 -3
  751. package/src/hooks/useState.js +0 -16
  752. package/src/hooks/useTrigger.d.ts +0 -5
  753. package/src/hooks/useTrigger.js +0 -20
  754. package/src/hooks/useTrigger.spec.js +0 -102
  755. package/src/svg/BoundedObject.d.ts +0 -23
  756. package/src/svg/BoundedObject.js +0 -59
  757. package/src/svg/ClipRect.d.ts +0 -5
  758. package/src/svg/ClipRect.js +0 -23
  759. package/src/svg/Ellipse.d.ts +0 -24
  760. package/src/svg/Ellipse.js +0 -37
  761. package/src/svg/Line.d.ts +0 -21
  762. package/src/svg/Line.js +0 -33
  763. package/src/svg/NonOverlappingRect.d.ts +0 -5
  764. package/src/svg/NonOverlappingRect.js +0 -15
  765. package/src/svg/NonOverlappingRectGroup.d.ts +0 -3
  766. package/src/svg/NonOverlappingRectGroup.js +0 -37
  767. package/src/svg/Rectangle.d.ts +0 -37
  768. package/src/svg/Rectangle.js +0 -42
  769. package/src/svg/Svg.d.ts +0 -32
  770. package/src/svg/Svg.js +0 -177
  771. package/src/svg/Text.d.ts +0 -40
  772. package/src/svg/Text.js +0 -78
  773. package/src/svg/TextualBoundedObject.d.ts +0 -7
  774. package/src/svg/TextualBoundedObject.js +0 -28
  775. package/src/svg/index.d.ts +0 -11
  776. package/src/svg/util/Rect.d.ts +0 -41
  777. package/src/svg/util/Rect.js +0 -109
  778. package/src/svg/util/index.js +0 -1
  779. package/src/ui/CSS.d.ts +0 -20
  780. package/src/ui/CSS.js +0 -79
  781. package/src/ui/CSSHelper.d.ts +0 -11
  782. package/src/ui/CSSHelper.js +0 -18
  783. package/src/ui/Container.d.ts +0 -18
  784. package/src/ui/Container.js +0 -154
  785. package/src/ui/ContentResolver.d.ts +0 -12
  786. package/src/ui/ContentResolver.js +0 -78
  787. package/src/ui/Controller.d.ts +0 -182
  788. package/src/ui/Controller.js +0 -114
  789. package/src/ui/Controller.spec.js +0 -415
  790. package/src/ui/Culture.d.ts +0 -57
  791. package/src/ui/Culture.js +0 -139
  792. package/src/ui/Cx.d.ts +0 -18
  793. package/src/ui/Cx.js +0 -325
  794. package/src/ui/Cx.spec.js +0 -194
  795. package/src/ui/DataProxy.d.ts +0 -12
  796. package/src/ui/DataProxy.js +0 -31
  797. package/src/ui/DataProxy.spec.js +0 -338
  798. package/src/ui/DetachedScope.d.ts +0 -21
  799. package/src/ui/DetachedScope.js +0 -98
  800. package/src/ui/FocusManager.d.ts +0 -29
  801. package/src/ui/FocusManager.js +0 -171
  802. package/src/ui/Format.d.ts +0 -3
  803. package/src/ui/Format.js +0 -108
  804. package/src/ui/HoverSync.d.ts +0 -13
  805. package/src/ui/HoverSync.js +0 -147
  806. package/src/ui/Instance.d.ts +0 -72
  807. package/src/ui/Instance.js +0 -620
  808. package/src/ui/IsolatedScope.d.ts +0 -16
  809. package/src/ui/IsolatedScope.js +0 -30
  810. package/src/ui/IsolatedScope.spec.js +0 -62
  811. package/src/ui/Localization.d.ts +0 -17
  812. package/src/ui/Localization.js +0 -70
  813. package/src/ui/PureContainer.d.ts +0 -16
  814. package/src/ui/PureContainer.js +0 -7
  815. package/src/ui/RenderingContext.d.ts +0 -9
  816. package/src/ui/RenderingContext.js +0 -88
  817. package/src/ui/Repeater.d.ts +0 -61
  818. package/src/ui/Repeater.js +0 -109
  819. package/src/ui/Repeater.spec.js +0 -143
  820. package/src/ui/Rescope.d.ts +0 -10
  821. package/src/ui/Rescope.js +0 -35
  822. package/src/ui/Rescope.spec.js +0 -195
  823. package/src/ui/ResizeManager.d.ts +0 -10
  824. package/src/ui/ResizeManager.js +0 -31
  825. package/src/ui/Restate.d.ts +0 -21
  826. package/src/ui/Restate.js +0 -167
  827. package/src/ui/Restate.spec.js +0 -422
  828. package/src/ui/StaticText.d.ts +0 -8
  829. package/src/ui/StaticText.js +0 -9
  830. package/src/ui/StructuredInstanceDataAccessor.d.ts +0 -16
  831. package/src/ui/StructuredInstanceDataAccessor.js +0 -26
  832. package/src/ui/Text.d.ts +0 -10
  833. package/src/ui/Text.js +0 -25
  834. package/src/ui/VDOM.d.ts +0 -12
  835. package/src/ui/VDOM.js +0 -2
  836. package/src/ui/Widget.d.ts +0 -14
  837. package/src/ui/Widget.js +0 -184
  838. package/src/ui/ZIndexManager.d.ts +0 -7
  839. package/src/ui/ZIndexManager.js +0 -11
  840. package/src/ui/adapter/ArrayAdapter.d.ts +0 -17
  841. package/src/ui/adapter/ArrayAdapter.js +0 -152
  842. package/src/ui/adapter/ArrayAdapter.spec.js +0 -55
  843. package/src/ui/adapter/DataAdapter.d.ts +0 -31
  844. package/src/ui/adapter/DataAdapter.js +0 -15
  845. package/src/ui/adapter/GroupAdapter.d.ts +0 -23
  846. package/src/ui/adapter/GroupAdapter.js +0 -140
  847. package/src/ui/adapter/TreeAdapter.d.ts +0 -24
  848. package/src/ui/adapter/TreeAdapter.js +0 -101
  849. package/src/ui/adapter/TreeAdapter.spec.js +0 -67
  850. package/src/ui/adapter/index.js +0 -4
  851. package/src/ui/app/History.d.ts +0 -17
  852. package/src/ui/app/History.js +0 -114
  853. package/src/ui/app/Url.d.ts +0 -21
  854. package/src/ui/app/Url.js +0 -103
  855. package/src/ui/app/Url.spec.js +0 -51
  856. package/src/ui/app/index.d.ts +0 -4
  857. package/src/ui/app/startAppLoop.d.ts +0 -4
  858. package/src/ui/app/startAppLoop.js +0 -58
  859. package/src/ui/app/startHotAppLoop.d.ts +0 -7
  860. package/src/ui/app/startHotAppLoop.js +0 -25
  861. package/src/ui/batchUpdates.d.ts +0 -11
  862. package/src/ui/batchUpdates.js +0 -67
  863. package/src/ui/bind.d.ts +0 -4
  864. package/src/ui/bind.js +0 -7
  865. package/src/ui/createFunctionalComponent.d.ts +0 -1
  866. package/src/ui/createFunctionalComponent.js +0 -63
  867. package/src/ui/createFunctionalComponent.spec.js +0 -400
  868. package/src/ui/expr.d.ts +0 -24
  869. package/src/ui/expr.js +0 -17
  870. package/src/ui/flattenProps.js +0 -21
  871. package/src/ui/index.d.ts +0 -42
  872. package/src/ui/index.js +0 -44
  873. package/src/ui/keyboardShortcuts.d.ts +0 -5
  874. package/src/ui/keyboardShortcuts.js +0 -31
  875. package/src/ui/layout/Content.d.ts +0 -14
  876. package/src/ui/layout/Content.js +0 -16
  877. package/src/ui/layout/ContentPlaceholder.d.ts +0 -19
  878. package/src/ui/layout/ContentPlaceholder.js +0 -105
  879. package/src/ui/layout/ContentPlaceholder.spec.js +0 -579
  880. package/src/ui/layout/FirstVisibleChildLayout.d.ts +0 -4
  881. package/src/ui/layout/FirstVisibleChildLayout.js +0 -66
  882. package/src/ui/layout/FirstVisibleChildLayout.spec.js +0 -196
  883. package/src/ui/layout/LabelsLeftLayout.d.ts +0 -11
  884. package/src/ui/layout/LabelsLeftLayout.js +0 -59
  885. package/src/ui/layout/LabelsTopLayout.d.ts +0 -15
  886. package/src/ui/layout/LabelsTopLayout.js +0 -135
  887. package/src/ui/layout/UseParentLayout.d.ts +0 -4
  888. package/src/ui/layout/UseParentLayout.js +0 -6
  889. package/src/ui/layout/exploreChildren.d.ts +0 -12
  890. package/src/ui/layout/exploreChildren.js +0 -27
  891. package/src/ui/layout/index.js +0 -10
  892. package/src/ui/selection/KeySelection.d.ts +0 -17
  893. package/src/ui/selection/KeySelection.js +0 -129
  894. package/src/ui/selection/PropertySelection.d.ts +0 -17
  895. package/src/ui/selection/PropertySelection.js +0 -55
  896. package/src/ui/selection/Selection.d.ts +0 -27
  897. package/src/ui/selection/Selection.js +0 -93
  898. package/src/ui/selection/index.js +0 -3
  899. package/src/ui/tpl.d.ts +0 -3
  900. package/src/ui/tpl.js +0 -5
  901. package/src/util/Component.d.ts +0 -42
  902. package/src/util/Component.js +0 -108
  903. package/src/util/Console.d.ts +0 -4
  904. package/src/util/Console.js +0 -11
  905. package/src/util/DOM.d.ts +0 -33
  906. package/src/util/DOM.js +0 -72
  907. package/src/util/Debug.d.ts +0 -11
  908. package/src/util/Debug.js +0 -45
  909. package/src/util/Format.d.ts +0 -18
  910. package/src/util/Format.js +0 -270
  911. package/src/util/Format.spec.js +0 -69
  912. package/src/util/GlobalCacheIdentifier.js +0 -11
  913. package/src/util/GlobalCacheldentifier.d.ts +0 -7
  914. package/src/util/KeyCode.d.ts +0 -21
  915. package/src/util/KeyCode.js +0 -21
  916. package/src/util/SubscriberList.d.ts +0 -42
  917. package/src/util/SubscriberList.js +0 -58
  918. package/src/util/Timing.d.ts +0 -14
  919. package/src/util/Timing.js +0 -58
  920. package/src/util/TraversalStack.js +0 -43
  921. package/src/util/TraversalStack.spec.js +0 -47
  922. package/src/util/addEventListenerWithOptions.d.ts +0 -6
  923. package/src/util/addEventListenerWithOptions.js +0 -9
  924. package/src/util/browserSupportsPassiveEventHandlers.d.ts +0 -5
  925. package/src/util/browserSupportsPassiveEventHandlers.js +0 -18
  926. package/src/util/calculateNaturalElementHeight.d.ts +0 -1
  927. package/src/util/calculateNaturalElementHeight.js +0 -22
  928. package/src/util/capitalize.d.ts +0 -1
  929. package/src/util/capitalize.js +0 -4
  930. package/src/util/coalesce.d.ts +0 -1
  931. package/src/util/coalesce.js +0 -6
  932. package/src/util/color/hslToRgb.d.ts +0 -9
  933. package/src/util/color/hslToRgb.js +0 -27
  934. package/src/util/color/index.d.ts +0 -4
  935. package/src/util/color/parseColor.d.ts +0 -60
  936. package/src/util/color/parseColor.js +0 -119
  937. package/src/util/color/rgbToHex.d.ts +0 -9
  938. package/src/util/color/rgbToHex.js +0 -8
  939. package/src/util/color/rgbToHsl.d.ts +0 -9
  940. package/src/util/color/rgbToHsl.js +0 -28
  941. package/src/util/date/dateDiff.d.ts +0 -8
  942. package/src/util/date/dateDiff.js +0 -3
  943. package/src/util/date/diff.d.ts +0 -8
  944. package/src/util/date/diff.js +0 -7
  945. package/src/util/date/encodeDate.d.ts +0 -1
  946. package/src/util/date/encodeDate.js +0 -8
  947. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +0 -1
  948. package/src/util/date/encodeDateWithTimezoneOffset.js +0 -19
  949. package/src/util/date/index.js +0 -11
  950. package/src/util/date/lowerBoundCheck.d.ts +0 -8
  951. package/src/util/date/lowerBoundCheck.js +0 -6
  952. package/src/util/date/maxDate.d.ts +0 -6
  953. package/src/util/date/maxDate.js +0 -9
  954. package/src/util/date/minDate.d.ts +0 -6
  955. package/src/util/date/minDate.js +0 -9
  956. package/src/util/date/monthStart.d.ts +0 -6
  957. package/src/util/date/monthStart.js +0 -3
  958. package/src/util/date/parseDateInvariant.d.ts +0 -3
  959. package/src/util/date/parseDateInvariant.js +0 -20
  960. package/src/util/date/sameDate.d.ts +0 -7
  961. package/src/util/date/sameDate.js +0 -5
  962. package/src/util/date/upperBoundCheck.d.ts +0 -8
  963. package/src/util/date/upperBoundCheck.js +0 -6
  964. package/src/util/date/zeroTime.d.ts +0 -7
  965. package/src/util/date/zeroTime.js +0 -3
  966. package/src/util/debounce.d.ts +0 -9
  967. package/src/util/debounce.js +0 -18
  968. package/src/util/dummyCallback.d.ts +0 -1
  969. package/src/util/dummyCallback.js +0 -1
  970. package/src/util/escapeSpecialRegexCharacters.d.ts +0 -7
  971. package/src/util/escapeSpecialRegexCharacters.js +0 -3
  972. package/src/util/eventCallbacks.d.ts +0 -5
  973. package/src/util/eventCallbacks.js +0 -2
  974. package/src/util/expandFatArrows.d.ts +0 -1
  975. package/src/util/expandFatArrows.js +0 -118
  976. package/src/util/findScrollableParent.d.ts +0 -1
  977. package/src/util/findScrollableParent.js +0 -16
  978. package/src/util/getActiveElement.d.ts +0 -1
  979. package/src/util/getActiveElement.js +0 -4
  980. package/src/util/getParentFrameBoundingClientRect.d.ts +0 -1
  981. package/src/util/getParentFrameBoundingClientRect.js +0 -21
  982. package/src/util/getScrollerBoundingClientRect.d.ts +0 -1
  983. package/src/util/getScrollerBoundingClientRect.js +0 -22
  984. package/src/util/getSearchQueryPredicate.d.ts +0 -1
  985. package/src/util/getSearchQueryPredicate.js +0 -59
  986. package/src/util/getTopLevelBoundingClientRect.d.ts +0 -1
  987. package/src/util/getTopLevelBoundingClientRect.js +0 -14
  988. package/src/util/getVendorPrefix.d.ts +0 -1
  989. package/src/util/getVendorPrefix.js +0 -26
  990. package/src/util/index.d.ts +0 -51
  991. package/src/util/index.js +0 -54
  992. package/src/util/innerTextTrim.d.ts +0 -7
  993. package/src/util/innerTextTrim.js +0 -5
  994. package/src/util/isArray.d.ts +0 -1
  995. package/src/util/isArray.js +0 -3
  996. package/src/util/isDefined.d.ts +0 -1
  997. package/src/util/isDefined.js +0 -3
  998. package/src/util/isDigit.d.ts +0 -7
  999. package/src/util/isDigit.js +0 -3
  1000. package/src/util/isFunction.d.ts +0 -1
  1001. package/src/util/isFunction.js +0 -3
  1002. package/src/util/isNonEmptyArray.d.ts +0 -1
  1003. package/src/util/isNonEmptyArray.js +0 -3
  1004. package/src/util/isNumber.d.ts +0 -1
  1005. package/src/util/isNumber.js +0 -3
  1006. package/src/util/isObject.d.ts +0 -1
  1007. package/src/util/isObject.js +0 -3
  1008. package/src/util/isPromise.d.ts +0 -1
  1009. package/src/util/isPromise.js +0 -6
  1010. package/src/util/isString.d.ts +0 -1
  1011. package/src/util/isString.js +0 -3
  1012. package/src/util/isTextInputElement.d.ts +0 -1
  1013. package/src/util/isTextInputElement.js +0 -3
  1014. package/src/util/isTouchDevice.d.ts +0 -2
  1015. package/src/util/isTouchDevice.js +0 -7
  1016. package/src/util/isTouchEvent.d.ts +0 -4
  1017. package/src/util/isTouchEvent.js +0 -64
  1018. package/src/util/isUndefined.d.ts +0 -1
  1019. package/src/util/isUndefined.js +0 -3
  1020. package/src/util/isValidIdentifierName.d.ts +0 -1
  1021. package/src/util/isValidIdentifierName.js +0 -5
  1022. package/src/util/onIdleCallback.d.ts +0 -1
  1023. package/src/util/onIdleCallback.js +0 -14
  1024. package/src/util/parseStyle.d.ts +0 -4
  1025. package/src/util/parseStyle.js +0 -27
  1026. package/src/util/quote.d.ts +0 -3
  1027. package/src/util/quote.js +0 -4
  1028. package/src/util/reverseSlice.d.ts +0 -1
  1029. package/src/util/reverseSlice.js +0 -10
  1030. package/src/util/routeAppend.d.ts +0 -1
  1031. package/src/util/routeAppend.js +0 -16
  1032. package/src/util/scrollElementIntoView.d.ts +0 -7
  1033. package/src/util/scrollElementIntoView.js +0 -34
  1034. package/src/util/shallowEquals.d.ts +0 -1
  1035. package/src/util/shallowEquals.js +0 -43
  1036. package/src/util/throttle.d.ts +0 -9
  1037. package/src/util/throttle.js +0 -14
  1038. package/src/util/validatedDebounce.js +0 -19
  1039. package/src/widgets/Button.d.ts +0 -58
  1040. package/src/widgets/Button.js +0 -118
  1041. package/src/widgets/CxCredit.d.ts +0 -12
  1042. package/src/widgets/CxCredit.js +0 -32
  1043. package/src/widgets/DocumentTitle.d.ts +0 -11
  1044. package/src/widgets/DocumentTitle.js +0 -69
  1045. package/src/widgets/FlexBox.d.ts +0 -69
  1046. package/src/widgets/FlexBox.js +0 -93
  1047. package/src/widgets/Heading.d.ts +0 -16
  1048. package/src/widgets/Heading.js +0 -33
  1049. package/src/widgets/HighlightedSearchText.d.ts +0 -9
  1050. package/src/widgets/HighlightedSearchText.js +0 -36
  1051. package/src/widgets/HtmlElement.d.ts +0 -30
  1052. package/src/widgets/HtmlElement.js +0 -275
  1053. package/src/widgets/HtmlElement.spec.js +0 -57
  1054. package/src/widgets/Icon.d.ts +0 -34
  1055. package/src/widgets/Icon.js +0 -50
  1056. package/src/widgets/List.d.ts +0 -96
  1057. package/src/widgets/List.js +0 -594
  1058. package/src/widgets/ProgressBar.d.ts +0 -17
  1059. package/src/widgets/ProgressBar.js +0 -46
  1060. package/src/widgets/Resizer.d.ts +0 -27
  1061. package/src/widgets/Resizer.js +0 -151
  1062. package/src/widgets/Sandbox.d.ts +0 -18
  1063. package/src/widgets/Sandbox.js +0 -65
  1064. package/src/widgets/Section.d.ts +0 -52
  1065. package/src/widgets/Section.js +0 -139
  1066. package/src/widgets/autoFocus.d.ts +0 -1
  1067. package/src/widgets/autoFocus.js +0 -9
  1068. package/src/widgets/cx.d.ts +0 -2
  1069. package/src/widgets/cx.js +0 -72
  1070. package/src/widgets/drag-drop/DragHandle.d.ts +0 -10
  1071. package/src/widgets/drag-drop/DragHandle.js +0 -37
  1072. package/src/widgets/drag-drop/DragSource.d.ts +0 -45
  1073. package/src/widgets/drag-drop/DragSource.js +0 -160
  1074. package/src/widgets/drag-drop/DropZone.d.ts +0 -98
  1075. package/src/widgets/drag-drop/DropZone.js +0 -214
  1076. package/src/widgets/drag-drop/index.d.ts +0 -4
  1077. package/src/widgets/drag-drop/ops.d.ts +0 -57
  1078. package/src/widgets/drag-drop/ops.js +0 -344
  1079. package/src/widgets/enableAllInternalDependencies.d.ts +0 -1
  1080. package/src/widgets/enableAllInternalDependencies.js +0 -11
  1081. package/src/widgets/form/Calendar.d.ts +0 -86
  1082. package/src/widgets/form/Calendar.js +0 -618
  1083. package/src/widgets/form/Checkbox.d.ts +0 -43
  1084. package/src/widgets/form/Checkbox.js +0 -203
  1085. package/src/widgets/form/ColorField.d.ts +0 -44
  1086. package/src/widgets/form/ColorField.js +0 -397
  1087. package/src/widgets/form/ColorPicker.d.ts +0 -23
  1088. package/src/widgets/form/ColorPicker.js +0 -485
  1089. package/src/widgets/form/DateField.d.ts +0 -6
  1090. package/src/widgets/form/DateField.js +0 -12
  1091. package/src/widgets/form/DateTimeField.d.ts +0 -89
  1092. package/src/widgets/form/DateTimeField.js +0 -576
  1093. package/src/widgets/form/DateTimePicker.js +0 -392
  1094. package/src/widgets/form/Field.d.ts +0 -112
  1095. package/src/widgets/form/Field.js +0 -446
  1096. package/src/widgets/form/FieldGroup.d.ts +0 -6
  1097. package/src/widgets/form/FieldGroup.js +0 -6
  1098. package/src/widgets/form/FieldIcon.js +0 -42
  1099. package/src/widgets/form/HelpText.d.ts +0 -10
  1100. package/src/widgets/form/HelpText.js +0 -9
  1101. package/src/widgets/form/Label.d.ts +0 -23
  1102. package/src/widgets/form/Label.js +0 -89
  1103. package/src/widgets/form/LabeledContainer.d.ts +0 -9
  1104. package/src/widgets/form/LabeledContainer.js +0 -59
  1105. package/src/widgets/form/LookupField.d.ts +0 -179
  1106. package/src/widgets/form/LookupField.js +0 -1135
  1107. package/src/widgets/form/MonthField.d.ts +0 -104
  1108. package/src/widgets/form/MonthField.js +0 -524
  1109. package/src/widgets/form/MonthPicker.d.ts +0 -97
  1110. package/src/widgets/form/MonthPicker.js +0 -687
  1111. package/src/widgets/form/NumberField.d.ts +0 -96
  1112. package/src/widgets/form/NumberField.js +0 -459
  1113. package/src/widgets/form/Radio.d.ts +0 -37
  1114. package/src/widgets/form/Radio.js +0 -188
  1115. package/src/widgets/form/Select.d.ts +0 -69
  1116. package/src/widgets/form/Select.js +0 -269
  1117. package/src/widgets/form/Slider.d.ts +0 -65
  1118. package/src/widgets/form/Slider.js +0 -351
  1119. package/src/widgets/form/Switch.d.ts +0 -38
  1120. package/src/widgets/form/Switch.js +0 -118
  1121. package/src/widgets/form/TextArea.d.ts +0 -17
  1122. package/src/widgets/form/TextArea.js +0 -195
  1123. package/src/widgets/form/TextField.d.ts +0 -78
  1124. package/src/widgets/form/TextField.js +0 -290
  1125. package/src/widgets/form/TimeField.d.ts +0 -6
  1126. package/src/widgets/form/TimeField.js +0 -11
  1127. package/src/widgets/form/TimeList.js +0 -84
  1128. package/src/widgets/form/UploadButton.d.ts +0 -34
  1129. package/src/widgets/form/UploadButton.js +0 -213
  1130. package/src/widgets/form/ValidationError.d.ts +0 -10
  1131. package/src/widgets/form/ValidationError.js +0 -44
  1132. package/src/widgets/form/ValidationGroup.d.ts +0 -41
  1133. package/src/widgets/form/ValidationGroup.js +0 -68
  1134. package/src/widgets/form/ValidationGroup.spec.js +0 -148
  1135. package/src/widgets/form/Validator.d.ts +0 -8
  1136. package/src/widgets/form/Validator.js +0 -21
  1137. package/src/widgets/form/Wheel.js +0 -261
  1138. package/src/widgets/form/index.d.ts +0 -26
  1139. package/src/widgets/grid/Grid.d.ts +0 -442
  1140. package/src/widgets/grid/Grid.js +0 -3429
  1141. package/src/widgets/grid/GridCell.d.ts +0 -38
  1142. package/src/widgets/grid/GridCell.js +0 -71
  1143. package/src/widgets/grid/GridCellEditor.js +0 -41
  1144. package/src/widgets/grid/GridRow.js +0 -228
  1145. package/src/widgets/grid/GridRowLine.js +0 -24
  1146. package/src/widgets/grid/Pagination.d.ts +0 -14
  1147. package/src/widgets/grid/Pagination.js +0 -95
  1148. package/src/widgets/grid/TreeNode.d.ts +0 -23
  1149. package/src/widgets/grid/TreeNode.js +0 -102
  1150. package/src/widgets/grid/index.d.ts +0 -4
  1151. package/src/widgets/grid/index.js +0 -15
  1152. package/src/widgets/icons/calendar.js +0 -16
  1153. package/src/widgets/icons/check.js +0 -12
  1154. package/src/widgets/icons/clear.js +0 -14
  1155. package/src/widgets/icons/close.js +0 -19
  1156. package/src/widgets/icons/cx.js +0 -37
  1157. package/src/widgets/icons/drop-down.js +0 -14
  1158. package/src/widgets/icons/file.js +0 -12
  1159. package/src/widgets/icons/folder-open.js +0 -14
  1160. package/src/widgets/icons/folder.js +0 -12
  1161. package/src/widgets/icons/forward.js +0 -21
  1162. package/src/widgets/icons/loading.js +0 -23
  1163. package/src/widgets/icons/menu.js +0 -16
  1164. package/src/widgets/icons/pixel-picker.js +0 -17
  1165. package/src/widgets/icons/registry.js +0 -54
  1166. package/src/widgets/icons/search.js +0 -12
  1167. package/src/widgets/icons/sort-asc.js +0 -13
  1168. package/src/widgets/icons/square.js +0 -17
  1169. package/src/widgets/nav/Link.d.ts +0 -26
  1170. package/src/widgets/nav/Link.js +0 -8
  1171. package/src/widgets/nav/LinkButton.d.ts +0 -34
  1172. package/src/widgets/nav/LinkButton.js +0 -128
  1173. package/src/widgets/nav/Menu.d.ts +0 -27
  1174. package/src/widgets/nav/Menu.js +0 -406
  1175. package/src/widgets/nav/MenuItem.d.ts +0 -31
  1176. package/src/widgets/nav/MenuItem.js +0 -445
  1177. package/src/widgets/nav/MenuSpacer.d.ts +0 -5
  1178. package/src/widgets/nav/MenuSpacer.js +0 -13
  1179. package/src/widgets/nav/RedirectRoute.d.ts +0 -9
  1180. package/src/widgets/nav/RedirectRoute.js +0 -41
  1181. package/src/widgets/nav/Route.d.ts +0 -21
  1182. package/src/widgets/nav/Route.js +0 -102
  1183. package/src/widgets/nav/Route.spec.js +0 -27
  1184. package/src/widgets/nav/Scroller.d.ts +0 -17
  1185. package/src/widgets/nav/Scroller.js +0 -214
  1186. package/src/widgets/nav/Submenu.d.ts +0 -6
  1187. package/src/widgets/nav/Submenu.js +0 -6
  1188. package/src/widgets/nav/Tab.d.ts +0 -33
  1189. package/src/widgets/nav/Tab.js +0 -82
  1190. package/src/widgets/nav/index.d.ts +0 -10
  1191. package/src/widgets/overlay/ContextMenu.d.ts +0 -10
  1192. package/src/widgets/overlay/ContextMenu.js +0 -29
  1193. package/src/widgets/overlay/Dropdown.d.ts +0 -32
  1194. package/src/widgets/overlay/Dropdown.js +0 -612
  1195. package/src/widgets/overlay/FlyweightTooltipTracker.d.ts +0 -8
  1196. package/src/widgets/overlay/FlyweightTooltipTracker.js +0 -39
  1197. package/src/widgets/overlay/MsgBox.d.ts +0 -17
  1198. package/src/widgets/overlay/MsgBox.js +0 -116
  1199. package/src/widgets/overlay/Overlay.d.ts +0 -73
  1200. package/src/widgets/overlay/Overlay.js +0 -747
  1201. package/src/widgets/overlay/Toast.d.ts +0 -30
  1202. package/src/widgets/overlay/Toast.js +0 -93
  1203. package/src/widgets/overlay/Tooltip.d.ts +0 -50
  1204. package/src/widgets/overlay/Tooltip.js +0 -308
  1205. package/src/widgets/overlay/Window.d.ts +0 -42
  1206. package/src/widgets/overlay/Window.js +0 -202
  1207. package/src/widgets/overlay/alerts.d.ts +0 -7
  1208. package/src/widgets/overlay/alerts.js +0 -39
  1209. package/src/widgets/overlay/captureMouse.d.ts +0 -54
  1210. package/src/widgets/overlay/captureMouse.js +0 -124
  1211. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +0 -18
  1212. package/src/widgets/overlay/createHotPromiseWindowFactory.js +0 -56
  1213. package/src/widgets/overlay/index.js +0 -11
  1214. package/src/widgets/overlay/tooltip-ops.d.ts +0 -11
  1215. package/src/widgets/overlay/tooltip-ops.js +0 -29
  1216. package/svg.d.ts +0 -1
  1217. package/svg.js +0 -1
  1218. package/ui.d.ts +0 -1
  1219. package/ui.js +0 -1
  1220. package/util.d.ts +0 -1
  1221. package/util.js +0 -1
  1222. package/widgets.d.ts +0 -1
  1223. package/widgets.js +0 -1
  1224. /package/src/charts/{index.js → index.ts} +0 -0
  1225. /package/src/data/{Binding.spec.js → Binding.spec.ts} +0 -0
  1226. /package/src/data/{View.spec.js → View.spec.ts} +0 -0
  1227. /package/src/data/{comparer.spec.js → comparer.spec.ts} +0 -0
  1228. /package/src/data/ops/{index.js → index.ts} +0 -0
  1229. /package/src/hooks/{index.d.ts → index.ts} +0 -0
  1230. /package/src/{index.js → index.ts} +0 -0
  1231. /package/src/svg/{index.js → index.ts} +0 -0
  1232. /package/src/svg/util/{index.d.ts → index.ts} +0 -0
  1233. /package/src/ui/adapter/{index.d.ts → index.ts} +0 -0
  1234. /package/src/ui/app/{index.js → index.ts} +0 -0
  1235. /package/src/ui/layout/{index.d.ts → index.ts} +0 -0
  1236. /package/src/ui/selection/{index.d.ts → index.ts} +0 -0
  1237. /package/src/util/color/{index.js → index.ts} +0 -0
  1238. /package/src/util/date/{index.d.ts → index.ts} +0 -0
  1239. /package/src/util/date/{upperBoundCheck.spec.js → upperBoundCheck.spec.ts} +0 -0
  1240. /package/src/util/{getSearchQueryPredicate.spec.js → getSearchQueryPredicate.spec.ts} +0 -0
  1241. /package/src/util/{isValidIdentifierName.spec.js → isValidIdentifierName.spec.ts} +0 -0
  1242. /package/src/util/{routeAppend.spec.js → routeAppend.spec.ts} +0 -0
  1243. /package/src/widgets/drag-drop/{index.js → index.ts} +0 -0
  1244. /package/src/widgets/form/{index.js → index.ts} +0 -0
  1245. /package/src/widgets/icons/{index.js → index.ts} +0 -0
  1246. /package/src/widgets/{index.js → index.ts} +0 -0
  1247. /package/src/widgets/nav/{index.js → index.ts} +0 -0
@@ -1,3429 +0,0 @@
1
- import { Widget, VDOM, getContent } from "../../ui/Widget";
2
- import { PureContainer } from "../../ui/PureContainer";
3
- import { getSelector } from "../../data/getSelector";
4
- import { isSelector } from "../../data/isSelector";
5
- import { Format } from "../../ui/Format";
6
- import { Selection } from "../../ui/selection/Selection";
7
- import { DataAdapter } from "../../ui/adapter/DataAdapter";
8
- import { GroupAdapter } from "../../ui/adapter/GroupAdapter";
9
- import { ResizeManager } from "../../ui/ResizeManager";
10
- import { KeyCode } from "../../util/KeyCode";
11
- import { scrollElementIntoView } from "../../util/scrollElementIntoView";
12
- import { findScrollableParent } from "../../util/findScrollableParent";
13
- import { FocusManager, oneFocusOut, offFocusOut } from "../../ui/FocusManager";
14
- import DropDownIcon from "../icons/sort-asc";
15
- import { ddMouseDown, ddDetect, initiateDragDrop, registerDropZone } from "../drag-drop/ops";
16
- import { GridRow, GridRowComponent } from "./GridRow";
17
- import { Localization } from "../../ui/Localization";
18
- import { SubscriberList } from "../../util/SubscriberList";
19
- import { RenderingContext } from "../../ui/RenderingContext";
20
- import { isNonEmptyArray } from "../../util/isNonEmptyArray";
21
- import { isObject } from "../../util/isObject";
22
- import { isString } from "../../util/isString";
23
- import { isDefined } from "../../util/isDefined";
24
- import { isArray } from "../../util/isArray";
25
- import { isNumber } from "../../util/isNumber";
26
- import { debounce } from "../../util/debounce";
27
- import { shallowEquals } from "../../util/shallowEquals";
28
- import { InstanceCache } from "../../ui/Instance";
29
- import { Cx } from "../../ui/Cx";
30
- import { Console } from "../../util/Console";
31
- import { getTopLevelBoundingClientRect } from "../../util/getTopLevelBoundingClientRect";
32
- import { getParentFrameBoundingClientRect } from "../../util/getParentFrameBoundingClientRect";
33
- import { ValidationGroup } from "../form/ValidationGroup";
34
- import { closest } from "../../util/DOM";
35
- import { captureMouse2, getCursorPos } from "../overlay/captureMouse";
36
- import { getAccessor } from "../../data/getAccessor";
37
- import { getActiveElement } from "../../util/getActiveElement";
38
- import { GridCellEditor } from "./GridCellEditor";
39
- import { batchUpdates } from "../../ui/batchUpdates";
40
- import { parseStyle } from "cx/src/util/parseStyle";
41
- import { StaticText } from "../../ui/StaticText";
42
- import { unfocusElement } from "../../ui/FocusManager";
43
- import { tooltipMouseMove, tooltipMouseLeave } from "../overlay/tooltip-ops";
44
- import { Container } from "../../ui/Container";
45
- import { findFirstChild } from "../../util/DOM";
46
- import { Binding } from "../../data/Binding";
47
-
48
- export class Grid extends Container {
49
- declareData(...args) {
50
- let selection = this.selection.configureWidget(this);
51
-
52
- super.declareData(
53
- ...args,
54
- {
55
- records: undefined,
56
- sorters: undefined,
57
- preSorters: undefined,
58
- scrollable: undefined,
59
- sortField: undefined,
60
- sortDirection: undefined,
61
- emptyText: undefined,
62
- dragSource: { structured: true },
63
- dropZone: { structured: true },
64
- filterParams: { structured: true },
65
- groupingParams: { structured: true },
66
- scrollResetParams: { structured: true },
67
- page: undefined,
68
- totalRecordCount: undefined,
69
- tabIndex: undefined,
70
- columnParams: { structured: true },
71
- },
72
- selection,
73
- );
74
- }
75
-
76
- init() {
77
- if (this.recordAlias) this.recordName = this.recordAlias;
78
-
79
- if (this.indexAlias) this.indexName = this.indexAlias;
80
-
81
- if (this.infinite) {
82
- this.buffered = true;
83
- this.remoteSort = true;
84
- }
85
-
86
- if (this.buffered) this.scrollable = true;
87
-
88
- this.recordsAccessor = getAccessor(this.records);
89
-
90
- this.selection = Selection.create(this.selection, {
91
- records: this.records,
92
- });
93
-
94
- if (!this.selection.isDummy || this.onRowClick || this.onRowDoubleClick) this.selectable = true;
95
- if (this.focusable == null) this.focusable = !this.selection.isDummy || this.cellEditable;
96
-
97
- super.init();
98
- }
99
-
100
- initState(context, instance) {
101
- instance.state = {
102
- colWidth: {},
103
- lockedColWidth: {},
104
- dimensionsVersion: 0,
105
- disableDefaultSort: false,
106
- };
107
- instance.v = 0;
108
- if (this.infinite)
109
- instance.buffer = {
110
- records: [],
111
- totalRecordCount: 0,
112
- page: 1,
113
- };
114
- }
115
-
116
- applyParentStore(instance) {
117
- super.applyParentStore(instance);
118
-
119
- // force prepareData to execute again and propagate the store change to the records
120
- if (instance.cached) delete instance.cached.rawData;
121
- }
122
-
123
- createRowTemplate(context, columnParams, instance, groupingData) {
124
- var row = this.row || {};
125
- let columns = this.columns;
126
- if (this.onGetColumns) {
127
- let result = instance.invoke("onGetColumns", columnParams, instance);
128
- if (isArray(result)) columns = result;
129
- else row = result;
130
- }
131
-
132
- if (columns)
133
- row.line1 = {
134
- columns,
135
- };
136
-
137
- row.hasSortableColumns = false;
138
- row.hasResizableColumns = false;
139
- row.hasMergedCells = false;
140
- row.mergedColumns = [];
141
-
142
- let aggregates = {};
143
- let showFooter = false;
144
- let lines = [];
145
- for (let i = 0; i < 10; i++) {
146
- let l = row["line" + i];
147
- if (l) {
148
- if (isArray(l.columns))
149
- for (let c = 0; c < l.columns.length; c++)
150
- l.columns[c].uniqueColumnId = `l${i}-${l.columns[c].key || c}`;
151
- lines.push(l);
152
- }
153
- }
154
-
155
- row.header = PureContainer.create({
156
- items: GridColumnHeaderLine.create(lines),
157
- });
158
-
159
- row.header.items.forEach((line) => {
160
- line.items.forEach((c, index) => {
161
- if (c.sortable) row.hasSortableColumns = true;
162
-
163
- if (c.mergeCells) {
164
- if (row.header.items.length > 1)
165
- Console.warn("Merged columns are only supported in grids in which rows have only one line of cells.");
166
- else {
167
- row.hasMergedCells = true;
168
- row.mergedColumns.push({ uniqueColumnId: c.uniqueColumnId, index, mode: c.mergeCells });
169
- }
170
- }
171
-
172
- if (
173
- c.resizable ||
174
- (c.header && c.header.resizable) ||
175
- (c.header1 && c.header1.resizable) ||
176
- (c.header2 && c.header2.resizable) ||
177
- (c.header3 && c.header3.resizable)
178
- )
179
- row.hasResizableColumns = true;
180
-
181
- if (c.aggregate && c.aggregateAlias && (c.aggregateField || isDefined(c.aggregateValue))) {
182
- aggregates[c.aggregateAlias] = {
183
- value: isDefined(c.aggregateValue)
184
- ? c.aggregateValue
185
- : isDefined(c.value)
186
- ? c.value
187
- : c.aggregateField
188
- ? { bind: this.recordName + "." + c.aggregateField }
189
- : null,
190
- weight:
191
- c.weight != null
192
- ? c.weight
193
- : c.weightField && {
194
- bind: this.recordName + "." + c.weightField,
195
- },
196
- type: c.aggregate,
197
- };
198
- } else if (c.footer && !showFooter) {
199
- showFooter = true;
200
- }
201
- });
202
- });
203
-
204
- //add default footer if some columns have aggregates and grouping is not defined
205
- if (!groupingData && (Object.keys(aggregates).length > 0 || this.fixedFooter || showFooter))
206
- groupingData = [
207
- {
208
- key: {},
209
- showFooter: true,
210
- },
211
- ];
212
-
213
- let { grouping, showHeader } = this.resolveGrouping(groupingData);
214
-
215
- this.showHeader = showHeader;
216
-
217
- if (this.fixedFooter && isNonEmptyArray(grouping)) {
218
- grouping[0].showFooter = true;
219
- if (grouping[0].key && Object.keys(grouping[0].key).length > 0)
220
- Console.warn(
221
- "First grouping level in grids with a fixed footer must group all data. The key field should be omitted.",
222
- );
223
- }
224
-
225
- instance.dataAdapter = DataAdapter.create(
226
- {
227
- type: (this.dataAdapter && this.dataAdapter.type) || GroupAdapter,
228
- recordsAccessor: this.recordsAccessor,
229
- keyField: this.keyField,
230
- aggregates: aggregates,
231
- recordName: this.recordName,
232
- indexName: this.indexName,
233
- sortOptions: this.sortOptions,
234
- groupings: grouping,
235
- },
236
- this.dataAdapter,
237
- );
238
-
239
- instance.dataAdapter.initInstance(context, instance);
240
-
241
- return Widget.create(GridRow, {
242
- class: this.CSS.element(this.baseClass, "data"),
243
- className: this.rowClass,
244
- style: this.rowStyle,
245
- recordName: this.recordName,
246
- hoverId: this.rowHoverId,
247
- ...row,
248
- });
249
- }
250
-
251
- prepareData(context, instance) {
252
- let { data, state, cached, row } = instance;
253
-
254
- let grouping = this.grouping;
255
-
256
- if (this.onGetGrouping) {
257
- if (!cached.data || cached.data.groupingParams !== data.groupingParams)
258
- grouping = instance.invoke("onGetGrouping", data.groupingParams, instance);
259
- else grouping = cached.grouping;
260
- }
261
-
262
- let groupingChanged = instance.cache("grouping", grouping);
263
-
264
- if (instance.cache("columnParams", data.columnParams) || groupingChanged || !row) {
265
- row = instance.row = this.createRowTemplate(context, data.columnParams, instance, grouping);
266
- }
267
-
268
- data.version = ++instance.v;
269
-
270
- if (!this.infinite) data.totalRecordCount = isArray(data.records) ? data.records.length : 0;
271
- else {
272
- if (isNumber(data.totalRecordCount)) instance.buffer.totalRecordCount = data.totalRecordCount;
273
- else data.totalRecordCount = instance.buffer.totalRecordCount;
274
-
275
- if (isDefined(data.records)) instance.buffer.records = data.records;
276
- else data.records = instance.buffer.records;
277
-
278
- if (isNumber(data.page)) instance.buffer.page = data.page;
279
- else data.page = instance.buffer.page;
280
-
281
- data.offset = (data.page - 1) * this.pageSize;
282
- }
283
-
284
- if (!isArray(data.records)) data.records = [];
285
-
286
- if (state.sorters && !isDefined(this.sorters)) data.sorters = state.sorters;
287
-
288
- let sortField = null;
289
-
290
- if (isDefined(this.sortField) && isDefined(this.sortDirection)) {
291
- let sorter = {
292
- field: data.sortField,
293
- direction: data.sortDirection,
294
- };
295
- sortField = data.sortField;
296
- data.sorters = [sorter];
297
- }
298
-
299
- let skipDefaultSorting = this.clearableSort && instance.state.disableDefaultSort;
300
- if (!skipDefaultSorting && !isNonEmptyArray(data.sorters) && this.defaultSortField) {
301
- let sorter = {
302
- field: this.defaultSortField,
303
- direction: this.defaultSortDirection || "ASC",
304
- };
305
- sortField = this.defaultSortField;
306
- data.sorters = [sorter];
307
- }
308
-
309
- if (sortField) {
310
- for (let l = 1; l < 10; l++) {
311
- let line = instance.row[`line${l}`];
312
- let sortColumn = line && line.columns && line.columns.find((c) => c.field == sortField);
313
- if (sortColumn) {
314
- data.sorters[0].value = sortColumn.sortValue || sortColumn.value;
315
- data.sorters[0].comparer = sortColumn.comparer;
316
- data.sorters[0].sortOptions = sortColumn.sortOptions;
317
- break;
318
- }
319
- }
320
- }
321
-
322
- let headerMode = this.headerMode;
323
-
324
- if (this.headerMode == null) {
325
- if (this.scrollable || row.hasSortableColumns || row.hasResizableColumns) headerMode = "default";
326
- else headerMode = "plain";
327
- }
328
-
329
- let border = this.border;
330
-
331
- if (this.showBorder || (border == null && this.scrollable)) border = true;
332
-
333
- let dragMode = false;
334
- if (data.dragSource) dragMode = data.dragSource.mode || "move";
335
-
336
- let dropMode = data.dropZone && data.dropZone.mode;
337
-
338
- if (this.onDrop && !dropMode) dropMode = "preview";
339
-
340
- data.dropMode = dropMode;
341
-
342
- data.stateMods = {
343
- selectable: this.selectable,
344
- "cell-editable": this.cellEditable,
345
- scrollable: data.scrollable,
346
- buffered: this.buffered,
347
- ["header-" + headerMode]: true,
348
- border: border,
349
- vlines: this.vlines,
350
- ["drag-" + dragMode]: dragMode,
351
- ["drop-" + dropMode]: dropMode,
352
- resizable: row.hasResizableColumns,
353
- };
354
-
355
- super.prepareData(context, instance);
356
-
357
- instance.records = this.mapRecords(context, instance);
358
-
359
- //tree adapters can have additional (child) records, filtering also affects actual record count
360
- if (instance.records && !this.infinite) {
361
- //apply record count after filtering
362
- data.totalRecordCount = instance.records.length;
363
-
364
- //recheck if there are any actual records
365
- //when grouping is enabled group header/footer are always in
366
- if (instance.records.length < 5) {
367
- data.empty = true;
368
- for (let i = 0; i < instance.records.length; i++)
369
- if (instance.records[i].type == "data") {
370
- data.empty = false;
371
- break;
372
- }
373
- } else data.empty = data.totalRecordCount == 0;
374
- } else data.empty = data.totalRecordCount == 0;
375
-
376
- if (this.onCreateIsRecordSelectable) {
377
- instance.isRecordSelectable = instance.invoke("onCreateIsRecordSelectable", null, instance);
378
- }
379
-
380
- if (this.onCreateIsRecordDraggable) {
381
- instance.isRecordDraggable = instance.invoke("onCreateIsRecordDraggable", null, instance);
382
- }
383
-
384
- if (this.onTrackMappedRecords) {
385
- instance.invoke("onTrackMappedRecords", instance.records, instance);
386
- }
387
- }
388
-
389
- initInstance(context, instance) {
390
- instance.fixedHeaderResizeEvent = new SubscriberList();
391
- super.initInstance(context, instance);
392
- }
393
-
394
- explore(context, instance) {
395
- context.push("parentPositionChangeEvent", instance.fixedHeaderResizeEvent);
396
-
397
- instance.hoverSync = context.hoverSync;
398
-
399
- super.explore(context, instance);
400
-
401
- instance.header = instance.getChild(context, instance.row.header, "header");
402
- instance.header.scheduleExploreIfVisible(context);
403
-
404
- let { store } = instance;
405
- instance.isSelected = this.selection.getIsSelectedDelegate(store);
406
-
407
- //do not process rows in buffered mode or cached mode if nothing has changed;
408
- if (!this.buffered && (!this.cached || instance.shouldUpdate)) {
409
- for (let i = 0; i < instance.records.length; i++) {
410
- let record = instance.records[i];
411
- if (record.type == "data") {
412
- let row = (record.row = instance.getChild(context, instance.row, record.key, record.store));
413
- row.selected = instance.isSelected(record.data, record.index);
414
- let changed = false;
415
- if (row.cache("selected", row.selected)) changed = true;
416
- if (row.cache("recordData", record.data)) changed = true;
417
- if (this.cached && !changed && !row.childStateDirty) row.shouldUpdate = false;
418
- else row.scheduleExploreIfVisible(context);
419
- }
420
- }
421
- }
422
- }
423
-
424
- exploreCleanup(context, instance) {
425
- context.pop("parentPositionChangeEvent");
426
- let fixedColumnCount = 0,
427
- visibleColumns = [];
428
- instance.header.children.forEach((line) => {
429
- line.children.forEach((col) => {
430
- if (col.data.fixed) fixedColumnCount++;
431
- visibleColumns.push(col.widget);
432
- });
433
- });
434
- instance.visibleColumns = visibleColumns;
435
- instance.hasFixedColumns = fixedColumnCount > 0;
436
- instance.fixedColumnCount = fixedColumnCount;
437
- if (fixedColumnCount > 0) {
438
- instance.data.classNames += ` ${instance.widget.CSS.state("fixed-columns")}`;
439
- }
440
- }
441
-
442
- resolveGrouping(grouping) {
443
- if (grouping) {
444
- if (!isArray(grouping)) {
445
- if (isString(grouping) || isObject(grouping)) grouping = [grouping];
446
- else throw new Error("Dynamic grouping should be an array of grouping objects.");
447
- }
448
-
449
- grouping = grouping.map((g, i) => {
450
- let group;
451
- if (isString(g))
452
- group = {
453
- key: {
454
- [g]: {
455
- bind: this.recordName + "." + g,
456
- },
457
- },
458
- showHeader: !this.scrollable && i == grouping.length - 1,
459
- showFooter: true,
460
- caption: { bind: `$group.${g}` },
461
- text: { bind: `${this.recordName}.${g}` },
462
- };
463
- else
464
- group = {
465
- ...g,
466
- };
467
- if (group.caption) group.caption = getSelector(group.caption);
468
- return group;
469
- });
470
- }
471
-
472
- let showHeader = !isArray(grouping) || !grouping.some((g) => g.showHeader);
473
-
474
- return { showHeader, grouping };
475
- }
476
-
477
- groupBy(groupingData, options) {
478
- let { grouping, showHeader } = this.resolveGrouping(groupingData);
479
- this.grouping = grouping;
480
- if (options?.autoConfigure) this.showHeader = showHeader;
481
- this.update();
482
- }
483
-
484
- render(context, instance, key) {
485
- let { data, hasFixedColumns } = instance;
486
-
487
- let fixedHeader =
488
- data.scrollable && this.showHeader && this.renderHeader(context, instance, "header", true, false);
489
-
490
- let fixedColumnsFixedHeader =
491
- data.scrollable &&
492
- this.showHeader &&
493
- hasFixedColumns &&
494
- this.renderHeader(context, instance, "header", true, true);
495
-
496
- if (!this.buffered) this.renderRows(context, instance);
497
-
498
- if (this.fixedFooter) this.renderFixedFooter(context, instance);
499
-
500
- let header = this.showHeader && this.renderHeader(context, instance, "header", false, false);
501
-
502
- let fixedColumnsHeader =
503
- this.showHeader && hasFixedColumns && this.renderHeader(context, instance, "header", false, true);
504
-
505
- return (
506
- <GridComponent
507
- key={key}
508
- instance={instance}
509
- data={instance.data}
510
- shouldUpdate={instance.shouldUpdate}
511
- header={header}
512
- fixedColumnsHeader={fixedColumnsHeader}
513
- fixedColumnsFixedHeader={fixedColumnsFixedHeader}
514
- fixedHeader={fixedHeader}
515
- fixedFooter={instance.fixedFooterVDOM}
516
- fixedColumnsFixedFooter={instance.fixedColumnsFixedFooterVDOM}
517
- >
518
- {this.renderChildren(context, instance)}
519
- </GridComponent>
520
- );
521
- }
522
-
523
- renderResizer(instance, hdinst, header, colIndex, forPreviousColumn) {
524
- let { widget } = instance;
525
-
526
- let { CSS, baseClass } = widget;
527
-
528
- let hdwidget = hdinst.widget;
529
-
530
- let resizerClassName = "col-resizer";
531
- if (forPreviousColumn) resizerClassName += "-prev-col";
532
-
533
- return (
534
- <div
535
- className={CSS.element(baseClass, resizerClassName)}
536
- onClick={(e) => {
537
- e.stopPropagation();
538
- }}
539
- data-unique-col-id={hdwidget.uniqueColumnId}
540
- onMouseDown={(e) => {
541
- if (e.buttons != 1) return;
542
- let resizeOverlayEl = document.createElement("div");
543
-
544
- let gridEl =
545
- e.target.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement;
546
- let uniqueColId = e.currentTarget.dataset.uniqueColId;
547
-
548
- // if we use fixed columns, rhs resizer of the last fixed column is within regular columns header tbody
549
- let headerCell = findFirstChild(
550
- gridEl,
551
- (el) => el.tagName == "TH" && el.dataset && el.dataset.uniqueColId == uniqueColId,
552
- );
553
-
554
- let initialWidth = headerCell.offsetWidth;
555
- let initialPosition = getCursorPos(e);
556
- resizeOverlayEl.className = CSS.element(baseClass, "resize-overlay");
557
- resizeOverlayEl.style.width = `${initialWidth}px`;
558
- resizeOverlayEl.style.left = `${
559
- headerCell.getBoundingClientRect().left - gridEl.getBoundingClientRect().left
560
- }px`;
561
- gridEl.appendChild(resizeOverlayEl);
562
- captureMouse2(e, {
563
- onMouseMove: (e) => {
564
- let cursor = getCursorPos(e);
565
- let width = Math.max(30, Math.round(initialWidth + cursor.clientX - initialPosition.clientX));
566
- resizeOverlayEl.style.width = `${width}px`;
567
- },
568
- onMouseUp: (e) => {
569
- if (!resizeOverlayEl) return; //dblclick
570
- let width = resizeOverlayEl.offsetWidth;
571
- hdinst.assignedWidth = width;
572
- gridEl.removeChild(resizeOverlayEl);
573
- resizeOverlayEl = null;
574
- if (widget.onColumnResize) instance.invoke("onColumnResize", { width, column: hdwidget }, hdinst);
575
- header.set("width", width);
576
- instance.setState({
577
- dimensionsVersion: instance.state.dimensionsVersion + 1,
578
- colWidth: {
579
- ...instance.state.colWidth,
580
- [hdwidget.uniqueColumnId]: width,
581
- },
582
- });
583
- },
584
- onDblClick: () => {
585
- let table = gridEl.querySelector("table");
586
- let parentEl = table.parentElement;
587
- let tableClone = table.cloneNode(true);
588
- tableClone.childNodes.forEach((tbody) => {
589
- tbody.childNodes.forEach((tr) => {
590
- tr.childNodes.forEach((td, index) => {
591
- if (index == colIndex) {
592
- td.style.maxWidth = null;
593
- td.style.minWidth = null;
594
- td.style.width = "auto";
595
- } else {
596
- td.style.display = "none";
597
- }
598
- });
599
- });
600
- });
601
- tableClone.style.position = "absolute";
602
- tableClone.style.visibility = "hidden";
603
- tableClone.style.top = 0;
604
- tableClone.style.left = 0;
605
- tableClone.style.width = "auto";
606
- parentEl.appendChild(tableClone);
607
- let width = tableClone.offsetWidth;
608
- parentEl.removeChild(tableClone);
609
- header.set("width", width);
610
- instance.setState({
611
- dimensionsVersion: instance.state.dimensionsVersion + 1,
612
- colWidth: {
613
- ...instance.state.colWidth,
614
- [hdwidget.uniqueColumnId]: width,
615
- },
616
- });
617
- },
618
- });
619
- }}
620
- />
621
- );
622
- }
623
-
624
- renderHeader(context, instance, key, fixed, fixedColumns) {
625
- let { data, widget, header } = instance;
626
-
627
- let { CSS, baseClass } = widget;
628
-
629
- let headerRows = [];
630
-
631
- if (!header) return null;
632
-
633
- let skip = {};
634
- let lineIndex = 0;
635
-
636
- header.children.forEach((line) => {
637
- let empty = [true, true, true];
638
- let result = [[], [], []];
639
-
640
- line.children.forEach((hdinst, colIndex) => {
641
- let hdwidget = hdinst.widget;
642
- for (let l = 0; l < 3; l++) {
643
- let colKey = `${lineIndex + l}-${colIndex}`;
644
-
645
- if (skip[colKey]) continue;
646
-
647
- if (Boolean(hdinst.data.fixed) != fixedColumns) continue;
648
-
649
- let header = hdinst.components[`header${l + 1}`];
650
- let colSpan,
651
- rowSpan,
652
- style,
653
- cls,
654
- mods = [],
655
- content,
656
- sortIcon,
657
- tool;
658
-
659
- let resizer = null,
660
- prevColumnResizer = null;
661
-
662
- if (header) {
663
- empty[l] = false;
664
-
665
- if (header.widget.align) mods.push("aligned-" + header.widget.align);
666
- else if (hdwidget.align) mods.push("aligned-" + hdwidget.align);
667
-
668
- if (hdwidget.sortable && header.widget.allowSorting) {
669
- mods.push("sortable");
670
- if (data.sorters && data.sorters[0].field == (hdwidget.sortField || hdwidget.field)) {
671
- mods.push("sorted-" + data.sorters[0].direction.toLowerCase());
672
- sortIcon = <DropDownIcon className={CSS.element(baseClass, "column-sort-icon")} />;
673
- }
674
- }
675
-
676
- let uniqueColumnId = header.data.colSpan > 1 ? null : hdwidget.uniqueColumnId;
677
-
678
- style = header.data.style;
679
- let customWidth =
680
- header.data.width ||
681
- instance.state.colWidth[uniqueColumnId] ||
682
- header.data.defaultWidth ||
683
- instance.state.lockedColWidth[uniqueColumnId];
684
- if (customWidth) {
685
- if (instance.state.colWidth[uniqueColumnId] != customWidth)
686
- instance.state.colWidth[uniqueColumnId] = customWidth;
687
- let s = `${customWidth}px`;
688
- style = {
689
- ...style,
690
- width: s,
691
- minWidth: s,
692
- maxWidth: s,
693
- };
694
- }
695
-
696
- if (header.data.classNames) cls = header.data.classNames;
697
-
698
- content = header.render(context);
699
-
700
- if (header.components && header.components.tool) {
701
- tool = (
702
- <div className={CSS.element(baseClass, "col-header-tool")}>
703
- {getContent(header.components.tool.render(context))}
704
- </div>
705
- );
706
- mods.push("tool");
707
- }
708
-
709
- if (header.data.colSpan > 1 || header.data.rowSpan > 1) {
710
- colSpan = header.data.colSpan;
711
- rowSpan = header.data.rowSpan;
712
-
713
- for (let r = 0; r < header.data.rowSpan; r++)
714
- for (let c = 0; c < header.data.colSpan; c++)
715
- skip[`${lineIndex + l + r}-${colIndex + c}`] = true;
716
- }
717
-
718
- if ((hdwidget.resizable || header.data.resizable) && header.data.colSpan < 2) {
719
- resizer = this.renderResizer(instance, hdinst, header, colIndex);
720
- }
721
-
722
- if (colIndex > 0) {
723
- let hdinstPrev = line.children[colIndex - 1];
724
- let prevLine = 3;
725
- let headerPrev;
726
- while (!headerPrev && prevLine >= 0) {
727
- headerPrev = hdinstPrev.components[`header${prevLine + 1}`];
728
- prevLine--;
729
- }
730
- if (
731
- (hdinstPrev.widget.resizable || headerPrev?.data?.resizable) &&
732
- headerPrev?.data?.colSpan < 2
733
- ) {
734
- prevColumnResizer = this.renderResizer(instance, hdinstPrev, headerPrev, colIndex - 1, true);
735
- }
736
- }
737
- }
738
-
739
- cls = CSS.element(baseClass, "col-header", mods) + (cls ? " " + cls : "");
740
-
741
- let onContextMenu;
742
-
743
- if (this.onColumnContextMenu) onContextMenu = (e) => instance.invoke("onColumnContextMenu", e, hdinst);
744
-
745
- result[l].push(
746
- <th
747
- key={colIndex}
748
- colSpan={colSpan}
749
- rowSpan={rowSpan}
750
- className={cls}
751
- style={style}
752
- onMouseDown={ddMouseDown}
753
- onMouseMove={(e) => this.onHeaderMouseMove(e, hdwidget, hdinst, instance, l)}
754
- onMouseLeave={(e) => this.onHeaderMouseLeave(e, hdinst, l)}
755
- onClick={(e) => this.onHeaderClick(e, hdwidget, instance, l)}
756
- onContextMenu={onContextMenu}
757
- data-unique-col-id={colSpan > 1 ? null : hdwidget.uniqueColumnId}
758
- >
759
- {getContent(content)}
760
- {sortIcon}
761
- {tool}
762
- {prevColumnResizer}
763
- {resizer}
764
- </th>,
765
- );
766
- }
767
- });
768
-
769
- result = result.filter((_, i) => !empty[i]);
770
- lineIndex += result.length;
771
-
772
- if (result[0]) {
773
- if (fixed && !fixedColumns) {
774
- result[0].push(
775
- <th key="dummy" rowSpan={result.length} className={CSS.element(baseClass, "col-header")} />,
776
- );
777
- }
778
-
779
- headerRows.push(...result.map((h, i) => <tr key={`${lineIndex}-${i}`}>{h}</tr>));
780
- }
781
- });
782
-
783
- if (headerRows.length == 0) return null;
784
-
785
- return (
786
- <tbody key={"h" + key} className={CSS.element(baseClass, "header")}>
787
- {headerRows}
788
- </tbody>
789
- );
790
- }
791
-
792
- onHeaderMouseMove(e, column, columnInstance, gridInstance, headerLine) {
793
- let { baseClass, CSS } = gridInstance.widget;
794
- if (columnInstance.data.fixed) return;
795
- let headerInstance = columnInstance.components[`header${headerLine + 1}`];
796
- if (!headerInstance) return;
797
- let { store, data } = headerInstance;
798
- if (headerInstance.widget?.tooltip) {
799
- tooltipMouseMove(e, headerInstance, headerInstance.widget.tooltip);
800
- }
801
- if (data.draggable && !data.fixed && ddDetect(e) && e.buttons == 1) {
802
- initiateDragDrop(
803
- e,
804
- {
805
- sourceEl: e.currentTarget,
806
- source: {
807
- type: "grid-column",
808
- store,
809
- column,
810
- columnInstance,
811
- headerInstance,
812
- gridInstance,
813
- headerLine,
814
- },
815
- clone: {
816
- store: store,
817
- matchCursorOffset: true,
818
- matchWidth: true,
819
- widget: () => <div className={CSS.element(baseClass, "col-header-drag-clone")}>{data.text}</div>,
820
- },
821
- },
822
- () => {},
823
- );
824
- }
825
- }
826
-
827
- onHeaderMouseLeave(e, columnInstance, headerLine) {
828
- let headerInstance = columnInstance.components[`header${headerLine + 1}`];
829
- if (!headerInstance) return;
830
- if (headerInstance.widget?.tooltip) {
831
- tooltipMouseLeave(e, headerInstance, headerInstance.widget.tooltip);
832
- }
833
- }
834
-
835
- onHeaderClick(e, column, instance, headerLine) {
836
- e.preventDefault();
837
- e.stopPropagation();
838
-
839
- let { data } = instance;
840
- let header = column.components[`header${headerLine + 1}`];
841
-
842
- let field = column.sortField || column.field;
843
- let value = column.sortValue || column.value;
844
- let comparer = column.comparer;
845
- let sortOptions = column.sortOptions;
846
-
847
- if (header && header.allowSorting && column.sortable && (field || value || data.sortField)) {
848
- let direction = column.primarySortDirection ?? "ASC";
849
- if (
850
- isNonEmptyArray(data.sorters) &&
851
- ((!!data.sorters[0].field && data.sorters[0].field == (field || data.sortField)) ||
852
- (!!value && data.sorters[0].value == value))
853
- ) {
854
- if (data.sorters[0].direction == "ASC" && (!this.clearableSort || direction == "ASC")) direction = "DESC";
855
- else if (data.sorters[0].direction == "DESC" && (!this.clearableSort || direction == "DESC"))
856
- direction = "ASC";
857
- else {
858
- direction = null;
859
- instance.state.disableDefaultSort = true;
860
- }
861
- }
862
-
863
- let sorters = direction
864
- ? [
865
- {
866
- field,
867
- direction,
868
- value,
869
- comparer,
870
- sortOptions,
871
- },
872
- ]
873
- : null;
874
-
875
- if (sorters == null) field = null;
876
-
877
- instance.set("sorters", sorters);
878
- instance.set("sortField", field);
879
- instance.set("sortDirection", direction);
880
-
881
- if (!this.remoteSort || this.infinite) instance.setState({ sorters });
882
- }
883
- }
884
-
885
- renderGroupHeader(context, instance, g, level, group, i, store, fixedColumns) {
886
- let { CSS, baseClass } = this;
887
- let data = store.getData();
888
- if (g.caption) {
889
- let caption = g.caption(data);
890
- return (
891
- <tbody
892
- key={`g-${level}-${group.$key}`}
893
- className={CSS.element(baseClass, "group-caption", ["level-" + level])}
894
- data-group-key={group.$key}
895
- data-group-element={`group-caption-${level}`}
896
- >
897
- <tr>
898
- <td colSpan={1000}>{caption}</td>
899
- </tr>
900
- </tbody>
901
- );
902
- } else if (g.showCaption) {
903
- let skip = 0;
904
-
905
- let { header } = instance;
906
-
907
- let lines = [];
908
- header.children.forEach((line, lineIndex) => {
909
- let empty = true;
910
-
911
- let cells = line.children.map((ci, i) => {
912
- if (--skip >= 0) return null;
913
-
914
- if (Boolean(ci.data.fixed) != fixedColumns) return null;
915
-
916
- let v,
917
- c = ci.widget,
918
- colSpan,
919
- pad,
920
- cls = "",
921
- style = null;
922
- if (c.caption) {
923
- if (c.caption.children)
924
- v = <Cx widget={c.caption.children} store={store} parentInstance={instance} subscribe />;
925
- else {
926
- v = c.caption.value(data);
927
- let fmt = c.caption.format(data);
928
- if (fmt) v = Format.value(v, fmt);
929
- }
930
- pad = c.caption.pad;
931
- colSpan = c.caption.colSpan;
932
- empty = false;
933
- cls = CSS.expand(c.caption.class(data)) || "";
934
- style = parseStyle(c.caption.style(data));
935
- if (c.caption.expand) {
936
- colSpan = 1;
937
- for (
938
- let ind = i + 1;
939
- ind < line.children.length &&
940
- !line.children[ind].widget.caption &&
941
- !line.children[ind].widget.aggregate;
942
- ind++
943
- )
944
- colSpan++;
945
- }
946
-
947
- if (colSpan > 1) skip = colSpan - 1;
948
- } else if (c.aggregate && c.aggregateAliasGetter && c.caption !== false) {
949
- empty = false;
950
- v = c.aggregateAliasGetter(group);
951
- if (isString(ci.data.format)) v = Format.value(v, ci.data.format);
952
- }
953
-
954
- if (cls) cls += " ";
955
- if (c.align) cls += CSS.state("aligned-" + c.align);
956
-
957
- if (pad !== false) cls += (cls ? " " : "") + CSS.state("pad");
958
-
959
- return (
960
- <td key={i} className={cls} colSpan={colSpan} style={style}>
961
- {v}
962
- </td>
963
- );
964
- });
965
-
966
- if (empty) return;
967
-
968
- lines.push(<tr key={lineIndex}>{cells}</tr>);
969
- });
970
-
971
- if (lines.length == 0) return null;
972
-
973
- return (
974
- <tbody
975
- key={"c" + group.$key}
976
- className={CSS.element(baseClass, "group-caption", ["level-" + level])}
977
- data-group-key={group.$key}
978
- data-group-element={`group-caption-${level}`}
979
- >
980
- {lines}
981
- </tbody>
982
- );
983
- }
984
- }
985
-
986
- renderGroupFooter(context, instance, g, level, group, i, store, fixed, fixedColumns) {
987
- let { CSS, baseClass } = this;
988
- let data = store.getData();
989
- let skip = 0;
990
-
991
- let { header, state } = instance;
992
- let rowStyle = {};
993
-
994
- let lines = [];
995
- header.children.forEach((line, lineIndex) => {
996
- let empty = true;
997
-
998
- let cells = line.children.map((ci, i) => {
999
- if (--skip >= 0) return null;
1000
-
1001
- if (Boolean(ci.data.fixed) != fixedColumns) return null;
1002
-
1003
- let v,
1004
- c = ci.widget,
1005
- colSpan = 1,
1006
- pad,
1007
- cls = "",
1008
- style = null;
1009
- if (c.footer) {
1010
- v = c.footer.value(data);
1011
- let fmt = c.footer.format(data);
1012
- if (fmt) v = Format.value(v, fmt);
1013
- pad = c.footer.pad;
1014
- colSpan = c.footer.colSpan;
1015
- empty = false;
1016
- cls = CSS.expand(c.footer.class(data)) || "";
1017
- style = parseStyle(c.footer.style(data));
1018
- if (c.footer.expand) {
1019
- colSpan = 1;
1020
- for (
1021
- let ind = i + 1;
1022
- ind < line.children.length &&
1023
- !line.children[ind].widget.footer &&
1024
- !line.children[ind].widget.aggregate;
1025
- ind++
1026
- )
1027
- colSpan++;
1028
- }
1029
-
1030
- if (colSpan > 1) skip = colSpan - 1;
1031
- } else if (c.aggregate && c.aggregateAliasGetter && c.footer !== false) {
1032
- empty = false;
1033
- v = c.aggregateAliasGetter(group);
1034
- if (isString(ci.data.format)) v = Format.value(v, ci.data.format);
1035
- }
1036
-
1037
- if (cls) cls += " ";
1038
- if (c.align) cls += CSS.state("aligned-" + c.align);
1039
-
1040
- if (pad !== false) cls += (cls ? " " : "") + CSS.state("pad");
1041
-
1042
- // apply column width to footers too, but only if colSpan == 1,
1043
- // otherwise set 1px so that the footer is not participating in the layout
1044
-
1045
- let maxWidth = 1;
1046
- if (colSpan == 1) maxWidth = state.colWidth[c.uniqueColumnId];
1047
- style = {
1048
- ...style,
1049
- maxWidth,
1050
- };
1051
-
1052
- return (
1053
- <td key={i} className={cls} colSpan={colSpan} style={style}>
1054
- {v}
1055
- </td>
1056
- );
1057
- });
1058
-
1059
- if (empty) return;
1060
-
1061
- if (fixed && !fixedColumns)
1062
- cells.push(<td key="dummy" className={CSS.element(baseClass, "fixed-footer-corner")} />);
1063
-
1064
- lines.push(<tr key={lineIndex}>{cells}</tr>);
1065
- });
1066
-
1067
- if (lines.length == 0) return null;
1068
-
1069
- return (
1070
- <tbody
1071
- key={"f" + i}
1072
- style={rowStyle}
1073
- className={CSS.element(baseClass, "group-footer", ["level-" + level])}
1074
- data-group-key={group.$key}
1075
- data-group-element={`group-footer-${level}`}
1076
- >
1077
- {lines}
1078
- </tbody>
1079
- );
1080
- }
1081
-
1082
- renderRows(context, instance) {
1083
- let { records, hasFixedColumns } = instance;
1084
-
1085
- if (!isArray(records)) return null;
1086
-
1087
- let record, g;
1088
-
1089
- for (let i = 0; i < records.length; i++) {
1090
- record = records[i];
1091
- if (record.type == "data") record.vdom = record.row.render(context, record.key);
1092
-
1093
- if (record.type == "group-header") {
1094
- record.vdom = [];
1095
- record.fixedVdom = [];
1096
- g = record.grouping;
1097
- if (g.caption || g.showCaption)
1098
- record.vdom.push(
1099
- this.renderGroupHeader(
1100
- context,
1101
- instance,
1102
- g,
1103
- record.level,
1104
- record.group,
1105
- record.key + "-caption",
1106
- record.store,
1107
- false,
1108
- ),
1109
- );
1110
-
1111
- if (hasFixedColumns)
1112
- record.fixedVdom.push(
1113
- this.renderGroupHeader(
1114
- context,
1115
- instance,
1116
- g,
1117
- record.level,
1118
- record.group,
1119
- record.key + "-caption",
1120
- record.store,
1121
- true,
1122
- ),
1123
- );
1124
-
1125
- if (g.showHeader) {
1126
- record.vdom.push(this.renderHeader(context, instance, record.key + "-header", false, false));
1127
- if (hasFixedColumns)
1128
- record.fixedVdom.push(this.renderHeader(context, instance, record.key + "-header", false, true));
1129
- }
1130
- }
1131
-
1132
- if (record.type == "group-footer") {
1133
- g = record.grouping;
1134
- if (g.showFooter) {
1135
- record.vdom = this.renderGroupFooter(
1136
- context,
1137
- instance,
1138
- g,
1139
- record.level,
1140
- record.group,
1141
- record.key + "-footer",
1142
- record.store,
1143
- false,
1144
- false,
1145
- );
1146
- if (hasFixedColumns)
1147
- record.fixedVdom = this.renderGroupFooter(
1148
- context,
1149
- instance,
1150
- g,
1151
- record.level,
1152
- record.group,
1153
- record.key + "-footer",
1154
- record.store,
1155
- false,
1156
- true,
1157
- );
1158
- }
1159
- }
1160
- }
1161
- }
1162
-
1163
- renderFixedFooter(context, instance) {
1164
- let { records, hasFixedColumns, data } = instance;
1165
-
1166
- instance.fixedFooterVDOM = null;
1167
- instance.fixedColumnsFixedFooterVDOM = null;
1168
-
1169
- if (data.empty || !isNonEmptyArray(records)) return;
1170
-
1171
- //all type of records are allowed here because the footer can be based on pre-computed data
1172
- //it doesn't make sense to show the footer if the grid is empty though
1173
- let record = records[records.length - 1];
1174
-
1175
- instance.fixedFooterOverlap = true;
1176
- instance.fixedFooterIsGroupFooter = record.type == "group-footer";
1177
-
1178
- instance.fixedFooterVDOM = this.renderGroupFooter(
1179
- context,
1180
- instance,
1181
- record.grouping,
1182
- record.level || 1,
1183
- record.group || { $key: "fixed-footer" },
1184
- record.key + "-footer",
1185
- record.store,
1186
- true,
1187
- false,
1188
- );
1189
-
1190
- if (hasFixedColumns)
1191
- instance.fixedColumnsFixedFooterVDOM = this.renderGroupFooter(
1192
- context,
1193
- instance,
1194
- record.grouping,
1195
- record.level,
1196
- record.group || { $key: "fixed-footer" },
1197
- record.key + "-footer",
1198
- record.store,
1199
- true,
1200
- true,
1201
- );
1202
- }
1203
-
1204
- mapRecords(context, instance) {
1205
- let { data, store, dataAdapter } = instance;
1206
-
1207
- let filter = null;
1208
- if (this.onCreateFilter) filter = instance.invoke("onCreateFilter", data.filterParams, instance);
1209
-
1210
- let sorters = !this.remoteSort && data.sorters;
1211
-
1212
- //apply pre-sorters only if some sorting is applied
1213
- if (isNonEmptyArray(data.sorters) && isNonEmptyArray(data.preSorters)) {
1214
- sorters = [...data.preSorters, ...data.sorters];
1215
- }
1216
-
1217
- dataAdapter.setFilter(filter);
1218
- dataAdapter.sort(sorters);
1219
-
1220
- //if no filtering or sorting applied, let the component maps records on demand
1221
- if (
1222
- this.buffered &&
1223
- !this.fixedFooter &&
1224
- !filter &&
1225
- !isNonEmptyArray(sorters) &&
1226
- !dataAdapter.isTreeAdapter &&
1227
- !instance.dataAdapter.groupings
1228
- )
1229
- return null;
1230
-
1231
- return dataAdapter.getRecords(context, instance, data.records, store);
1232
- }
1233
-
1234
- mapRecord(context, instance, data, index) {
1235
- return instance.dataAdapter.mapRecord(context, instance, data, instance.store, this.recordsAccessor, index);
1236
- }
1237
- }
1238
-
1239
- Grid.prototype.baseClass = "grid";
1240
- Grid.prototype.showHeader = true;
1241
- Grid.prototype.showFooter = false;
1242
- Grid.prototype.recordName = "$record";
1243
- Grid.prototype.indexName = "$index";
1244
- Grid.prototype.remoteSort = false;
1245
- Grid.prototype.lockColumnWidths = false;
1246
- Grid.prototype.lockColumnWidthsRequiredRowCount = 3;
1247
- Grid.prototype.focused = false;
1248
- Grid.prototype.emptyText = false;
1249
- Grid.prototype.showBorder = false; // show border override for material theme
1250
- Grid.prototype.cached = false;
1251
- Grid.prototype.buffered = false;
1252
- Grid.prototype.bufferStep = 15;
1253
- Grid.prototype.bufferSize = 60;
1254
- Grid.prototype.pageSize = 100;
1255
- Grid.prototype.infinite = false;
1256
- Grid.prototype.styled = true;
1257
- Grid.prototype.scrollSelectionIntoView = false;
1258
- Grid.prototype.clearableSort = false;
1259
- Grid.prototype.cellEditable = false;
1260
- Grid.prototype.preciseMeasurements = false;
1261
- Grid.prototype.hoverChannel = "default";
1262
- Grid.prototype.focusable = null; // automatically resolved
1263
- Grid.prototype.allowsFileDrops = false;
1264
-
1265
- Widget.alias("grid", Grid);
1266
- Localization.registerPrototype("cx/widgets/Grid", Grid);
1267
-
1268
- class GridComponent extends VDOM.Component {
1269
- constructor(props) {
1270
- super(props);
1271
- this.dom = {};
1272
- let { widget } = props.instance;
1273
-
1274
- let end = Math.min(widget.bufferSize, props.data.totalRecordCount);
1275
-
1276
- this.state = {
1277
- cursor: widget.focused && widget.selectable ? 0 : -1,
1278
- cursorCellIndex: 0,
1279
- focused: widget.focused,
1280
- dropInsertionIndex: null,
1281
- dropNextToTheRowAbove: null,
1282
- start: 0,
1283
- end: end,
1284
- };
1285
-
1286
- this.syncBuffering = false;
1287
-
1288
- if (widget.infinite) {
1289
- this.start = 0;
1290
- this.end = end;
1291
- this.loadingStartPage = 0;
1292
- this.loadingEndPage = 0;
1293
- }
1294
-
1295
- this.scrollerRef = (el) => {
1296
- this.dom.scroller = el;
1297
- };
1298
-
1299
- this.fixedScrollerRef = (el) => {
1300
- this.dom.fixedScroller = el;
1301
- };
1302
-
1303
- this.gridRef = (el) => {
1304
- this.dom.el = el;
1305
- };
1306
- }
1307
-
1308
- getBufferStartEnd() {
1309
- //{start, end};
1310
- return this.syncBuffering ? this : this.state;
1311
- }
1312
-
1313
- renderCellEditor(key, CSS, baseClass, instance, column) {
1314
- //add an inner div with fixed height in order to help IE absolutely position the contents inside
1315
- return (
1316
- <td key={key} className={CSS.element(baseClass, "cell-editor")}>
1317
- <Cx parentInstance={instance} subscribe>
1318
- <GridCellEditor
1319
- className={CSS.element(baseClass, "cell-editor-wrap")}
1320
- style={
1321
- this.rowHeight > 0
1322
- ? {
1323
- height: this.rowHeight + 1,
1324
- }
1325
- : null
1326
- }
1327
- >
1328
- <ValidationGroup
1329
- valid={{
1330
- get: () => this.cellEditorValid,
1331
- set: (value) => {
1332
- this.cellEditorValid = value;
1333
- },
1334
- }}
1335
- >
1336
- {column.editor}
1337
- </ValidationGroup>
1338
- </GridCellEditor>
1339
- </Cx>
1340
- </td>
1341
- );
1342
- }
1343
-
1344
- createRowRenderer(cellWrap) {
1345
- let { instance, data } = this.props;
1346
- let { widget, isRecordSelectable, visibleColumns, isRecordDraggable, row } = instance;
1347
- let { CSS, baseClass } = widget;
1348
- let { dragSource } = data;
1349
- let { dragged, cursor, cursorCellIndex, cellEdit, dropInsertionIndex, dropTarget } = this.state;
1350
- let { colWidth, dimensionsVersion } = instance.state;
1351
- let { hasMergedCells } = row;
1352
-
1353
- return (record, index, standalone, fixed) => {
1354
- let { store, key, row } = record;
1355
- let isDragged = dragged && (row.selected || record == dragged);
1356
- let mod = {
1357
- selected: row.selected,
1358
- dragged: isDragged,
1359
- cursor: widget.selectable && index == cursor,
1360
- over: dropTarget == "row" && dropInsertionIndex === index,
1361
- alternate: index % 2 == 1,
1362
- };
1363
-
1364
- if (isRecordSelectable) {
1365
- let selectable = isRecordSelectable(record.data, {});
1366
- mod["selectable"] = selectable;
1367
- mod["non-selectable"] = !selectable;
1368
- }
1369
-
1370
- let draggable =
1371
- dragSource &&
1372
- (!row.dragHandles || row.dragHandles.length == 0) &&
1373
- (!isRecordDraggable || isRecordDraggable(record.data));
1374
- mod["draggable"] = draggable;
1375
- mod["non-draggable"] = !draggable;
1376
-
1377
- let wrap = (children) => {
1378
- let skipCells = {};
1379
- return (
1380
- <GridRowComponent
1381
- key={key}
1382
- className={CSS.state(mod)}
1383
- store={store}
1384
- dragSource={dragSource}
1385
- instance={row}
1386
- grid={instance}
1387
- record={record}
1388
- parent={this}
1389
- cursorIndex={index}
1390
- selected={row.selected}
1391
- isBeingDragged={dragged}
1392
- isDraggedOver={mod.over}
1393
- cursor={mod.cursor}
1394
- cursorCellIndex={index == cursor && cursorCellIndex}
1395
- cellEdit={index == cursor && cursorCellIndex != null && cellEdit}
1396
- shouldUpdate={row.shouldUpdate}
1397
- dimensionsVersion={dimensionsVersion}
1398
- fixed={fixed}
1399
- useTrTag={hasMergedCells}
1400
- >
1401
- {children.content.map(({ key, data, content }, line) => {
1402
- let cells = content.map(
1403
- ({ key, data, content, uniqueColumnId, merged, mergeRowSpan }, cellIndex) => {
1404
- if (Boolean(data.fixed) !== fixed) return null;
1405
- if (merged) return null;
1406
- let cellected =
1407
- index == cursor && cellIndex == cursorCellIndex && widget.cellEditable && line == 0;
1408
- let className = cellected
1409
- ? CSS.expand(data.classNames, CSS.state("cellected"))
1410
- : data.classNames;
1411
- if (cellected && cellEdit) {
1412
- let column = visibleColumns[cursorCellIndex];
1413
- if (column && column.editor && data.editable)
1414
- return this.renderCellEditor(key, CSS, baseClass, row, column);
1415
- }
1416
- let width = colWidth[uniqueColumnId];
1417
- let style = data.style;
1418
- if (width) {
1419
- style = {
1420
- ...style,
1421
- maxWidth: `${width}px`,
1422
- };
1423
- }
1424
-
1425
- if (skipCells[`${line}-${cellIndex}`]) return null;
1426
-
1427
- if (data.colSpan > 1 || data.rowSpan > 1) {
1428
- for (let r = line; r < line + (data.rowSpan ?? 1); r++)
1429
- for (let c = cellIndex; c < cellIndex + (data.colSpan ?? 1); c++)
1430
- skipCells[`${r}-${c}`] = true;
1431
- }
1432
-
1433
- if (cellWrap) content = cellWrap(content);
1434
-
1435
- return (
1436
- <td
1437
- key={key}
1438
- className={className}
1439
- style={style}
1440
- colSpan={data.colSpan}
1441
- rowSpan={mergeRowSpan ?? data.rowSpan}
1442
- >
1443
- {content}
1444
- </td>
1445
- );
1446
- },
1447
- );
1448
- if (hasMergedCells) return cells;
1449
- return (
1450
- <tr key={key} className={data.classNames} style={data.style}>
1451
- {cells}
1452
- </tr>
1453
- );
1454
- })}
1455
- </GridRowComponent>
1456
- );
1457
- };
1458
-
1459
- if (!standalone) return wrap(record.vdom);
1460
-
1461
- return (
1462
- <Cx
1463
- key={key}
1464
- instance={record.row}
1465
- parentInstance={instance}
1466
- options={{ name: "grid-row" }}
1467
- contentFactory={(x) =>
1468
- wrap({
1469
- content: Array.isArray(x.children) ? x.children : x.children != null ? [x.children] : [],
1470
- data: {},
1471
- })
1472
- }
1473
- params={{
1474
- ...mod,
1475
- dimensionsVersion: dimensionsVersion,
1476
- cursorIndex: index,
1477
- data: record.data,
1478
- cursorCellIndex: index == cursor && cursorCellIndex,
1479
- cellEdit: index == cursor && cursorCellIndex != null && cellEdit,
1480
- }}
1481
- />
1482
- );
1483
- };
1484
- }
1485
-
1486
- render() {
1487
- let { instance, data, fixedFooter, fixedColumnsFixedFooter } = this.props;
1488
- let { widget, hasFixedColumns } = instance;
1489
- let { CSS, baseClass } = widget;
1490
- let { start, end } = this.getBufferStartEnd();
1491
-
1492
- let cellWrap = false;
1493
-
1494
- if (widget.cellEditable && (widget.hasResizableColumns || hasFixedColumns)) {
1495
- cellWrap = (children) => <div className="cxe-grid-cell-clip">{children}</div>;
1496
- }
1497
-
1498
- let children = [],
1499
- fixedChildren = [];
1500
-
1501
- let renderRow = this.createRowRenderer(cellWrap);
1502
-
1503
- let addRow = (record, index, standalone) => {
1504
- children.push(renderRow(record, index, standalone, false));
1505
- if (hasFixedColumns) fixedChildren.push(renderRow(record, index, standalone, true));
1506
-
1507
- //avoid re-rendering on cursor change
1508
- record.row.shouldUpdate = false;
1509
- };
1510
-
1511
- if (widget.buffered) {
1512
- let context = new RenderingContext();
1513
- let dummyDataClass = CSS.element(baseClass, "data", { dummy: true });
1514
- if (!instance.recordInstanceCache) instance.recordInstanceCache = new InstanceCache(instance);
1515
- instance.recordInstanceCache.mark();
1516
- this.getRecordsSlice(start, end).forEach((r, i) => {
1517
- if (r == null) {
1518
- addRow(
1519
- {
1520
- key: "dummy-" + start + i,
1521
- row: {
1522
- data: { classNames: dummyDataClass },
1523
- widget: instance.row,
1524
- },
1525
- vdom: {
1526
- content: [
1527
- {
1528
- key: 0,
1529
- data: {},
1530
- content: [
1531
- {
1532
- key: 0,
1533
- data: {
1534
- colSpan: 1000,
1535
- style: {
1536
- height: `${this.rowHeight}px`,
1537
- },
1538
- },
1539
- },
1540
- ],
1541
- },
1542
- ],
1543
- },
1544
- },
1545
- start + i,
1546
- );
1547
- } else {
1548
- let record = instance.records
1549
- ? r
1550
- : widget.mapRecord(context, instance, r, widget.infinite ? start + i - data.offset : start + i);
1551
- let row = (record.row = instance.recordInstanceCache.getChild(instance.row, record.store, record.key));
1552
- instance.recordInstanceCache.addChild(row);
1553
- row.detached = true;
1554
- row.selected = instance.isSelected(record.data, record.index);
1555
-
1556
- if (record.type == "data") {
1557
- addRow(record, start + i, true);
1558
- } else if (record.type == "group-header") {
1559
- let g = record.grouping;
1560
- if (g.caption || g.showCaption) {
1561
- children.push(
1562
- widget.renderGroupHeader(
1563
- null,
1564
- instance,
1565
- g,
1566
- record.level,
1567
- record.group,
1568
- record.key + "-caption",
1569
- record.store,
1570
- false,
1571
- ),
1572
- );
1573
-
1574
- if (hasFixedColumns)
1575
- fixedChildren.push(
1576
- widget.renderGroupHeader(
1577
- null,
1578
- instance,
1579
- g,
1580
- record.level,
1581
- record.group,
1582
- record.key + "-caption",
1583
- record.store,
1584
- true,
1585
- ),
1586
- );
1587
- }
1588
- } else if (record.type == "group-footer") {
1589
- let g = record.grouping;
1590
- if (g.showFooter && (!widget.fixedFooter || start + i != instance.records.length - 1)) {
1591
- children.push(
1592
- widget.renderGroupFooter(
1593
- null,
1594
- instance,
1595
- g,
1596
- record.level,
1597
- record.group,
1598
- record.key + "-footer",
1599
- record.store,
1600
- false,
1601
- false,
1602
- ),
1603
- );
1604
-
1605
- if (hasFixedColumns)
1606
- fixedChildren.push(
1607
- widget.renderGroupFooter(
1608
- null,
1609
- instance,
1610
- g,
1611
- record.level,
1612
- record.group,
1613
- record.key + "-footer",
1614
- record.store,
1615
- false,
1616
- true,
1617
- ),
1618
- );
1619
- }
1620
- }
1621
- }
1622
- });
1623
- instance.recordInstanceCache.sweep();
1624
- } else {
1625
- let { row } = instance;
1626
- let { hasMergedCells, mergedColumns } = row;
1627
- if (hasMergedCells) {
1628
- // merge adjacent cells with the same value in columns that are marked as merged
1629
- let rowSpan = {};
1630
- let getCellRenderInfo = (vdom, cellIndex) => vdom.content[0]?.content[cellIndex];
1631
- for (let index = instance.records.length - 1; index >= 0; index--) {
1632
- let row = instance.records[index];
1633
- let prevRow = instance.records[index - 1];
1634
- if (row.type == "data") {
1635
- let stopMerge = false;
1636
- for (let mi = 0; mi < mergedColumns.length; mi++) {
1637
- let mergedCol = mergedColumns[mi];
1638
- let cellInfo = getCellRenderInfo(row.vdom, mergedCol.index);
1639
- cellInfo.merged = false;
1640
- delete cellInfo.mergeRowSpan;
1641
- if (prevRow?.type == "data") {
1642
- let shouldMerge = false;
1643
- switch (mergedCol.mode) {
1644
- case "always":
1645
- shouldMerge = true;
1646
- break;
1647
- case "same-value":
1648
- let prevCellInfo = getCellRenderInfo(prevRow.vdom, mergedCol.index);
1649
- shouldMerge = !stopMerge && cellInfo.data.value === prevCellInfo.data.value;
1650
- break;
1651
- }
1652
-
1653
- if (shouldMerge) {
1654
- cellInfo.merged = true;
1655
- rowSpan[mergedCol.uniqueColumnId] = (rowSpan[mergedCol.uniqueColumnId] ?? 1) + 1;
1656
- } else {
1657
- if (mergedCol.mode == "same-value") stopMerge = true;
1658
- }
1659
- }
1660
- if (!cellInfo.merged && rowSpan[mergedCol.uniqueColumnId] > 1) {
1661
- cellInfo.mergeRowSpan = rowSpan[mergedCol.uniqueColumnId];
1662
- rowSpan[mergedCol.uniqueColumnId] = 1;
1663
- }
1664
- }
1665
- } else rowSpan = {};
1666
- }
1667
- }
1668
-
1669
- instance.records.forEach((record, i) => {
1670
- if (record.type == "data") addRow(record, i, false);
1671
- else {
1672
- children.push(record.vdom);
1673
- if (hasFixedColumns) fixedChildren.push(record.fixedVdom);
1674
- }
1675
- });
1676
- }
1677
-
1678
- if (this.state.dropTarget == "grid" && this.state.dropInsertionIndex != null) {
1679
- let dragInsertionRow = (
1680
- <tbody key="dropzone">
1681
- <tr>
1682
- <td
1683
- className={CSS.element(baseClass, "dropzone")}
1684
- colSpan={1000}
1685
- style={{
1686
- height: data.dropMode == "insertion" ? 0 : this.state.dropItemHeight,
1687
- }}
1688
- />
1689
- </tr>
1690
- </tbody>
1691
- );
1692
-
1693
- let dataRecordClass = CSS.element(baseClass, "data");
1694
-
1695
- let isDataRecord = widget.buffered
1696
- ? (item) => item?.props?.instance?.data?.class == dataRecordClass
1697
- : (item) => item?.props?.record?.type;
1698
-
1699
- let index = 0;
1700
- while (index < children.length && !isDataRecord(children[index])) index++;
1701
-
1702
- let count = 0;
1703
- while (index < children.length && count < this.state.dropInsertionIndex) {
1704
- if (isDataRecord(children[index])) count++;
1705
- index++;
1706
- }
1707
-
1708
- let savedIndexPos = index;
1709
-
1710
- if (!this.state.dropNextToTheRowAbove)
1711
- while (index < children.length && !isDataRecord(children[index])) index++;
1712
-
1713
- // do not allow insertion after the last group footer
1714
- if (savedIndexPos < index && index == children.length) index = savedIndexPos;
1715
-
1716
- children.splice(index, 0, dragInsertionRow);
1717
- }
1718
-
1719
- let content = [],
1720
- fixedColumnsContent = [];
1721
-
1722
- //instance.records holds the record count after filtering
1723
- if (data.emptyText && data.empty) {
1724
- children = [
1725
- <tbody key="empty" className={CSS.element(baseClass, "empty-text")}>
1726
- <tr>
1727
- <td colSpan={1000}>{data.emptyText}</td>
1728
- </tr>
1729
- </tbody>,
1730
- ];
1731
- } else if (widget.fixedFooter && (widget.buffered || !instance.fixedFooterIsGroupFooter)) {
1732
- //add fixed footer content for buffered grids
1733
- if (fixedFooter || fixedColumnsFixedFooter) {
1734
- children.push(fixedFooter);
1735
- if (hasFixedColumns) fixedChildren.push(fixedColumnsFixedFooter);
1736
- }
1737
- }
1738
-
1739
- let shouldRenderFixedFooter = widget.scrollable && (fixedFooter || fixedColumnsFixedFooter);
1740
-
1741
- if (hasFixedColumns) {
1742
- fixedColumnsContent.push(
1743
- <div
1744
- key="fixedscroller"
1745
- ref={this.fixedScrollerRef}
1746
- className={CSS.element(baseClass, "fixed-scroll-area", {
1747
- "fixed-header": !!this.props.header,
1748
- "fixed-footer": shouldRenderFixedFooter,
1749
- })}
1750
- >
1751
- <div className={CSS.element(baseClass, "fixed-table-wrapper")}>
1752
- <table
1753
- ref={(el) => {
1754
- this.dom.fixedTable = el;
1755
- }}
1756
- >
1757
- {this.props.fixedColumnsHeader}
1758
- {fixedChildren}
1759
- </table>
1760
- </div>
1761
- </div>,
1762
- );
1763
- }
1764
-
1765
- content.push(
1766
- <div
1767
- key="scroller"
1768
- ref={this.scrollerRef}
1769
- onScroll={this.onScroll.bind(this)}
1770
- className={CSS.element(baseClass, "scroll-area", {
1771
- "fixed-header": !!this.props.header,
1772
- "fixed-footer": shouldRenderFixedFooter,
1773
- })}
1774
- >
1775
- <div className={CSS.element(baseClass, "table-wrapper")}>
1776
- <table
1777
- ref={(el) => {
1778
- this.dom.table = el;
1779
- if (this.props.instance.widget.onRef) this.props.instance.invoke("onRef", el, this.props.instance);
1780
- }}
1781
- >
1782
- {this.props.header}
1783
- {children}
1784
- </table>
1785
- </div>
1786
- </div>,
1787
- );
1788
-
1789
- if (this.props.fixedHeader)
1790
- content.push(
1791
- <div
1792
- key="fh"
1793
- ref={(el) => {
1794
- this.dom.fixedHeader = el;
1795
- }}
1796
- className={CSS.element(baseClass, "fixed-header")}
1797
- style={{
1798
- display: this.scrollWidth > 0 ? "block" : "none",
1799
- }}
1800
- >
1801
- <table>{this.props.fixedHeader}</table>
1802
- </div>,
1803
- );
1804
-
1805
- if (this.props.fixedColumnsFixedHeader)
1806
- fixedColumnsContent.push(
1807
- <div
1808
- key="fcfh"
1809
- ref={(el) => {
1810
- this.dom.fixedColumnsFixedHeader = el;
1811
- }}
1812
- className={CSS.element(baseClass, "fixed-fixed-header")}
1813
- style={{
1814
- display: this.scrollWidth > 0 ? "block" : "none",
1815
- }}
1816
- >
1817
- <table>{this.props.fixedColumnsFixedHeader}</table>
1818
- </div>,
1819
- );
1820
-
1821
- if (shouldRenderFixedFooter) {
1822
- content.push(
1823
- <div
1824
- key="ff"
1825
- ref={(el) => {
1826
- this.dom.fixedFooter = el;
1827
- }}
1828
- className={CSS.element(baseClass, "fixed-footer")}
1829
- >
1830
- <table>{fixedFooter}</table>
1831
- </div>,
1832
- );
1833
-
1834
- if (hasFixedColumns)
1835
- fixedColumnsContent.push(
1836
- <div
1837
- key="fcff"
1838
- ref={(el) => {
1839
- this.dom.fixedColumnsFixedFooter = el;
1840
- }}
1841
- className={CSS.element(baseClass, "fixed-fixed-footer")}
1842
- >
1843
- <table>{fixedColumnsFixedFooter}</table>
1844
- </div>,
1845
- );
1846
- }
1847
-
1848
- let columnInsertionMarker = null;
1849
- if (this.state.dropTarget == "column") {
1850
- columnInsertionMarker = (
1851
- <div
1852
- className={CSS.element(baseClass, "col-insertion-marker")}
1853
- style={{
1854
- left: this.state.colDropInsertionLeft,
1855
- }}
1856
- />
1857
- );
1858
- }
1859
-
1860
- return (
1861
- <div
1862
- className={data.classNames}
1863
- style={{ ...data.style, counterReset: `cx-row-number ${start}` }}
1864
- tabIndex={widget.focusable ? data.tabIndex || 0 : null}
1865
- ref={this.gridRef}
1866
- onKeyDown={this.handleKeyDown.bind(this)}
1867
- onFocus={this.onFocus.bind(this)}
1868
- onBlur={this.onBlur.bind(this)}
1869
- onDragEnter={this.onFileDragEnter.bind(this)}
1870
- onDragOver={this.onFileDragOver.bind(this)}
1871
- onDragLeave={this.onFileDragLeave.bind(this)}
1872
- onDrop={this.onFileDrop.bind(this)}
1873
- >
1874
- {fixedColumnsContent}
1875
- {content}
1876
- {columnInsertionMarker}
1877
- {this.props.children}
1878
- </div>
1879
- );
1880
- }
1881
-
1882
- getRecordsSlice(start, end) {
1883
- let { data, instance } = this.props;
1884
- let { widget } = instance;
1885
- if (!widget.infinite) {
1886
- let source = instance.records || data.records;
1887
- return source.slice(start, end);
1888
- }
1889
-
1890
- let { offset, records } = data;
1891
- let result = [];
1892
- for (let i = start; i < Math.min(end, data.totalRecordCount); i++) {
1893
- if (i >= offset && i < offset + records.length) result.push(records[i - offset]);
1894
- else result.push(null);
1895
- }
1896
-
1897
- return result;
1898
- }
1899
-
1900
- ensureData(visibleStart, visibleEnd) {
1901
- if (this.loading) return;
1902
-
1903
- let { instance } = this.props;
1904
- let { widget } = instance;
1905
- let { pageSize } = widget;
1906
-
1907
- let startPage = Math.trunc(visibleStart / pageSize) + 1,
1908
- endPage = Math.trunc((visibleEnd - 1) / pageSize) + 1;
1909
-
1910
- //debouncing restricts excessive page loading on fast scrolling as rendering data is
1911
- //useless because visible region is scrolled away before data appears
1912
- //the user should spent some time on the page before loading it
1913
-
1914
- if (!this.loadPageRange)
1915
- this.loadPageRange = debounce((startPage, endPage) => {
1916
- let { data } = this.props;
1917
- let { records, offset } = data;
1918
- let promises = [];
1919
-
1920
- for (let page = startPage; page <= endPage; page++) {
1921
- let s = (page - 1) * pageSize,
1922
- e = s + pageSize;
1923
- if (s >= offset && e <= offset + records.length) {
1924
- promises.push(Promise.resolve(records.slice(s - offset, e - offset)));
1925
- } else {
1926
- let result = instance.invoke(
1927
- "onFetchRecords",
1928
- {
1929
- page,
1930
- pageSize,
1931
- sorters: data.sorters,
1932
- sortField: data.sortField,
1933
- sortDirection: data.sortDirection,
1934
- filterParams: data.filterParams,
1935
- state: this.prevFetchRecordsState,
1936
- },
1937
- instance,
1938
- );
1939
- promises.push(Promise.resolve(result));
1940
- }
1941
- }
1942
-
1943
- this.loading = true;
1944
-
1945
- Promise.all(promises)
1946
- .then((pageRecords) => {
1947
- this.loading = false;
1948
- let records = [];
1949
- let totalRecordCount;
1950
- let lastPage;
1951
-
1952
- pageRecords.forEach((page) => {
1953
- if (Array.isArray(page)) {
1954
- records.push(...page);
1955
- } else {
1956
- if (!Array.isArray(page.records))
1957
- throw new Error(
1958
- "onFetchRecords should return an array of records or an object with results inside records property.",
1959
- );
1960
- totalRecordCount = page.totalRecordCount;
1961
- lastPage = page.lastPage;
1962
- this.prevFetchRecordsState = page.state;
1963
- records.push(...page.records);
1964
- }
1965
- });
1966
-
1967
- let { data } = this.props;
1968
-
1969
- if (!isNumber(totalRecordCount)) {
1970
- totalRecordCount = (startPage - 1) * pageSize + records.length;
1971
- if (!lastPage && records.length == (endPage - startPage + 1) * pageSize) totalRecordCount++;
1972
- if (data.totalRecordCount > totalRecordCount) totalRecordCount = data.totalRecordCount;
1973
- }
1974
-
1975
- instance.buffer.totalRecordCount = data.totalRecordCount = totalRecordCount;
1976
- instance.buffer.records = data.records = records;
1977
- instance.buffer.page = data.page = startPage;
1978
- data.offset = (startPage - 1) * pageSize;
1979
-
1980
- instance.store.silently(() => {
1981
- instance.set("records", records);
1982
- instance.set("page", startPage);
1983
- instance.set("totalRecordCount", totalRecordCount);
1984
- });
1985
-
1986
- let stateChanges = {
1987
- startPage,
1988
- endPage,
1989
- };
1990
-
1991
- if (this.state.end == 0) stateChanges.end = Math.min(widget.bufferSize, totalRecordCount);
1992
-
1993
- this.setState(stateChanges, () => {
1994
- this.loadingStartPage = startPage;
1995
- this.loadingEndPage = endPage;
1996
- this.onScroll();
1997
- });
1998
- })
1999
- .catch((error) => {
2000
- this.loading = false;
2001
- if (widget.onLoadingError) instance.invoke(error, "onLoadingError", instance);
2002
- });
2003
- }, 30);
2004
-
2005
- if (startPage < this.loadingStartPage || endPage > this.loadingEndPage) {
2006
- this.loadingStartPage = startPage;
2007
- this.loadingEndPage = endPage;
2008
- this.loadPageRange(startPage, endPage);
2009
- }
2010
- }
2011
-
2012
- onScroll() {
2013
- //check if unmounted
2014
- if (!this.dom.scroller) return;
2015
-
2016
- if (this.dom.fixedHeader) {
2017
- this.dom.fixedHeader.scrollLeft = this.dom.scroller.scrollLeft;
2018
- }
2019
-
2020
- if (this.dom.fixedFooter) {
2021
- this.dom.fixedFooter.scrollLeft = this.dom.scroller.scrollLeft;
2022
- }
2023
-
2024
- if (this.dom.fixedScroller) {
2025
- this.dom.fixedScroller.scrollTop = this.dom.scroller.scrollTop;
2026
- }
2027
-
2028
- let { instance, data } = this.props;
2029
- let { widget } = instance;
2030
- if (widget.buffered && !this.pending) {
2031
- let start = 0;
2032
- if (widget.measureRowHeights && instance.records)
2033
- start = Math.max(0, this.estimateStart(instance.records, this.dom.scroller.scrollTop) - widget.bufferStep);
2034
- else if (this.rowHeight > 0)
2035
- start = Math.round(this.dom.scroller.scrollTop / this.rowHeight - widget.bufferStep);
2036
-
2037
- start = Math.round(start / widget.bufferStep) * widget.bufferStep;
2038
- start = Math.max(0, Math.min(start, data.totalRecordCount - widget.bufferSize));
2039
- let end = Math.min(data.totalRecordCount, start + widget.bufferSize);
2040
-
2041
- if (widget.infinite) {
2042
- this.ensureData(start, end);
2043
- }
2044
-
2045
- if (this.syncBuffering) {
2046
- this.start = start;
2047
- this.end = end;
2048
- } else if (this.state.end != end) {
2049
- this.pending = true;
2050
- this.setState({ start, end }, () => {
2051
- this.pending = false;
2052
- });
2053
- }
2054
- }
2055
- }
2056
-
2057
- onFixedColumnsWheel(e) {
2058
- this.dom.scroller.scrollTop += e.deltaY;
2059
- e.preventDefault();
2060
- }
2061
-
2062
- shouldComponentUpdate(props, state) {
2063
- return props.shouldUpdate !== false || state !== this.state;
2064
- }
2065
-
2066
- componentDidMount() {
2067
- this.componentDidUpdate();
2068
- let { instance } = this.props;
2069
- let { widget } = instance;
2070
- if (widget.scrollable) {
2071
- //update fixed header/footer on resize
2072
- this.offResize = ResizeManager.trackElement(this.dom.scroller, () => {
2073
- requestAnimationFrame(() => {
2074
- //ignore changes if the element is not visible on the page
2075
- if (!this.dom.scroller?.offsetWidth) return;
2076
- this.componentDidUpdate();
2077
- instance.setState({
2078
- dimensionsVersion: instance.state.dimensionsVersion + 1,
2079
- lockedColWidth: {},
2080
- });
2081
- });
2082
- });
2083
- }
2084
- if (widget.pipeKeyDown) instance.invoke("pipeKeyDown", this.handleKeyDown.bind(this), instance);
2085
- this.unregisterDropZone = registerDropZone(this);
2086
- if (widget.infinite) this.ensureData(0, 0);
2087
- if (this.dom.fixedScroller) {
2088
- this.onFixedColumnsWheel = this.onFixedColumnsWheel.bind(this);
2089
- this.dom.fixedScroller.addEventListener("wheel", this.onFixedColumnsWheel, { passive: false });
2090
- }
2091
- }
2092
-
2093
- onDragStart(e) {
2094
- let { instance } = this.props;
2095
- let { widget } = instance;
2096
- if (widget.onDragStart) instance.invoke("onDragStart", e, instance);
2097
- }
2098
-
2099
- onDrop(e) {
2100
- try {
2101
- let { instance } = this.props;
2102
- let { widget } = instance;
2103
- let { start } = this.getBufferStartEnd();
2104
- let { dropInsertionIndex, dropTarget, dropNextToTheRowAbove } = this.state;
2105
- if (dropTarget == "grid" && widget.onDrop && dropInsertionIndex != null) {
2106
- e.target = {
2107
- insertionIndex: start + dropInsertionIndex,
2108
- recordBefore: this.getDataRecordAt(start + dropInsertionIndex - 1),
2109
- recordAfter: this.getDataRecordAt(start + dropInsertionIndex),
2110
- dropNextToTheRowAbove,
2111
- };
2112
- instance.invoke("onDrop", e, instance);
2113
- } else if (dropTarget == "row") {
2114
- e.target = {
2115
- index: start + dropInsertionIndex,
2116
- record: this.getDataRecordAt(start + dropInsertionIndex),
2117
- };
2118
- instance.invoke("onRowDrop", e, instance);
2119
- } else if (dropTarget == "column" && widget.onColumnDrop) {
2120
- e.target = {
2121
- index: this.state.colDropInsertionIndex,
2122
- grid: widget,
2123
- instance,
2124
- };
2125
- instance.invoke("onColumnDrop", e, instance);
2126
- }
2127
- } catch (err) {
2128
- console.error("Grid drop operation failed. Please fix this error:", err);
2129
- }
2130
-
2131
- //in some cases drop operation is not followed by leave
2132
- this.onDragLeave(e);
2133
- }
2134
-
2135
- onDropTest(e) {
2136
- let { instance } = this.props;
2137
- let { widget } = instance;
2138
- let grid = widget.onDropTest && instance.invoke("onDropTest", e, instance);
2139
- let row = widget.onRowDropTest && instance.invoke("onRowDropTest", e, instance);
2140
- let column = widget.onColumnDropTest && instance.invoke("onColumnDropTest", e, instance);
2141
- return (grid || row || column) && { grid, row, column };
2142
- }
2143
-
2144
- onDragEnd(e) {
2145
- this.setState({
2146
- dropTarget: null,
2147
- dropInsertionIndex: null,
2148
- colDropInsertionIndex: null,
2149
- colDropInsertionLeft: null,
2150
- });
2151
- let { instance } = this.props;
2152
- let { widget } = instance;
2153
- if (widget.onDragEnd) instance.invoke("onDragEnd", e, instance);
2154
- }
2155
-
2156
- onDragMeasure(e, { test: { grid, row, column } }) {
2157
- //columns can be dropped anywhere, while rows only in the scrollable area
2158
- let r = getTopLevelBoundingClientRect(column ? this.dom.el : this.dom.scroller);
2159
- let { clientX, clientY } = e.cursor;
2160
-
2161
- if (clientX < r.left || clientX >= r.right || clientY < r.top || clientY >= r.bottom) return false;
2162
-
2163
- return {
2164
- over: 1000,
2165
- };
2166
- }
2167
-
2168
- onColumnDragOver(ev) {
2169
- let headerTBody = this.dom.table.firstChild;
2170
- let positions = [];
2171
- let bounds;
2172
-
2173
- let exists = {};
2174
-
2175
- for (let r = 0; r < headerTBody.children.length; r++) {
2176
- let cells = headerTBody.children[r].children;
2177
- for (let c = 0; c < cells.length; c++) {
2178
- bounds = cells[c].getBoundingClientRect();
2179
- let key = bounds.left.toFixed(0);
2180
- if (exists[key]) continue;
2181
- positions.push(bounds.left);
2182
- exists[key] = true;
2183
- }
2184
- if (r == 0) positions.push(bounds.right);
2185
- }
2186
-
2187
- //due to the order of enumeration it's possible that positions are out of order
2188
- positions.sort((a, b) => a - b);
2189
- let index = 0;
2190
- while (index + 1 < positions.length && ev.cursor.clientX > positions[index + 1]) index++;
2191
-
2192
- let { fixedColumnCount } = this.props.instance;
2193
-
2194
- this.setState({
2195
- colDropInsertionIndex: fixedColumnCount + index,
2196
- colDropInsertionLeft:
2197
- positions[index] - positions[0] - this.dom.scroller.scrollLeft + this.dom.scroller.offsetLeft,
2198
- dropTarget: "column",
2199
- });
2200
- }
2201
-
2202
- onDragOver(ev, { test: { grid, row, column } }) {
2203
- if (column) this.onColumnDragOver(ev);
2204
-
2205
- if (!grid && !row) return;
2206
-
2207
- let { instance } = this.props;
2208
- let { widget, data } = instance;
2209
- let { CSS, baseClass } = widget;
2210
- let rowClass = CSS.element(baseClass, "data");
2211
- let nodes = Array.from(this.dom.table.children).filter(
2212
- (node) => node.className && node.className.indexOf(rowClass) != -1,
2213
- );
2214
- let { start } = this.getBufferStartEnd();
2215
-
2216
- let s = 0,
2217
- e = nodes.length,
2218
- m,
2219
- b;
2220
- let parentOffset = getParentFrameBoundingClientRect(this.dom.scroller);
2221
- let cy = ev.cursor.clientY - parentOffset.top;
2222
-
2223
- let rowOverIndex = null;
2224
- let nextToTheRowAbove = false;
2225
-
2226
- while (s < e) {
2227
- m = Math.floor((s + e) / 2);
2228
- b = nodes[m].getBoundingClientRect();
2229
-
2230
- //dragged items might be invisible and have no client bounds
2231
- if (b.top == 0 && b.bottom == 0) {
2232
- //it's important to go all the way in one direction otherwise infinite loop might occur
2233
- while (m > s && b.top == 0 && b.bottom == 0) {
2234
- m--;
2235
- b = nodes[m].getBoundingClientRect();
2236
- }
2237
- while (m + 1 < e && b.top == 0 && b.bottom == 0) {
2238
- m = m + 1;
2239
- b = nodes[m].getBoundingClientRect();
2240
- }
2241
- if (b.top == 0 && b.bottom == 0) {
2242
- s = e = m;
2243
- break;
2244
- }
2245
- }
2246
-
2247
- if (cy < b.top) e = m;
2248
- else if (cy > b.bottom) s = m + 1;
2249
- else {
2250
- //hovering over a row here
2251
- if (row) {
2252
- let confirmed = !grid;
2253
- if (!confirmed) {
2254
- let insertionZone = (b.bottom - b.top) / 4;
2255
- confirmed = cy > b.top + insertionZone && cy < b.bottom - insertionZone;
2256
- }
2257
- if (confirmed) {
2258
- rowOverIndex = m;
2259
- break;
2260
- }
2261
- }
2262
-
2263
- if (cy > (b.bottom + b.top) / 2) {
2264
- s = e = m + 1;
2265
- nextToTheRowAbove = true;
2266
- } else s = e = m;
2267
- }
2268
- }
2269
-
2270
- let cancel = false;
2271
-
2272
- if (rowOverIndex != null) {
2273
- let evt = {
2274
- ...ev,
2275
- target: {
2276
- record: this.getRecordAt(rowOverIndex),
2277
- index: start + rowOverIndex,
2278
- },
2279
- };
2280
- if (widget.onRowDragOver && instance.invoke("onRowDragOver", evt, instance) === false) cancel = true;
2281
- else if (rowOverIndex != this.state.dropInsertionIndex || this.state.dropTarget != "row") {
2282
- this.setState({
2283
- dropInsertionIndex: rowOverIndex,
2284
- dropNextToTheRowAbove: false,
2285
- dropItemHeight: ev.source.height - 1,
2286
- dropTarget: "row",
2287
- });
2288
- }
2289
- } else if (grid) {
2290
- let evt = {
2291
- ...ev,
2292
- target: {
2293
- recordBefore: this.getRecordAt(s - 1),
2294
- recordAfter: this.getRecordAt(s),
2295
- insertionIndex: start + s,
2296
- totalRecordCount: data.totalRecordCount,
2297
- },
2298
- };
2299
- if (widget.onDragOver && instance.invoke("onDragOver", evt, instance) === false) cancel = true;
2300
- else if (s != this.state.dropInsertionIndex || this.state.dropTarget != "grid") {
2301
- this.setState({
2302
- dropInsertionIndex: s,
2303
- dropNextToTheRowAbove: nextToTheRowAbove,
2304
- dropItemHeight: ev.source.height - 1,
2305
- dropTarget: "grid",
2306
- });
2307
- }
2308
- }
2309
- if (cancel) {
2310
- this.setState({
2311
- dropInsertionIndex: null,
2312
- dropNextToTheRowAbove: null,
2313
- dropTarget: null,
2314
- });
2315
- }
2316
- }
2317
-
2318
- onDragLeave(e) {
2319
- this.setState({
2320
- dropInsertionIndex: null,
2321
- dropNextToTheRowAbove: null,
2322
- dropTarget: null,
2323
- });
2324
- }
2325
-
2326
- onGetHScrollParent() {
2327
- let { widget } = this.props.instance;
2328
- if (widget.scrollable) return this.dom.scroller;
2329
- return findScrollableParent(this.dom.table, true);
2330
- }
2331
-
2332
- onGetVScrollParent({ test: { grid, row, column } }) {
2333
- if (column && !grid && !row) return null;
2334
- let { widget } = this.props.instance;
2335
- if (widget.scrollable) return this.dom.scroller;
2336
- return findScrollableParent(this.dom.table);
2337
- }
2338
-
2339
- UNSAFE_componentWillReceiveProps(props) {
2340
- let { data, widget } = props.instance;
2341
- if (this.state.cursor >= data.totalRecordCount)
2342
- this.setState({
2343
- cursor: data.totalRecordCount - 1,
2344
- });
2345
- else if (widget.selectable && this.state.focused && this.state.cursor < 0)
2346
- this.setState({
2347
- cursor: 0,
2348
- });
2349
- }
2350
-
2351
- componentWillUnmount() {
2352
- let { instance } = this.props;
2353
- let { widget } = instance;
2354
- if (this.offResize) this.offResize();
2355
-
2356
- offFocusOut(this);
2357
-
2358
- if (this.unregisterDropZone) this.unregisterDropZone();
2359
-
2360
- if (widget.pipeKeyDown) instance.invoke("pipeKeyDown", null, instance);
2361
-
2362
- if (this.dom.fixedScroller) {
2363
- this.dom.fixedScroller.removeEventListener("wheel", this.onFixedColumnsWheel);
2364
- }
2365
- }
2366
-
2367
- estimateHeight(records, start, end, breakCondition) {
2368
- let avgDataRowHeight = this.heightStats.estimate("data");
2369
- let totalHeight = 0;
2370
- for (let i = start; i < end; i++) {
2371
- let record = records[i];
2372
- switch (record.type) {
2373
- case "data":
2374
- if (record.key in this.rowHeights) totalHeight += this.rowHeights[record.key];
2375
- else totalHeight += avgDataRowHeight;
2376
- break;
2377
-
2378
- case "group-header":
2379
- if (record.grouping.showCaption) {
2380
- let captionKey = "group-caption-" + record.level;
2381
- if (`${captionKey}-${record.group.$key}` in this.rowHeights)
2382
- totalHeight += this.rowHeights[`${captionKey}-${record.group.$key}`];
2383
- else totalHeight += this.heightStats.estimate(captionKey) || avgDataRowHeight;
2384
- }
2385
- break;
2386
-
2387
- case "group-footer":
2388
- if (record.grouping.showFooter) {
2389
- let captionKey = "group-footer-" + record.level;
2390
- if (`${captionKey}-${record.group.$key}` in this.rowHeights)
2391
- totalHeight += this.rowHeights[`${captionKey}-${record.group.$key}`];
2392
- else totalHeight += this.heightStats.estimate(captionKey) || avgDataRowHeight;
2393
- }
2394
- break;
2395
-
2396
- default:
2397
- Console.warn("UNPROCESSED RECORD TYPE", record);
2398
- break;
2399
- }
2400
-
2401
- if (breakCondition && breakCondition(i, totalHeight) === false) break;
2402
- }
2403
- return totalHeight;
2404
- }
2405
-
2406
- estimateStart(records, height) {
2407
- let start = 0;
2408
- if (height == 0) return 0;
2409
- this.estimateHeight(records, 0, records.length, (index, h) => {
2410
- start = index;
2411
- return h < height;
2412
- });
2413
- return start;
2414
- }
2415
-
2416
- componentDidUpdate() {
2417
- let { instance, data } = this.props;
2418
- let { widget, fixedFooterOverlap } = instance;
2419
-
2420
- if (
2421
- widget.lockColumnWidths &&
2422
- isArray(data.records) &&
2423
- data.records.length >= widget.lockColumnWidthsRequiredRowCount
2424
- ) {
2425
- let headerTBody = this.dom.table.firstChild;
2426
- for (let r = 0; r < headerTBody.children.length; r++) {
2427
- let sr = headerTBody.children[r];
2428
- for (let c = 0; c < sr.children.length; c++) {
2429
- let cell = sr.children[c];
2430
- cell.style.width = cell.style.minWidth = cell.style.maxWidth = `${sr.children[c].offsetWidth}px`;
2431
- cell.style.boxSizing = "border-box";
2432
- if (cell.dataset.uniqueColId)
2433
- instance.state.lockedColWidth[cell.dataset.uniqueColId] = sr.children[c].offsetWidth;
2434
- }
2435
- }
2436
- }
2437
-
2438
- if (widget.scrollable) {
2439
- this.scrollWidth = this.dom.scroller.offsetWidth - this.dom.scroller.clientWidth;
2440
-
2441
- let resized = false,
2442
- headerHeight = 0,
2443
- footerHeight = 0,
2444
- rowHeight = 0;
2445
-
2446
- if (this.dom.fixedTable) syncHeaderHeights(this.dom.table.firstChild, this.dom.fixedTable.firstChild);
2447
-
2448
- if (this.dom.fixedHeader) {
2449
- let fixedHeaderTBody = this.dom.fixedHeader.firstChild.firstChild;
2450
-
2451
- resized = widget.preciseMeasurements
2452
- ? copyCellSizePrecise(this.dom.table.firstChild, fixedHeaderTBody)
2453
- : copyCellSize(this.dom.table.firstChild, fixedHeaderTBody);
2454
-
2455
- let scrollColumnEl = fixedHeaderTBody.firstChild.lastChild;
2456
- if (scrollColumnEl) scrollColumnEl.style.minWidth = scrollColumnEl.style.maxWidth = this.scrollWidth + "px";
2457
-
2458
- this.dom.fixedHeader.style.display = "block";
2459
- headerHeight = this.dom.fixedHeader.offsetHeight;
2460
- this.dom.scroller.style.marginTop = `${headerHeight}px`;
2461
- if (this.dom.fixedScroller) this.dom.fixedScroller.style.marginTop = `${headerHeight}px`;
2462
- else if (this.dom.fixedHeader.style.left != null) this.dom.fixedHeader.style.left = null;
2463
- } else {
2464
- this.dom.scroller.style.marginTop = 0;
2465
- if (this.dom.fixedScroller) this.dom.fixedScroller.style.marginTop = 0;
2466
- }
2467
-
2468
- if (this.dom.fixedColumnsFixedHeader) {
2469
- let fixedColumnsWidth = `${this.dom.fixedScroller.offsetWidth}px`;
2470
- this.dom.fixedColumnsFixedHeader.style.right = "auto";
2471
- this.dom.fixedColumnsFixedHeader.style.width = fixedColumnsWidth;
2472
- if (this.dom.fixedHeader) this.dom.fixedHeader.style.left = fixedColumnsWidth;
2473
-
2474
- this.dom.fixedColumnsFixedHeader.style.display = "block";
2475
-
2476
- let fixedHeaderTBody = this.dom.fixedColumnsFixedHeader.firstChild.firstChild;
2477
-
2478
- if (this.dom.fixedTable.firstChild) {
2479
- resized = copyCellSize(this.dom.fixedTable.firstChild, fixedHeaderTBody);
2480
- }
2481
- }
2482
-
2483
- if (this.dom.fixedFooter || this.dom.fixedColumnsFixedFooter) {
2484
- if (this.dom.fixedColumnsFixedFooter) {
2485
- let fixedColumnsWidth = `${this.dom.fixedScroller.offsetWidth}px`;
2486
- this.dom.fixedColumnsFixedFooter.style.right = "auto";
2487
- this.dom.fixedColumnsFixedFooter.style.width = fixedColumnsWidth;
2488
-
2489
- let dstTableBody = this.dom.fixedColumnsFixedFooter.firstChild.firstChild;
2490
- if (dstTableBody) {
2491
- let srcTableBody = this.dom.fixedTable.lastChild;
2492
- copyCellSize(srcTableBody, dstTableBody, fixedFooterOverlap);
2493
- this.dom.fixedColumnsFixedFooter.style.display = "block";
2494
- footerHeight = this.dom.fixedFooter.offsetHeight;
2495
- }
2496
- }
2497
-
2498
- if (this.dom.fixedFooter) {
2499
- let dstTableBody = this.dom.fixedFooter.firstChild.firstChild;
2500
-
2501
- if (dstTableBody) {
2502
- let srcTableBody = this.dom.table.lastChild;
2503
-
2504
- copyCellSize(srcTableBody, dstTableBody, fixedFooterOverlap);
2505
-
2506
- let scrollColumnEl = dstTableBody.firstChild.lastChild;
2507
- if (scrollColumnEl)
2508
- scrollColumnEl.style.minWidth = scrollColumnEl.style.maxWidth = this.scrollWidth + "px";
2509
-
2510
- this.dom.fixedFooter.style.display = "block";
2511
- footerHeight = this.dom.fixedFooter.offsetHeight;
2512
- }
2513
-
2514
- if (this.dom.fixedScroller) this.dom.fixedFooter.style.left = `${this.dom.fixedScroller.offsetWidth}px`;
2515
- else if (this.dom.fixedFooter.style.left != null) this.dom.fixedFooter.style.left = null;
2516
- }
2517
-
2518
- this.dom.scroller.style.marginBottom = `${footerHeight}px`;
2519
- if (this.dom.fixedScroller) this.dom.fixedScroller.style.marginBottom = `${footerHeight}px`;
2520
- } else {
2521
- this.dom.scroller.style.marginBottom = 0;
2522
- if (this.dom.fixedScroller) this.dom.fixedScroller.style.marginBottom = 0;
2523
- }
2524
-
2525
- let scrollOverlap = fixedFooterOverlap ? footerHeight : 0;
2526
-
2527
- if (widget.buffered) {
2528
- let { start, end } = this.getBufferStartEnd();
2529
- let remaining = 0,
2530
- count = Math.min(data.totalRecordCount, end - start);
2531
-
2532
- if (widget.measureRowHeights) {
2533
- if (!this.rowHeights) this.rowHeights = {};
2534
- if (!this.heightStats) this.heightStats = new AvgHeight();
2535
- for (let i = 0; i < this.dom.table.children.length; i++) {
2536
- let body = this.dom.table.children[i];
2537
- if (body.dataset.recordKey != null) {
2538
- if (!(body.dataset.recordKey in this.rowHeights)) this.heightStats.add("data", body.offsetHeight);
2539
- this.rowHeights[body.dataset.recordKey] = body.offsetHeight;
2540
- } else if (body.dataset.groupKey) {
2541
- let key = body.dataset.groupElement + "-" + body.dataset.groupKey;
2542
- this.rowHeights[key] = body.offsetHeight;
2543
- if (!(body.dataset.recordKey in this.rowHeights))
2544
- this.heightStats.add(body.dataset.groupElement, body.offsetHeight);
2545
- }
2546
- }
2547
- }
2548
-
2549
- if (count > 0) {
2550
- //do not change row height while a drag-drop operation is in place
2551
- rowHeight = this.state.dragged
2552
- ? this.rowHeight
2553
- : Math.round((this.dom.table.offsetHeight - headerHeight) / count);
2554
- // if (this.rowHeight && this.rowHeight != rowHeight) {
2555
- // console.warn("ROW-HEIGHT-CHANGE", this.rowHeight, rowHeight);
2556
- // }
2557
- remaining = Math.max(0, data.totalRecordCount - end);
2558
- }
2559
-
2560
- let upperMargin = 0,
2561
- lowerMargin = 0;
2562
- if (widget.measureRowHeights && instance.records) {
2563
- upperMargin = this.estimateHeight(instance.records, 0, start);
2564
- lowerMargin = this.estimateHeight(instance.records, end, instance.records.length);
2565
- } else {
2566
- upperMargin = start * rowHeight;
2567
- lowerMargin = remaining * rowHeight;
2568
- }
2569
-
2570
- //console.log(upperMargin, start * rowHeight, this.rowHeights, this.heightStats);
2571
-
2572
- this.dom.table.style.marginTop = `${(-headerHeight + upperMargin).toFixed(0)}px`;
2573
- this.dom.table.style.marginBottom = `${(lowerMargin - scrollOverlap).toFixed(0)}px`;
2574
- } else {
2575
- this.dom.table.style.marginTop = `${-headerHeight}px`;
2576
- this.dom.table.style.marginBottom = `${-scrollOverlap}px`;
2577
- }
2578
-
2579
- if (this.dom.fixedTable) {
2580
- this.dom.fixedTable.style.marginTop = this.dom.table.style.marginTop;
2581
- this.dom.fixedTable.style.marginBottom = this.dom.table.style.marginBottom;
2582
- }
2583
-
2584
- this.rowHeight = rowHeight;
2585
-
2586
- let sortersChanged = widget.infinite && !shallowEquals(data.sorters, this.lastSorters);
2587
-
2588
- if (data.empty && !widget.infinite) {
2589
- this.dom.scroller.scrollTop = 0;
2590
- }
2591
-
2592
- if (
2593
- sortersChanged ||
2594
- data.filterParams !== this.lastScrollFilterParams ||
2595
- data.scrollResetParams !== this.lastScrollResetParams
2596
- ) {
2597
- this.dom.scroller.scrollTop = 0;
2598
- this.lastScrollFilterParams = data.filterParams;
2599
- this.lastScrollResetParams = data.scrollResetParams;
2600
- this.lastSorters = data.sorters;
2601
- if (widget.infinite) {
2602
- this.loadingStartPage = 0;
2603
- this.loadingEndPage = 0;
2604
- instance.buffer.records = data.records = [];
2605
- instance.buffer.totalRecordCount = 0;
2606
- instance.buffer.page = 1;
2607
- this.prevFetchRecordsState = null;
2608
- this.loading = false;
2609
- }
2610
- }
2611
-
2612
- if (widget.scrollSelectionIntoView && !widget.buffered) {
2613
- let { CSS, baseClass } = widget;
2614
- let selectedRowSelector = `.${CSS.element(baseClass, "data")}.${CSS.state("selected")}`;
2615
- let firstSelectedRow = this.dom.table.querySelector(selectedRowSelector);
2616
- if (firstSelectedRow != this.selectedEl) {
2617
- firstSelectedRow && scrollElementIntoView(firstSelectedRow);
2618
- this.selectedEl = firstSelectedRow;
2619
- }
2620
- }
2621
-
2622
- setTimeout(this.onScroll.bind(this), 0);
2623
-
2624
- if (resized) instance.fixedHeaderResizeEvent.notify();
2625
- }
2626
- }
2627
-
2628
- moveCursor(
2629
- index,
2630
- { focused, hover, scrollIntoView, select, selectRange, selectOptions, cellIndex, cellEdit, cancelEdit } = {},
2631
- ) {
2632
- let { widget, visibleColumns } = this.props.instance;
2633
- if (!widget.selectable && !widget.cellEditable) return;
2634
-
2635
- let newState = {};
2636
-
2637
- if (cellEdit != null && cellEdit != this.state.cellEdit) {
2638
- newState.cellEdit = cellEdit;
2639
- if (
2640
- cellEdit &&
2641
- (!visibleColumns[this.state.cursorCellIndex] || !visibleColumns[this.state.cursorCellIndex].editor)
2642
- )
2643
- newState.cellEdit = false;
2644
- }
2645
-
2646
- if (cellIndex != null && cellIndex != this.state.cursorCellIndex) {
2647
- newState.cursorCellIndex = cellIndex;
2648
- newState.cellEdit = false;
2649
- }
2650
-
2651
- if (widget.focused) focused = true;
2652
-
2653
- if (focused != null && this.state.focused != focused) {
2654
- newState.focused = focused;
2655
- newState.cellEdit = false;
2656
- }
2657
-
2658
- if (index != this.state.cursor) {
2659
- newState.cursor = index;
2660
- newState.cellEdit = false;
2661
- }
2662
-
2663
- batchUpdates(() => {
2664
- if (select) {
2665
- let start = selectRange && this.state.selectionStart >= 0 ? this.state.selectionStart : index;
2666
- if (start < 0) start = index;
2667
- this.selectRange(start, index, selectOptions);
2668
- if (!selectRange) newState.selectionStart = index;
2669
- }
2670
-
2671
- if (Object.keys(newState).length > 0) {
2672
- let prevState = this.state;
2673
- let wasCellEditing = prevState.focused && prevState.cellEdit;
2674
- let futureState = { ...this.state, ...newState };
2675
-
2676
- if (!futureState.cellEdit && wasCellEditing) {
2677
- // If cell editing is in progress, moving the cursor may cause that the cell editor to unmount before
2678
- // the blur event which may cause data loss for components which do not have reactOn=change set, e.g. NumberField.
2679
- unfocusElement(null, false);
2680
- let record = this.getRecordAt(prevState.cursor);
2681
- if ((!this.cellEditorValid || cancelEdit) && this.cellEditUndoData)
2682
- record.store.set(widget.recordName, this.cellEditUndoData);
2683
- else {
2684
- let newData = record.store.get(widget.recordName); //record.data might be stale at this point
2685
- if (widget.onCellEdited && newData != this.cellEditUndoData) {
2686
- this.props.instance.invoke(
2687
- "onCellEdited",
2688
- {
2689
- column: visibleColumns[prevState.cursorCellIndex],
2690
- newData,
2691
- oldData: this.cellEditUndoData,
2692
- field: visibleColumns[prevState.cursorCellIndex].field,
2693
- },
2694
- record,
2695
- );
2696
- this.cellEditUndoData = newData;
2697
- }
2698
- }
2699
- }
2700
-
2701
- if (futureState.cellEdit && !wasCellEditing) {
2702
- let record = this.getRecordAt(futureState.cursor);
2703
- let cellEditUndoData = record.data;
2704
-
2705
- if (
2706
- widget.onBeforeCellEdit &&
2707
- this.props.instance.invoke(
2708
- "onBeforeCellEdit",
2709
- {
2710
- column: visibleColumns[futureState.cursorCellIndex],
2711
- data: cellEditUndoData,
2712
- field: visibleColumns[futureState.cursorCellIndex].field,
2713
- },
2714
- record,
2715
- ) === false
2716
- )
2717
- return;
2718
-
2719
- this.cellEditUndoData = cellEditUndoData;
2720
- }
2721
-
2722
- this.setState(newState, () => {
2723
- if (this.state.focused && !this.state.cellEdit && wasCellEditing) FocusManager.focus(this.dom.el);
2724
-
2725
- if (scrollIntoView) {
2726
- let record = this.getRecordAt(index);
2727
-
2728
- let item = record && this.dom.table.querySelector(`tbody[data-record-key="${record.key}"]`);
2729
-
2730
- let hscroll = false;
2731
- if (item) {
2732
- if (widget.cellEditable)
2733
- if (this.state.cursorCellIndex >= this.props.instance.fixedColumnCount) {
2734
- hscroll = true;
2735
- item =
2736
- item.firstChild.children[
2737
- this.state.cursorCellIndex - this.props.instance.fixedColumnCount
2738
- ];
2739
- } else {
2740
- let fixedItem = this.dom.fixedTable.querySelector(`tbody[data-record-key="${record.key}"]`);
2741
- let cell = fixedItem && fixedItem.firstChild.children[this.state.cursorCellIndex];
2742
- if (cell) scrollElementIntoView(cell, false, true, 10);
2743
- }
2744
-
2745
- scrollElementIntoView(item, true, hscroll, widget.cellEditable ? 10 : 0);
2746
- }
2747
- }
2748
- });
2749
- }
2750
- });
2751
- }
2752
-
2753
- showCursor(focused) {
2754
- let { records, isSelected } = this.props.instance;
2755
- let cursor = this.state.cursor;
2756
- if (cursor == -1) {
2757
- if (records) {
2758
- cursor = records.findIndex((x) => isSelected(x.data, x.index));
2759
- //if there are no selected records, find the first data record (skip group header)
2760
- if (cursor == -1) cursor = records.findIndex((x) => x.type == "data");
2761
- } else cursor = 0;
2762
- }
2763
- this.moveCursor(cursor, { focused: true, scrollIntoView: false });
2764
- }
2765
-
2766
- onFocus() {
2767
- FocusManager.nudge();
2768
-
2769
- //focus moved within the grid
2770
- if (this.state.focused) {
2771
- if (this.state.cellEdit && this.dom.el == getActiveElement())
2772
- this.moveCursor(this.state.cursor, {
2773
- cellEdit: false,
2774
- });
2775
- return;
2776
- }
2777
-
2778
- let { widget } = this.props.instance;
2779
-
2780
- //the cursor will be set if focus in originating from a mouse event
2781
- setTimeout(() => {
2782
- this.showCursor(true);
2783
- }, 0);
2784
-
2785
- if (!widget.focused) {
2786
- if (this.dom.el) {
2787
- //if an inner element is focused first (autoFocus), this.dom.el might be undefined
2788
- oneFocusOut(this, this.dom.el, () => {
2789
- this.moveCursor(-1, { focused: false });
2790
- });
2791
- }
2792
- }
2793
-
2794
- this.setState({
2795
- focused: true,
2796
- });
2797
- }
2798
-
2799
- onBlur() {
2800
- FocusManager.nudge();
2801
- }
2802
-
2803
- selectRange(from, to, options) {
2804
- let { instance, data } = this.props;
2805
- let { records, widget } = instance;
2806
-
2807
- if (from > to) {
2808
- let tmp = from;
2809
- from = to;
2810
- to = tmp;
2811
- }
2812
-
2813
- options = {
2814
- ...options,
2815
- range: from < to,
2816
- };
2817
-
2818
- let selection = [],
2819
- indexes = [];
2820
-
2821
- for (let cursor = from; cursor <= to; cursor++) {
2822
- let record;
2823
- if (records) record = records[cursor];
2824
- else {
2825
- let offset = widget.infinite ? data.offset : 0;
2826
- let r = data.records[cursor - offset];
2827
- if (r) record = widget.mapRecord(null, instance, r, cursor - offset);
2828
- }
2829
- if (record && record.type == "data") {
2830
- if (instance.isRecordSelectable && !instance.isRecordSelectable(record.data, options)) continue;
2831
- selection.push(record.data);
2832
- indexes.push(record.index);
2833
- }
2834
- }
2835
-
2836
- widget.selection.selectMultiple(instance.store, selection, indexes, options);
2837
- }
2838
-
2839
- getDataRecordAt(index) {
2840
- let { records } = this.props.instance;
2841
- if (!records) return this.getRecordAt(index);
2842
- let dataRecords = records.filter((r) => r.type == "data");
2843
- return dataRecords[index];
2844
- }
2845
-
2846
- getRecordAt(cursor) {
2847
- let { instance, data } = this.props;
2848
- let { records, widget } = instance;
2849
-
2850
- if (records) return records[cursor];
2851
-
2852
- let offset = widget.infinite ? data.offset : 0;
2853
- let r = data.records[cursor - offset];
2854
- if (r) return widget.mapRecord(null, instance, r, cursor - offset);
2855
-
2856
- return null;
2857
- }
2858
-
2859
- getRecordInstanceAt(cursor) {
2860
- let record = this.getRecordAt(cursor);
2861
- if (!record) return null;
2862
- let { instance } = this.props;
2863
- if (instance.recordInstanceCache)
2864
- return instance.recordInstanceCache.getChild(instance.row, record.store, record.key);
2865
-
2866
- //different signature
2867
- return instance.getChild(null, instance.row, record.key, record.store);
2868
- }
2869
-
2870
- handleKeyDown(e) {
2871
- let { instance, data } = this.props;
2872
- let { widget } = instance;
2873
-
2874
- if (widget.onKeyDown && instance.invoke("onKeyDown", e, instance) === false) return;
2875
-
2876
- let recordInstance = this.getRecordInstanceAt(this.state.cursor);
2877
- if (recordInstance && widget.onRowKeyDown && instance.invoke("onRowKeyDown", e, recordInstance) === false) return;
2878
-
2879
- if (widget.onCellKeyDown && widget.cellEditable && this.state.cursorCellIndex != -1) {
2880
- if (
2881
- instance.invoke("onCellKeyDown", e, instance, {
2882
- cellIndex: this.state.cursorCellIndex,
2883
- record: recordInstance,
2884
- }) === false
2885
- )
2886
- return;
2887
- }
2888
-
2889
- switch (e.keyCode) {
2890
- case KeyCode.enter:
2891
- this.moveCursor(this.state.cursor, {
2892
- select: true,
2893
- selectOptions: {
2894
- toggle: e.ctrlKey && !e.shiftKey,
2895
- add: e.ctrlKey && e.shiftKey,
2896
- },
2897
- selectRange: e.shiftKey,
2898
- cellEdit: widget.cellEditable && !this.state.cellEdit,
2899
- focused: true,
2900
- });
2901
- e.stopPropagation();
2902
- e.preventDefault();
2903
- break;
2904
-
2905
- case KeyCode.esc:
2906
- if (this.state.cellEdit) {
2907
- this.moveCursor(this.state.cursor, {
2908
- cellEdit: false,
2909
- focused: true,
2910
- cancelEdit: true,
2911
- });
2912
- e.stopPropagation();
2913
- e.preventDefault();
2914
- }
2915
- break;
2916
-
2917
- case KeyCode.tab:
2918
- if (widget.cellEditable) {
2919
- e.stopPropagation();
2920
- e.preventDefault();
2921
- let direction = e.shiftKey ? -1 : +1;
2922
- let cursor = this.state.cursor;
2923
- let cellIndex = (this.state.cursorCellIndex + direction) % instance.row.line1.columns.length;
2924
- if (cellIndex == -1) {
2925
- cellIndex += instance.row.line1.columns.length;
2926
- cursor--;
2927
- } else if (cellIndex == 0 && direction > 0) cursor++;
2928
- for (; ; cursor += direction) {
2929
- let record = this.getRecordAt(cursor);
2930
- if (!record) break;
2931
- if (record.type != "data") continue;
2932
- this.moveCursor(cursor, {
2933
- focused: true,
2934
- cellIndex,
2935
- scrollIntoView: true,
2936
- cellEdit: false,
2937
- });
2938
- break;
2939
- }
2940
- }
2941
- break;
2942
-
2943
- case KeyCode.down:
2944
- for (let cursor = this.state.cursor + 1; ; cursor++) {
2945
- let record = this.getRecordAt(cursor);
2946
- if (!record) break;
2947
- if (record.type != "data") continue;
2948
- this.moveCursor(cursor, {
2949
- focused: true,
2950
- scrollIntoView: true,
2951
- select: e.shiftKey,
2952
- selectRange: e.shiftKey,
2953
- });
2954
- break;
2955
- }
2956
- e.stopPropagation();
2957
- e.preventDefault();
2958
- break;
2959
-
2960
- case KeyCode.up:
2961
- for (let cursor = this.state.cursor - 1; cursor >= 0; cursor--) {
2962
- let record = this.getRecordAt(cursor);
2963
- if (!record) break;
2964
- if (record.type != "data") continue;
2965
- this.moveCursor(cursor, {
2966
- focused: true,
2967
- scrollIntoView: true,
2968
- select: e.shiftKey,
2969
- selectRange: e.shiftKey,
2970
- });
2971
- break;
2972
- }
2973
- e.stopPropagation();
2974
- e.preventDefault();
2975
- break;
2976
-
2977
- case KeyCode.right:
2978
- if (widget.cellEditable) {
2979
- if (this.state.cursorCellIndex + 1 < instance.row.line1.columns.length) {
2980
- this.moveCursor(this.state.cursor, {
2981
- focused: true,
2982
- cellIndex: this.state.cursorCellIndex + 1,
2983
- scrollIntoView: true,
2984
- });
2985
- }
2986
- e.stopPropagation();
2987
- e.preventDefault();
2988
- }
2989
- break;
2990
-
2991
- case KeyCode.left:
2992
- if (widget.cellEditable) {
2993
- if (this.state.cursorCellIndex > 0) {
2994
- this.moveCursor(this.state.cursor, {
2995
- focused: true,
2996
- cellIndex: this.state.cursorCellIndex - 1,
2997
- scrollIntoView: true,
2998
- });
2999
- }
3000
- e.stopPropagation();
3001
- e.preventDefault();
3002
- }
3003
- break;
3004
-
3005
- case KeyCode.a:
3006
- if (!e.ctrlKey || !widget.selection.multiple) return;
3007
-
3008
- if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
3009
-
3010
- this.selectRange(0, data.totalRecordCount);
3011
-
3012
- e.stopPropagation();
3013
- e.preventDefault();
3014
- break;
3015
- }
3016
- }
3017
-
3018
- beginDragDrop(e, record) {
3019
- let { instance, data } = this.props;
3020
- let { widget, store } = instance;
3021
- let { isRecordDraggable } = instance;
3022
-
3023
- if (isRecordDraggable && !isRecordDraggable(record.data)) return;
3024
-
3025
- //get a fresh isSelected delegate
3026
- let isSelected = widget.selection.getIsSelectedDelegate(store);
3027
-
3028
- let selected = [];
3029
-
3030
- let add = (rec, data, index, force) => {
3031
- if (!data || !(force || isSelected(data, index)) || (isRecordDraggable && !isRecordDraggable(data))) return;
3032
- let mappedRecord = rec ? { ...rec } : widget.mapRecord(null, instance, data, index);
3033
- let row = (mappedRecord.row = instance.getDetachedChild(
3034
- instance.row,
3035
- "DD:" + mappedRecord.key,
3036
- mappedRecord.store,
3037
- ));
3038
- row.selected = true;
3039
- selected.push(mappedRecord);
3040
- };
3041
-
3042
- if (!record.selected) {
3043
- if (instance.records) instance.records.forEach((r) => add(r, r.data, r.index));
3044
- else this.getRecordsSlice(0, data.totalRecordCount).forEach((r, index) => add(null, r, index));
3045
- }
3046
-
3047
- if (selected.length == 0) add(record, record.data, record.index, true);
3048
-
3049
- let renderRow = this.createRowRenderer(false);
3050
-
3051
- let contents = selected.map((record, i) => ({
3052
- type: StaticText,
3053
- text: renderRow(record, i, true, false),
3054
- }));
3055
-
3056
- initiateDragDrop(
3057
- e,
3058
- {
3059
- sourceEl: closest(e.currentTarget, (a) => a.tagName == "TBODY"),
3060
- source: {
3061
- data: data.dragSource.data,
3062
- store: store,
3063
- record: record,
3064
- records: selected,
3065
- },
3066
- clone: {
3067
- store: record.store,
3068
- matchCursorOffset: true,
3069
- matchWidth: true,
3070
- widget: (
3071
- <cx>
3072
- <div className={data.classNames}>
3073
- <table>{contents}</table>
3074
- </div>
3075
- </cx>
3076
- ),
3077
- },
3078
- },
3079
- () => {
3080
- this.setState({
3081
- dragged: false,
3082
- });
3083
- },
3084
- );
3085
-
3086
- this.setState({
3087
- dragged: record,
3088
- });
3089
- }
3090
-
3091
- onFileDragEnter(ev) {
3092
- if (!this.props.instance.widget.allowsFileDrops) return;
3093
- let event = getDragDropEvent(ev);
3094
- var test = this.onDropTest(event);
3095
- if (test) {
3096
- ev.preventDefault();
3097
- ev.stopPropagation();
3098
- this.onDragStart(ev);
3099
- }
3100
- }
3101
- onFileDragOver(ev) {
3102
- if (!this.props.instance.widget.allowsFileDrops) return;
3103
- let event = getDragDropEvent(ev);
3104
- var test = this.onDropTest(event);
3105
- if (test) {
3106
- ev.preventDefault();
3107
- ev.stopPropagation();
3108
- this.onDragOver(event, { test });
3109
- }
3110
- }
3111
- onFileDragLeave(ev) {
3112
- if (!this.props.instance.widget.allowsFileDrops) return;
3113
- if (ev.target != this.dom.el) {
3114
- //The dragleave event fires when the cursor leave any of the child elements.
3115
- //We need to be sure that the cursor left the top element too.
3116
- let el = document.elementFromPoint(ev.clientX, ev.clientY);
3117
- if (el == this.dom.el || this.dom.el.contains(el)) return;
3118
- }
3119
- let event = getDragDropEvent(ev);
3120
- var test = this.onDropTest(event);
3121
- if (test) {
3122
- this.onDragLeave(event);
3123
- }
3124
- }
3125
- onFileDrop(ev) {
3126
- if (!this.props.instance.widget.allowsFileDrops) return;
3127
- let event = getDragDropEvent(ev);
3128
- var test = this.onDropTest(event);
3129
- if (test) {
3130
- ev.preventDefault();
3131
- ev.stopPropagation();
3132
- this.onDrop(event);
3133
- }
3134
- }
3135
- }
3136
-
3137
- class GridColumnHeaderLine extends PureContainer {
3138
- declareData() {
3139
- return super.declareData(...arguments, {
3140
- showHeader: undefined,
3141
- });
3142
- }
3143
-
3144
- init() {
3145
- this.items = Widget.create(GridColumnHeader, this.columns || []);
3146
- this.visible = this.showHeader;
3147
- this.style = this.headerStyle;
3148
- this.className = this.headerClass;
3149
- this.class = null;
3150
- super.init();
3151
- }
3152
-
3153
- render(context, instance, key) {
3154
- let { data } = instance;
3155
- return (
3156
- <tr key={key} className={data.classNames} style={data.style}>
3157
- {this.renderChildren(context, instance)}
3158
- </tr>
3159
- );
3160
- }
3161
- }
3162
-
3163
- GridColumnHeaderLine.prototype.isPureContainer = false;
3164
- GridColumnHeaderLine.prototype.styled = true;
3165
- GridColumnHeaderLine.prototype.showHeader = true;
3166
- GridColumnHeaderLine.autoInit = true;
3167
-
3168
- class GridColumnHeader extends Widget {
3169
- declareData() {
3170
- return super.declareData(...arguments, {
3171
- format: undefined,
3172
- width: undefined,
3173
- defaultWidth: undefined,
3174
- fixed: undefined,
3175
- });
3176
- }
3177
-
3178
- init() {
3179
- delete this.style;
3180
- delete this.className;
3181
- delete this.class;
3182
-
3183
- if (this.header) this.header1 = this.header;
3184
-
3185
- if (this.header1 || this.resizable || this.width || this.defaultWidth || this.sortable || this.draggable) {
3186
- if (!isObject(this.header1))
3187
- this.header1 = {
3188
- text: this.header1 || "",
3189
- };
3190
-
3191
- if (this.resizable) this.header1.resizable = this.resizable;
3192
-
3193
- if (this.width) this.header1.width = this.width;
3194
-
3195
- if (this.defaultWidth) this.header1.defaultWidth = this.defaultWidth;
3196
-
3197
- if (this.draggable) this.header1.draggable = this.draggable;
3198
- }
3199
-
3200
- if (this.header2 && isSelector(this.header2))
3201
- this.header2 = {
3202
- text: this.header2,
3203
- };
3204
-
3205
- if (this.header3 && isSelector(this.header3))
3206
- this.header3 = {
3207
- text: this.header3,
3208
- };
3209
-
3210
- if (!this.aggregateField && this.field) this.aggregateField = this.field;
3211
-
3212
- if (!this.aggregateAlias) this.aggregateAlias = this.aggregateField;
3213
- if (this.aggregateAlias) this.aggregateAliasGetter = Binding.get(this.aggregateAlias).value;
3214
-
3215
- if (this.footer && isSelector(this.footer))
3216
- this.footer = {
3217
- value: this.footer,
3218
- pad: this.pad,
3219
- colSpan: this.colSpan,
3220
- };
3221
-
3222
- if (this.footer) {
3223
- this.footer.value = getSelector(this.footer.value);
3224
- this.footer.class = getSelector(this.footer.class);
3225
- this.footer.style = getSelector(this.footer.style);
3226
- this.footer.format = getSelector(this.footer.format);
3227
- }
3228
-
3229
- if (this.caption && isSelector(this.caption))
3230
- this.caption = {
3231
- value: this.caption,
3232
- pad: this.pad,
3233
- format: this.format,
3234
- };
3235
-
3236
- if (this.caption) {
3237
- let children = this.caption.children || this.caption.items;
3238
- if (children) {
3239
- delete this.caption.items;
3240
- this.caption.children = Widget.create(children);
3241
- } else {
3242
- this.caption.value = getSelector(this.caption.value);
3243
- this.caption.format = getSelector(this.caption.format);
3244
- }
3245
- this.caption.class = getSelector(this.caption.class);
3246
- this.caption.style = getSelector(this.caption.style);
3247
- }
3248
-
3249
- super.init();
3250
- }
3251
-
3252
- initComponents() {
3253
- return super.initComponents({
3254
- header1: this.header1 && GridColumnHeaderCell.create(this.header1),
3255
- header2: this.header2 && GridColumnHeaderCell.create(this.header2),
3256
- header3: this.header3 && GridColumnHeaderCell.create(this.header3),
3257
- });
3258
- }
3259
-
3260
- render() {
3261
- return null;
3262
- }
3263
- }
3264
-
3265
- GridColumnHeader.autoInit = true;
3266
-
3267
- class GridColumnHeaderCell extends PureContainer {
3268
- declareData() {
3269
- return super.declareData(...arguments, {
3270
- text: undefined,
3271
- colSpan: undefined,
3272
- rowSpan: undefined,
3273
- width: undefined,
3274
- defaultWidth: undefined,
3275
- resizable: undefined,
3276
- fixed: undefined,
3277
- draggable: undefined,
3278
- });
3279
- }
3280
-
3281
- initComponents() {
3282
- return super.initComponents(...arguments, {
3283
- tool: this.tool && Widget.create(this.tool),
3284
- });
3285
- }
3286
-
3287
- render(context, instance, key) {
3288
- let { data } = instance;
3289
- return data.text || super.render(context, instance, key);
3290
- }
3291
- }
3292
-
3293
- GridColumnHeaderCell.prototype.colSpan = 1;
3294
- GridColumnHeaderCell.prototype.rowSpan = 1;
3295
- GridColumnHeaderCell.prototype.allowSorting = true;
3296
- GridColumnHeaderCell.prototype.styled = true;
3297
- GridColumnHeaderCell.prototype.fixed = false;
3298
-
3299
- // function initGrouping(grouping) {
3300
- // grouping.forEach((g) => {
3301
- // if (g.caption) g.caption = getSelector(g.caption);
3302
- // });
3303
- // }
3304
-
3305
- function copyCellSize(srcTableBody, dstTableBody, applyHeight = true) {
3306
- if (!srcTableBody || !dstTableBody) return false;
3307
-
3308
- let changed = false;
3309
- for (let r = 0; r < dstTableBody.children.length && r < srcTableBody.children.length; r++) {
3310
- let sr = srcTableBody.children[r];
3311
- let dr = dstTableBody.children[r];
3312
- for (let c = 0; c < dr.children.length && c < sr.children.length; c++) {
3313
- let dc = dr.children[c];
3314
- let ws = `${sr.children[c].offsetWidth}px`;
3315
- if (!changed && dc.style.width != ws) changed = true;
3316
- dc.style.width = dc.style.minWidth = dc.style.maxWidth = ws;
3317
- if (applyHeight) dc.style.height = `${sr.children[c].offsetHeight}px`;
3318
- }
3319
- }
3320
- return changed;
3321
- }
3322
-
3323
- function copyCellSizePrecise(srcTableBody, dstTableBody, applyHeight = true) {
3324
- if (!srcTableBody || !dstTableBody) return false;
3325
- let changed = false;
3326
- for (let r = 0; r < dstTableBody.children.length && r < srcTableBody.children.length; r++) {
3327
- let sr = srcTableBody.children[r];
3328
- let dr = dstTableBody.children[r];
3329
- for (let c = 0; c < dr.children.length && c < sr.children.length; c++) {
3330
- let dc = dr.children[c];
3331
- let bounds = sr.children[c].getBoundingClientRect();
3332
- let ws = `${bounds.width}px`;
3333
- if (!changed && dc.style.width != ws) changed = true;
3334
- dc.style.width = dc.style.minWidth = dc.style.maxWidth = ws;
3335
- if (applyHeight) dc.style.height = `${bounds.height}px`;
3336
- }
3337
- }
3338
- return changed;
3339
- }
3340
-
3341
- function syncHeaderHeights(header1, header2) {
3342
- /**
3343
- * In the first pass measure all row heights.
3344
- * In the second pass apply those heights.
3345
- * Use getBoundingClientRect() for sub-pixel accuracy.
3346
- */
3347
-
3348
- if (!header1 || !header2) return;
3349
- const rowCount = Math.max(header1.children.length, header2.children.length);
3350
- let rowHeight = [];
3351
- for (let r = 0; r < rowCount; r++) {
3352
- rowHeight.push(0);
3353
- let tr1 = header1.children[r];
3354
- let tr2 = header2.children[r];
3355
- if (tr1) {
3356
- for (let i = 0; i < tr1.children.length; i++) {
3357
- let td = tr1.children[i];
3358
- let h = td.getBoundingClientRect().height;
3359
- if (td.rowSpan == 1 && h > rowHeight[r]) {
3360
- rowHeight[r] = h;
3361
- break;
3362
- }
3363
- }
3364
- }
3365
- if (tr2) {
3366
- for (let i = 0; i < tr2.children.length; i++) {
3367
- let td = tr2.children[i];
3368
- let h = td.getBoundingClientRect().height;
3369
- if (td.rowSpan == 1 && h > rowHeight[r]) {
3370
- rowHeight[r] = h;
3371
- break;
3372
- }
3373
- }
3374
- }
3375
- }
3376
-
3377
- for (let r = 0; r < rowCount; r++) {
3378
- let tr1 = header1.children[r];
3379
- let tr2 = header2.children[r];
3380
- if (tr1) {
3381
- for (let i = 0; i < tr1.children.length; i++) {
3382
- let td = tr1.children[i];
3383
- let h = 0;
3384
- for (let x = 0; x < td.rowSpan; x++) h += rowHeight[r + x];
3385
- td.style.height = `${h}px`;
3386
- }
3387
- }
3388
- if (tr2) {
3389
- for (let i = 0; i < tr2.children.length; i++) {
3390
- let td = tr2.children[i];
3391
- let h = 0;
3392
- for (let x = 0; x < td.rowSpan; x++) h += rowHeight[r + x];
3393
- td.style.height = `${h}px`;
3394
- }
3395
- }
3396
- }
3397
- }
3398
-
3399
- class AvgHeight {
3400
- constructor() {
3401
- this.groups = {};
3402
- }
3403
-
3404
- add(group, height) {
3405
- let g = this.groups[group];
3406
- if (!g) g = this.groups[group] = { sum: 0, count: 0 };
3407
- g.sum += height;
3408
- g.count++;
3409
- }
3410
-
3411
- estimate(group) {
3412
- let g = this.groups[group];
3413
- if (!g || g.count == 0) return null;
3414
- return Math.round(g.sum / g.count);
3415
- }
3416
- }
3417
-
3418
- function getDragDropEvent(ev) {
3419
- return {
3420
- event: ev,
3421
- cursor: getCursorPos(ev),
3422
- dataTransfer: ev.dataTransfer,
3423
- source: {
3424
- width: 32,
3425
- height: 32,
3426
- margin: [],
3427
- },
3428
- };
3429
- }