@omegagrid/grid 0.10.2 → 0.10.4

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 (257) hide show
  1. package/dist/commands/editingCommands.d.ts +4 -0
  2. package/dist/commands/editingCommands.d.ts.map +1 -0
  3. package/dist/commands/editingCommands.js +74 -0
  4. package/dist/commands/editingCommands.js.map +1 -0
  5. package/dist/commands/groupCommands.d.ts +8 -0
  6. package/dist/commands/groupCommands.d.ts.map +1 -0
  7. package/dist/commands/groupCommands.js +7 -0
  8. package/dist/commands/groupCommands.js.map +1 -0
  9. package/dist/commands/index.d.ts +4 -0
  10. package/dist/commands/index.d.ts.map +1 -0
  11. package/dist/commands/index.js +9 -0
  12. package/dist/commands/index.js.map +1 -0
  13. package/dist/commands/navigationCommands.d.ts +5 -0
  14. package/dist/commands/navigationCommands.d.ts.map +1 -0
  15. package/dist/commands/navigationCommands.js +117 -0
  16. package/dist/commands/navigationCommands.js.map +1 -0
  17. package/dist/constants.d.ts +65 -0
  18. package/dist/constants.d.ts.map +1 -0
  19. package/dist/constants.js +8 -0
  20. package/dist/constants.js.map +1 -0
  21. package/dist/editors/baseEditor.d.ts +31 -0
  22. package/dist/editors/baseEditor.d.ts.map +1 -0
  23. package/dist/editors/baseEditor.js +112 -0
  24. package/dist/editors/baseEditor.js.map +1 -0
  25. package/dist/editors/calendarEditor.d.ts +12 -0
  26. package/dist/editors/calendarEditor.d.ts.map +1 -0
  27. package/dist/editors/calendarEditor.js +74 -0
  28. package/dist/editors/calendarEditor.js.map +1 -0
  29. package/dist/editors/checkboxEditor.d.ts +9 -0
  30. package/dist/editors/checkboxEditor.d.ts.map +1 -0
  31. package/dist/editors/checkboxEditor.js +32 -0
  32. package/dist/editors/checkboxEditor.js.map +1 -0
  33. package/dist/editors/dateEditor.d.ts +8 -0
  34. package/dist/editors/dateEditor.d.ts.map +1 -0
  35. package/dist/editors/dateEditor.js +37 -0
  36. package/dist/editors/dateEditor.js.map +1 -0
  37. package/dist/editors/dropdownEditor.d.ts +26 -0
  38. package/dist/editors/dropdownEditor.d.ts.map +1 -0
  39. package/dist/editors/dropdownEditor.js +142 -0
  40. package/dist/editors/dropdownEditor.js.map +1 -0
  41. package/dist/editors/formulaEditor.d.ts +21 -0
  42. package/dist/editors/formulaEditor.d.ts.map +1 -0
  43. package/dist/editors/formulaEditor.js +109 -0
  44. package/dist/editors/formulaEditor.js.map +1 -0
  45. package/dist/editors/index.d.ts +8 -0
  46. package/dist/editors/index.d.ts.map +1 -0
  47. package/dist/editors/index.js +19 -0
  48. package/dist/editors/index.js.map +1 -0
  49. package/dist/editors/numberEditor.d.ts +9 -0
  50. package/dist/editors/numberEditor.d.ts.map +1 -0
  51. package/dist/editors/numberEditor.js +37 -0
  52. package/dist/editors/numberEditor.js.map +1 -0
  53. package/dist/editors/textEditor.d.ts +15 -0
  54. package/dist/editors/textEditor.d.ts.map +1 -0
  55. package/dist/editors/textEditor.js +74 -0
  56. package/dist/editors/textEditor.js.map +1 -0
  57. package/dist/filters/NumberFilter.d.ts +8 -0
  58. package/dist/filters/NumberFilter.d.ts.map +1 -0
  59. package/dist/filters/NumberFilter.js +13 -0
  60. package/dist/filters/NumberFilter.js.map +1 -0
  61. package/dist/filters/baseFilter.d.ts +20 -0
  62. package/dist/filters/baseFilter.d.ts.map +1 -0
  63. package/dist/filters/baseFilter.js +47 -0
  64. package/dist/filters/baseFilter.js.map +1 -0
  65. package/dist/filters/checkboxFilter.d.ts +12 -0
  66. package/dist/filters/checkboxFilter.d.ts.map +1 -0
  67. package/dist/filters/checkboxFilter.js +67 -0
  68. package/dist/filters/checkboxFilter.js.map +1 -0
  69. package/dist/filters/dropdownFilter.d.ts +17 -0
  70. package/dist/filters/dropdownFilter.d.ts.map +1 -0
  71. package/dist/filters/dropdownFilter.js +116 -0
  72. package/dist/filters/dropdownFilter.js.map +1 -0
  73. package/dist/filters/filterFactory.d.ts +4 -0
  74. package/dist/filters/filterFactory.d.ts.map +1 -0
  75. package/dist/filters/filterFactory.js +39 -0
  76. package/dist/filters/filterFactory.js.map +1 -0
  77. package/dist/filters/index.d.ts +5 -0
  78. package/dist/filters/index.d.ts.map +1 -0
  79. package/dist/filters/index.js +5 -0
  80. package/dist/filters/index.js.map +1 -0
  81. package/dist/filters/textFilter.d.ts +17 -0
  82. package/dist/filters/textFilter.d.ts.map +1 -0
  83. package/dist/filters/textFilter.js +89 -0
  84. package/dist/filters/textFilter.js.map +1 -0
  85. package/dist/gridAdapter.d.ts +30 -0
  86. package/dist/gridAdapter.d.ts.map +1 -0
  87. package/dist/gridAdapter.js +11 -0
  88. package/dist/gridAdapter.js.map +1 -0
  89. package/dist/i18n/en-us.d.ts +4 -0
  90. package/dist/i18n/en-us.d.ts.map +1 -0
  91. package/dist/i18n/en-us.js +5 -0
  92. package/dist/i18n/en-us.js.map +1 -0
  93. package/dist/i18n/index.d.ts +5 -0
  94. package/dist/i18n/index.d.ts.map +1 -0
  95. package/dist/i18n/index.js +8 -0
  96. package/dist/i18n/index.js.map +1 -0
  97. package/dist/index.d.ts +7 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +7 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/renderers/ActionRenderer.d.ts +3 -0
  102. package/dist/renderers/ActionRenderer.d.ts.map +1 -0
  103. package/dist/renderers/ActionRenderer.js +68 -0
  104. package/dist/renderers/ActionRenderer.js.map +1 -0
  105. package/dist/renderers/BaseRenderer.d.ts +6 -0
  106. package/dist/renderers/BaseRenderer.d.ts.map +1 -0
  107. package/dist/renderers/BaseRenderer.js +56 -0
  108. package/dist/renderers/BaseRenderer.js.map +1 -0
  109. package/dist/renderers/CheckboxRenderer.d.ts +4 -0
  110. package/dist/renderers/CheckboxRenderer.d.ts.map +1 -0
  111. package/dist/renderers/CheckboxRenderer.js +22 -0
  112. package/dist/renderers/CheckboxRenderer.js.map +1 -0
  113. package/dist/renderers/DateTimeRenderer.d.ts +4 -0
  114. package/dist/renderers/DateTimeRenderer.d.ts.map +1 -0
  115. package/dist/renderers/DateTimeRenderer.js +21 -0
  116. package/dist/renderers/DateTimeRenderer.js.map +1 -0
  117. package/dist/renderers/DropdownRenderer.d.ts +4 -0
  118. package/dist/renderers/DropdownRenderer.d.ts.map +1 -0
  119. package/dist/renderers/DropdownRenderer.js +18 -0
  120. package/dist/renderers/DropdownRenderer.js.map +1 -0
  121. package/dist/renderers/GeneralRenderer.d.ts +4 -0
  122. package/dist/renderers/GeneralRenderer.d.ts.map +1 -0
  123. package/dist/renderers/GeneralRenderer.js +12 -0
  124. package/dist/renderers/GeneralRenderer.js.map +1 -0
  125. package/dist/renderers/HtmlRenderer.d.ts +4 -0
  126. package/dist/renderers/HtmlRenderer.d.ts.map +1 -0
  127. package/dist/renderers/HtmlRenderer.js +6 -0
  128. package/dist/renderers/HtmlRenderer.js.map +1 -0
  129. package/dist/renderers/NumberRenderer.d.ts +4 -0
  130. package/dist/renderers/NumberRenderer.d.ts.map +1 -0
  131. package/dist/renderers/NumberRenderer.js +14 -0
  132. package/dist/renderers/NumberRenderer.js.map +1 -0
  133. package/dist/renderers/SparklineRenderer.d.ts +3 -0
  134. package/dist/renderers/SparklineRenderer.d.ts.map +1 -0
  135. package/dist/renderers/SparklineRenderer.js +8 -0
  136. package/dist/renderers/SparklineRenderer.js.map +1 -0
  137. package/dist/renderers/TextRenderer.d.ts +4 -0
  138. package/dist/renderers/TextRenderer.d.ts.map +1 -0
  139. package/dist/renderers/TextRenderer.js +38 -0
  140. package/dist/renderers/TextRenderer.js.map +1 -0
  141. package/dist/renderers/index.d.ts +12 -0
  142. package/dist/renderers/index.d.ts.map +1 -0
  143. package/dist/renderers/index.js +32 -0
  144. package/dist/renderers/index.js.map +1 -0
  145. package/dist/types.d.ts +10 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +2 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/ui/comment.d.ts +59 -0
  150. package/dist/ui/comment.d.ts.map +1 -0
  151. package/dist/ui/comment.js +284 -0
  152. package/dist/ui/comment.js.map +1 -0
  153. package/dist/ui/comment.style.d.ts +2 -0
  154. package/dist/ui/comment.style.d.ts.map +1 -0
  155. package/dist/ui/comment.style.js +108 -0
  156. package/dist/ui/comment.style.js.map +1 -0
  157. package/dist/ui/elementCache.d.ts +15 -0
  158. package/dist/ui/elementCache.d.ts.map +1 -0
  159. package/dist/ui/elementCache.js +57 -0
  160. package/dist/ui/elementCache.js.map +1 -0
  161. package/dist/ui/filterLabel.d.ts +10 -0
  162. package/dist/ui/filterLabel.d.ts.map +1 -0
  163. package/dist/ui/filterLabel.js +76 -0
  164. package/dist/ui/filterLabel.js.map +1 -0
  165. package/dist/ui/formulaInput.d.ts +56 -0
  166. package/dist/ui/formulaInput.d.ts.map +1 -0
  167. package/dist/ui/formulaInput.js +251 -0
  168. package/dist/ui/formulaInput.js.map +1 -0
  169. package/dist/ui/formulaInput.style.d.ts +2 -0
  170. package/dist/ui/formulaInput.style.d.ts.map +1 -0
  171. package/dist/ui/formulaInput.style.js +65 -0
  172. package/dist/ui/formulaInput.style.js.map +1 -0
  173. package/dist/ui/grid.d.ts +91 -0
  174. package/dist/ui/grid.d.ts.map +1 -0
  175. package/dist/ui/grid.editing.d.ts +61 -0
  176. package/dist/ui/grid.editing.d.ts.map +1 -0
  177. package/dist/ui/grid.editing.js +439 -0
  178. package/dist/ui/grid.editing.js.map +1 -0
  179. package/dist/ui/grid.events.d.ts +97 -0
  180. package/dist/ui/grid.events.d.ts.map +1 -0
  181. package/dist/ui/grid.events.js +581 -0
  182. package/dist/ui/grid.events.js.map +1 -0
  183. package/dist/ui/grid.filtering.d.ts +23 -0
  184. package/dist/ui/grid.filtering.d.ts.map +1 -0
  185. package/dist/ui/grid.filtering.js +68 -0
  186. package/dist/ui/grid.filtering.js.map +1 -0
  187. package/dist/ui/grid.js +297 -0
  188. package/dist/ui/grid.js.map +1 -0
  189. package/dist/ui/grid.menu.d.ts +43 -0
  190. package/dist/ui/grid.menu.d.ts.map +1 -0
  191. package/dist/ui/grid.menu.js +168 -0
  192. package/dist/ui/grid.menu.js.map +1 -0
  193. package/dist/ui/grid.objects.d.ts +24 -0
  194. package/dist/ui/grid.objects.d.ts.map +1 -0
  195. package/dist/ui/grid.objects.js +69 -0
  196. package/dist/ui/grid.objects.js.map +1 -0
  197. package/dist/ui/grid.rendering.d.ts +84 -0
  198. package/dist/ui/grid.rendering.d.ts.map +1 -0
  199. package/dist/ui/grid.rendering.js +471 -0
  200. package/dist/ui/grid.rendering.js.map +1 -0
  201. package/dist/ui/grid.selecting.d.ts +99 -0
  202. package/dist/ui/grid.selecting.d.ts.map +1 -0
  203. package/dist/ui/grid.selecting.js +319 -0
  204. package/dist/ui/grid.selecting.js.map +1 -0
  205. package/dist/ui/grid.sorting.d.ts +23 -0
  206. package/dist/ui/grid.sorting.d.ts.map +1 -0
  207. package/dist/ui/grid.sorting.js +47 -0
  208. package/dist/ui/grid.sorting.js.map +1 -0
  209. package/dist/ui/grid.style.d.ts +2 -0
  210. package/dist/ui/grid.style.d.ts.map +1 -0
  211. package/dist/ui/grid.style.js +39 -0
  212. package/dist/ui/grid.style.js.map +1 -0
  213. package/dist/ui/group.d.ts +71 -0
  214. package/dist/ui/group.d.ts.map +1 -0
  215. package/dist/ui/group.js +312 -0
  216. package/dist/ui/group.js.map +1 -0
  217. package/dist/ui/index.d.ts +19 -0
  218. package/dist/ui/index.d.ts.map +1 -0
  219. package/dist/ui/index.js +19 -0
  220. package/dist/ui/index.js.map +1 -0
  221. package/dist/ui/objectHost.d.ts +30 -0
  222. package/dist/ui/objectHost.d.ts.map +1 -0
  223. package/dist/ui/objectHost.js +114 -0
  224. package/dist/ui/objectHost.js.map +1 -0
  225. package/dist/ui/objectHost.style.d.ts +2 -0
  226. package/dist/ui/objectHost.style.d.ts.map +1 -0
  227. package/dist/ui/objectHost.style.js +43 -0
  228. package/dist/ui/objectHost.style.js.map +1 -0
  229. package/dist/ui/selector.d.ts +97 -0
  230. package/dist/ui/selector.d.ts.map +1 -0
  231. package/dist/ui/selector.js +489 -0
  232. package/dist/ui/selector.js.map +1 -0
  233. package/dist/ui/selector.style.d.ts +2 -0
  234. package/dist/ui/selector.style.d.ts.map +1 -0
  235. package/dist/ui/selector.style.js +106 -0
  236. package/dist/ui/selector.style.js.map +1 -0
  237. package/dist/ui/sortingArrow.d.ts +8 -0
  238. package/dist/ui/sortingArrow.d.ts.map +1 -0
  239. package/dist/ui/sortingArrow.js +42 -0
  240. package/dist/ui/sortingArrow.js.map +1 -0
  241. package/dist/ui/sparkline.d.ts +14 -0
  242. package/dist/ui/sparkline.d.ts.map +1 -0
  243. package/dist/ui/sparkline.js +111 -0
  244. package/dist/ui/sparkline.js.map +1 -0
  245. package/dist/ui/table.d.ts +122 -0
  246. package/dist/ui/table.d.ts.map +1 -0
  247. package/dist/ui/table.js +1063 -0
  248. package/dist/ui/table.js.map +1 -0
  249. package/dist/ui/table.styles.d.ts +2 -0
  250. package/dist/ui/table.styles.d.ts.map +1 -0
  251. package/dist/ui/table.styles.js +249 -0
  252. package/dist/ui/table.styles.js.map +1 -0
  253. package/dist/ui/tooltip.d.ts +9 -0
  254. package/dist/ui/tooltip.d.ts.map +1 -0
  255. package/dist/ui/tooltip.js +32 -0
  256. package/dist/ui/tooltip.js.map +1 -0
  257. package/package.json +7 -7
