@highcharts/grid-pro 2.2.0 → 2.3.0

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 (266) hide show
  1. package/LICENSE.txt +6 -0
  2. package/README.md +15 -9
  3. package/css/grid-pro.css +1262 -1122
  4. package/css/modules/grid-base-variables.css +131 -0
  5. package/css/modules/grid-button-variables.css +140 -0
  6. package/css/modules/grid-caption-variables.css +11 -0
  7. package/css/modules/grid-description-variables.css +11 -0
  8. package/css/modules/grid-input-variables.css +114 -0
  9. package/css/modules/grid-link-variables.css +18 -0
  10. package/css/modules/grid-menu-variables.css +50 -0
  11. package/css/modules/grid-pagination-variables.css +12 -0
  12. package/css/modules/grid-popup-variables.css +24 -0
  13. package/css/modules/grid-pro.css +234 -0
  14. package/css/modules/grid-table-variables.css +385 -0
  15. package/css/modules/grid-theme-default.css +55 -0
  16. package/es-modules/Accessibility/A11yI18n.js +1 -2
  17. package/es-modules/Accessibility/Accessibility.js +1 -2
  18. package/es-modules/Accessibility/AccessibilityComponent.d.ts +2 -2
  19. package/es-modules/Accessibility/Components/InfoRegionsComponent.js +5 -6
  20. package/es-modules/Accessibility/Components/LegendComponent.js +1 -2
  21. package/es-modules/Accessibility/Components/MenuComponent.js +1 -2
  22. package/es-modules/Accessibility/Components/NavigatorComponent.js +3 -4
  23. package/es-modules/Accessibility/Components/RangeSelectorComponent.js +1 -2
  24. package/es-modules/Accessibility/Components/SeriesComponent/ForcedMarkers.js +1 -2
  25. package/es-modules/Accessibility/Components/SeriesComponent/NewDataAnnouncer.js +3 -4
  26. package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +3 -4
  27. package/es-modules/Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js +1 -2
  28. package/es-modules/Accessibility/Components/ZoomComponent.js +1 -2
  29. package/es-modules/Accessibility/FocusBorder.js +1 -2
  30. package/es-modules/Accessibility/KeyboardNavigation.js +1 -2
  31. package/es-modules/Accessibility/KeyboardNavigationHandler.js +1 -2
  32. package/es-modules/Accessibility/Options/A11yDefaults.d.ts +11 -0
  33. package/es-modules/Accessibility/Options/A11yDefaults.js +11 -0
  34. package/es-modules/Accessibility/Options/DeprecatedOptions.d.ts +58 -0
  35. package/es-modules/Accessibility/Options/DeprecatedOptions.js +7 -2
  36. package/es-modules/Accessibility/Options/LangDefaults.js +9 -0
  37. package/es-modules/Accessibility/ProxyElement.js +2 -5
  38. package/es-modules/Accessibility/ProxyProvider.js +1 -2
  39. package/es-modules/Accessibility/Utils/Announcer.js +2 -3
  40. package/es-modules/Accessibility/Utils/ChartUtilities.js +1 -2
  41. package/es-modules/Accessibility/Utils/EventProvider.d.ts +2 -2
  42. package/es-modules/Accessibility/Utils/EventProvider.js +6 -2
  43. package/es-modules/Accessibility/Utils/HTMLUtilities.js +1 -2
  44. package/es-modules/Core/Animation/AnimationUtilities.js +1 -2
  45. package/es-modules/Core/Animation/Fx.js +1 -2
  46. package/es-modules/Core/Callback.d.ts +9 -2
  47. package/es-modules/Core/Chart/Chart.js +48 -41
  48. package/es-modules/Core/Chart/Chart3D.js +1 -2
  49. package/es-modules/Core/Chart/ChartDefaults.js +11 -0
  50. package/es-modules/Core/Chart/ChartOptions.d.ts +8 -0
  51. package/es-modules/Core/Chart/GanttChart.js +1 -2
  52. package/es-modules/Core/Chart/MapChart.js +1 -2
  53. package/es-modules/Core/Chart/StockChart.js +2 -3
  54. package/es-modules/Core/Color/Color.js +1 -2
  55. package/es-modules/Core/Defaults.js +36 -9
  56. package/es-modules/Core/Delaunay.d.ts +52 -0
  57. package/es-modules/Core/Delaunay.js +310 -0
  58. package/es-modules/Core/Foundation.js +1 -2
  59. package/es-modules/Core/Geometry/CircleUtilities.js +1 -2
  60. package/es-modules/Core/Globals.js +1 -1
  61. package/es-modules/Core/HttpUtilities.js +1 -2
  62. package/es-modules/Core/MSPointer.js +1 -2
  63. package/es-modules/Core/Math3D.js +1 -2
  64. package/es-modules/Core/Options.d.ts +6 -2
  65. package/es-modules/Core/Pointer.js +23 -4
  66. package/es-modules/Core/PointerEvent.d.ts +2 -0
  67. package/es-modules/Core/Renderer/HTML/AST.js +2 -2
  68. package/es-modules/Core/Renderer/HTML/HTMLElement.js +1 -2
  69. package/es-modules/Core/Renderer/RendererUtilities.js +34 -19
  70. package/es-modules/Core/Responsive.d.ts +4 -2
  71. package/es-modules/Core/Responsive.js +10 -4
  72. package/es-modules/Core/Templating.d.ts +1 -1
  73. package/es-modules/Core/Templating.js +3 -4
  74. package/es-modules/Core/Time.d.ts +8 -0
  75. package/es-modules/Core/Time.js +2 -2
  76. package/es-modules/Core/Tooltip.d.ts +4 -8
  77. package/es-modules/Core/Tooltip.js +100 -81
  78. package/es-modules/Core/TooltipOptions.d.ts +44 -1
  79. package/es-modules/Core/Utilities.d.ts +25 -665
  80. package/es-modules/Core/Utilities.js +17 -1398
  81. package/es-modules/Data/ColumnUtils.d.ts +83 -80
  82. package/es-modules/Data/ColumnUtils.js +103 -113
  83. package/es-modules/Data/Connectors/CSVConnector.d.ts +9 -14
  84. package/es-modules/Data/Connectors/CSVConnector.js +3 -4
  85. package/es-modules/Data/Connectors/DataConnector.d.ts +52 -54
  86. package/es-modules/Data/Connectors/DataConnector.js +33 -52
  87. package/es-modules/Data/Connectors/GoogleSheetsConnector.d.ts +40 -42
  88. package/es-modules/Data/Connectors/GoogleSheetsConnector.js +73 -88
  89. package/es-modules/Data/Connectors/GoogleSheetsConnectorOptions.d.ts +4 -2
  90. package/es-modules/Data/Connectors/HTMLTableConnector.d.ts +23 -28
  91. package/es-modules/Data/Connectors/HTMLTableConnector.js +3 -4
  92. package/es-modules/Data/Connectors/JSONConnector.d.ts +9 -14
  93. package/es-modules/Data/Connectors/JSONConnector.js +3 -4
  94. package/es-modules/Data/Converters/CSVConverter.d.ts +5 -5
  95. package/es-modules/Data/Converters/CSVConverter.js +3 -4
  96. package/es-modules/Data/Converters/CSVConverterOptions.d.ts +2 -2
  97. package/es-modules/Data/Converters/DataConverter.d.ts +76 -78
  98. package/es-modules/Data/Converters/DataConverter.js +26 -53
  99. package/es-modules/Data/Converters/DataConverterUtils.d.ts +88 -81
  100. package/es-modules/Data/Converters/DataConverterUtils.js +169 -181
  101. package/es-modules/Data/Converters/GoogleSheetsConverter.d.ts +4 -4
  102. package/es-modules/Data/Converters/GoogleSheetsConverter.js +3 -3
  103. package/es-modules/Data/Converters/GoogleSheetsConverterOptions.d.ts +2 -2
  104. package/es-modules/Data/Converters/HTMLTableConverter.d.ts +4 -4
  105. package/es-modules/Data/Converters/HTMLTableConverter.js +2 -3
  106. package/es-modules/Data/Converters/HTMLTableConverterOptions.d.ts +2 -2
  107. package/es-modules/Data/Converters/JSONConverter.d.ts +7 -7
  108. package/es-modules/Data/Converters/JSONConverter.js +6 -6
  109. package/es-modules/Data/Converters/JSONConverterOptions.d.ts +2 -2
  110. package/es-modules/Data/DataCursor.d.ts +65 -70
  111. package/es-modules/Data/DataCursor.js +119 -139
  112. package/es-modules/Data/DataEvent.d.ts +55 -57
  113. package/es-modules/Data/DataPool.d.ts +10 -17
  114. package/es-modules/Data/DataPool.js +20 -9
  115. package/es-modules/Data/DataTable.d.ts +111 -113
  116. package/es-modules/Data/DataTable.js +3 -3
  117. package/es-modules/Data/DataTableCore.d.ts +9 -9
  118. package/es-modules/Data/DataTableCore.js +2 -2
  119. package/es-modules/Data/Formula/FormulaParser.js +1 -2
  120. package/es-modules/Data/Formula/FormulaProcessor.js +1 -2
  121. package/es-modules/Data/Modifiers/ChainModifier.d.ts +29 -34
  122. package/es-modules/Data/Modifiers/ChainModifier.js +7 -8
  123. package/es-modules/Data/Modifiers/DataModifier.d.ts +36 -41
  124. package/es-modules/Data/Modifiers/DataModifier.js +31 -53
  125. package/es-modules/Data/Modifiers/FilterModifier.d.ts +4 -4
  126. package/es-modules/Data/Modifiers/FilterModifier.js +3 -4
  127. package/es-modules/Data/Modifiers/FilterModifierOptions.d.ts +3 -2
  128. package/es-modules/Data/Modifiers/InvertModifier.d.ts +4 -4
  129. package/es-modules/Data/Modifiers/InvertModifier.js +3 -4
  130. package/es-modules/Data/Modifiers/MathModifier.d.ts +5 -4
  131. package/es-modules/Data/Modifiers/RangeModifier.d.ts +4 -4
  132. package/es-modules/Data/Modifiers/RangeModifier.js +3 -4
  133. package/es-modules/Data/Modifiers/SortModifier.d.ts +6 -11
  134. package/es-modules/Data/Modifiers/SortModifier.js +3 -4
  135. package/es-modules/Data/Modifiers/SortModifierOptions.d.ts +3 -3
  136. package/es-modules/Grid/Core/Accessibility/Accessibility.d.ts +1 -1
  137. package/es-modules/Grid/Core/Accessibility/Accessibility.js +5 -6
  138. package/es-modules/Grid/Core/Data/DataProvider.d.ts +97 -0
  139. package/es-modules/Grid/Core/Data/DataProvider.js +89 -0
  140. package/es-modules/Grid/Core/Data/DataProviderRegistry.d.ts +20 -0
  141. package/es-modules/Grid/Core/Data/DataProviderRegistry.js +52 -0
  142. package/es-modules/Grid/Core/Data/DataProviderType.d.ts +19 -0
  143. package/es-modules/Grid/Core/Data/DataProviderType.js +15 -0
  144. package/es-modules/Grid/Core/Data/LocalDataProvider.d.ts +165 -0
  145. package/es-modules/Grid/Core/Data/LocalDataProvider.js +341 -0
  146. package/es-modules/Grid/Core/Defaults.js +4 -2
  147. package/es-modules/Grid/Core/Globals.d.ts +20 -16
  148. package/es-modules/Grid/Core/Globals.js +10 -8
  149. package/es-modules/Grid/Core/Grid.d.ts +31 -22
  150. package/es-modules/Grid/Core/Grid.js +214 -136
  151. package/es-modules/Grid/Core/GridUtils.d.ts +33 -0
  152. package/es-modules/Grid/Core/GridUtils.js +50 -3
  153. package/es-modules/Grid/Core/Options.d.ts +145 -4
  154. package/es-modules/Grid/Core/Pagination/Pagination.d.ts +3 -0
  155. package/es-modules/Grid/Core/Pagination/Pagination.js +63 -23
  156. package/es-modules/Grid/Core/Pagination/PaginationOptions.d.ts +4 -0
  157. package/es-modules/Grid/Core/Querying/FilteringController.js +1 -2
  158. package/es-modules/Grid/Core/Querying/PaginationController.d.ts +2 -2
  159. package/es-modules/Grid/Core/Querying/PaginationController.js +3 -3
  160. package/es-modules/Grid/Core/Querying/QueryingController.d.ts +1 -1
  161. package/es-modules/Grid/Core/Querying/QueryingController.js +2 -26
  162. package/es-modules/Grid/Core/Responsive/ResponsiveComposition.d.ts +53 -0
  163. package/es-modules/Grid/Core/Responsive/ResponsiveComposition.js +229 -0
  164. package/es-modules/Grid/Core/Responsive/ResponsiveOptions.d.ts +58 -0
  165. package/es-modules/Grid/Core/Responsive/ResponsiveOptions.js +15 -0
  166. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/ColumnFiltering.js +2 -3
  167. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilterCell.d.ts +1 -1
  168. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilterCell.js +3 -4
  169. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilterRow.d.ts +1 -1
  170. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilterRow.js +2 -2
  171. package/es-modules/Grid/Core/Table/Actions/ColumnSorting.d.ts +17 -1
  172. package/es-modules/Grid/Core/Table/Actions/ColumnSorting.js +58 -15
  173. package/es-modules/Grid/Core/Table/Actions/ColumnsResizer.js +1 -3
  174. package/es-modules/Grid/Core/Table/Actions/RowsVirtualizer.d.ts +57 -3
  175. package/es-modules/Grid/Core/Table/Actions/RowsVirtualizer.js +397 -118
  176. package/es-modules/Grid/Core/Table/Body/CellContextMenu.d.ts +11 -0
  177. package/es-modules/Grid/Core/Table/Body/CellContextMenu.js +84 -0
  178. package/es-modules/Grid/Core/Table/Body/TableCell.d.ts +27 -13
  179. package/es-modules/Grid/Core/Table/Body/TableCell.js +74 -25
  180. package/es-modules/Grid/Core/Table/Body/TableRow.d.ts +7 -15
  181. package/es-modules/Grid/Core/Table/Body/TableRow.js +24 -19
  182. package/es-modules/Grid/Core/Table/Cell.d.ts +16 -3
  183. package/es-modules/Grid/Core/Table/Cell.js +36 -3
  184. package/es-modules/Grid/Core/Table/CellContent/TextContent.js +3 -8
  185. package/es-modules/Grid/Core/Table/Column.d.ts +10 -4
  186. package/es-modules/Grid/Core/Table/Column.js +23 -34
  187. package/es-modules/Grid/Core/Table/ColumnResizing/IndependentResizingMode.js +9 -8
  188. package/es-modules/Grid/Core/Table/ColumnResizing/ResizingMode.js +4 -3
  189. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ColumnToolbar.d.ts +5 -0
  190. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ColumnToolbar.js +7 -2
  191. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/FilterPopup.js +1 -2
  192. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/MenuButtons/FilterMenuButton.js +1 -2
  193. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/MenuButtons/SortMenuButton.js +2 -3
  194. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/FilterToolbarButton.js +1 -2
  195. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/MenuToolbarButton.js +1 -2
  196. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/SortToolbarButton.d.ts +0 -1
  197. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/SortToolbarButton.js +4 -14
  198. package/es-modules/Grid/Core/Table/Header/HeaderCell.d.ts +6 -1
  199. package/es-modules/Grid/Core/Table/Header/HeaderCell.js +33 -13
  200. package/es-modules/Grid/Core/Table/Header/HeaderRow.js +4 -5
  201. package/es-modules/Grid/Core/Table/Header/TableHeader.d.ts +1 -1
  202. package/es-modules/Grid/Core/Table/Header/TableHeader.js +3 -3
  203. package/es-modules/Grid/Core/Table/Row.d.ts +1 -1
  204. package/es-modules/Grid/Core/Table/Row.js +2 -2
  205. package/es-modules/Grid/Core/Table/Table.d.ts +38 -12
  206. package/es-modules/Grid/Core/Table/Table.js +184 -91
  207. package/es-modules/Grid/Core/UI/ContextMenuButton.d.ts +6 -7
  208. package/es-modules/Grid/Core/UI/ContextMenuButton.js +5 -3
  209. package/es-modules/Grid/Core/UI/Popup.js +7 -9
  210. package/es-modules/Grid/Core/UI/SvgIcons.d.ts +42 -7
  211. package/es-modules/Grid/Core/UI/SvgIcons.js +206 -33
  212. package/es-modules/Grid/Core/UI/Toolbar.d.ts +5 -0
  213. package/es-modules/Grid/Core/UI/ToolbarButton.d.ts +4 -12
  214. package/es-modules/Grid/Core/UI/ToolbarButton.js +8 -26
  215. package/es-modules/Grid/Pro/CellEditing/CellEditMode.d.ts +2 -2
  216. package/es-modules/Grid/Pro/CellEditing/CellEditing.js +10 -10
  217. package/es-modules/Grid/Pro/CellEditing/CellEditingComposition.js +1 -2
  218. package/es-modules/Grid/Pro/CellRendering/CellRenderersComposition.d.ts +1 -1
  219. package/es-modules/Grid/Pro/CellRendering/CellRenderersComposition.js +4 -2
  220. package/es-modules/Grid/Pro/CellRendering/ContentTypes/CheckboxContent.d.ts +2 -2
  221. package/es-modules/Grid/Pro/CellRendering/ContentTypes/NumberInputContent.js +1 -2
  222. package/es-modules/Grid/Pro/CellRendering/ContentTypes/SelectContent.d.ts +2 -2
  223. package/es-modules/Grid/Pro/CellRendering/ContentTypes/SparklineContent.js +1 -2
  224. package/es-modules/Grid/Pro/CellRendering/ContentTypes/TextInputContent.d.ts +2 -2
  225. package/es-modules/Grid/Pro/CellRendering/ContentTypes/TextInputContent.js +1 -2
  226. package/es-modules/Grid/Pro/CellRendering/Renderers/CheckboxRenderer.js +1 -2
  227. package/es-modules/Grid/Pro/CellRendering/Renderers/DateInputRenderer.js +1 -2
  228. package/es-modules/Grid/Pro/CellRendering/Renderers/DateTimeInputRenderer.js +1 -2
  229. package/es-modules/Grid/Pro/CellRendering/Renderers/NumberInputRenderer.js +1 -2
  230. package/es-modules/Grid/Pro/CellRendering/Renderers/SelectRenderer.js +1 -2
  231. package/es-modules/Grid/Pro/CellRendering/Renderers/SparklineRenderer.d.ts +2 -2
  232. package/es-modules/Grid/Pro/CellRendering/Renderers/SparklineRenderer.js +1 -2
  233. package/es-modules/Grid/Pro/CellRendering/Renderers/TextInputRenderer.js +1 -2
  234. package/es-modules/Grid/Pro/CellRendering/Renderers/TextRenderer.js +1 -2
  235. package/es-modules/Grid/Pro/CellRendering/Renderers/TimeInputRenderer.js +1 -2
  236. package/es-modules/Grid/Pro/ColumnTypes/Validator.js +34 -32
  237. package/es-modules/Grid/Pro/ColumnTypes/ValidatorComposition.d.ts +1 -1
  238. package/es-modules/Grid/Pro/ColumnTypes/ValidatorComposition.js +3 -4
  239. package/es-modules/Grid/Pro/Credits/CreditsProComposition.js +1 -3
  240. package/es-modules/Grid/Pro/Data/DataSourceHelper.d.ts +74 -0
  241. package/es-modules/Grid/Pro/Data/DataSourceHelper.js +246 -0
  242. package/es-modules/Grid/Pro/Data/QuerySerializer.d.ts +46 -0
  243. package/es-modules/Grid/Pro/Data/QuerySerializer.js +169 -0
  244. package/es-modules/Grid/Pro/Data/RemoteDataProvider.d.ts +187 -0
  245. package/es-modules/Grid/Pro/Data/RemoteDataProvider.js +500 -0
  246. package/es-modules/Grid/Pro/Export/Exporting.js +1 -2
  247. package/es-modules/Grid/Pro/Export/ExportingComposition.js +1 -2
  248. package/es-modules/Grid/Pro/GridEvents.js +1 -2
  249. package/es-modules/Grid/Pro/Pagination/PaginationComposition.d.ts +0 -1
  250. package/es-modules/Grid/Pro/Pagination/PaginationComposition.js +1 -2
  251. package/es-modules/Shared/BaseForm.js +1 -2
  252. package/es-modules/Shared/DownloadURL.js +1 -2
  253. package/es-modules/Shared/TimeBase.js +3 -3
  254. package/es-modules/Shared/Types.d.ts +7 -0
  255. package/es-modules/Shared/Utilities.d.ts +576 -0
  256. package/es-modules/Shared/Utilities.js +1368 -0
  257. package/es-modules/masters/grid-pro.src.d.ts +15 -11
  258. package/es-modules/masters/grid-pro.src.js +12 -5
  259. package/grid-pro.d.ts +15 -11
  260. package/grid-pro.js +3 -3
  261. package/grid-pro.js.map +1 -1
  262. package/grid-pro.src.d.ts +15 -11
  263. package/grid-pro.src.js +10408 -8009
  264. package/package.json +1 -1
  265. package/es-modules/Grid/Core/Pagination/Icons.d.ts +0 -7
  266. package/es-modules/Grid/Core/Pagination/Icons.js +0 -7
