@aquera/nile-elements 1.5.1 → 1.5.2
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.
- package/README.md +3 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +19 -7
- package/dist/nile-grid/index.cjs.js +1 -1
- package/dist/nile-grid/index.esm.js +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.esm.js +2 -0
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.esm.js +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.esm.js +1 -1
- package/dist/nile-grid/nile-grid-head/nile-grid-head.css.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-head/nile-grid-head.css.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid-head/nile-grid-head.css.esm.js +8 -2
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.esm.js +2 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.esm.js +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.esm.js +1 -1
- package/dist/nile-grid/nile-grid.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid.css.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.css.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid.css.esm.js +1 -0
- package/dist/nile-grid/nile-grid.esm.js +5 -3
- package/dist/nile-grid/nile-grid.layout.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.layout.esm.js +1 -1
- package/dist/nile-grid/nile-grid.resize.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.resize.esm.js +1 -1
- package/dist/nile-grid/nile-grid.utils.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.utils.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid.utils.esm.js +1 -1
- package/dist/nile-grid/nile-grid.width.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.width.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid.width.esm.js +1 -1
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.js +2 -0
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.js.map +1 -1
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.js +1 -1
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.js.map +1 -1
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.d.ts +1 -1
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.js +2 -2
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.js.map +1 -1
- package/dist/src/nile-grid/nile-grid-head/nile-grid-head.css.js +6 -0
- package/dist/src/nile-grid/nile-grid-head/nile-grid-head.css.js.map +1 -1
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.css.js +2 -1
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.css.js.map +1 -1
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.js +1 -1
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.js.map +1 -1
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.d.ts +1 -1
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.js +2 -2
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.css.js +1 -0
- package/dist/src/nile-grid/nile-grid.css.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.d.ts +30 -3
- package/dist/src/nile-grid/nile-grid.js +102 -29
- package/dist/src/nile-grid/nile-grid.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.layout.d.ts +2 -9
- package/dist/src/nile-grid/nile-grid.layout.js +120 -106
- package/dist/src/nile-grid/nile-grid.layout.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.resize.d.ts +1 -0
- package/dist/src/nile-grid/nile-grid.resize.js +7 -3
- package/dist/src/nile-grid/nile-grid.resize.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.utils.d.ts +1 -0
- package/dist/src/nile-grid/nile-grid.utils.js +24 -2
- package/dist/src/nile-grid/nile-grid.utils.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.width.d.ts +2 -1
- package/dist/src/nile-grid/nile-grid.width.js +38 -8
- package/dist/src/nile-grid/nile-grid.width.js.map +1 -1
- package/dist/src/nile-grid/types/nile-grid.types.d.ts +5 -0
- package/dist/src/nile-grid/types/nile-grid.types.js.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.ts +2 -0
- package/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.ts +1 -1
- package/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.ts +2 -1
- package/src/nile-grid/nile-grid-head/nile-grid-head.css.ts +6 -0
- package/src/nile-grid/nile-grid-head-item/nile-grid-head-item.css.ts +2 -1
- package/src/nile-grid/nile-grid-head-item/nile-grid-head-item.ts +1 -1
- package/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.ts +2 -1
- package/src/nile-grid/nile-grid.css.ts +1 -0
- package/src/nile-grid/nile-grid.layout.ts +122 -133
- package/src/nile-grid/nile-grid.resize.ts +15 -9
- package/src/nile-grid/nile-grid.ts +96 -27
- package/src/nile-grid/nile-grid.utils.ts +27 -2
- package/src/nile-grid/nile-grid.width.ts +45 -14
- package/src/nile-grid/types/nile-grid.types.ts +7 -1
- package/vscode-html-custom-data.json +3 -3
|
@@ -9,9 +9,10 @@ import { html, CSSResultArray, TemplateResult } from 'lit';
|
|
|
9
9
|
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
10
10
|
import { styles } from './nile-grid.css';
|
|
11
11
|
import NileElement from '../internal/nile-element';
|
|
12
|
-
import {
|
|
12
|
+
import { syncStickyShadows, layout } from './nile-grid.layout';
|
|
13
13
|
import { listenToEventListeners, removeEventListeners, getHead, getBody } from './nile-grid.utils';
|
|
14
|
-
import { computeNewWidth, resizeWithScroll,
|
|
14
|
+
import { computeNewWidth, resizeWithScroll, resizeNoScroll, updateResizeGuides } from './nile-grid.resize';
|
|
15
|
+
import { PrefixColumn } from './types/nile-grid.types';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Nile grid component.
|
|
@@ -29,9 +30,6 @@ export class NileGrid extends NileElement {
|
|
|
29
30
|
return [styles];
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
/** To set the grid template columns in rebuildTemplate method */
|
|
33
|
-
@state() public colTemplate = '';
|
|
34
|
-
|
|
35
33
|
/** To store the column widths in the beginning and after resizing */
|
|
36
34
|
@state() public columnWidths: number[] = [];
|
|
37
35
|
|
|
@@ -44,8 +42,14 @@ export class NileGrid extends NileElement {
|
|
|
44
42
|
/** To get the last resize line to show the resize handle */
|
|
45
43
|
@query('.nile-resize-end') resizeEnd: HTMLElement;
|
|
46
44
|
|
|
45
|
+
/** To get the last resize line to show the resize handle */
|
|
46
|
+
@query('.shadow-left') shadowLeft: HTMLElement;
|
|
47
|
+
|
|
48
|
+
/** To get the last resize line to show the resize handle */
|
|
49
|
+
@query('.shadow-right') shadowRight: HTMLElement;
|
|
50
|
+
|
|
47
51
|
/** To enable horizontal scrolling when user is resizing */
|
|
48
|
-
@property({ type: Boolean, attribute: true, reflect: true })
|
|
52
|
+
@property({ type: Boolean, attribute: true, reflect: true }) enableScroll: boolean = false;
|
|
49
53
|
|
|
50
54
|
/** To enable hoverable rows */
|
|
51
55
|
@property({ type: Boolean, attribute: true, reflect: true }) hoverable: boolean = false;
|
|
@@ -81,6 +85,61 @@ export class NileGrid extends NileElement {
|
|
|
81
85
|
/** To check if the widths are initialized */
|
|
82
86
|
@state() public lockedWidthColumns: boolean[] = [];
|
|
83
87
|
|
|
88
|
+
/** prefix columns width */
|
|
89
|
+
@state() public prefixSumColumnsWidth: PrefixColumn[] = [];
|
|
90
|
+
|
|
91
|
+
/** prefix columns width */
|
|
92
|
+
@state() public stickyColumns: number[] = [];
|
|
93
|
+
|
|
94
|
+
/** body rows */
|
|
95
|
+
@state() public bodyRows: HTMLElement[] = [];
|
|
96
|
+
|
|
97
|
+
/** head rows */
|
|
98
|
+
@state() public headRows: HTMLElement[] = [];
|
|
99
|
+
|
|
100
|
+
@state() public needsStructureLayout = false;
|
|
101
|
+
|
|
102
|
+
@state() public needsWidthLayout = false;
|
|
103
|
+
|
|
104
|
+
@state() public needsSpanLayout = false;
|
|
105
|
+
|
|
106
|
+
@state() public colCount = 0;
|
|
107
|
+
|
|
108
|
+
public shadowLeftVisibleSticky?: boolean;
|
|
109
|
+
|
|
110
|
+
public shadowRightVisibleSticky?: boolean;
|
|
111
|
+
|
|
112
|
+
public stickyLeftHeadEls: HTMLElement[] = [];
|
|
113
|
+
|
|
114
|
+
public stickyRightHeadEls: HTMLElement[] = [];
|
|
115
|
+
|
|
116
|
+
public stickyLeftBodyEls: HTMLElement[] = [];
|
|
117
|
+
|
|
118
|
+
public stickyRightBodyEls: HTMLElement[] = [];
|
|
119
|
+
|
|
120
|
+
private resizeTimer: any = 0;
|
|
121
|
+
|
|
122
|
+
/** To throttle sticky shadow updates */
|
|
123
|
+
private shadowRaf = 0;
|
|
124
|
+
|
|
125
|
+
constructor() {
|
|
126
|
+
super();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
connectedCallback(): void {
|
|
130
|
+
super.connectedCallback();
|
|
131
|
+
this.emit('nile-init');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private syncStickyShadowsRaf = () => {
|
|
135
|
+
if (this.shadowRaf) return;
|
|
136
|
+
this.shadowRaf = requestAnimationFrame(() => {
|
|
137
|
+
this.shadowRaf = 0;
|
|
138
|
+
syncStickyShadows(this);
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
|
|
84
143
|
private scheduleLayout() {
|
|
85
144
|
if (this.raf) cancelAnimationFrame(this.raf);
|
|
86
145
|
this.raf = requestAnimationFrame(() => {
|
|
@@ -89,7 +148,6 @@ export class NileGrid extends NileElement {
|
|
|
89
148
|
this,
|
|
90
149
|
this.slotEl,
|
|
91
150
|
this.ensureWidths.bind(this),
|
|
92
|
-
rebuildTemplate,
|
|
93
151
|
this.stickyLeftIndexes,
|
|
94
152
|
this.stickyRightIndexes
|
|
95
153
|
);
|
|
@@ -99,8 +157,8 @@ export class NileGrid extends NileElement {
|
|
|
99
157
|
|
|
100
158
|
private ensureWidths(colCount: number) {
|
|
101
159
|
if (this.columnWidths.length !== colCount) {
|
|
102
|
-
this.columnWidths = Array(colCount).fill(
|
|
103
|
-
this.lockedWidthColumns = Array(colCount).fill(false);
|
|
160
|
+
this.columnWidths = Array(colCount).fill(0);
|
|
161
|
+
this.lockedWidthColumns = Array(colCount).fill(false);
|
|
104
162
|
}
|
|
105
163
|
}
|
|
106
164
|
|
|
@@ -123,16 +181,16 @@ export class NileGrid extends NileElement {
|
|
|
123
181
|
});
|
|
124
182
|
|
|
125
183
|
if (delta0 === 0) {
|
|
126
|
-
|
|
184
|
+
updateResizeGuides(this, col);
|
|
127
185
|
return;
|
|
128
186
|
}
|
|
129
187
|
|
|
130
|
-
if (!this.
|
|
188
|
+
if (!this.enableScroll) {
|
|
131
189
|
resizeNoScroll({ grid: this, col, prevW, newW, floor: this.minColumnWidth });
|
|
132
190
|
} else {
|
|
133
191
|
resizeWithScroll({ grid: this, col, newW });
|
|
134
192
|
}
|
|
135
|
-
|
|
193
|
+
updateResizeGuides(this, col);
|
|
136
194
|
};
|
|
137
195
|
|
|
138
196
|
protected firstUpdated() {
|
|
@@ -143,47 +201,57 @@ export class NileGrid extends NileElement {
|
|
|
143
201
|
this.slotEl,
|
|
144
202
|
this._attachObserverAndLayout.bind(this)
|
|
145
203
|
);
|
|
146
|
-
this.addEventListener('scroll',
|
|
204
|
+
this.addEventListener('scroll', this.syncStickyShadowsRaf);
|
|
147
205
|
this.resizeObserverStickyShadows = new ResizeObserver(() => syncStickyShadows(this));
|
|
148
206
|
this.resizeObserverStickyShadows.observe(this);
|
|
149
|
-
|
|
207
|
+
this.syncStickyShadowsRaf();
|
|
150
208
|
}
|
|
151
209
|
|
|
152
210
|
private _attachObserverAndLayout() {
|
|
153
211
|
this.mo?.disconnect();
|
|
154
212
|
this.mo = new MutationObserver(() => {
|
|
213
|
+
this.needsStructureLayout = true;
|
|
214
|
+
this.needsWidthLayout = true;
|
|
215
|
+
this.needsSpanLayout = true;
|
|
155
216
|
this.scheduleLayout();
|
|
156
217
|
});
|
|
157
218
|
this.resizeObserver?.disconnect();
|
|
158
219
|
this.resizeObserver = new ResizeObserver(() => {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
this.
|
|
162
|
-
this.
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
this.stickyRightIndexes
|
|
166
|
-
);
|
|
220
|
+
if (this.resizeTimer) clearTimeout(this.resizeTimer);
|
|
221
|
+
this.resizeTimer = setTimeout(() => {
|
|
222
|
+
this.resizeTimer = 0;
|
|
223
|
+
this.needsWidthLayout = true;
|
|
224
|
+
this.scheduleLayout();
|
|
225
|
+
}, 16);
|
|
167
226
|
});
|
|
168
227
|
|
|
169
228
|
const head = getHead(this.slotEl);
|
|
170
229
|
const body = getBody(this.slotEl);
|
|
230
|
+
|
|
171
231
|
if (!head && !body) return;
|
|
172
|
-
|
|
173
|
-
const target = body ?? this;
|
|
232
|
+
const target = head ?? this;
|
|
174
233
|
this.mo.observe(target, {
|
|
175
|
-
subtree: true,
|
|
176
234
|
childList: true,
|
|
235
|
+
subtree: true,
|
|
177
236
|
attributes: true,
|
|
178
|
-
attributeFilter: ['colspan', 'rowspan']
|
|
237
|
+
attributeFilter: ['colspan', 'rowspan', 'width', 'lockwidth', 'sticky']
|
|
179
238
|
});
|
|
180
239
|
this.resizeObserver?.observe(this);
|
|
240
|
+
|
|
241
|
+
if (!this.colCount || !this.columnWidths?.length) {
|
|
242
|
+
this.needsStructureLayout = true;
|
|
243
|
+
this.needsSpanLayout = true;
|
|
244
|
+
this.needsWidthLayout = true;
|
|
245
|
+
this.scheduleLayout();
|
|
246
|
+
}
|
|
181
247
|
}
|
|
182
248
|
|
|
183
249
|
public render(): TemplateResult {
|
|
184
250
|
return html`
|
|
185
251
|
<div part="grid-base" class="nile-grid-base">
|
|
186
|
-
<
|
|
252
|
+
<div part="grid-slot-wrapper">
|
|
253
|
+
<slot part="grid-slot"></slot>
|
|
254
|
+
</div>
|
|
187
255
|
<div part="resize-start" class="nile-resize-start"></div>
|
|
188
256
|
<div part="resize-end" class="nile-resize-end"></div>
|
|
189
257
|
</div>
|
|
@@ -191,6 +259,7 @@ export class NileGrid extends NileElement {
|
|
|
191
259
|
}
|
|
192
260
|
|
|
193
261
|
disconnectedCallback(): void {
|
|
262
|
+
this.emit('nile-destroy');
|
|
194
263
|
super.disconnectedCallback?.();
|
|
195
264
|
this.mo?.disconnect();
|
|
196
265
|
this.resizeObserver?.disconnect();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NileGrid } from './nile-grid';
|
|
2
|
+
import { applyAfterResize } from './nile-grid.resize'
|
|
2
3
|
|
|
3
4
|
/** listenToEventListeners
|
|
4
5
|
* @param nileGrid Grid element to attach listeners on
|
|
@@ -14,14 +15,18 @@ export const listenToEventListeners = (
|
|
|
14
15
|
_attachObserverAndLayout: any
|
|
15
16
|
) => {
|
|
16
17
|
nileGrid.addEventListener('nile-column-resize', onResize);
|
|
17
|
-
nileGrid.addEventListener('nile-resize-start', () => {
|
|
18
|
+
nileGrid.addEventListener('nile-resize-start', (e) => {
|
|
19
|
+
e.stopPropagation();
|
|
18
20
|
nileGrid.resizeStart.style.display = 'block';
|
|
19
21
|
});
|
|
20
|
-
nileGrid.addEventListener('nile-resize-end', () => {
|
|
22
|
+
nileGrid.addEventListener('nile-resize-end', (e: CustomEvent) => {
|
|
23
|
+
e.stopPropagation();
|
|
24
|
+
applyAfterResize(nileGrid, (e as CustomEvent).detail!.col);
|
|
21
25
|
nileGrid.resizeStart.style.display = 'none';
|
|
22
26
|
nileGrid.resizeEnd.style.display = 'none';
|
|
23
27
|
});
|
|
24
28
|
slotEl.addEventListener('slotchange', () => _attachObserverAndLayout());
|
|
29
|
+
nileGrid.addEventListener('scroll', () => scrollEventHandler(nileGrid));
|
|
25
30
|
};
|
|
26
31
|
|
|
27
32
|
/** removeEventListeners
|
|
@@ -46,6 +51,7 @@ export const removeEventListeners = (
|
|
|
46
51
|
nileGrid.resizeEnd.style.display = 'none';
|
|
47
52
|
});
|
|
48
53
|
slotEl.removeEventListener('slotchange', () => _attachObserverAndLayout());
|
|
54
|
+
nileGrid.removeEventListener('scroll', () => scrollEventHandler(nileGrid));
|
|
49
55
|
};
|
|
50
56
|
|
|
51
57
|
/** getHead
|
|
@@ -72,4 +78,23 @@ export const getBody = (slotEl: any) => {
|
|
|
72
78
|
(n: any) => n.tagName.toLowerCase() === 'nile-grid-body'
|
|
73
79
|
) as HTMLElement) || null
|
|
74
80
|
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const scrollEventHandler = (el: NileGrid) => {
|
|
84
|
+
const maxY = Math.max(1, el.scrollHeight - el.clientHeight);
|
|
85
|
+
const maxX = Math.max(1, el.scrollWidth - el.clientWidth);
|
|
86
|
+
|
|
87
|
+
const percentageY = Math.round((el.scrollTop / maxY) * 100);
|
|
88
|
+
const percentageX = Math.round((el.scrollLeft / maxX) * 100);
|
|
89
|
+
|
|
90
|
+
el.emit('nile-scroll', {
|
|
91
|
+
bubbles: true,
|
|
92
|
+
composed: true,
|
|
93
|
+
detail: {
|
|
94
|
+
horizontalScroll: percentageX,
|
|
95
|
+
verticalScroll: percentageY,
|
|
96
|
+
left: el.scrollLeft,
|
|
97
|
+
top: el.scrollTop
|
|
98
|
+
}
|
|
99
|
+
});
|
|
75
100
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NileGrid } from './nile-grid';
|
|
2
2
|
import { applyColumnsTemplate } from './nile-grid.layout';
|
|
3
3
|
import { getHead } from './nile-grid.utils';
|
|
4
|
+
import { PrefixColumn } from './types/nile-grid.types';
|
|
4
5
|
|
|
5
6
|
/** computeColumnWidths
|
|
6
7
|
* @param nileGrid Grid instance (reads minColumnWidth, columnWidths)
|
|
@@ -14,22 +15,18 @@ export function computeColumnWidths(
|
|
|
14
15
|
colCount: number,
|
|
15
16
|
columnWidths: number[],
|
|
16
17
|
slotEl: any,
|
|
17
|
-
lockedWidthColumns: boolean[]
|
|
18
|
+
lockedWidthColumns: boolean[],
|
|
19
|
+
headerChanged: boolean
|
|
18
20
|
): void {
|
|
19
21
|
const minCol = nileGrid.minColumnWidth;
|
|
20
22
|
const containerWidth = getContainerWidth(nileGrid);
|
|
21
|
-
const desired = readDesiredFromHead(
|
|
22
|
-
slotEl,
|
|
23
|
-
colCount,
|
|
24
|
-
containerWidth,
|
|
25
|
-
nileGrid,
|
|
26
|
-
lockedWidthColumns,
|
|
27
|
-
columnWidths
|
|
28
|
-
);
|
|
23
|
+
const desired = readDesiredFromHead(slotEl, colCount, containerWidth, nileGrid, lockedWidthColumns, headerChanged, columnWidths);
|
|
29
24
|
const isSeeded = seedWidthsFromDesired(desired, columnWidths, minCol);
|
|
30
25
|
|
|
31
26
|
distributeFlex(columnWidths, isSeeded, containerWidth, minCol);
|
|
32
|
-
|
|
27
|
+
if(!nileGrid.enableScroll) {
|
|
28
|
+
normalizeToContainer(columnWidths, containerWidth, minCol);
|
|
29
|
+
}
|
|
33
30
|
clampAndRound(columnWidths, minCol);
|
|
34
31
|
applyColumnsTemplate(nileGrid, columnWidths);
|
|
35
32
|
}
|
|
@@ -55,12 +52,18 @@ function readDesiredFromHead(
|
|
|
55
52
|
containerWidth: number,
|
|
56
53
|
nileGrid: NileGrid,
|
|
57
54
|
lockedWidthColumns: boolean[],
|
|
55
|
+
headerChanged: boolean,
|
|
58
56
|
prevWidths?: number[]
|
|
59
57
|
): (number | null)[] {
|
|
60
58
|
const desired = Array(colCount).fill(null);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
if (headerChanged) {
|
|
60
|
+
const head = getHead(slotEl) as HTMLElement | null;
|
|
61
|
+
if (head) fillDesiredFromHeadRows(head, desired, colCount, containerWidth, lockedWidthColumns);
|
|
62
|
+
}
|
|
63
|
+
const hasPrevWidths = !!prevWidths?.length && prevWidths.some(w => w > 0);
|
|
64
|
+
if (hasPrevWidths && prevWidths?.length === colCount) {
|
|
65
|
+
fillFromPrevWidths(desired, prevWidths, nileGrid);
|
|
66
|
+
}
|
|
64
67
|
return desired;
|
|
65
68
|
}
|
|
66
69
|
|
|
@@ -408,4 +411,32 @@ export function giveToRight(widths: number[], start: number, giveInit: number) {
|
|
|
408
411
|
give = 0;
|
|
409
412
|
}
|
|
410
413
|
return give;
|
|
411
|
-
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
export function addVariablesValue(nileGrid: NileGrid) {
|
|
418
|
+
const columnWidths = nileGrid.columnWidths;
|
|
419
|
+
const leftStickyColumns = nileGrid.stickyLeftIndexes;
|
|
420
|
+
const rightStickyColumns = nileGrid.stickyRightIndexes;
|
|
421
|
+
const prefixColumns: PrefixColumn[] = [];
|
|
422
|
+
const root = nileGrid as HTMLElement;
|
|
423
|
+
|
|
424
|
+
// --- LEFT STICKY ---
|
|
425
|
+
let totalLeft = 0;
|
|
426
|
+
for (let i = 0; i < leftStickyColumns.length; i++) {
|
|
427
|
+
const colIndex = leftStickyColumns[i];
|
|
428
|
+
prefixColumns.push({ colNumber: colIndex, left: totalLeft, right: 0 });
|
|
429
|
+
root.style.setProperty(`--sticky-left-${colIndex}`, `${totalLeft}px`);
|
|
430
|
+
totalLeft += columnWidths[colIndex];
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// --- RIGHT STICKY ---
|
|
434
|
+
let totalRight = 0;
|
|
435
|
+
for (let i = rightStickyColumns.length - 1; i >= 0; i--) {
|
|
436
|
+
const colIndex = rightStickyColumns[i];
|
|
437
|
+
prefixColumns.push({ colNumber: colIndex, left: 0, right: totalRight });
|
|
438
|
+
root.style.setProperty(`--sticky-right-${colIndex}`, `${totalRight}px`);
|
|
439
|
+
totalRight += columnWidths[colIndex];
|
|
440
|
+
}
|
|
441
|
+
nileGrid.prefixSumColumnsWidth = prefixColumns;
|
|
442
|
+
}
|
|
@@ -2197,11 +2197,11 @@
|
|
|
2197
2197
|
},
|
|
2198
2198
|
{
|
|
2199
2199
|
"name": "nile-grid",
|
|
2200
|
-
"description": "Nile grid component.\n\nAttributes:\n\n * `
|
|
2200
|
+
"description": "Nile grid component.\n\nAttributes:\n\n * `enableScroll` {`boolean`} - To enable horizontal scrolling when user is resizing\n\n * `hoverable` {`boolean`} - To enable hoverable rows\n\n * `minColumnWidth` {`number`} - Minimum column width\n\nProperties:\n\n * `columnWidths` {`number[]`} - To store the column widths in the beginning and after resizing\n\n * `slotEl` {`HTMLSlotElement`} - To get the slot element\n\n * `resizeStart` {`HTMLElement`} - To get the first resize line to show the resize handle\n\n * `resizeEnd` {`HTMLElement`} - To get the last resize line to show the resize handle\n\n * `shadowLeft` {`HTMLElement`} - To get the last resize line to show the resize handle\n\n * `shadowRight` {`HTMLElement`} - To get the last resize line to show the resize handle\n\n * `enableScroll` {`boolean`} - To enable horizontal scrolling when user is resizing\n\n * `hoverable` {`boolean`} - To enable hoverable rows\n\n * `mo` {`MutationObserver | undefined`} - To store the mutation observer\n\n * `resizeObserver` - To store the resize observer\n\n * `resizeObserverStickyShadows` - \n\n * `raf` {`number`} - To store the request animation frame\n\n * `minColumnWidth` {`number`} - Minimum column width\n\n * `stickyLeftIndexes` {`number[]`} - To store the sticky index's\n\n * `stickyRightIndexes` {`number[]`} - To store the sticky index's\n\n * `cellHeight` {`number | null`} - To calculate the rowspan height\n\n * `headHeight` {`number | null`} - \n\n * `widthsInitialized` {`boolean`} - To check if the widths are initialized\n\n * `lockedWidthColumns` {`boolean[]`} - To check if the widths are initialized\n\n * `prefixSumColumnsWidth` {`PrefixColumn[]`} - prefix columns width\n\n * `stickyColumns` {`number[]`} - prefix columns width\n\n * `bodyRows` {`HTMLElement[]`} - body rows\n\n * `headRows` {`HTMLElement[]`} - head rows\n\n * `needsStructureLayout` {`boolean`} - \n\n * `needsWidthLayout` {`boolean`} - \n\n * `needsSpanLayout` {`boolean`} - \n\n * `colCount` {`number`} - \n\n * `shadowLeftVisibleSticky` {`boolean | undefined`} - \n\n * `shadowRightVisibleSticky` {`boolean | undefined`} - \n\n * `stickyLeftHeadEls` {`HTMLElement[]`} - \n\n * `stickyRightHeadEls` {`HTMLElement[]`} - \n\n * `stickyLeftBodyEls` {`HTMLElement[]`} - \n\n * `stickyRightBodyEls` {`HTMLElement[]`} - \n\n * `resizeTimer` - \n\n * `shadowRaf` {`number`} - To throttle sticky shadow updates\n\n * `syncStickyShadowsRaf` - \n\n * `onResize` - \n\n * `BUBBLES` {`boolean`} - \n\n * `COMPOSED` {`boolean`} - \n\n * `CANCELABLE` {`boolean`} - ",
|
|
2201
2201
|
"attributes": [
|
|
2202
2202
|
{
|
|
2203
|
-
"name": "
|
|
2204
|
-
"description": "`
|
|
2203
|
+
"name": "enableScroll",
|
|
2204
|
+
"description": "`enableScroll` {`boolean`} - To enable horizontal scrolling when user is resizing\n\nProperty: enableScroll\n\nDefault: false",
|
|
2205
2205
|
"valueSet": "v"
|
|
2206
2206
|
},
|
|
2207
2207
|
{
|