@@ -0,0 +1,1063 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import constants from '../constants';
8
+ import { dom, Expander, LevelExpander } from "@omegagrid/core";
9
+ import { LitElement, html } from 'lit';
10
+ import { customElement, property } from 'lit/decorators.js';
11
+ import { encodeRow, styleToCSStyle, CellRange, MergeCellState } from "@omegagrid/grid-core";
12
+ import { ElementCache } from "./elementCache";
13
+ import { tableStyles } from "./table.styles";
14
+ import { SortingArrow } from "./sortingArrow";
15
+ import { applyStyle, getCellRenderer } from '../renderers';
16
+ export class TableEvent extends Event {
17
+ }
18
+ let Table = class Table extends LitElement {
19
+ constructor() {
20
+ super(...arguments);
21
+ // map of model indexes on element indexes
22
+ this._rowMap = new Map();
23
+ this._colMap = new Map();
24
+ this.hideOuterBorder = false;
25
+ this.rowOffset = 0;
26
+ this.colOffset = 0;
27
+ this.zoom = 1;
28
+ this.nogrid = false;
29
+ this.renderAll = false;
30
+ this.getColumnByModelIndex = (c) => this.getColumnByGridIndex(this.colMap.get(c));
31
+ this.getColumnByGridIndex = (c) => this.colgroup.children[c + this.rowHeaderCount];
32
+ this.getRowByModelIndex = (r) => this.bRows[this.rowMap.get(r)];
33
+ this.getRowByGridIndex = (r) => this.bRows[r];
34
+ this.getCellByGridIndex = (c, r) => this.bRows[r].children[c + this.rowHeaderCount];
35
+ this.getCellByModelIndex = (c, r) => this.getRowByModelIndex(r)?.children[this.colMap.get(c) + this.rowHeaderCount];
36
+ this.getCellByCellModel = (m) => this.getCellByModelIndex(m.c, m.r);
37
+ this.resetFreezeLeft = () => this._freezeLeft = null;
38
+ this._highlightedColHeaderCells = [];
39
+ this._highlightedRowHeaderCells = [];
40
+ this.render = () => html `
41
+ <style>
42
+ table {
43
+ font-size: ${this.model?.options.fontSize || constants.FONT_SIZE}px;
44
+ }
45
+
46
+ table tr {
47
+ line-height: ${(this.model?.options.rowHeight || 22) - 1}px;
48
+ }
49
+ </style>
50
+
51
+ ${this.table}
52
+ `;
53
+ this.clearHeaderCache = () => {
54
+ this.resetFreezeLeft();
55
+ this.hCache = new ElementCache(this.model.columns.length, this.columnHeaderCount);
56
+ this.hCache.disabled = !this.model.options.cellCache;
57
+ };
58
+ this.clearBodyCache = () => {
59
+ this.bCache = new ElementCache(this.model.columns.length, this.model.rows.length);
60
+ this.bCache.disabled = !this.model.options.cellCache;
61
+ };
62
+ //#endregion
63
+ this.cellRenderSchedules = new WeakMap();
64
+ //#endregion
65
+ }
66
+ get thead() {
67
+ if (this._thead)
68
+ return this._thead;
69
+ return (this._thead = dom.createElement('thead'));
70
+ }
71
+ get tbody() {
72
+ if (this._tbody)
73
+ return this._tbody;
74
+ return (this._tbody = dom.createElement('tbody'));
75
+ }
76
+ get colgroup() {
77
+ if (this._colgroup)
78
+ return this._colgroup;
79
+ return (this._colgroup = dom.createElement('colgroup'));
80
+ }
81
+ get table() {
82
+ if (this._table)
83
+ return this._table;
84
+ this._table = dom.createElement('table');
85
+ this._table.appendChild(this.colgroup);
86
+ this._table.appendChild(this.thead);
87
+ this._table.appendChild(this.tbody);
88
+ return this._table;
89
+ }
90
+ //#endregion
91
+ //#region calculated props
92
+ get colMap() { return this._colMap; }
93
+ get rowMap() { return this._rowMap; }
94
+ get freezeLeft() {
95
+ if (this._freezeLeft == null) {
96
+ const freezeLeft = this.model.options.freezeLeft;
97
+ if (freezeLeft >= this.model.columns.length) {
98
+ this._freezeLeft = 0;
99
+ }
100
+ else if (this.offsetWidth > 0) {
101
+ let w = 0;
102
+ for (let c = 0; c < freezeLeft; c++) {
103
+ w += this.model.columns[c].width;
104
+ }
105
+ this._freezeLeft = w < this.offsetWidth / 2 ? freezeLeft : 0;
106
+ }
107
+ else {
108
+ this._freezeLeft = freezeLeft;
109
+ }
110
+ }
111
+ return this._freezeLeft;
112
+ }
113
+ get freezeTop() {
114
+ if (this._freezeTop == null) {
115
+ this._freezeTop = this.model.options.freezeTop;
116
+ }
117
+ return this._freezeTop;
118
+ }
119
+ previewZoom(zoom) {
120
+ dom.zoomElement(this.table, zoom);
121
+ }
122
+ highlightColHeaderCells(columns) {
123
+ if (!this.model.options.colLetters)
124
+ return;
125
+ this._highlightedColHeaderCells.forEach(cell => cell.className = 'hlabel');
126
+ this._highlightedColHeaderCells = [];
127
+ const offset = this.rowHeaderCount;
128
+ columns.forEach(c => {
129
+ const cell = this.hRows[this.model.hasColumnTreeEnabled ? 1 : 0].children[this.colMap.get(c) + offset];
130
+ if (cell) {
131
+ this._highlightedColHeaderCells.push(cell);
132
+ cell.className = 'hlabel selected';
133
+ }
134
+ });
135
+ }
136
+ highlightRowHeaderCells(rows) {
137
+ if (!this.model.options.rowNumbers)
138
+ return;
139
+ if (this.model.rows.length == 0)
140
+ return;
141
+ this._highlightedRowHeaderCells.forEach(cell => cell.className = 'vlabel');
142
+ this._highlightedRowHeaderCells = [];
143
+ rows.forEach(r => {
144
+ const cell = this.getRowByModelIndex(r)?.children[this.model.hasRowTreeEnabled ? 1 : 0];
145
+ if (cell) {
146
+ this._highlightedRowHeaderCells.push(cell);
147
+ cell.className = 'vlabel selected';
148
+ }
149
+ });
150
+ }
151
+ get columnHeaderCount() {
152
+ return this.model.headerCount
153
+ + (this.model.hasColumnTreeEnabled ? 1 : 0)
154
+ + (this.model.hasFilter ? 1 : 0)
155
+ + (this.model.options.colLetters ? 1 : 0);
156
+ }
157
+ get rowHeaderCount() { return (this.model.hasRowTreeEnabled ? 1 : 0) + (this.model.options.rowNumbers ? 1 : 0); }
158
+ get renderRowCount() {
159
+ return this.renderAll
160
+ ? this.model.visibleRows.length
161
+ : Math.round(Math.min(this.clientHeight / constants.MIN_ROW_HEIGHT, this.model.rows.length));
162
+ }
163
+ get renderColCount() {
164
+ return this.renderAll
165
+ ? this.model.visibleColumns.length + this.rowHeaderCount
166
+ : Math.round(Math.min((this.clientWidth / constants.MIN_COL_WIDTH) || 5, this.model.columns.length + this.rowHeaderCount));
167
+ }
168
+ get totalHeaderHeight() {
169
+ let h = 0, r = 0;
170
+ if (this.model.hasColumnTreeEnabled) {
171
+ h += this.treeHeaderHeight;
172
+ ++r;
173
+ }
174
+ if (this.model.options.colLetters) {
175
+ h += this.thead.children[r].offsetHeight || this.model.options.rowHeight;
176
+ ++r;
177
+ }
178
+ for (let i = 0; i < this.model.headerCount; i++) {
179
+ h += this.thead.children[r + i].offsetHeight || this.model.options.rowHeight;
180
+ }
181
+ if (this.model.hasFilter)
182
+ h += this.model.options.rowHeight;
183
+ return h;
184
+ }
185
+ get treeHeaderWidth() { return this.model.hasRowTreeEnabled ? this.model.maxRowLevel * 15 + 20 : 0; }
186
+ get treeHeaderHeight() {
187
+ return this.model.hasColumnTree ? this.model.maxColumnLevel * 15 + 20 : 0;
188
+ }
189
+ get totalHeaderWidth() {
190
+ let w = 0;
191
+ if (this.model.options.rowNumbers)
192
+ w += constants.ROW_HEADER_WIDTH;
193
+ w += this.treeHeaderWidth;
194
+ return w;
195
+ }
196
+ get viewportSize() {
197
+ if (!this._viewportSize) {
198
+ this._viewportSize = this.renderAll ? { w: Infinity, h: Infinity } : {
199
+ w: (this.clientWidth - this.totalHeaderWidth - constants.SLIDER_SIZE) / this.zoom,
200
+ h: (this.clientHeight - this.totalHeaderHeight - constants.SLIDER_SIZE) / this.zoom
201
+ };
202
+ }
203
+ return this._viewportSize;
204
+ }
205
+ get viewport() {
206
+ if (!this._viewport) {
207
+ this._viewport = this.model.getViewport({ c: this.colOffset, r: this.rowOffset }, this.viewportSize, {
208
+ t: this.model.options.freezeTop,
209
+ l: this.freezeLeft,
210
+ b: this.model.options.freezeBottom,
211
+ r: this.model.options.freezeRight
212
+ });
213
+ }
214
+ return this._viewport;
215
+ }
216
+ get viewportRange() {
217
+ if (this.viewport.columns.length == 0 || this.viewport.rows.length == 0)
218
+ return null;
219
+ return new CellRange(this.viewport.columns[0].index, this.viewport.rows[0].index, this.viewport.columns[this.viewport.columns.length - 1].index, this.viewport.rows[this.viewport.rows.length - 1].index);
220
+ }
221
+ //#endregion
222
+ findColumnIndexByOffset(offset) {
223
+ let w = 0;
224
+ const columns = this.colgroup.children;
225
+ for (let c = 0; c < columns.length; c++) {
226
+ const col = columns[c];
227
+ w += col.offsetWidth;
228
+ if (w >= offset)
229
+ return c;
230
+ }
231
+ return -1;
232
+ }
233
+ findRowByOffset(offset) {
234
+ const rows = (offset > this.thead.offsetHeight ? this.tbody : this.thead).children;
235
+ if (offset > this.thead.offsetHeight)
236
+ offset -= this.thead.offsetHeight;
237
+ let h = 0;
238
+ for (let r = 0; r < rows.length; r++) {
239
+ const row = rows[r];
240
+ h += row.offsetHeight;
241
+ if (h >= offset)
242
+ return row;
243
+ }
244
+ return null;
245
+ }
246
+ findTableCellByOffset(x, y) {
247
+ x = x / this.zoom;
248
+ y = y / this.zoom;
249
+ const row = this.findRowByOffset(y);
250
+ const column = this.findColumnIndexByOffset(x); // ?? this.colgroup.children.length - 1;
251
+ const cell = row && column > -1 ? row.children[column] : null;
252
+ return cell && !dom.isHidden(cell) ? cell : null;
253
+ }
254
+ /**
255
+ * Returns the nearest visible cell to the given offset and exact cell if availible
256
+ * @param x
257
+ * @param y
258
+ * @returns
259
+ */
260
+ findNearestTableCellByOffset(x, y) {
261
+ x = x / this.zoom;
262
+ y = y / this.zoom;
263
+ let row, c;
264
+ const exactRow = this.findRowByOffset(y);
265
+ const excactColumnIndex = this.findColumnIndexByOffset(x);
266
+ if (y < 0)
267
+ row = this.tbody.children[0];
268
+ else if (y > this.tbody.offsetHeight + this.thead.offsetHeight)
269
+ row = this.tbody.children[this.viewport.rows.length - 1];
270
+ else
271
+ row = exactRow;
272
+ if (x < 0)
273
+ c = this.rowHeaderCount;
274
+ else if (x >= this.tbody.offsetWidth)
275
+ c = this.viewport.columns.length + this.rowHeaderCount - 1;
276
+ else
277
+ c = excactColumnIndex;
278
+ let cell = row && c > -1 ? row.children[c] : null;
279
+ // find nearest visible cell
280
+ while (cell && dom.isHidden(cell))
281
+ cell = cell.previousElementSibling;
282
+ const exactCell = exactRow && excactColumnIndex > -1 ? exactRow.children[excactColumnIndex] : null;
283
+ return [cell, exactCell && !dom.isHidden(exactCell) ? exactCell : null];
284
+ }
285
+ connectedCallback() {
286
+ super.connectedCallback();
287
+ this.grid = dom.findParent(this, 'og-grid');
288
+ }
289
+ willUpdate() {
290
+ this._viewport = null;
291
+ this._viewportSize = null;
292
+ if (this.model) {
293
+ this.clearHeaderCache();
294
+ this.clearBodyCache();
295
+ }
296
+ }
297
+ updated() {
298
+ if (this.model) {
299
+ this.createColumns();
300
+ this.createHeaderRows();
301
+ this.createBodyRows();
302
+ this.renderCells();
303
+ }
304
+ }
305
+ refresh() {
306
+ this.clearHeaderCache();
307
+ this.clearBodyCache();
308
+ this.requestUpdate();
309
+ }
310
+ createColumns() {
311
+ this._freezeLeft = null;
312
+ const colCount = this.renderColCount;
313
+ if (!this.cols || this.cols.length != colCount) {
314
+ this.cols = new Array(colCount);
315
+ for (let c = 0; c < colCount; c++) {
316
+ this.cols[c] = dom.createElement('col');
317
+ this.cols.forEach(() => this.colgroup.appendChild(this.cols[c]));
318
+ }
319
+ }
320
+ }
321
+ createHeaderRows() {
322
+ const rowCount = this.columnHeaderCount;
323
+ const colCount = this.renderColCount;
324
+ dom.empty(this.thead);
325
+ if (!this.hRows || this.hRows.length != rowCount || !this.hRows[0] || this.hRows[0].children.length != colCount) {
326
+ this.hRows = new Array(rowCount);
327
+ for (let r = 0; r < rowCount; r++) {
328
+ this.hRows[r] = dom.createElement('tr');
329
+ for (let c = 0; c < colCount; c++) {
330
+ this.hRows[r].appendChild(dom.createElement('th'));
331
+ }
332
+ }
333
+ }
334
+ dom.empty(this.thead);
335
+ this.hRows.forEach(row => this.thead.appendChild(row));
336
+ }
337
+ createBodyRows() {
338
+ const rowCount = this.renderRowCount;
339
+ const colCount = this.renderColCount;
340
+ const offset = this.rowHeaderCount;
341
+ if (!this.bRows || this.bRows.length == 0 || this.bRows.length != rowCount || this.bRows[0].children.length != colCount) {
342
+ if (rowCount == 0 && this.grid.options.emptyPlaceholder) {
343
+ this.bRows = [dom.createElement('tr')];
344
+ this.bRows[0].appendChild(dom.createElement('td'));
345
+ }
346
+ else {
347
+ this.bRows = new Array(rowCount);
348
+ for (let r = 0; r < rowCount; r++) {
349
+ this.bRows[r] = dom.createElement('tr');
350
+ for (let c = 0; c < offset; c++) {
351
+ this.bRows[r].appendChild(dom.createElement('th'));
352
+ }
353
+ for (let c = offset; c < colCount; c++) {
354
+ this.bRows[r].appendChild(dom.createElement('td'));
355
+ }
356
+ }
357
+ }
358
+ }
359
+ dom.empty(this.tbody);
360
+ this.bRows.forEach(row => this.tbody.appendChild(row));
361
+ }
362
+ renderCells(update = { vertical: true, horizontal: true }) {
363
+ if (this.table && (update.vertical || update.horizontal)) {
364
+ this._viewport = null;
365
+ // this.tbody.remove();
366
+ if (update.horizontal)
367
+ this.renderHeader();
368
+ if (this.model.rows.length > 0) {
369
+ this.renderBody();
370
+ if (update.vertical)
371
+ this.renderRowTree();
372
+ // this.table.appendChild(this.tbody);
373
+ }
374
+ else if (this.model.options.emptyPlaceholder) {
375
+ this.renderEmptyBody();
376
+ this.table.appendChild(this.tbody);
377
+ }
378
+ this.dispatchEvent(new TableEvent('rendercells'));
379
+ }
380
+ }
381
+ renderEmptyBody() {
382
+ const cell = this.bRows[0].children[0];
383
+ cell.innerHTML = 'no data';
384
+ cell.className = 'empty-placeholder';
385
+ cell.colSpan = this.viewport.columns.length + this.rowHeaderCount;
386
+ }
387
+ //#region render header rows
388
+ renderHeader() {
389
+ let column;
390
+ this.colMap.clear();
391
+ const offset = this.rowHeaderCount;
392
+ const viewport = this.viewport;
393
+ if (this.model.hasRowTreeEnabled) {
394
+ dom.setSize(this.colgroup.children[0], { w: this.treeHeaderWidth }, true);
395
+ }
396
+ if (this.model.options.rowNumbers) {
397
+ dom.setSize(this.colgroup.children[offset - 1], { w: constants.ROW_HEADER_WIDTH }, true);
398
+ }
399
+ for (let c = 0; c < viewport.columns.length; c++) {
400
+ column = viewport.columns[c];
401
+ if (this.model.autofitColumns.has(column.index)) {
402
+ this.grid.rendering.autofitColumn(column.index, false, false);
403
+ this.model.autofitColumns.delete(column.index); // use autofit only once for performance reasons
404
+ }
405
+ this.colMap.set(column.index, c);
406
+ dom.setSize(this.colgroup.children[c + offset], { w: column.width });
407
+ dom.setMinSize(this.colgroup.children[c + offset], { w: column.width });
408
+ dom.setMaxSize(this.colgroup.children[c + offset], { w: column.width });
409
+ }
410
+ let r = 0;
411
+ if (this.model.hasColumnTreeEnabled) {
412
+ this.renderHeaderRowTree(this.hRows[r], r);
413
+ ++r;
414
+ }
415
+ if (this.model.options.colLetters) {
416
+ dom.setSize(this.hRows[r], { h: this.model.options.rowHeight });
417
+ this.renderHeaderRowLetters(this.hRows[r], r);
418
+ ++r;
419
+ }
420
+ for (let i = 0; i < this.model.headerCount; i++) {
421
+ this.renderHeaderRowLabels(this.hRows[r + i], r + i, i);
422
+ }
423
+ r += this.model.headerCount;
424
+ if (this.model.hasFilter) {
425
+ dom.setSize(this.hRows[r], { h: this.model.options.rowHeight });
426
+ this.renderHeaderRowFilters(this.hRows[r], r);
427
+ }
428
+ }
429
+ renderHeaderRowLetters(tr, index) {
430
+ let cell;
431
+ let c2;
432
+ const viewport = this.viewport;
433
+ const r = index - this.columnHeaderCount;
434
+ let offset = 0; //this.rowHeaderCount;
435
+ dom.setSize(tr, { h: this.model.options.rowHeight });
436
+ if ((this.model.hasRowTree || this.model.options.rowNumbers) && !this.model.hasColumnTreeEnabled) {
437
+ cell = tr.children[offset];
438
+ cell.colSpan = this.rowHeaderCount;
439
+ cell.rowSpan = this.columnHeaderCount;
440
+ const c = offset - this.rowHeaderCount;
441
+ const cornerCell = this.model.options.levelButtonCell;
442
+ if (!cornerCell || (r == cornerCell.r && c == cornerCell.c)) {
443
+ this.renderHeaderRowCornerCell(cell);
444
+ }
445
+ offset++;
446
+ }
447
+ for (let i = offset; i < this.rowHeaderCount; i++) {
448
+ dom.hideCell(tr.children[i]);
449
+ offset++;
450
+ }
451
+ for (let c = offset; c < tr.children.length; c++) {
452
+ c2 = c - offset;
453
+ cell = tr.children[c];
454
+ cell.className = 'hlabel';
455
+ if (viewport.columns.length > c2) {
456
+ cell.innerHTML = viewport.columns[c2].address;
457
+ cell.c = viewport.columns[c2].index;
458
+ dom.showCell(cell);
459
+ }
460
+ else {
461
+ dom.hideCell(cell);
462
+ }
463
+ }
464
+ }
465
+ renderHeaderRowTree(tr, index) {
466
+ if (!this.model.hasColumnTreeEnabled)
467
+ return;
468
+ let cell;
469
+ let offset = 0;
470
+ let c2;
471
+ const r = index - this.columnHeaderCount;
472
+ const viewport = this.viewport;
473
+ const rowNumbers = this.model.options.rowNumbers;
474
+ const rowTree = this.model.hasRowTreeEnabled;
475
+ dom.setSize(tr, { h: this.treeHeaderHeight });
476
+ cell = tr.children[offset];
477
+ if (!cell)
478
+ return;
479
+ cell.rowSpan = rowNumbers || rowTree ? this.columnHeaderCount : 1;
480
+ cell.colSpan = this.rowHeaderCount;
481
+ const c = offset - this.rowHeaderCount;
482
+ const cornerCell = this.model.options.levelButtonCell;
483
+ let cornerCellColumn = null;
484
+ if ((!cornerCell && (rowNumbers || rowTree)) || (cornerCell && r == cornerCell.r && c == cornerCell.c)) {
485
+ cornerCellColumn = c;
486
+ this.renderHeaderRowCornerCell(cell);
487
+ }
488
+ if (rowNumbers || rowTree) {
489
+ ++offset;
490
+ // if (rowTree) {
491
+ // cell = tr.children[offset] as TableCell;
492
+ // cell.innerHTML = '';
493
+ // dom.hideCell(cell);
494
+ // ++offset;
495
+ // }
496
+ }
497
+ for (let c = offset; c < tr.children.length; c++) {
498
+ c2 = c - offset;
499
+ cell = tr.children[c];
500
+ if (viewport.columns.length > c2) {
501
+ if (cornerCellColumn != c) {
502
+ cell.innerHTML = '';
503
+ cell.className = 'htree';
504
+ this.renderHeaderRowTreeCell(tr, index, viewport.columns[c2], cell);
505
+ }
506
+ dom.showCell(cell);
507
+ }
508
+ else {
509
+ dom.hideCell(cell);
510
+ }
511
+ }
512
+ }
513
+ renderHeaderRowTreeCell(tr, rIndex, column, th) {
514
+ let div = this.hCache.get(column.index, rIndex);
515
+ if (!div) {
516
+ div = dom.createElement('div');
517
+ this.hCache.set(column.index, rIndex, div);
518
+ const colWidth = column.width + 1;
519
+ const treeRowHeight = this.treeHeaderHeight / this.model.maxColumnLevel;
520
+ if (column.hasChildren) {
521
+ const expander = new Expander();
522
+ expander.addEventListener('toggle', () => this.grid.rendering.toggleColumn(column.index));
523
+ div.expander = expander;
524
+ div.appendChild(expander);
525
+ dom.setPosition(expander, {
526
+ l: colWidth / 2 - constants.EXPANDER_SIZE / 2,
527
+ t: column.level * treeRowHeight + treeRowHeight / 2 - constants.EXPANDER_SIZE / 2
528
+ });
529
+ div.expanderLine = this.createExpanderLine('h');
530
+ div.appendChild(div.expanderLine);
531
+ dom.setPosition(div.expanderLine, {
532
+ l: this.model.options.columnTree.reversed ? 0 : (colWidth / 2),
533
+ t: column.level * treeRowHeight + treeRowHeight / 2
534
+ });
535
+ dom.setSize(div.expanderLine, {
536
+ h: treeRowHeight / 2,
537
+ w: colWidth / 2 + 1
538
+ });
539
+ }
540
+ if (column.hasParent) {
541
+ let parent = column;
542
+ while (parent.hasParent) {
543
+ parent = parent.parent;
544
+ const line = this.createExpanderLine('h');
545
+ div.appendChild(line);
546
+ dom.setSize(line, {
547
+ h: treeRowHeight / 2,
548
+ w: colWidth - 1
549
+ });
550
+ dom.setPosition(line, {
551
+ l: 0,
552
+ t: parent.level * treeRowHeight + treeRowHeight / 2
553
+ });
554
+ }
555
+ }
556
+ }
557
+ if (div.expander)
558
+ div.expander.state = column.collapsed ? 'closed' : 'open';
559
+ th.appendChild(div);
560
+ }
561
+ createExpanderLine(direction) {
562
+ const expanderLine = dom.createElement('div');
563
+ expanderLine.className = `${direction}tree-line`;
564
+ return expanderLine;
565
+ }
566
+ renderHeaderRowLabels(tr, rIndex, hIndex) {
567
+ let colModel;
568
+ let cell;
569
+ let header;
570
+ let offset = 0;
571
+ let c2;
572
+ const viewport = this.viewport;
573
+ const r = rIndex - this.columnHeaderCount;
574
+ const cornerCell = this.model.options.levelButtonCell;
575
+ let rowHeight;
576
+ if (this.model.hasRowTreeEnabled) {
577
+ cell = tr.children[offset];
578
+ cell.innerHTML = '';
579
+ if (this.model.hasColumnTreeEnabled || this.model.options.colLetters || hIndex > 0) {
580
+ dom.hideCell(cell);
581
+ }
582
+ else {
583
+ cell.rowSpan = this.columnHeaderCount;
584
+ cell.colSpan = this.rowHeaderCount;
585
+ this.renderHeaderRowCornerCell(cell);
586
+ }
587
+ ++offset;
588
+ }
589
+ if (this.model.options.rowNumbers) {
590
+ cell = tr.children[offset];
591
+ cell.innerHTML = '';
592
+ if (this.model.hasRowTreeEnabled || this.model.options.colLetters || this.model.hasColumnTreeEnabled || hIndex > 0) {
593
+ dom.hideCell(cell);
594
+ }
595
+ else {
596
+ cell.rowSpan = this.columnHeaderCount;
597
+ cell.colSpan = this.rowHeaderCount;
598
+ this.renderHeaderRowCornerCell(cell);
599
+ }
600
+ ++offset;
601
+ }
602
+ for (let c = offset; c < tr.children.length; c++) {
603
+ c2 = c - offset;
604
+ cell = tr.children[c];
605
+ cell.className = 'hlabel';
606
+ cell.innerHTML = '';
607
+ if (viewport.columns.length > c2) {
608
+ colModel = viewport.columns[c2];
609
+ header = colModel.header[hIndex];
610
+ if (header.height)
611
+ rowHeight = Math.max(header.height, rowHeight || 0);
612
+ cell.colSpan = 1;
613
+ cell.rowSpan = 1;
614
+ cell.c = colModel.index;
615
+ cell.r = hIndex;
616
+ if (header?.hidden) {
617
+ if (c2 == this.freezeLeft) {
618
+ let prevModel = colModel.prevVisible;
619
+ let c3 = 0;
620
+ while (prevModel && prevModel.header[hIndex]?.hidden) {
621
+ prevModel = prevModel.prevVisible;
622
+ ++c3;
623
+ }
624
+ if (prevModel && prevModel.header[hIndex].cs) {
625
+ dom.showCell(cell);
626
+ cell.colSpan = prevModel.header[hIndex].cs - c3 - 1;
627
+ cell.rowSpan = prevModel.header[hIndex].rs || 1;
628
+ this.renderHeaderRowLabelCell(cell, prevModel, rIndex, hIndex);
629
+ }
630
+ else {
631
+ dom.hideCell(cell);
632
+ }
633
+ }
634
+ else {
635
+ dom.hideCell(cell);
636
+ }
637
+ }
638
+ else {
639
+ if (colModel.header && colModel.header[hIndex]) {
640
+ const cs = colModel.header[hIndex].cs || 1;
641
+ cell.colSpan = cs > 1 ? colModel.calculateRealColspan(cs) : 1;
642
+ cell.rowSpan = colModel.header[hIndex].rs || 1;
643
+ }
644
+ dom.showCell(cell);
645
+ this.renderHeaderRowLabelCell(cell, colModel, rIndex, hIndex);
646
+ if (cornerCell && cornerCell.r == r && cornerCell.c == colModel.index) {
647
+ this.renderHeaderRowCornerCell(cell);
648
+ }
649
+ }
650
+ }
651
+ else {
652
+ dom.hideCell(cell);
653
+ }
654
+ }
655
+ dom.setSize(tr, { h: rowHeight ?? this.model.options.rowHeight });
656
+ }
657
+ renderHeaderRowLabelCell(th, column, rIndex, hIndex) {
658
+ // TODO: move rendering logic to HeaderRenderer
659
+ let div = this.hCache.get(column.index, rIndex);
660
+ const h = column.header[hIndex];
661
+ if (!div) {
662
+ div = dom.createElement('div');
663
+ if (!h)
664
+ div.innerHTML = '';
665
+ else if (h.html)
666
+ div.innerHTML = h.label ?? "";
667
+ else
668
+ div.innerText = h.label ?? "";
669
+ if (h && h._style != null) {
670
+ applyStyle(div, styleToCSStyle(this.model.styles.get(h._style)));
671
+ }
672
+ this.hCache.set(column.index, rIndex, div);
673
+ }
674
+ if (this.model.options.columnHeaderTreeButtons
675
+ && column.hasChildren
676
+ && hIndex == column.level) {
677
+ let expander = div.expander;
678
+ if (!expander) {
679
+ expander = new Expander();
680
+ expander.addEventListener('toggle', () => this.grid.rendering.toggleColumn(column.index));
681
+ div.expander = expander;
682
+ div.prepend(expander);
683
+ dom.setPosition(expander, { l: 4, t: 4 });
684
+ }
685
+ expander.state = column.collapsed ? 'closed' : 'open';
686
+ }
687
+ if (column.sorting && hIndex == column.header.length - 1) {
688
+ th.className += ' sort';
689
+ if (!div.sortingArrow) {
690
+ div.sortingArrow = new SortingArrow();
691
+ div.appendChild(div.sortingArrow);
692
+ dom.setPosition(div.sortingArrow, { t: 0, r: 5 });
693
+ }
694
+ div.sortingArrow.sortSettings = this.model.sorting.get(column.index);
695
+ }
696
+ if (column.hasHeaderTooltip(hIndex)) {
697
+ // if (!(options && options.export)) {
698
+ const corner = dom.createElement('div');
699
+ corner.className = 'crn';
700
+ div.appendChild(corner);
701
+ div.classList.add('tt');
702
+ // }
703
+ }
704
+ th.appendChild(div);
705
+ }
706
+ renderHeaderRowFilters(tr, index) {
707
+ let cell;
708
+ let offset = 0;
709
+ let c2;
710
+ const viewport = this.viewport;
711
+ if (this.model.hasRowTreeEnabled) {
712
+ cell = tr.children[offset];
713
+ cell.innerHTML = '';
714
+ if (this.model.columnHeaderCount > 1) {
715
+ dom.hideCell(cell);
716
+ }
717
+ else {
718
+ cell.colSpan = this.model.columnHeaderCount;
719
+ }
720
+ ++offset;
721
+ }
722
+ if (this.model.options.rowNumbers) {
723
+ cell = tr.children[offset];
724
+ cell.innerHTML = '';
725
+ if (this.model.hasRowTreeEnabled || this.model.options.colLetters
726
+ || this.model.hasColumnTreeEnabled || this.model.headerCount > 0) {
727
+ dom.hideCell(cell);
728
+ }
729
+ else {
730
+ cell.rowSpan = this.columnHeaderCount;
731
+ cell.colSpan = this.rowHeaderCount;
732
+ this.renderHeaderRowCornerCell(cell);
733
+ }
734
+ ++offset;
735
+ }
736
+ for (let c = offset; c < tr.children.length; c++) {
737
+ c2 = c - offset;
738
+ cell = tr.children[c];
739
+ if (viewport.columns.length > c2) {
740
+ dom.showCell(cell);
741
+ const column = viewport.columns[c2];
742
+ if (column.hasFilter)
743
+ this.renderHeaderRowFilterCell(tr, index, column, cell);
744
+ else
745
+ cell.innerHTML = '';
746
+ }
747
+ else {
748
+ dom.hideCell(cell);
749
+ }
750
+ }
751
+ }
752
+ renderHeaderRowFilterCell(tr, rIndex, column, th) {
753
+ th.innerHTML = '';
754
+ th.className = 'filter';
755
+ th.c = column.index;
756
+ let div = this.hCache.get(column.index, rIndex);
757
+ if (!div) {
758
+ div = dom.createElement('div');
759
+ div.filter = dom.createElement('og-filter-label');
760
+ div.appendChild(div.filter);
761
+ this.hCache.set(column.index, rIndex, div);
762
+ }
763
+ const term = this.grid.filtering.filter.get(column.index)?.term;
764
+ div.filter.value = Array.isArray(term) ? term.map(item => item.value ?? item.key).join(', ') : term;
765
+ th.appendChild(div);
766
+ }
767
+ renderHeaderRowCornerCell(th) {
768
+ this.cornerDiv = dom.createElement('div');
769
+ const treeColWidth = Math.max((this.treeHeaderWidth || (constants.EXPANDER_SIZE + 2)) / (this.model.maxRowLevel + 1), constants.EXPANDER_SIZE + 2);
770
+ if (this.model.hasRowTree) {
771
+ for (let l = 0; l <= this.model.maxRowLevel; l++) {
772
+ const expander = new LevelExpander();
773
+ expander.level = l;
774
+ this.cornerDiv.appendChild(expander);
775
+ dom.setPosition(expander, {
776
+ l: l * treeColWidth + treeColWidth / 2 - constants.EXPANDER_SIZE / 2,
777
+ b: 3
778
+ });
779
+ expander.addEventListener('mousedown', e => e.stopPropagation());
780
+ expander.addEventListener('toggle', (e) => {
781
+ this.model.columns.filter(col => col.levelButtons).forEach(col => this.bCache.deleteColumn(col.index));
782
+ this.grid.rendering.setRowExpandLevel(e.level);
783
+ });
784
+ }
785
+ }
786
+ if (this.model.hasColumnTree) {
787
+ const treeRowHeight = (this.model.hasColumnTree ? this.treeHeaderHeight : th.clientHeight) / (this.model.maxColumnLevel + 1);
788
+ const vertical = (this.model.maxColumnLevel * 15 + 20) <= th.clientHeight;
789
+ for (let l = 0; l <= this.model.maxColumnLevel; l++) {
790
+ const expander = new LevelExpander();
791
+ expander.level = l;
792
+ this.cornerDiv.appendChild(expander);
793
+ dom.setPosition(expander, vertical ? {
794
+ t: l * treeRowHeight + treeRowHeight / 2 - constants.EXPANDER_SIZE / 2,
795
+ r: 3
796
+ } : {
797
+ r: l * treeColWidth + treeColWidth / 2 - constants.EXPANDER_SIZE / 2,
798
+ b: 3
799
+ });
800
+ expander.addEventListener('mousedown', e => e.stopPropagation());
801
+ expander.addEventListener('toggle', (e) => {
802
+ this.grid.rendering.setColumnExpandLevel(e.level);
803
+ });
804
+ }
805
+ }
806
+ dom.empty(th);
807
+ th.appendChild(this.cornerDiv);
808
+ }
809
+ //#region render body rows
810
+ renderBody() {
811
+ let row;
812
+ let cell;
813
+ let rowModel;
814
+ let rIndex;
815
+ let cIndex;
816
+ let colModel;
817
+ let cellModel;
818
+ let a1;
819
+ let mergeState;
820
+ const freezeLeft = this.freezeLeft || 0;
821
+ // const freezeTop = this.freezeTop || 0;
822
+ const offset = this.rowHeaderCount;
823
+ const merges = this.model.merges;
824
+ const rowNumbers = this.model.options.rowNumbers;
825
+ const viewport = this.viewport;
826
+ const viewportRange = this.viewportRange;
827
+ if (!viewportRange)
828
+ return;
829
+ const mainRange = new CellRange(this.colOffset + freezeLeft, this.rowOffset, // + freezeTop,
830
+ viewportRange.c2, viewportRange.r2);
831
+ this.rowMap.clear();
832
+ for (let r = 0; r < this.bRows.length; r++) {
833
+ row = this.bRows[r];
834
+ if (r < viewport.rows.length) {
835
+ rowModel = viewport.rows[r];
836
+ rIndex = rowModel.index;
837
+ if (this.model.autofitRows.has(rIndex)) {
838
+ this.grid.rendering.autofitRow(rIndex, false, false);
839
+ this.model.autofitRows.delete(rIndex); // use autofit only once for performance reasons
840
+ }
841
+ dom.setSize(row, { h: rowModel.height });
842
+ if (rowModel.height < this.model.options.rowHeight) {
843
+ dom.setLineHeight(row, rowModel.height);
844
+ }
845
+ this.rowMap.set(rIndex, r);
846
+ if (rowNumbers) {
847
+ cell = row.children[offset - 1];
848
+ cell.className = 'vlabel';
849
+ cell.r = rIndex;
850
+ cell.c = -1;
851
+ cell.innerHTML = `<div>${encodeRow(rIndex)}</div>`;
852
+ }
853
+ for (let c = offset; c < row.children.length; c++) {
854
+ cell = row.children[c];
855
+ if (c - offset < viewport.columns.length) {
856
+ colModel = viewport.columns[c - offset];
857
+ cIndex = colModel.index;
858
+ cell.r = rIndex;
859
+ cell.c = cIndex;
860
+ cellModel = rowModel.cell(cIndex);
861
+ a1 = cellModel.address;
862
+ mergeState = merges.getMergeState(a1);
863
+ if (mergeState == MergeCellState.HIDDEN) {
864
+ const merge = merges.hiddenCells.get(cellModel.address);
865
+ const inter = mainRange.intersect(new CellRange(merge.c, merge.r, merge.c + merge.cs - 1, merge.r + merge.rs - 1));
866
+ if (inter && cellModel.c == inter.c1 && cellModel.r == inter.r1) {
867
+ // top left cell of the merged range
868
+ cellModel = this.model.rows[merge.r].cell(merge.c);
869
+ cell.colSpan = inter.size.columns;
870
+ cell.rowSpan = inter.size.rows;
871
+ cell.c = cellModel.c;
872
+ cell.r = cellModel.r;
873
+ }
874
+ else {
875
+ dom.hideCell(cell);
876
+ continue;
877
+ }
878
+ }
879
+ else if (mergeState == MergeCellState.MERGED) {
880
+ const merge = cellModel.merge;
881
+ cell.colSpan = merge.cs;
882
+ cell.rowSpan = merge.rs;
883
+ }
884
+ else {
885
+ cell.colSpan = 1;
886
+ cell.rowSpan = 1;
887
+ }
888
+ dom.showCell(cell);
889
+ this.renderBodyCell(cellModel, cell);
890
+ // this.scheduleRenderBodyCell(cellModel, cell);
891
+ }
892
+ else {
893
+ dom.hideCell(cell);
894
+ }
895
+ }
896
+ row.style.display = 'table-row';
897
+ row.className = rowModel.filterState > 1 ? `filtered` : '';
898
+ }
899
+ else {
900
+ row.style.display = 'none';
901
+ }
902
+ }
903
+ }
904
+ scheduleRenderBodyCell(cellModel, cell) {
905
+ if (this.cellRenderSchedules.has(cell)) {
906
+ window.clearTimeout(this.cellRenderSchedules.get(cell));
907
+ this.cellRenderSchedules.delete(cell);
908
+ }
909
+ this.cellRenderSchedules.set(cell, window.setTimeout(() => this.renderBodyCell(cellModel, cell)));
910
+ }
911
+ fixCellBorders(cell, style) {
912
+ if (style.bottom?.style == 'none') {
913
+ cell.style.borderBottomColor = 'transparent';
914
+ }
915
+ if (style.top?.style == 'none') {
916
+ cell.style.borderTop = 'transparent';
917
+ }
918
+ if (style.right?.style == 'none') {
919
+ cell.style.borderRight = 'transparent';
920
+ }
921
+ if (style.left?.style == 'none') {
922
+ cell.style.borderLeft = 'transparent';
923
+ }
924
+ }
925
+ renderBodyCell(cellModel, cell) {
926
+ const force = !cell;
927
+ cell = cell || this.getCellByCellModel(cellModel);
928
+ if (cell) {
929
+ let div = (force ? null : this.bCache.get(cellModel.c, cellModel.r));
930
+ if (!div) {
931
+ div = dom.createElement('div');
932
+ getCellRenderer(cellModel).call(this, div, cellModel);
933
+ this.bCache.set(cellModel.c, cellModel.r, div);
934
+ }
935
+ if (this.renderAll) {
936
+ // do this only when rendering all cells for performance reasons, good for exports to raw html
937
+ const s = cellModel.composedStyle;
938
+ if (s)
939
+ this.fixCellBorders(cell, s);
940
+ }
941
+ dom.empty(cell);
942
+ cell.appendChild(div);
943
+ }
944
+ else {
945
+ this.bCache.delete(cellModel.c, cellModel.r);
946
+ }
947
+ }
948
+ mergeBodyCells(mergedCells) {
949
+ let cell;
950
+ const skipSet = new Set();
951
+ for (const m of mergedCells) {
952
+ cell = this.bRows[m.r].cells[m.c];
953
+ if (!cell || skipSet.has(cell))
954
+ continue;
955
+ for (let r = m.r; r < m.r + m.rs; r++) {
956
+ for (let c = m.c; c < m.c + m.cs; c++) {
957
+ cell = this.bRows[r].cells[c];
958
+ if (!cell)
959
+ continue;
960
+ if (r == m.r && c == m.c) {
961
+ cell.colSpan = m.cs;
962
+ cell.rowSpan = m.rs;
963
+ }
964
+ else {
965
+ skipSet.add(cell);
966
+ dom.hideCell(cell);
967
+ }
968
+ }
969
+ }
970
+ }
971
+ }
972
+ renderRowTree() {
973
+ if (!this.model.hasRowTreeEnabled)
974
+ return;
975
+ let cell;
976
+ const viewport = this.viewport;
977
+ const cIndex = -this.rowHeaderCount;
978
+ for (let r = 0; r < this.bRows.length; r++) {
979
+ cell = this.bRows[r].children[0];
980
+ cell.innerHTML = '';
981
+ if (r < viewport.rows.length) {
982
+ cell.className = 'vtree';
983
+ this.renderRowTreeCell(cIndex, viewport.rows[r], cell);
984
+ }
985
+ }
986
+ }
987
+ renderRowTreeCell(cIndex, row, th) {
988
+ let div = this.bCache.get(cIndex, row.index);
989
+ if (!div) {
990
+ div = dom.createElement('div');
991
+ this.bCache.set(cIndex, row.index, div);
992
+ const rowHeight = row.height + 1;
993
+ const treeColWidth = this.treeHeaderWidth / this.model.maxRowLevel;
994
+ if (row.hasChildren) {
995
+ const expander = new Expander();
996
+ expander.addEventListener('toggle', () => this.grid.rendering.toggleRow(row.index));
997
+ th.parentElement.expander = expander;
998
+ div.expander = expander;
999
+ div.appendChild(expander);
1000
+ dom.setPosition(expander, {
1001
+ t: rowHeight / 2 - constants.EXPANDER_SIZE / 2,
1002
+ l: row.level * treeColWidth + treeColWidth / 2 - constants.EXPANDER_SIZE / 2
1003
+ });
1004
+ const line = this.createExpanderLine('v');
1005
+ div.appendChild(line);
1006
+ dom.setPosition(line, {
1007
+ t: this.model.options.rowTree.reversed ? 0 : (rowHeight / 2),
1008
+ l: row.level * treeColWidth + treeColWidth / 2
1009
+ });
1010
+ dom.setSize(line, {
1011
+ w: treeColWidth / 2,
1012
+ h: rowHeight / 2 + 1
1013
+ });
1014
+ }
1015
+ if (row.hasParent) {
1016
+ let parent = row;
1017
+ while (parent.hasParent) {
1018
+ parent = parent.parent;
1019
+ const line = this.createExpanderLine('v');
1020
+ div.appendChild(line);
1021
+ dom.setSize(line, {
1022
+ w: treeColWidth / 2,
1023
+ h: rowHeight + 2
1024
+ });
1025
+ dom.setPosition(line, {
1026
+ t: -1,
1027
+ l: parent.level * treeColWidth + treeColWidth / 2
1028
+ });
1029
+ }
1030
+ }
1031
+ }
1032
+ if (div.expander)
1033
+ div.expander.state = row.collapsed ? 'closed' : 'open';
1034
+ th.appendChild(div);
1035
+ }
1036
+ };
1037
+ Table.styles = [tableStyles];
1038
+ __decorate([
1039
+ property({ type: Object })
1040
+ ], Table.prototype, "model", void 0);
1041
+ __decorate([
1042
+ property({ type: Boolean, reflect: true })
1043
+ ], Table.prototype, "hideOuterBorder", void 0);
1044
+ __decorate([
1045
+ property({ type: Number, hasChanged: () => false })
1046
+ ], Table.prototype, "rowOffset", void 0);
1047
+ __decorate([
1048
+ property({ type: Number, hasChanged: () => false })
1049
+ ], Table.prototype, "colOffset", void 0);
1050
+ __decorate([
1051
+ property({ type: Number, reflect: true })
1052
+ ], Table.prototype, "zoom", void 0);
1053
+ __decorate([
1054
+ property({ type: Boolean, reflect: true })
1055
+ ], Table.prototype, "nogrid", void 0);
1056
+ __decorate([
1057
+ property({ type: Boolean, reflect: true })
1058
+ ], Table.prototype, "renderAll", void 0);
1059
+ Table = __decorate([
1060
+ customElement('og-table')
1061
+ ], Table);
1062
+ export { Table };
1063
+ //# sourceMappingURL=table.js.map