@@ -0,0 +1,11 @@
1
+ import type TableCell from './TableCell';
2
+ import ContextMenu from '../../UI/ContextMenu.js';
3
+ declare class CellContextMenu extends ContextMenu {
4
+ cell?: TableCell;
5
+ private cursorAnchorElement?;
6
+ private removeCellOutdateListener?;
7
+ showAt(cell: TableCell, clientX: number, clientY: number): void;
8
+ hide(): void;
9
+ protected renderContent(): void;
10
+ }
11
+ export default CellContextMenu;
@@ -0,0 +1,84 @@
1
+ /* *
2
+ *
3
+ * Grid Cell Context Menu
4
+ *
5
+ * (c) 2020-2026 Highsoft AS
6
+ *
7
+ * A commercial license may be required depending on use.
8
+ * See www.highcharts.com/license
9
+ *
10
+ * Authors:
11
+ * - Mikkel Espolin Birkeland
12
+ *
13
+ * */
14
+ 'use strict';
15
+ import ContextMenu from '../../UI/ContextMenu.js';
16
+ import ContextMenuButton from '../../UI/ContextMenuButton.js';
17
+ import { addEvent } from '../../../../Shared/Utilities.js';
18
+ /* *
19
+ *
20
+ * Class
21
+ *
22
+ * */
23
+ class CellContextMenu extends ContextMenu {
24
+ showAt(cell, clientX, clientY) {
25
+ const wrapper = this.grid.contentWrapper;
26
+ if (!wrapper) {
27
+ return;
28
+ }
29
+ this.cell = cell;
30
+ this.removeCellOutdateListener?.();
31
+ this.removeCellOutdateListener = addEvent(cell, 'outdate', () => {
32
+ this.hide();
33
+ delete this.cell;
34
+ });
35
+ const rect = wrapper.getBoundingClientRect();
36
+ this.cursorAnchorElement = document.createElement('div');
37
+ this.cursorAnchorElement.style.position = 'absolute';
38
+ this.cursorAnchorElement.style.left = (clientX - rect.left) + 'px';
39
+ this.cursorAnchorElement.style.top = (clientY - rect.top) + 'px';
40
+ this.cursorAnchorElement.style.width = '0px';
41
+ this.cursorAnchorElement.style.height = '0px';
42
+ this.cursorAnchorElement.style.pointerEvents = 'none';
43
+ wrapper.appendChild(this.cursorAnchorElement);
44
+ super.show(this.cursorAnchorElement);
45
+ }
46
+ hide() {
47
+ super.hide();
48
+ this.cursorAnchorElement?.remove();
49
+ this.removeCellOutdateListener?.();
50
+ delete this.cursorAnchorElement;
51
+ delete this.removeCellOutdateListener;
52
+ }
53
+ renderContent() {
54
+ const { cell } = this;
55
+ if (!cell) {
56
+ return;
57
+ }
58
+ const items = cell.column?.options.cells?.contextMenu?.items || [];
59
+ for (const item of items) {
60
+ if (item.separator) {
61
+ this.addDivider();
62
+ continue;
63
+ }
64
+ const btn = new ContextMenuButton({
65
+ label: item.label,
66
+ icon: item.icon,
67
+ onClick: () => {
68
+ if (item.disabled) {
69
+ return;
70
+ }
71
+ item.onClick?.call(cell, cell);
72
+ this.hide();
73
+ }
74
+ }).add(this);
75
+ if (btn && item.disabled) {
76
+ // Minimal disable support for v1. We don't currently have a
77
+ // dedicated ContextMenuButton API for disabled state.
78
+ // This keeps behavior consistent without introducing new CSS.
79
+ btn.wrapper?.querySelector('button')?.setAttribute('disabled', '');
80
+ }
81
+ }
82
+ }
83
+ }
84
+ export default CellContextMenu;
@@ -1,4 +1,4 @@
1
- import type DataTable from '../../../../Data/DataTable';
1
+ import type { CellType as DataTableCellType } from '../../../../Data/DataTable';
2
2
  import type Column from '../Column';
