@aquera/nile-elements 1.1.3-beta-1.4 → 1.1.3-beta-2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/index.html +124 -24
- package/dist/index.js +729 -770
- 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 +4 -8
- package/dist/nile-grid/nile-grid.esm.js +6 -6
- 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-body/nile-grid-body.cjs.js +1 -1
- package/dist/nile-grid-body/nile-grid-body.cjs.js.map +1 -1
- package/dist/nile-grid-body/nile-grid-body.css.cjs.js +1 -1
- package/dist/nile-grid-body/nile-grid-body.css.cjs.js.map +1 -1
- package/dist/nile-grid-body/nile-grid-body.css.esm.js +4 -0
- package/dist/nile-grid-body/nile-grid-body.esm.js +3 -3
- package/dist/nile-grid-cell-item/nile-grid-cell-item.cjs.js +1 -1
- package/dist/nile-grid-cell-item/nile-grid-cell-item.cjs.js.map +1 -1
- package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js +1 -1
- package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js.map +1 -1
- package/dist/nile-grid-cell-item/nile-grid-cell-item.css.esm.js +3 -18
- package/dist/nile-grid-cell-item/nile-grid-cell-item.esm.js +3 -3
- package/dist/nile-grid-head/nile-grid-head.cjs.js +1 -1
- package/dist/nile-grid-head/nile-grid-head.cjs.js.map +1 -1
- package/dist/nile-grid-head/nile-grid-head.css.cjs.js +1 -1
- package/dist/nile-grid-head/nile-grid-head.css.cjs.js.map +1 -1
- package/dist/nile-grid-head/nile-grid-head.css.esm.js +1 -1
- package/dist/nile-grid-head/nile-grid-head.esm.js +3 -3
- package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js +1 -1
- package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js.map +1 -1
- package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js +1 -1
- package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js.map +1 -1
- package/dist/nile-grid-head-item/nile-grid-head-item.css.esm.js +5 -20
- package/dist/nile-grid-head-item/nile-grid-head-item.esm.js +3 -4
- package/dist/nile-grid-row/nile-grid-row.cjs.js +1 -1
- package/dist/nile-grid-row/nile-grid-row.cjs.js.map +1 -1
- package/dist/nile-grid-row/nile-grid-row.css.cjs.js +1 -1
- package/dist/nile-grid-row/nile-grid-row.css.cjs.js.map +1 -1
- package/dist/nile-grid-row/nile-grid-row.css.esm.js +5 -17
- package/dist/nile-grid-row/nile-grid-row.esm.js +5 -4
- package/dist/nile-select/nile-select.cjs.js +1 -1
- package/dist/nile-select/nile-select.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.esm.js +2 -2
- package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
- package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
- package/dist/nile-select/virtual-scroll-helper.esm.js +1 -0
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js +2 -2
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.esm.js +7 -6
- package/dist/src/nile-grid/nile-grid.css.js +2 -6
- package/dist/src/nile-grid/nile-grid.css.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.d.ts +3 -9
- package/dist/src/nile-grid/nile-grid.js +20 -96
- package/dist/src/nile-grid/nile-grid.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.utils.d.ts +2 -3
- package/dist/src/nile-grid/nile-grid.utils.js +81 -223
- package/dist/src/nile-grid/nile-grid.utils.js.map +1 -1
- package/dist/src/nile-grid-body/nile-grid-body.css.js +4 -0
- package/dist/src/nile-grid-body/nile-grid-body.css.js.map +1 -1
- package/dist/src/nile-grid-body/nile-grid-body.js +1 -1
- package/dist/src/nile-grid-body/nile-grid-body.js.map +1 -1
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js +2 -17
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js.map +1 -1
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.d.ts +3 -0
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.js +11 -1
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.js.map +1 -1
- package/dist/src/nile-grid-head/nile-grid-head.css.js +1 -1
- package/dist/src/nile-grid-head/nile-grid-head.css.js.map +1 -1
- package/dist/src/nile-grid-head/nile-grid-head.js +1 -1
- package/dist/src/nile-grid-head/nile-grid-head.js.map +1 -1
- package/dist/src/nile-grid-head-item/nile-grid-head-item.css.js +3 -18
- package/dist/src/nile-grid-head-item/nile-grid-head-item.css.js.map +1 -1
- package/dist/src/nile-grid-head-item/nile-grid-head-item.d.ts +2 -3
- package/dist/src/nile-grid-head-item/nile-grid-head-item.js +11 -14
- package/dist/src/nile-grid-head-item/nile-grid-head-item.js.map +1 -1
- package/dist/src/nile-grid-row/nile-grid-row.css.js +5 -17
- package/dist/src/nile-grid-row/nile-grid-row.css.js.map +1 -1
- package/dist/src/nile-grid-row/nile-grid-row.d.ts +1 -4
- package/dist/src/nile-grid-row/nile-grid-row.js +4 -19
- package/dist/src/nile-grid-row/nile-grid-row.js.map +1 -1
- package/dist/src/nile-select/nile-select.d.ts +1 -0
- package/dist/src/nile-select/nile-select.js +4 -0
- package/dist/src/nile-select/nile-select.js.map +1 -1
- package/dist/src/nile-select/virtual-scroll-helper.js +1 -0
- package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
- package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +18 -0
- package/dist/src/nile-virtual-select/nile-virtual-select.js +230 -3
- package/dist/src/nile-virtual-select/nile-virtual-select.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.css.ts +2 -6
- package/src/nile-grid/nile-grid.ts +21 -124
- package/src/nile-grid/nile-grid.utils.ts +98 -353
- package/src/nile-grid-body/nile-grid-body.css.ts +4 -0
- package/src/nile-grid-body/nile-grid-body.ts +2 -2
- package/src/nile-grid-cell-item/nile-grid-cell-item.css.ts +2 -17
- package/src/nile-grid-cell-item/nile-grid-cell-item.ts +11 -3
- package/src/nile-grid-head/nile-grid-head.css.ts +1 -1
- package/src/nile-grid-head/nile-grid-head.ts +2 -2
- package/src/nile-grid-head-item/nile-grid-head-item.css.ts +3 -18
- package/src/nile-grid-head-item/nile-grid-head-item.ts +16 -8
- package/src/nile-grid-row/nile-grid-row.css.ts +5 -17
- package/src/nile-grid-row/nile-grid-row.ts +6 -9
- package/src/nile-select/nile-select.ts +2 -0
- package/src/nile-select/virtual-scroll-helper.ts +1 -0
- package/src/nile-virtual-select/nile-virtual-select.ts +257 -3
- package/vscode-html-custom-data.json +75 -38
- package/src/nile-grid/nile-grid.types.ts +0 -1
|
@@ -1,39 +1,41 @@
|
|
|
1
1
|
import { NileGrid } from './nile-grid';
|
|
2
|
-
import { HeadItemEl } from './nile-grid.types';
|
|
3
2
|
|
|
4
3
|
export const resizeLinesHandler = (
|
|
5
|
-
resizeStart:
|
|
6
|
-
resizeEnd:
|
|
4
|
+
resizeStart: any,
|
|
5
|
+
resizeEnd: any,
|
|
7
6
|
col: number,
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
widthPx: number,
|
|
8
|
+
scrollHeight: any,
|
|
9
|
+
columnWidths: any,
|
|
10
|
+
e: any
|
|
10
11
|
) => {
|
|
11
12
|
resizeStart.style.display = 'block';
|
|
12
13
|
resizeEnd.style.display = 'block';
|
|
13
14
|
resizeStart.style.height = scrollHeight + 'px';
|
|
14
15
|
resizeEnd.style.height = scrollHeight + 'px';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
16
|
+
if (col === 0) {
|
|
17
|
+
resizeStart.style.left = `${Math.max(60, widthPx) - 6}px`;
|
|
18
|
+
resizeEnd.style.left = `${Math.max(60, widthPx) - 2}px`;
|
|
19
|
+
} else {
|
|
20
|
+
let totalWidth = 0;
|
|
21
|
+
if (
|
|
22
|
+
(e.target as HTMLElement).getAttribute('colspan') &&
|
|
23
|
+
parseInt((e.target as HTMLElement).getAttribute('colspan')!) > 1
|
|
24
|
+
) {
|
|
25
|
+
widthPx = widthPx - columnWidths[col - 1];
|
|
26
|
+
for (let i = 0; i < col; i++) {
|
|
27
|
+
totalWidth += columnWidths[i];
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
for (let i = 0; i < col; i++) {
|
|
31
|
+
totalWidth += columnWidths[i];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
resizeStart.style.left = `${totalWidth + Math.max(60, widthPx) - 6}px`;
|
|
35
|
+
resizeEnd.style.left = `${totalWidth + Math.max(60, widthPx) - 2}px`;
|
|
36
|
+
}
|
|
34
37
|
};
|
|
35
38
|
|
|
36
|
-
|
|
37
39
|
export const listenToEventListeners = (
|
|
38
40
|
nileGrid: NileGrid,
|
|
39
41
|
onResize: any,
|
|
@@ -111,280 +113,108 @@ export const applyTemplate = (
|
|
|
111
113
|
if (head) head.style.gridTemplateColumns = colTemplate;
|
|
112
114
|
if (body) {
|
|
113
115
|
body.style.gridTemplateColumns = colTemplate;
|
|
116
|
+
body.style.overflowX = 'auto';
|
|
114
117
|
}
|
|
115
118
|
};
|
|
116
119
|
|
|
117
|
-
function
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
colCount: number
|
|
121
|
-
stickyLeftIndexes: number[],
|
|
122
|
-
stickyRightIndexes: number[],
|
|
123
|
-
columnWidths: number[],
|
|
124
|
-
opts: {
|
|
125
|
-
itemSelector: string;
|
|
126
|
-
useStickyAttr?: boolean;
|
|
127
|
-
handleRowBg?: boolean;
|
|
128
|
-
}
|
|
120
|
+
function computeHeadLayout(
|
|
121
|
+
headRows: HTMLElement[],
|
|
122
|
+
carryHead: number[],
|
|
123
|
+
colCount: number
|
|
129
124
|
): number {
|
|
130
|
-
|
|
125
|
+
headRows.forEach((row, rIdx) => {
|
|
131
126
|
let c = 1;
|
|
127
|
+
const cells = Array.from(
|
|
128
|
+
row.querySelectorAll('nile-grid-head-item, nile-grid-cell')
|
|
129
|
+
) as HTMLElement[];
|
|
132
130
|
const rStart = rIdx + 1;
|
|
133
|
-
let maxRowspan = 1;
|
|
134
|
-
|
|
135
|
-
let bg: HTMLElement | null = null;
|
|
136
|
-
if (opts.handleRowBg) {
|
|
137
|
-
bg = row.shadowRoot?.querySelector<HTMLElement>('[data-row-bg]') ?? null;
|
|
138
|
-
if (bg) bg.style.gridColumn = `1 / -1`;
|
|
139
|
-
}
|
|
140
131
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
132
|
+
cells.forEach(cell => {
|
|
133
|
+
while (carryHead[c - 1] > 0) c++;
|
|
134
|
+
const colspan = Math.max(1, Number(cell.getAttribute('colspan')) || 1);
|
|
135
|
+
const rowspan = Math.max(1, Number(cell.getAttribute('rowspan')) || 1);
|
|
144
136
|
|
|
145
|
-
|
|
146
|
-
|
|
137
|
+
const cStart = c,
|
|
138
|
+
cEnd = c + colspan;
|
|
139
|
+
const rEnd = rStart + rowspan;
|
|
147
140
|
|
|
148
|
-
|
|
149
|
-
|
|
141
|
+
cell.style.gridColumn = `${cStart} / ${cEnd}`;
|
|
142
|
+
cell.style.gridRow = `${rStart} / ${rEnd}`;
|
|
143
|
+
(cell as any).dataset.cStart = String(cStart);
|
|
150
144
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
50 * rowspan
|
|
155
|
-
}px`;
|
|
156
|
-
el.style.zIndex = "1";
|
|
145
|
+
for (let k = 0; k < colspan; k++) {
|
|
146
|
+
const idx = c - 1 + k;
|
|
147
|
+
carryHead[idx] = Math.max(carryHead[idx] || 0, rowspan);
|
|
157
148
|
}
|
|
149
|
+
c = cEnd;
|
|
150
|
+
colCount = Math.max(colCount, cEnd - 1);
|
|
151
|
+
});
|
|
158
152
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
153
|
+
for (let i = 0; i < carryHead.length; i++)
|
|
154
|
+
if (carryHead[i] > 0) carryHead[i]--;
|
|
155
|
+
});
|
|
156
|
+
return colCount;
|
|
157
|
+
}
|
|
162
158
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
159
|
+
function computeBodyLayout(
|
|
160
|
+
bodyRows: HTMLElement[],
|
|
161
|
+
carryBody: number[],
|
|
162
|
+
colCount: number
|
|
163
|
+
) {
|
|
164
|
+
bodyRows.forEach((row, rIdx) => {
|
|
165
|
+
let c = 1;
|
|
166
|
+
const cells = Array.from(
|
|
167
|
+
row.querySelectorAll('nile-grid-cell, nile-grid-header')
|
|
168
|
+
) as HTMLElement[];
|
|
169
|
+
const rStart = rIdx + 1;
|
|
170
|
+
let maxRowspan = 1;
|
|
166
171
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
172
|
+
const bg = row.shadowRoot?.querySelector<HTMLElement>('[data-row-bg]');
|
|
173
|
+
if (bg) bg.style.gridColumn = `1 / -1`;
|
|
170
174
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
175
|
+
cells.forEach(cell => {
|
|
176
|
+
while (carryBody[c - 1] > 0) c++;
|
|
177
|
+
const colspan = Math.max(1, Number(cell.getAttribute('colspan')) || 1);
|
|
178
|
+
const rowspan = Math.max(1, Number(cell.getAttribute('rowspan')) || 1);
|
|
179
|
+
|
|
180
|
+
const cStart = c,
|
|
181
|
+
cEnd = c + colspan;
|
|
182
|
+
const rEnd = rStart + rowspan;
|
|
174
183
|
|
|
175
|
-
|
|
184
|
+
cell.style.gridColumn = `${cStart} / ${cEnd}`;
|
|
185
|
+
cell.style.gridRow = `${rStart} / ${rEnd}`;
|
|
186
|
+
(cell as any).dataset.cStart = String(cStart);
|
|
176
187
|
|
|
177
188
|
for (let k = 0; k < colspan; k++) {
|
|
178
189
|
const idx = c - 1 + k;
|
|
179
|
-
|
|
190
|
+
carryBody[idx] = Math.max(carryBody[idx] || 0, rowspan);
|
|
180
191
|
}
|
|
181
|
-
|
|
182
192
|
maxRowspan = Math.max(maxRowspan, rowspan);
|
|
183
193
|
c = cEnd;
|
|
184
194
|
colCount = Math.max(colCount, cEnd - 1);
|
|
185
195
|
});
|
|
186
196
|
|
|
187
|
-
if (
|
|
197
|
+
if (bg) {
|
|
188
198
|
const rEnd = rStart + maxRowspan;
|
|
189
199
|
bg.style.gridRow = `${rStart} / ${rEnd}`;
|
|
190
200
|
}
|
|
191
201
|
|
|
192
|
-
for (let i = 0; i <
|
|
193
|
-
if (
|
|
194
|
-
}
|
|
202
|
+
for (let i = 0; i < carryBody.length; i++)
|
|
203
|
+
if (carryBody[i] > 0) carryBody[i]--;
|
|
195
204
|
});
|
|
196
205
|
|
|
197
206
|
return colCount;
|
|
198
207
|
}
|
|
199
208
|
|
|
200
|
-
function computeHeadLayout(
|
|
201
|
-
headRows: HTMLElement[],
|
|
202
|
-
carryHead: number[],
|
|
203
|
-
colCount: number,
|
|
204
|
-
stickyLeftIndexes: number[],
|
|
205
|
-
stickyRightIndexes: number[],
|
|
206
|
-
columnWidths: number[]
|
|
207
|
-
): number {
|
|
208
|
-
return layoutRows(
|
|
209
|
-
headRows,
|
|
210
|
-
carryHead,
|
|
211
|
-
colCount,
|
|
212
|
-
stickyLeftIndexes,
|
|
213
|
-
stickyRightIndexes,
|
|
214
|
-
columnWidths,
|
|
215
|
-
{
|
|
216
|
-
itemSelector: 'nile-grid-head-item',
|
|
217
|
-
useStickyAttr: true,
|
|
218
|
-
handleRowBg: false,
|
|
219
|
-
}
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function computeBodyLayout(
|
|
224
|
-
bodyRows: HTMLElement[],
|
|
225
|
-
carryBody: number[],
|
|
226
|
-
colCount: number,
|
|
227
|
-
stickyLeftIndexes: number[],
|
|
228
|
-
stickyRightIndexes: number[],
|
|
229
|
-
columnWidths: number[]
|
|
230
|
-
): number {
|
|
231
|
-
return layoutRows(
|
|
232
|
-
bodyRows,
|
|
233
|
-
carryBody,
|
|
234
|
-
colCount,
|
|
235
|
-
stickyLeftIndexes,
|
|
236
|
-
stickyRightIndexes,
|
|
237
|
-
columnWidths,
|
|
238
|
-
{
|
|
239
|
-
itemSelector: 'nile-grid-cell-item',
|
|
240
|
-
useStickyAttr: false,
|
|
241
|
-
handleRowBg: true,
|
|
242
|
-
}
|
|
243
|
-
);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
209
|
function computeColumnWidths(
|
|
247
210
|
nileGrid: NileGrid,
|
|
248
211
|
colCount: number,
|
|
249
|
-
columnWidths: number[]
|
|
250
|
-
slotEl: any
|
|
212
|
+
columnWidths: number[]
|
|
251
213
|
) {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const isSeeded = seedWidthsFromDesired(desired, columnWidths, minCol);
|
|
257
|
-
|
|
258
|
-
distributeFlex(columnWidths, isSeeded, containerWidth, minCol);
|
|
259
|
-
|
|
260
|
-
normalizeToContainer(columnWidths, containerWidth, minCol);
|
|
261
|
-
|
|
262
|
-
clampAndRound(columnWidths, minCol);
|
|
263
|
-
applyColumnsTemplate(nileGrid, columnWidths, slotEl);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
function getContainerWidth(nileGrid: NileGrid): number {
|
|
268
|
-
return Math.max(0, (nileGrid.getBoundingClientRect().width || 0) - 4);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
function readDesiredFromHead(slotEl: any, colCount: number): (number | null)[] {
|
|
272
|
-
const desired: (number | null)[] = Array(colCount).fill(null);
|
|
273
|
-
const head = getHead(slotEl) as HTMLElement | null;
|
|
274
|
-
if (!head) return desired;
|
|
275
|
-
|
|
276
|
-
const headRows = Array.from(head.children).filter(
|
|
277
|
-
el => el.tagName.toLowerCase() === 'nile-grid-row'
|
|
278
|
-
) as HTMLElement[];
|
|
279
|
-
|
|
280
|
-
for (const row of headRows) {
|
|
281
|
-
const items = Array.from(row.children).filter(
|
|
282
|
-
el => el.tagName.toLowerCase() === 'nile-grid-head-item'
|
|
283
|
-
) as Array<HeadItemEl>;
|
|
284
|
-
|
|
285
|
-
items
|
|
286
|
-
.map(h => {
|
|
287
|
-
const cStart = Number((h as any).dataset?.cStart) || 1;
|
|
288
|
-
const colspan = Math.max(1, Number(h.getAttribute('colspan')) || 1);
|
|
289
|
-
const attr = h.getAttribute('customWidth');
|
|
290
|
-
const cw = attr != null ? Number(attr) : (h as any).customWidth ?? null;
|
|
291
|
-
return { cStart, colspan, cw };
|
|
292
|
-
})
|
|
293
|
-
.filter(x => x.cw != null && !Number.isNaN(x.cw!))
|
|
294
|
-
.sort((a, b) => {
|
|
295
|
-
return a.colspan - b.colspan;
|
|
296
|
-
})
|
|
297
|
-
.forEach(({ cStart, colspan, cw }) => {
|
|
298
|
-
const perCol = (cw as number) / colspan;
|
|
299
|
-
for (let k = 0; k < colspan; k++) {
|
|
300
|
-
const idx = cStart - 1 + k;
|
|
301
|
-
if (idx >= 0 && idx < colCount && desired[idx] == null) {
|
|
302
|
-
desired[idx] = perCol;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
return desired;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
function seedWidthsFromDesired(
|
|
311
|
-
desired: (number | null)[],
|
|
312
|
-
columnWidths: number[],
|
|
313
|
-
minCol: number
|
|
314
|
-
): boolean[] {
|
|
315
|
-
const isSeeded = Array(desired.length).fill(false);
|
|
316
|
-
for (let i = 0; i < desired.length; i++) {
|
|
317
|
-
const w = desired[i] ?? null;
|
|
318
|
-
columnWidths[i] =
|
|
319
|
-
w != null && !Number.isNaN(w) ? Math.max(minCol, Number(w)) : 0;
|
|
320
|
-
isSeeded[i] = w != null && !Number.isNaN(w);
|
|
321
|
-
}
|
|
322
|
-
return isSeeded;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
function distributeFlex(
|
|
326
|
-
columnWidths: number[],
|
|
327
|
-
isSeeded: boolean[],
|
|
328
|
-
containerWidth: number,
|
|
329
|
-
minCol: number
|
|
330
|
-
) {
|
|
331
|
-
const sumSeed = columnWidths.reduce((a, b) => a + b, 0);
|
|
332
|
-
const remaining = containerWidth - sumSeed;
|
|
333
|
-
const flexIdxs = Array.from(
|
|
334
|
-
{ length: columnWidths.length },
|
|
335
|
-
(_, i) => i
|
|
336
|
-
).filter(i => !isSeeded[i]);
|
|
337
|
-
if (flexIdxs.length === 0) return;
|
|
338
|
-
|
|
339
|
-
const each = remaining / flexIdxs.length;
|
|
340
|
-
for (const i of flexIdxs) columnWidths[i] = Math.max(minCol, each);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
function normalizeToContainer(
|
|
344
|
-
columnWidths: number[],
|
|
345
|
-
containerWidth: number,
|
|
346
|
-
minCol: number
|
|
347
|
-
) {
|
|
348
|
-
let total = columnWidths.reduce((a, b) => a + b, 0);
|
|
349
|
-
|
|
350
|
-
if (total < containerWidth && columnWidths.length > 0) {
|
|
351
|
-
const add = containerWidth - total;
|
|
352
|
-
const weight = total || 1;
|
|
353
|
-
for (let i = 0; i < columnWidths.length; i++) {
|
|
354
|
-
columnWidths[i] += add * (columnWidths[i] / weight);
|
|
355
|
-
}
|
|
356
|
-
} else if (total > containerWidth) {
|
|
357
|
-
let need = total - containerWidth;
|
|
358
|
-
|
|
359
|
-
for (let iter = 0; iter < 8 && need > 0.5; iter++) {
|
|
360
|
-
let weightSum = 0;
|
|
361
|
-
const candidates: number[] = [];
|
|
362
|
-
for (let i = 0; i < columnWidths.length; i++) {
|
|
363
|
-
const reducible = Math.max(0, columnWidths[i] - minCol);
|
|
364
|
-
if (reducible > 0) {
|
|
365
|
-
candidates.push(i);
|
|
366
|
-
weightSum += columnWidths[i];
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
if (candidates.length === 0 || weightSum <= 0) break;
|
|
370
|
-
|
|
371
|
-
let reduced = 0;
|
|
372
|
-
for (const i of candidates) {
|
|
373
|
-
const reducible = Math.max(0, columnWidths[i] - minCol);
|
|
374
|
-
const share = columnWidths[i] / weightSum;
|
|
375
|
-
const cut = Math.min(reducible, need * share);
|
|
376
|
-
columnWidths[i] -= cut;
|
|
377
|
-
reduced += cut;
|
|
378
|
-
}
|
|
379
|
-
need -= reduced;
|
|
380
|
-
if (reduced < 0.5) break;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
function clampAndRound(columnWidths: number[], minCol: number) {
|
|
386
|
-
for (let i = 0; i < columnWidths.length; i++) {
|
|
387
|
-
columnWidths[i] = Math.max(minCol, Math.round(columnWidths[i]));
|
|
214
|
+
for (let col = 0; col < colCount; col++) {
|
|
215
|
+
const containerWidth = (nileGrid.getBoundingClientRect().width || 1) - 2;
|
|
216
|
+
columnWidths[col] =
|
|
217
|
+
nileGrid.customWidths[col] || containerWidth / Math.max(colCount, 1);
|
|
388
218
|
}
|
|
389
219
|
}
|
|
390
220
|
|
|
@@ -394,8 +224,7 @@ export const layout = (
|
|
|
394
224
|
ensureWidths: any,
|
|
395
225
|
rebuildTemplate: any,
|
|
396
226
|
applyTemplate: any,
|
|
397
|
-
|
|
398
|
-
stickyRightIndexes: number[]
|
|
227
|
+
columnWidths: any
|
|
399
228
|
) => {
|
|
400
229
|
const head = getHead(slotEl);
|
|
401
230
|
const body = getBody(slotEl);
|
|
@@ -410,98 +239,14 @@ export const layout = (
|
|
|
410
239
|
|
|
411
240
|
let colCount = 0;
|
|
412
241
|
|
|
413
|
-
colCount = computeHeadLayout(
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
stickyLeftIndexes,
|
|
418
|
-
stickyRightIndexes,
|
|
419
|
-
nileGrid.columnWidths
|
|
420
|
-
);
|
|
421
|
-
colCount = computeBodyLayout(
|
|
422
|
-
bodyRows,
|
|
423
|
-
[],
|
|
424
|
-
colCount,
|
|
425
|
-
stickyLeftIndexes,
|
|
426
|
-
stickyRightIndexes,
|
|
427
|
-
nileGrid.columnWidths
|
|
428
|
-
);
|
|
429
|
-
computeColumnWidths(nileGrid, colCount, nileGrid.columnWidths, slotEl);
|
|
242
|
+
colCount = computeHeadLayout(headRows, [], colCount);
|
|
243
|
+
colCount = computeBodyLayout(bodyRows, [], colCount);
|
|
244
|
+
|
|
245
|
+
computeColumnWidths(nileGrid, colCount, columnWidths);
|
|
430
246
|
|
|
431
247
|
ensureWidths(colCount);
|
|
432
248
|
body.style.gridAutoRows = 'auto';
|
|
433
|
-
|
|
249
|
+
body.style.overflowY = 'auto';
|
|
250
|
+
nileGrid.colTemplate = rebuildTemplate(colCount, columnWidths);
|
|
434
251
|
applyTemplate(head, body, nileGrid.colTemplate, nileGrid.colTemplate);
|
|
435
252
|
};
|
|
436
|
-
|
|
437
|
-
function applySticky(
|
|
438
|
-
el: HTMLElement,
|
|
439
|
-
colIndex: number,
|
|
440
|
-
stickyLeftIndexes: number[],
|
|
441
|
-
stickyRightIndexes: number[],
|
|
442
|
-
columnWidths: number[]
|
|
443
|
-
) {
|
|
444
|
-
const onLeft = stickyLeftIndexes.includes(colIndex);
|
|
445
|
-
const onRight = stickyRightIndexes.includes(colIndex);
|
|
446
|
-
|
|
447
|
-
if (!onLeft && !onRight) return;
|
|
448
|
-
|
|
449
|
-
el.style.position = 'sticky';
|
|
450
|
-
el.style.zIndex = '2';
|
|
451
|
-
|
|
452
|
-
if (onLeft && !onRight) {
|
|
453
|
-
const leftOrder = [...stickyLeftIndexes].sort((a, b) => a - b);
|
|
454
|
-
const pos = leftOrder.indexOf(colIndex);
|
|
455
|
-
let left = 0;
|
|
456
|
-
for (let i = 0; i < pos; i++) left += columnWidths[leftOrder[i]] ?? 0;
|
|
457
|
-
el.style.left = `${left}px`;
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
const rightOrder = [...stickyRightIndexes].sort((a, b) => b - a);
|
|
462
|
-
const pos = rightOrder.indexOf(colIndex);
|
|
463
|
-
|
|
464
|
-
const scroller = el.closest('nile-grid') as HTMLElement | null;
|
|
465
|
-
const sb = scroller ? scroller.offsetWidth - scroller.clientWidth : 0;
|
|
466
|
-
|
|
467
|
-
let right = sb;
|
|
468
|
-
for (let i = 0; i < pos; i++) right += columnWidths[rightOrder[i]] ?? 0;
|
|
469
|
-
|
|
470
|
-
el.style.right = `${right - 2}px`;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
export function applyColumnsTemplate(
|
|
475
|
-
nileGrid: HTMLElement,
|
|
476
|
-
columnWidths: number[],
|
|
477
|
-
slotEl: HTMLElement
|
|
478
|
-
) {
|
|
479
|
-
const cols = columnWidths
|
|
480
|
-
.map((w, idx) => {
|
|
481
|
-
if (idx === columnWidths.length - 1) {
|
|
482
|
-
return `minmax(${Math.round(w)}px, auto)`;
|
|
483
|
-
}
|
|
484
|
-
return `${Math.max(0, Math.round(w))}px`;
|
|
485
|
-
})
|
|
486
|
-
.join(' ');
|
|
487
|
-
nileGrid.style.setProperty('--nile-grid-columns', cols);
|
|
488
|
-
|
|
489
|
-
const head = slotEl.querySelector('nile-grid-head') as HTMLElement | null;
|
|
490
|
-
if (head) {
|
|
491
|
-
head.style.setProperty('--nile-grid-columns', cols);
|
|
492
|
-
head
|
|
493
|
-
.querySelectorAll('nile-grid-row')
|
|
494
|
-
.forEach(r =>
|
|
495
|
-
(r as HTMLElement).style.setProperty('--nile-grid-columns', cols)
|
|
496
|
-
);
|
|
497
|
-
}
|
|
498
|
-
const body = slotEl.querySelector('nile-grid-body') as HTMLElement | null;
|
|
499
|
-
if (body) {
|
|
500
|
-
body.style.setProperty('--nile-grid-columns', cols);
|
|
501
|
-
body
|
|
502
|
-
.querySelectorAll('nile-grid-row')
|
|
503
|
-
.forEach(r =>
|
|
504
|
-
(r as HTMLElement).style.setProperty('--nile-grid-columns', cols)
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { html, CSSResultArray, TemplateResult } from 'lit';
|
|
8
|
+
import { LitElement, html, CSSResultArray, TemplateResult } from 'lit';
|
|
9
9
|
import { customElement } from 'lit/decorators.js';
|
|
10
10
|
import { styles } from './nile-grid-body.css';
|
|
11
11
|
import NileElement from '../internal/nile-element';
|
|
@@ -33,7 +33,7 @@ export class NileGridBody extends NileElement {
|
|
|
33
33
|
|
|
34
34
|
public render(): TemplateResult {
|
|
35
35
|
return html`
|
|
36
|
-
<div
|
|
36
|
+
<div style="display: contents;">
|
|
37
37
|
<slot></slot>
|
|
38
38
|
</div>
|
|
39
39
|
`;
|
|
@@ -22,17 +22,8 @@ export const styles = css`
|
|
|
22
22
|
padding: var(--padding);
|
|
23
23
|
height: auto;
|
|
24
24
|
border-bottom: 1px solid var(--nile-colors-neutral-400);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
font-family: var(--nile-font-weight-regular);
|
|
28
|
-
background-color: #FFFFFF;
|
|
29
|
-
min-height: 44px;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.cell-item-base {
|
|
33
|
-
width: 100%;
|
|
34
|
-
overflow: hidden;
|
|
35
|
-
text-overflow: ellipsis;
|
|
25
|
+
border-right: 1px solid var(--nile-colors-neutral-400);
|
|
26
|
+
position: relative;
|
|
36
27
|
}
|
|
37
28
|
|
|
38
29
|
::slotted(*) {
|
|
@@ -42,11 +33,6 @@ export const styles = css`
|
|
|
42
33
|
width: min-content;
|
|
43
34
|
}
|
|
44
35
|
|
|
45
|
-
:host(:last-child) .resize-handle {
|
|
46
|
-
border-right: none;
|
|
47
|
-
display: none;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
36
|
.resize-handle {
|
|
51
37
|
position: absolute;
|
|
52
38
|
top: 0;
|
|
@@ -57,7 +43,6 @@ export const styles = css`
|
|
|
57
43
|
z-index: 1;
|
|
58
44
|
width: 2px;
|
|
59
45
|
border-right: 1px solid var(--nile-colors-neutral-400);
|
|
60
|
-
display: none;
|
|
61
46
|
}
|
|
62
47
|
`;
|
|
63
48
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { html, CSSResultArray, TemplateResult } from 'lit';
|
|
8
|
+
import { LitElement, html, CSSResultArray, TemplateResult } from 'lit';
|
|
9
9
|
import { customElement, property } from 'lit/decorators.js';
|
|
10
10
|
import { styles } from './nile-grid-cell-item.css';
|
|
11
11
|
import NileElement from '../internal/nile-element';
|
|
@@ -33,7 +33,16 @@ export class NileGridCellItem extends NileElement {
|
|
|
33
33
|
|
|
34
34
|
@property({ type: Number, reflect: true, attribute: true }) colspan = 1;
|
|
35
35
|
@property({ type: Number, reflect: true, attribute: true }) rowspan = 1;
|
|
36
|
+
@property({ type: String, reflect: true, attribute: true }) align?:
|
|
37
|
+
| 'start'
|
|
38
|
+
| 'center'
|
|
39
|
+
| 'end';
|
|
40
|
+
@property({ type: String, reflect: true, attribute: true }) valign?:
|
|
41
|
+
| 'top'
|
|
42
|
+
| 'middle'
|
|
43
|
+
| 'bottom';
|
|
36
44
|
@property({ type: Boolean, reflect: true, attribute: true }) resizable = false;
|
|
45
|
+
@property({ type: Boolean, reflect: true, attribute: true }) textOverflowType: 'ellipsis' | 'clip' = 'ellipsis';
|
|
37
46
|
|
|
38
47
|
connectedCallback() {
|
|
39
48
|
super.connectedCallback();
|
|
@@ -41,7 +50,6 @@ export class NileGridCellItem extends NileElement {
|
|
|
41
50
|
}
|
|
42
51
|
|
|
43
52
|
private onHandlePointerDown = (ev: PointerEvent) => {
|
|
44
|
-
|
|
45
53
|
const el = this as HTMLElement;
|
|
46
54
|
|
|
47
55
|
const downXRef = { value: 0 };
|
|
@@ -63,7 +71,7 @@ export class NileGridCellItem extends NileElement {
|
|
|
63
71
|
|
|
64
72
|
public render(): TemplateResult {
|
|
65
73
|
return html`
|
|
66
|
-
<div
|
|
74
|
+
<div style="display: contents;">
|
|
67
75
|
<slot></slot>
|
|
68
76
|
${this.resizable
|
|
69
77
|
? html`
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { html, CSSResultArray, TemplateResult } from 'lit';
|
|
8
|
+
import { LitElement, html, CSSResultArray, TemplateResult } from 'lit';
|
|
9
9
|
import { customElement } from 'lit/decorators.js';
|
|
10
10
|
import { styles } from './nile-grid-head.css';
|
|
11
11
|
import NileElement from '../internal/nile-element';
|
|
@@ -32,7 +32,7 @@ export class NileGridHead extends NileElement {
|
|
|
32
32
|
|
|
33
33
|
public render(): TemplateResult {
|
|
34
34
|
return html`
|
|
35
|
-
<div
|
|
35
|
+
<div style="display: contents;">
|
|
36
36
|
<slot></slot>
|
|
37
37
|
</div>
|
|
38
38
|
`;
|