3
3
  import type TableRow from './TableRow';
4
4
  import Cell from '../Cell.js';
@@ -19,6 +19,16 @@ declare class TableCell extends Cell {
19
19
  * The cell's content.
20
20
  */
21
21
  content?: CellContent;
22
+ /**
23
+ * A token used to prevent stale async responses from overwriting cell
24
+ * data. In virtualized grids, cells are reused as rows scroll in/out of
25
+ * view. If a cell starts an async value fetch for row A, then gets reused
26
+ * for row B before the fetch completes, the stale response for row A
27
+ * could incorrectly overwrite row B's data. This token is incremented
28
+ * before each async fetch, and checked when the fetch completes - if the
29
+ * token has changed, the response is discarded as stale.
30
+ */
31
+ private asyncFetchToken;
22
32
  /**
23
33
  * Constructs a cell in the data grid.
24
34
  *
@@ -32,15 +42,15 @@ declare class TableCell extends Cell {
32
42
  /**
33
43
  * Renders the cell by appending it to the row and setting its value.
34
44
  */
35
- render(): void;
45
+ render(): Promise<void>;
36
46
  /**
37
- * Edits the cell value and updates the data table. Call this instead of
47
+ * Edits the cell value and updates the dataset. Call this instead of
38
48
  * `setValue` when you want it to trigger the cell value user change event.
39
49
  *
40
50
  * @param value
41
51
  * The new value to set.
42
52
  */
43
- editValue(value: DataTable.CellType): Promise<void>;
53
+ editValue(value: DataTableCellType): Promise<void>;
44
54
  /**
45
55
  * Sets the cell value and updates its content with it.
46
56
  *
@@ -48,21 +58,25 @@ declare class TableCell extends Cell {
48
58
  * The raw value to set. If not provided, it will use the value from the
49
59
  * data table for the current row and column.
50
60
  *
51
- * @param updateTable
52
- * Whether to update the table after setting the content. Defaults to
53
- * `false`, meaning the table will not be updated.
61
+ * @param updateDataset
62
+ * Whether to update the dataset after setting the content. Defaults to
63
+ * `false`, meaning the dataset will not be updated.
64
+ */
65
+ setValue(value?: DataTableCellType, updateDataset?: boolean): Promise<void>;
66
+ /**
67
+ * Returns merged styles from defaults and current column options.
54
68
  */
55
- setValue(value?: DataTable.CellType, updateTable?: boolean): Promise<void>;
69
+ private getCellStyles;
56
70
  /**
57
- * Updates the the data table so that it reflects the current state of
58
- * the grid.
71
+ * Updates the the dataset so that it reflects the current state of the
72
+ * grid.
59
73
  *
60
74
  * @returns
61
75
  * A promise that resolves to `true` if the cell triggered all the whole
62
- * viewport rows to be updated, or `false` if the only change should be
63
- * the cell's content.
76
+ * viewport rows to be updated, or `false` if the only change was the cell's
77
+ * content.
64
78
  */
65
- private updateDataTable;
79
+ private updateDataset;
66
80
  /**
67
81
  * Initialize event listeners for table body cells.
68
82
  *
@@ -16,8 +16,8 @@
16
16
  'use strict';
17
17
  import Globals from '../../Globals.js';
18
18
  import Cell from '../Cell.js';
19
- import Utils from '../../../../Core/Utilities.js';
20
- const { fireEvent } = Utils;
19
+ import { defined, fireEvent } from '../../../../Shared/Utilities.js';
20
+ import { mergeStyleValues } from '../../GridUtils.js';
21
21
  /* *
22
22
  *
23
23
  * Class
@@ -43,6 +43,16 @@ class TableCell extends Cell {
43
43
  */
44
44
  constructor(row, column) {
45
45
  super(row, column);
46
+ /**
47
+ * A token used to prevent stale async responses from overwriting cell
48
+ * data. In virtualized grids, cells are reused as rows scroll in/out of
49
+ * view. If a cell starts an async value fetch for row A, then gets reused
50
+ * for row B before the fetch completes, the stale response for row A
51
+ * could incorrectly overwrite row B's data. This token is incremented
52
+ * before each async fetch, and checked when the fetch completes - if the
53
+ * token has changed, the response is discarded as stale.
54
+ */
55
+ this.asyncFetchToken = 0;
46
56
  this.column = column;
47
57
  this.row = row;
48
58
  this.column.registerCell(this);
@@ -55,12 +65,12 @@ class TableCell extends Cell {
55
65
  /**
56
66
  * Renders the cell by appending it to the row and setting its value.
57
67
  */
58
- render() {
59
- super.render();
60
- void this.setValue();
68
+ async render() {
69
+ await super.render();
70
+ await this.setValue();
61
71
  }
62
72
  /**
63
- * Edits the cell value and updates the data table. Call this instead of
73
+ * Edits the cell value and updates the dataset. Call this instead of
64
74
  * `setValue` when you want it to trigger the cell value user change event.
65
75
  *
66
76
  * @param value
@@ -81,14 +91,40 @@ class TableCell extends Cell {
81
91
  * The raw value to set. If not provided, it will use the value from the
82
92
  * data table for the current row and column.
83
93
  *
84
- * @param updateTable
85
- * Whether to update the table after setting the content. Defaults to
86
- * `false`, meaning the table will not be updated.
94
+ * @param updateDataset
95
+ * Whether to update the dataset after setting the content. Defaults to
96
+ * `false`, meaning the dataset will not be updated.
87
97
  */
88
- async setValue(value = this.column.data?.[this.row.index], updateTable = false) {
98
+ async setValue(value, updateDataset = false) {
99
+ const fetchToken = ++this.asyncFetchToken;
100
+ const { grid } = this.column.viewport;
101
+ // TODO(design): Design a better way to show the cell val being updated.
102
+ this.htmlElement.style.opacity = '0.5';
103
+ if (!defined(value)) {
104
+ value = await grid.dataProvider?.getValue(this.column.id, this.row.index);
105
+ // Discard stale response if cell was reused for a different row
106
+ if (fetchToken !== this.asyncFetchToken) {
107
+ this.htmlElement.style.opacity = '';
108
+ return;
109
+ }
110
+ }
111
+ const oldValue = this.value;
89
112
  this.value = value;
90
- if (updateTable && await this.updateDataTable()) {
91
- return;
113
+ if (updateDataset) {
114
+ try {
115
+ grid.showLoading();
116
+ if (await this.updateDataset()) {
117
+ return;
118
+ }
119
+ }
120
+ catch (err) {
121
+ // eslint-disable-next-line no-console
122
+ console.error(err);
123
+ this.value = oldValue;
124
+ }
125
+ finally {
126
+ grid.hideLoading();
127
+ }
92
128
  }
93
129
  if (this.content) {
94
130
  this.content.update();
@@ -101,33 +137,46 @@ class TableCell extends Cell {
101
137
  this.htmlElement.classList[this.column.dataType === 'number' ? 'add' : 'remove'](Globals.getClassName('rightAlign'));
102
138
  // Add custom class name from column options
103
139
  this.setCustomClassName(this.column.options.cells?.className);
140
+ this.setCustomStyles(this.getCellStyles());
141
+ // TODO(design): Remove this after the first part was implemented.
142
+ this.htmlElement.style.opacity = '';
104
143
  fireEvent(this, 'afterRender', { target: this });
105
144
  }
106
145
  /**
107
- * Updates the the data table so that it reflects the current state of
108
- * the grid.
146
+ * Returns merged styles from defaults and current column options.
147
+ */
148
+ getCellStyles() {
149
+ const { grid } = this.column.viewport;
150
+ const rawColumnOptions = grid.columnOptionsMap?.[this.column.id]?.options;
151
+ return {
152
+ ...mergeStyleValues(this.column, grid.options?.columnDefaults?.style, rawColumnOptions?.style),
153
+ ...mergeStyleValues(this, grid.options?.columnDefaults?.cells?.style, rawColumnOptions?.cells?.style)
154
+ };
155
+ }
156
+ /**
157
+ * Updates the the dataset so that it reflects the current state of the
158
+ * grid.
109
159
  *
110
160
  * @returns
111
161
  * A promise that resolves to `true` if the cell triggered all the whole
112
- * viewport rows to be updated, or `false` if the only change should be
113
- * the cell's content.
162
+ * viewport rows to be updated, or `false` if the only change was the cell's
163
+ * content.
114
164
  */
115
- async updateDataTable() {
116
- if (this.column.data?.[this.row.index] === this.value) {
165
+ async updateDataset() {
166
+ const oldValue = await this.column.viewport.grid.dataProvider?.getValue(this.column.id, this.row.index);
167
+ if (oldValue === this.value) {
117
168
  // Abort if the value is the same as in the data table.
118
169
  return false;
119
170
  }
120
171
  const vp = this.column.viewport;
121
- const { dataTable: originalDataTable } = vp.grid;
122
- const rowTableIndex = this.row.id &&
123
- originalDataTable?.getLocalRowIndex(this.row.id);
124
- if (!originalDataTable || rowTableIndex === void 0) {
172
+ const { dataProvider: dp } = vp.grid;
173
+ const rowId = this.row.id;
174
+ if (!dp || rowId === void 0) {
125
175
  return false;
126
176
  }
127
177
  this.row.data[this.column.id] = this.value;
128
- originalDataTable.setCell(this.column.id, rowTableIndex, this.value);
129
- // If no modifiers, don't update all rows
130
- if (vp.grid.dataTable === vp.grid.presentationTable) {
178
+ await dp.setValue(this.value, this.column.id, rowId);
179
+ if (vp.grid.querying.willNotModify()) {
131
180
  return false;
132
181
  }
133
182
  await vp.updateRows();
@@ -1,6 +1,7 @@
1
1
  import type Cell from '../Cell';
2
2
  import type Column from '../Column';
3
- import type DataTable from '../../../../Data/DataTable';
3
+ import type { RowObject as DataTableRowObject } from '../../../../Data/DataTable';
4
+ import type { RowId } from '../../Data/DataProvider';
4
5
  import Row from '../Row.js';
5
6
  import Table from '../Table.js';
6
7
  /**
@@ -10,15 +11,15 @@ declare class TableRow extends Row {
10
11
  /**
11
12
  * The row values from the data table in the original column order.
12
13
  */
13
- data: DataTable.RowObject;
14
+ data: DataTableRowObject;
14
15
  /**
15
16
  * The local index of the row in the presentation data table.
16
17
  */
17
18
  index: number;
18
19
  /**
19
- * The index of the row in the original data table (ID).
20
+ * The unique ID of the row.
20
21
  */
21
- id?: number;
22
+ id?: RowId;
22
23
  /**
23
24
  * The vertical translation of the row.
24
25
  */
@@ -33,6 +34,7 @@ declare class TableRow extends Row {
33
34
  * The index of the row in the data table.
34
35
  */
35
36
  constructor(viewport: Table, index: number);
37
+ init(): Promise<void>;
36
38
  createCell(column: Column): Cell;
37
39
  /**
38
40
  * Loads the row data from the data table.
@@ -42,17 +44,7 @@ declare class TableRow extends Row {
42
44
  * Updates the row data and its cells with the latest values from the data
43
45
  * table.
44
46
  */
45
- update(): void;
46
- /**
47
- * Reuses the row instance for a new index.
48
- *
49
- * @param index
50
- * The index of the row in the data table.
51
- *
52
- * @param doReflow
53
- * Whether to reflow the row after updating the cells.
54
- */
55
- reuse(index: number, doReflow?: boolean): void;
47
+ update(): Promise<void>;
56
48
  /**
57
49
  * Adds or removes the hovered CSS class to the row element.
58
50
  *
@@ -17,6 +17,7 @@
17
17
  import Row from '../Row.js';
18
18
  import TableCell from './TableCell.js';
19
19
  import Globals from '../../Globals.js';
20
+ import { fireEvent } from '../../../../Shared/Utilities.js';
20
21
  /* *
21
22
  *
22
23
  * Class
@@ -56,24 +57,28 @@ class TableRow extends Row {
56
57
  */
57
58
  this.translateY = 0;
58
59
  this.index = index;
59
- this.id = viewport.dataTable.getOriginalRowIndex(index);
60
- this.loadData();
61
- this.setRowAttributes();
62
60
  }
63
61
  /* *
64
62
  *
65
63
  * Methods
66
64
  *
67
65
  * */
66
+ async init() {
67
+ const dp = this.viewport.grid.dataProvider;
68
+ this.id = await dp?.getRowId(this.index);
69
+ await this.loadData();
70
+ this.setRowAttributes();
71
+ }
68
72
  createCell(column) {
69
73
  return new TableCell(this, column);
70
74
  }
71
75
  /**
72
76
  * Loads the row data from the data table.
73
77
  */
74
- loadData() {
75
- const data = this.viewport.dataTable.getRowObject(this.index);
78
+ async loadData() {
79
+ const data = await this.viewport.grid.dataProvider?.getRowObject(this.index);
76
80
  if (!data) {
81
+ this.data = {};
77
82
  return;
78
83
  }
79
84
  this.data = data;
@@ -82,13 +87,13 @@ class TableRow extends Row {
82
87
  * Updates the row data and its cells with the latest values from the data
83
88
  * table.
84
89
  */
85
- update() {
86
- this.id = this.viewport.dataTable.getOriginalRowIndex(this.index);
90
+ async update() {
91
+ this.id = await this.viewport.grid.dataProvider?.getRowId(this.index);
87
92
  this.updateRowAttributes();
88
- this.loadData();
93
+ await this.loadData();
89
94
  for (let i = 0, iEnd = this.cells.length; i < iEnd; ++i) {
90
95
  const cell = this.cells[i];
91
- void cell.setValue();
96
+ await cell.setValue();
92
97
  }
93
98
  this.reflow();
94
99
  }
@@ -98,28 +103,28 @@ class TableRow extends Row {
98
103
  * @param index
99
104
  * The index of the row in the data table.
100
105
  *
101
- * @param doReflow
102
- * Whether to reflow the row after updating the cells.
106
+ * @internal
103
107
  */
104
- reuse(index, doReflow = true) {
108
+ async reuse(index) {
109
+ for (let i = 0, iEnd = this.cells.length; i < iEnd; ++i) {
110
+ fireEvent(this.cells[i], 'outdate');
111
+ }
105
112
  if (this.index === index) {
106
- this.update();
113
+ await this.update();
107
114
  return;
108
115
  }
109
116
  this.index = index;
110
- this.id = this.viewport.dataTable.getOriginalRowIndex(index);
117
+ this.id = await this.viewport.grid.dataProvider?.getRowId(this.index);
111
118
  this.htmlElement.setAttribute('data-row-index', index);
112
119
  this.updateRowAttributes();
113
120
  this.updateParityClass();
114
121
  this.updateStateClasses();
115
- this.loadData();
122
+ await this.loadData();
116
123
  for (let i = 0, iEnd = this.cells.length; i < iEnd; ++i) {
117
124
  const cell = this.cells[i];
118
- void cell.setValue();
119
- }
120
- if (doReflow) {
121
- this.reflow();
125
+ await cell.setValue();
122
126
  }
127
+ this.reflow();
123
128
  }
124
129
  /**
125
130
  * Adds or removes the hovered CSS class to the row element.
@@ -1,4 +1,5 @@
1
- import type DataTable from '../../../Data/DataTable';
1
+ import type { CellType as DataTableCellType } from '../../../Data/DataTable';
2
+ import type CSSObject from '../../../Core/Renderer/CSSObject';
2
3
  import Column from './Column';
3
4
  import Row from './Row';
4
5
  declare abstract class Cell {
@@ -17,11 +18,15 @@ declare abstract class Cell {
17
18
  /**
18
19
  * The raw value of the cell.
19
20
  */
20
- value: DataTable.CellType;
21
+ value: DataTableCellType;
21
22
  /**
22
23
  * An additional, custom class name that can be changed dynamically.
23
24
  */
24
25
  private customClassName?;
26
+ /**
27
+ * Custom inline styles currently applied from user options.
28
+ */
29
+ private customStyleProperties?;
25
30
  /**
26
31
  * Array of cell events to be removed when the cell is destroyed.
27
32
  */
@@ -55,7 +60,7 @@ declare abstract class Cell {
55
60
  /**
56
61
  * Renders the cell by appending the HTML element to the row.
57
62
  */
58
- render(): void;
63
+ render(): Promise<void>;
59
64
  /**
60
65
  * Reflows the cell dimensions.
61
66
  */
@@ -77,6 +82,14 @@ declare abstract class Cell {
77
82
  * The template string.
78
83
  */
79
84
  protected setCustomClassName(template?: string): void;
85
+ /**
86
+ * Sets custom inline styles from options and removes the previously applied
87
+ * custom styles to keep updates deterministic.
88
+ *
89
+ * @param styles
90
+ * A style object to apply.
91
+ */
92
+ protected setCustomStyles(styles?: CSSObject): void;
80
93
  /**
81
94
  * Destroys the cell.
82
95
  */
@@ -15,8 +15,7 @@
15
15
  * */
16
16
  'use strict';
17
17
  import Templating from '../../../Core/Templating.js';
18
- import U from '../../../Core/Utilities.js';
19
- const { fireEvent } = U;
18
+ import { fireEvent } from '../../../Shared/Utilities.js';
20
19
  /* *
21
20
  *
22
21
  * Abstract Class of Cell
@@ -185,9 +184,10 @@ class Cell {
185
184
  /**
186
185
  * Renders the cell by appending the HTML element to the row.
187
186
  */
188
- render() {
187
+ async render() {
189
188
  this.row.htmlElement.appendChild(this.htmlElement);
190
189
  this.reflow();
190
+ return Promise.resolve();
191
191
  }
192
192
  /**
193
193
  * Reflows the cell dimensions.
@@ -235,6 +235,39 @@ class Cell {
235
235
  element.classList.add(...newClassName.split(/\s+/g));
236
236
  this.customClassName = newClassName;
237
237
  }
238
+ /**
239
+ * Sets custom inline styles from options and removes the previously applied
240
+ * custom styles to keep updates deterministic.
241
+ *
242
+ * @param styles
243
+ * A style object to apply.
244
+ */
245
+ setCustomStyles(styles) {
246
+ const elementStyle = this.htmlElement.style;
247
+ const getCSSPropertyName = (property) => (property.indexOf('-') > -1 ?
248
+ property :
249
+ property.replace(/[A-Z]/g, '-$&').toLowerCase());
250
+ if (this.customStyleProperties) {
251
+ for (const property of this.customStyleProperties) {
252
+ elementStyle.removeProperty(property);
253
+ }
254
+ }
255
+ if (!styles) {
256
+ delete this.customStyleProperties;
257
+ return;
258
+ }
259
+ const appliedProperties = [];
260
+ for (const key of Object.keys(styles)) {
261
+ const value = styles[key];
262
+ if (value === void 0 || value === null) {
263
+ continue;
264
+ }
265
+ const property = getCSSPropertyName(String(key));
266
+ elementStyle.setProperty(property, String(value));
267
+ appliedProperties.push(property);
268
+ }
269
+ this.customStyleProperties = appliedProperties;
270
+ }
238
271
  /**
239
272
  * Destroys the cell.
240
273
  */
@@ -17,8 +17,7 @@ import AST from '../../../../Core/Renderer/HTML/AST.js';
17
17
  import CellContent from './CellContent.js';
18
18
  import GridUtils from '../../GridUtils.js';
19
19
  const { setHTMLContent } = GridUtils;
20
- import Utils from '../../../../Core/Utilities.js';
21
- const { defined, isString } = Utils;
20
+ import { defined } from '../../../../Shared/Utilities.js';
22
21
  /* *
23
22
  *
24
23
  * Class
@@ -77,12 +76,8 @@ class TextContent extends CellContent {
77
76
  }
78
77
  else if (isDefaultFormat) {
79
78
  const formattedValue = formatter?.call(cell);
80
- if (isString(formattedValue)) {
81
- cellContent = formattedValue;
82
- }
83
- else {
84
- cellContent = value + '';
85
- }
79
+ cellContent = defined(formattedValue) ?
80
+ String(formattedValue) : value + '';
86
81
  }
87
82
  else if (isDefaultFormatter) {
88
83
  cellContent = format ? cell.format(format) : value + '';
@@ -2,8 +2,8 @@ import type { IndividualColumnOptions } from '../Options';
2
2
  import type Cell from './Cell';
3
3
  import type CellContent from './CellContent/CellContent';
4
4
  import type HeaderCell from './Header/HeaderCell';
5
+ import type { Column as DataTableColumn } from '../../../Data/DataTable';
5
6
  import Table from './Table.js';
6
- import DataTable from '../../../Data/DataTable.js';
7
7
  import ColumnSorting from './Actions/ColumnSorting';
8
8
  import ColumnFiltering from './Actions/ColumnFiltering/ColumnFiltering.js';
9
9
  import TableCell from './Body/TableCell';
@@ -18,7 +18,7 @@ export declare class Column {
18
18
  /**
19
19
  * Type of the data in the column.
20
20
  */
21
- readonly dataType: ColumnDataType;
21
+ dataType: ColumnDataType;
22
22
  /**
23
23
  * The cells of the column.
24
24
  */
@@ -28,9 +28,11 @@ export declare class Column {
28
28
  */
29
29
  id: string;
30
30
  /**
31
- * The data of the column.
31
+ * The data of the column. Shouldn't be used directly in all cases, because
32
+ * it's not guaranteed to be defined (e.g. when using the lazy loading,
33
+ * `RemoteDataProvider`).
32
34
  */
33
- data?: DataTable.Column;
35
+ data?: DataTableColumn;
34
36
  /**
35
37
  * The options of the column as a proxy that provides merged access to
36
38
  * original options and defaults if not defined in the individual options.
@@ -65,6 +67,10 @@ export declare class Column {
65
67
  * The index of the column.
66
68
  */
67
69
  constructor(viewport: Table, id: string, index: number);
70
+ /**
71
+ * Initializes the column data-related properties.
72
+ */
73
+ init(): Promise<void>;
68
74
  /**
69
75
  * Loads the data of the column from the viewport's data table.
70
76
  */