@akcelik/strct 1.0.0 → 1.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/fesm2022/akcelik-strct.mjs +735 -209
- package/fesm2022/akcelik-strct.mjs.map +1 -1
- package/package.json +1 -1
- package/types/akcelik-strct.d.ts +82 -5
|
@@ -7458,6 +7458,126 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
7458
7458
|
}, styles: [".strct-table-host{display:block;overflow-x:auto}.strct-table{width:100%;border-collapse:collapse;font-size:13px;border:1px solid var(--b2);border-radius:8px;overflow:hidden}.strct-table th,.strct-table td{padding:9px 13px;text-align:start;border-bottom:1px solid var(--b1)}.strct-table th{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--t2);background:var(--bg-2)}.strct-table td{color:var(--t1)}.strct-table tbody tr:last-child td{border-bottom:0}.strct-table-host--striped tbody tr:nth-child(2n) td{background:var(--bg-2)}.strct-table-host--hover tbody tr:hover td{background:var(--acc-s)}@keyframes strct-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}.strct-table__skeleton-block{height:12px;background:var(--bg-3);border-radius:var(--radius-sm);animation:strct-skeleton-pulse 1.4s ease infinite}.strct-table__skeleton-row td{border-bottom:1px solid var(--b1)}.strct-table__empty{text-align:center;color:var(--t3);padding:22px}\n"] }]
|
|
7459
7459
|
}], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: true }] }], striped: [{ type: i0.Input, args: [{ isSignal: true, alias: "striped", required: false }] }], hover: [{ type: i0.Input, args: [{ isSignal: true, alias: "hover", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], cellDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctCellDef), { isSignal: true }] }] } });
|
|
7460
7460
|
|
|
7461
|
+
/**
|
|
7462
|
+
* Minimal, dependency-free XLSX writer for the datagrid's Excel export.
|
|
7463
|
+
*
|
|
7464
|
+
* An .xlsx file is a ZIP of SpreadsheetML parts. This builds the five
|
|
7465
|
+
* required parts with inline strings and zips them with STORED (uncompressed)
|
|
7466
|
+
* entries — no runtime dependency, byte-accurate CRC32, opens in Excel,
|
|
7467
|
+
* LibreOffice and Google Sheets.
|
|
7468
|
+
*/
|
|
7469
|
+
const CRC_TABLE = (() => {
|
|
7470
|
+
const t = new Uint32Array(256);
|
|
7471
|
+
for (let n = 0; n < 256; n++) {
|
|
7472
|
+
let c = n;
|
|
7473
|
+
for (let k = 0; k < 8; k++)
|
|
7474
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
7475
|
+
t[n] = c >>> 0;
|
|
7476
|
+
}
|
|
7477
|
+
return t;
|
|
7478
|
+
})();
|
|
7479
|
+
function crc32(data) {
|
|
7480
|
+
let c = 0xffffffff;
|
|
7481
|
+
for (const byte of data)
|
|
7482
|
+
c = CRC_TABLE[(c ^ byte) & 0xff] ^ (c >>> 8);
|
|
7483
|
+
return (c ^ 0xffffffff) >>> 0;
|
|
7484
|
+
}
|
|
7485
|
+
const enc = new TextEncoder();
|
|
7486
|
+
/** ZIP with STORED entries (no compression — spreadsheets are small). */
|
|
7487
|
+
function zip(entries) {
|
|
7488
|
+
const chunks = [];
|
|
7489
|
+
const central = [];
|
|
7490
|
+
let offset = 0;
|
|
7491
|
+
const u16 = (n) => new Uint8Array([n & 0xff, (n >> 8) & 0xff]);
|
|
7492
|
+
const u32 = (n) => new Uint8Array([n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, (n >> 24) & 0xff]);
|
|
7493
|
+
const cat = (...parts) => {
|
|
7494
|
+
const total = parts.reduce((s, p) => s + p.length, 0);
|
|
7495
|
+
const out = new Uint8Array(total);
|
|
7496
|
+
let o = 0;
|
|
7497
|
+
for (const p of parts) {
|
|
7498
|
+
out.set(p, o);
|
|
7499
|
+
o += p.length;
|
|
7500
|
+
}
|
|
7501
|
+
return out;
|
|
7502
|
+
};
|
|
7503
|
+
for (const { name, data } of entries) {
|
|
7504
|
+
const nameBytes = enc.encode(name);
|
|
7505
|
+
const crc = crc32(data);
|
|
7506
|
+
const local = cat(u32(0x04034b50), u16(20), // version needed
|
|
7507
|
+
u16(0), // flags
|
|
7508
|
+
u16(0), // method: stored
|
|
7509
|
+
u16(0), u16(0), // mod time/date
|
|
7510
|
+
u32(crc), u32(data.length), u32(data.length), u16(nameBytes.length), u16(0), nameBytes, data);
|
|
7511
|
+
central.push(cat(u32(0x02014b50), u16(20), u16(20), u16(0), u16(0), u16(0), u16(0), u32(crc), u32(data.length), u32(data.length), u16(nameBytes.length), u16(0), u16(0), u16(0), u16(0), u32(0), u32(offset), nameBytes));
|
|
7512
|
+
chunks.push(local);
|
|
7513
|
+
offset += local.length;
|
|
7514
|
+
}
|
|
7515
|
+
const centralStart = offset;
|
|
7516
|
+
const centralBytes = cat(...central);
|
|
7517
|
+
const end = cat(u32(0x06054b50), u16(0), u16(0), u16(entries.length), u16(entries.length), u32(centralBytes.length), u32(centralStart), u16(0));
|
|
7518
|
+
return cat(...chunks, centralBytes, end);
|
|
7519
|
+
}
|
|
7520
|
+
const xml = (s) => String(s ?? '')
|
|
7521
|
+
.replace(/&/g, '&')
|
|
7522
|
+
.replace(/</g, '<')
|
|
7523
|
+
.replace(/>/g, '>')
|
|
7524
|
+
.replace(/"/g, '"');
|
|
7525
|
+
/** A1-style column ref: 0 → A, 26 → AA … */
|
|
7526
|
+
function colRef(i) {
|
|
7527
|
+
let s = '';
|
|
7528
|
+
for (let n = i; n >= 0; n = Math.floor(n / 26) - 1)
|
|
7529
|
+
s = String.fromCharCode(65 + (n % 26)) + s;
|
|
7530
|
+
return s;
|
|
7531
|
+
}
|
|
7532
|
+
/**
|
|
7533
|
+
* Build a single-sheet workbook: `header` as a bold-free first row, then
|
|
7534
|
+
* `rows`. Numbers stay numeric; everything else exports as inline strings.
|
|
7535
|
+
*/
|
|
7536
|
+
function buildXlsx(header, rows, sheetName = 'Data') {
|
|
7537
|
+
const rowXml = (cells, r) => `<row r="${r}">` +
|
|
7538
|
+
cells
|
|
7539
|
+
.map((v, c) => {
|
|
7540
|
+
const ref = `${colRef(c)}${r}`;
|
|
7541
|
+
if (typeof v === 'number' && Number.isFinite(v)) {
|
|
7542
|
+
return `<c r="${ref}"><v>${v}</v></c>`;
|
|
7543
|
+
}
|
|
7544
|
+
return `<c r="${ref}" t="inlineStr"><is><t xml:space="preserve">${xml(v)}</t></is></c>`;
|
|
7545
|
+
})
|
|
7546
|
+
.join('') +
|
|
7547
|
+
'</row>';
|
|
7548
|
+
const sheet = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
7549
|
+
`<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData>` +
|
|
7550
|
+
rowXml(header, 1) +
|
|
7551
|
+
rows.map((cells, i) => rowXml(cells, i + 2)).join('') +
|
|
7552
|
+
`</sheetData></worksheet>`;
|
|
7553
|
+
const workbook = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
7554
|
+
`<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" ` +
|
|
7555
|
+
`xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">` +
|
|
7556
|
+
`<sheets><sheet name="${xml(sheetName)}" sheetId="1" r:id="rId1"/></sheets></workbook>`;
|
|
7557
|
+
const workbookRels = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
7558
|
+
`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">` +
|
|
7559
|
+
`<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>` +
|
|
7560
|
+
`</Relationships>`;
|
|
7561
|
+
const rootRels = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
7562
|
+
`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">` +
|
|
7563
|
+
`<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>` +
|
|
7564
|
+
`</Relationships>`;
|
|
7565
|
+
const contentTypes = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
7566
|
+
`<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">` +
|
|
7567
|
+
`<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>` +
|
|
7568
|
+
`<Default Extension="xml" ContentType="application/xml"/>` +
|
|
7569
|
+
`<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>` +
|
|
7570
|
+
`<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>` +
|
|
7571
|
+
`</Types>`;
|
|
7572
|
+
return zip([
|
|
7573
|
+
{ name: '[Content_Types].xml', data: enc.encode(contentTypes) },
|
|
7574
|
+
{ name: '_rels/.rels', data: enc.encode(rootRels) },
|
|
7575
|
+
{ name: 'xl/workbook.xml', data: enc.encode(workbook) },
|
|
7576
|
+
{ name: 'xl/_rels/workbook.xml.rels', data: enc.encode(workbookRels) },
|
|
7577
|
+
{ name: 'xl/worksheets/sheet1.xml', data: enc.encode(sheet) },
|
|
7578
|
+
]);
|
|
7579
|
+
}
|
|
7580
|
+
|
|
7461
7581
|
const DG_LABELS = {
|
|
7462
7582
|
row: 'row',
|
|
7463
7583
|
rows: 'rows',
|
|
@@ -7590,6 +7710,14 @@ class StrctDatagrid {
|
|
|
7590
7710
|
stateKey = input(null, ...(ngDevMode ? [{ debugName: "stateKey" }] : /* istanbul ignore next */ []));
|
|
7591
7711
|
/** User column preferences (two-way): widths from resize, hidden from the chooser. */
|
|
7592
7712
|
columnState = model(null, ...(ngDevMode ? [{ debugName: "columnState" }] : /* istanbul ignore next */ []));
|
|
7713
|
+
/** Let the user reorder data columns by dragging their headers. */
|
|
7714
|
+
reorderable = input(false, { ...(ngDevMode ? { debugName: "reorderable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
7715
|
+
/**
|
|
7716
|
+
* Group rows by this column key: the grid renders a collapsible header row
|
|
7717
|
+
* per distinct value (with a count), respecting the current sort within
|
|
7718
|
+
* groups. Paging is bypassed while grouped; not combinable with `virtual`.
|
|
7719
|
+
*/
|
|
7720
|
+
groupBy = input(null, ...(ngDevMode ? [{ debugName: "groupBy" }] : /* istanbul ignore next */ []));
|
|
7593
7721
|
/** Emitted when the selection changes. */
|
|
7594
7722
|
selectionChange = output();
|
|
7595
7723
|
/** Emitted when the refresh button is clicked. */
|
|
@@ -7661,13 +7789,108 @@ class StrctDatagrid {
|
|
|
7661
7789
|
paneOpen = computed(() => this.detailPane() && !!this.detailDef() && !!this.activeRow(), ...(ngDevMode ? [{ debugName: "paneOpen" }] : /* istanbul ignore next */ []));
|
|
7662
7790
|
/** Whether to render the trailing row-actions (kebab) column. */
|
|
7663
7791
|
canActions = computed(() => !!this.rowActions() && !this.paneOpen(), ...(ngDevMode ? [{ debugName: "canActions" }] : /* istanbul ignore next */ []));
|
|
7792
|
+
/** User-chosen column order (keys); unknown keys keep declared positions. */
|
|
7793
|
+
columnOrder = signal(null, ...(ngDevMode ? [{ debugName: "columnOrder" }] : /* istanbul ignore next */ []));
|
|
7794
|
+
/** Declared columns re-arranged by the user's drag order. */
|
|
7795
|
+
orderedColumns = computed(() => {
|
|
7796
|
+
const cols = this.columns();
|
|
7797
|
+
const order = this.columnOrder();
|
|
7798
|
+
if (!order?.length)
|
|
7799
|
+
return cols;
|
|
7800
|
+
const byKey = new Map(cols.map((c) => [c.key, c]));
|
|
7801
|
+
const out = [];
|
|
7802
|
+
for (const key of order) {
|
|
7803
|
+
const c = byKey.get(key);
|
|
7804
|
+
if (c) {
|
|
7805
|
+
out.push(c);
|
|
7806
|
+
byKey.delete(key);
|
|
7807
|
+
}
|
|
7808
|
+
}
|
|
7809
|
+
for (const c of cols)
|
|
7810
|
+
if (byKey.has(c.key))
|
|
7811
|
+
out.push(c);
|
|
7812
|
+
return out;
|
|
7813
|
+
}, ...(ngDevMode ? [{ debugName: "orderedColumns" }] : /* istanbul ignore next */ []));
|
|
7664
7814
|
/** Only the first column is shown while the detail pane is open. */
|
|
7665
7815
|
visibleColumns = computed(() => {
|
|
7666
7816
|
if (this.paneOpen())
|
|
7667
|
-
return this.
|
|
7817
|
+
return this.orderedColumns().slice(0, 1);
|
|
7668
7818
|
const hidden = this.hiddenColumns();
|
|
7669
|
-
return this.
|
|
7819
|
+
return this.orderedColumns().filter((c) => !hidden.has(c.key));
|
|
7670
7820
|
}, ...(ngDevMode ? [{ debugName: "visibleColumns" }] : /* istanbul ignore next */ []));
|
|
7821
|
+
// ── Column drag-reorder ────────────────────────────────────────
|
|
7822
|
+
dragKey = signal(null, ...(ngDevMode ? [{ debugName: "dragKey" }] : /* istanbul ignore next */ []));
|
|
7823
|
+
dropKey = signal(null, ...(ngDevMode ? [{ debugName: "dropKey" }] : /* istanbul ignore next */ []));
|
|
7824
|
+
onColDragStart(key, event) {
|
|
7825
|
+
if (!this.reorderable())
|
|
7826
|
+
return;
|
|
7827
|
+
this.dragKey.set(key);
|
|
7828
|
+
event.dataTransfer?.setData('text/plain', key);
|
|
7829
|
+
if (event.dataTransfer)
|
|
7830
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
7831
|
+
}
|
|
7832
|
+
onColDragOver(key, event) {
|
|
7833
|
+
if (!this.reorderable() || !this.dragKey() || key === this.dragKey())
|
|
7834
|
+
return;
|
|
7835
|
+
event.preventDefault();
|
|
7836
|
+
this.dropKey.set(key);
|
|
7837
|
+
}
|
|
7838
|
+
onColDrop(key) {
|
|
7839
|
+
const from = this.dragKey();
|
|
7840
|
+
this.dragKey.set(null);
|
|
7841
|
+
this.dropKey.set(null);
|
|
7842
|
+
if (!from || from === key)
|
|
7843
|
+
return;
|
|
7844
|
+
const keys = this.orderedColumns().map((c) => c.key);
|
|
7845
|
+
const fromIdx = keys.indexOf(from);
|
|
7846
|
+
const toIdx = keys.indexOf(key);
|
|
7847
|
+
if (fromIdx < 0 || toIdx < 0)
|
|
7848
|
+
return;
|
|
7849
|
+
keys.splice(toIdx, 0, ...keys.splice(fromIdx, 1));
|
|
7850
|
+
this.columnOrder.set(keys);
|
|
7851
|
+
}
|
|
7852
|
+
onColDragEnd() {
|
|
7853
|
+
this.dragKey.set(null);
|
|
7854
|
+
this.dropKey.set(null);
|
|
7855
|
+
}
|
|
7856
|
+
// ── Row grouping ───────────────────────────────────────────────
|
|
7857
|
+
collapsedGroups = signal(new Set(), ...(ngDevMode ? [{ debugName: "collapsedGroups" }] : /* istanbul ignore next */ []));
|
|
7858
|
+
/** Collapse / expand one group header. */
|
|
7859
|
+
toggleGroup(key) {
|
|
7860
|
+
const next = new Set(this.collapsedGroups());
|
|
7861
|
+
if (next.has(key))
|
|
7862
|
+
next.delete(key);
|
|
7863
|
+
else
|
|
7864
|
+
next.add(key);
|
|
7865
|
+
this.collapsedGroups.set(next);
|
|
7866
|
+
}
|
|
7867
|
+
/** What tbody renders: plain (virtual/paged) rows, or groups + their rows. */
|
|
7868
|
+
displayItems = computed(() => {
|
|
7869
|
+
const g = this.groupBy();
|
|
7870
|
+
if (!g || this.virtual())
|
|
7871
|
+
return this.renderRows().map((row) => ({ row }));
|
|
7872
|
+
const map = new Map();
|
|
7873
|
+
for (const row of this.sorted()) {
|
|
7874
|
+
const key = row[g];
|
|
7875
|
+
const bucket = map.get(key);
|
|
7876
|
+
if (bucket)
|
|
7877
|
+
bucket.push(row);
|
|
7878
|
+
else
|
|
7879
|
+
map.set(key, [row]);
|
|
7880
|
+
}
|
|
7881
|
+
const out = [];
|
|
7882
|
+
for (const [key, rows] of map) {
|
|
7883
|
+
const collapsed = this.collapsedGroups().has(key);
|
|
7884
|
+
out.push({ group: { key, label: String(key ?? '—'), count: rows.length, collapsed } });
|
|
7885
|
+
if (!collapsed)
|
|
7886
|
+
for (const row of rows)
|
|
7887
|
+
out.push({ row });
|
|
7888
|
+
}
|
|
7889
|
+
return out;
|
|
7890
|
+
}, ...(ngDevMode ? [{ debugName: "displayItems" }] : /* istanbul ignore next */ []));
|
|
7891
|
+
itemKey(it) {
|
|
7892
|
+
return it.group ? `strct-group:${String(it.group.key)}` : this.rowKey(it.row);
|
|
7893
|
+
}
|
|
7671
7894
|
sorted = computed(() => {
|
|
7672
7895
|
// Server-side mode: rows arrive already ordered / sliced — never touch them.
|
|
7673
7896
|
if (this.lazy())
|
|
@@ -7836,11 +8059,12 @@ class StrctDatagrid {
|
|
|
7836
8059
|
this.applyColumnState(st);
|
|
7837
8060
|
});
|
|
7838
8061
|
});
|
|
7839
|
-
// Push user changes (resize / chooser) outward + persist under stateKey.
|
|
8062
|
+
// Push user changes (resize / chooser / reorder) outward + persist under stateKey.
|
|
7840
8063
|
effect(() => {
|
|
7841
8064
|
const widths = Object.fromEntries(this.columnWidths());
|
|
7842
8065
|
const hidden = [...this.hiddenColumns()];
|
|
7843
|
-
const
|
|
8066
|
+
const order = this.columnOrder() ?? undefined;
|
|
8067
|
+
const st = { widths, hidden, order };
|
|
7844
8068
|
const key = JSON.stringify(st);
|
|
7845
8069
|
untracked(() => {
|
|
7846
8070
|
if (key === this.lastStateKey)
|
|
@@ -7874,6 +8098,7 @@ class StrctDatagrid {
|
|
|
7874
8098
|
applyColumnState(st) {
|
|
7875
8099
|
this.columnWidths.set(new Map(Object.entries(st.widths ?? {}).map(([k, v]) => [k, Number(v)])));
|
|
7876
8100
|
this.hiddenColumns.set(new Set(st.hidden ?? []));
|
|
8101
|
+
this.columnOrder.set(st.order?.length ? [...st.order] : null);
|
|
7877
8102
|
}
|
|
7878
8103
|
/**
|
|
7879
8104
|
* The grid as CSV: header labels + every non-hidden column, all rows in the
|
|
@@ -7892,6 +8117,33 @@ class StrctDatagrid {
|
|
|
7892
8117
|
...data.map((r) => cols.map((c) => esc(r[c.key])).join(',')),
|
|
7893
8118
|
].join('\n');
|
|
7894
8119
|
}
|
|
8120
|
+
/**
|
|
8121
|
+
* The grid as a real .xlsx workbook (dependency-free SpreadsheetML):
|
|
8122
|
+
* header labels + every non-hidden column in the current order, all rows in
|
|
8123
|
+
* the current sort; numeric cells stay numeric.
|
|
8124
|
+
*/
|
|
8125
|
+
toXLSX() {
|
|
8126
|
+
const hidden = this.hiddenColumns();
|
|
8127
|
+
const cols = this.orderedColumns().filter((c) => !hidden.has(c.key));
|
|
8128
|
+
const data = this.lazy() ? this.rows() : this.sorted();
|
|
8129
|
+
return buildXlsx(cols.map((c) => c.label), data.map((r) => cols.map((c) => r[c.key])));
|
|
8130
|
+
}
|
|
8131
|
+
/** Download the grid as an .xlsx file. */
|
|
8132
|
+
downloadXLSX(filename = 'datagrid.xlsx') {
|
|
8133
|
+
if (typeof document === 'undefined')
|
|
8134
|
+
return;
|
|
8135
|
+
const bytes = this.toXLSX();
|
|
8136
|
+
const copy = new Uint8Array(bytes);
|
|
8137
|
+
const blob = new Blob([copy.buffer], {
|
|
8138
|
+
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
8139
|
+
});
|
|
8140
|
+
const url = URL.createObjectURL(blob);
|
|
8141
|
+
const a = document.createElement('a');
|
|
8142
|
+
a.href = url;
|
|
8143
|
+
a.download = filename;
|
|
8144
|
+
a.click();
|
|
8145
|
+
URL.revokeObjectURL(url);
|
|
8146
|
+
}
|
|
7895
8147
|
/** Download the grid as a CSV file. */
|
|
7896
8148
|
downloadCSV(filename = 'datagrid.csv') {
|
|
7897
8149
|
if (typeof document === 'undefined')
|
|
@@ -8030,7 +8282,7 @@ class StrctDatagrid {
|
|
|
8030
8282
|
return String(a ?? '').localeCompare(String(b ?? ''), undefined, { numeric: true });
|
|
8031
8283
|
}
|
|
8032
8284
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StrctDatagrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8033
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: StrctDatagrid, isStandalone: true, selector: "strct-datagrid", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: true, isRequired: false, transformFunction: null }, detailPane: { classPropertyName: "detailPane", publicName: "detailPane", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, columnChooser: { classPropertyName: "columnChooser", publicName: "columnChooser", isSignal: true, isRequired: false, transformFunction: null }, sync: { classPropertyName: "sync", publicName: "sync", isSignal: true, isRequired: false, transformFunction: null }, footerActionsDisabled: { classPropertyName: "footerActionsDisabled", publicName: "footerActionsDisabled", isSignal: true, isRequired: false, transformFunction: null }, rowId: { classPropertyName: "rowId", publicName: "rowId", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, initialSelection: { classPropertyName: "initialSelection", publicName: "initialSelection", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, viewportHeight: { classPropertyName: "viewportHeight", publicName: "viewportHeight", isSignal: true, isRequired: false, transformFunction: null }, rowHeight: { classPropertyName: "rowHeight", publicName: "rowHeight", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, stateKey: { classPropertyName: "stateKey", publicName: "stateKey", isSignal: true, isRequired: false, transformFunction: null }, columnState: { classPropertyName: "columnState", publicName: "columnState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { columnState: "columnStateChange", selectionChange: "selectionChange", syncChange: "syncChange", rowAction: "rowAction", lazyLoad: "lazyLoad" }, host: { properties: { "class.strct-dg-host--compact": "compact()", "class.strct-dg-host--singleline": "singleLine()", "class.strct-dg-host--virtual": "virtual()", "class.strct-dg-host--sticky": "stickyActive()" }, classAttribute: "strct-dg-host" }, queries: [{ propertyName: "detailDef", first: true, predicate: StrctRowDetailDef, descendants: true, isSignal: true }, { propertyName: "actionBarDef", first: true, predicate: StrctDatagridActionBar, descendants: true, isSignal: true }, { propertyName: "cellDefs", predicate: StrctCellDef, isSignal: true }], ngImport: i0, template: `
|
|
8285
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: StrctDatagrid, isStandalone: true, selector: "strct-datagrid", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: true, isRequired: false, transformFunction: null }, detailPane: { classPropertyName: "detailPane", publicName: "detailPane", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, columnChooser: { classPropertyName: "columnChooser", publicName: "columnChooser", isSignal: true, isRequired: false, transformFunction: null }, sync: { classPropertyName: "sync", publicName: "sync", isSignal: true, isRequired: false, transformFunction: null }, footerActionsDisabled: { classPropertyName: "footerActionsDisabled", publicName: "footerActionsDisabled", isSignal: true, isRequired: false, transformFunction: null }, rowId: { classPropertyName: "rowId", publicName: "rowId", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, initialSelection: { classPropertyName: "initialSelection", publicName: "initialSelection", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, viewportHeight: { classPropertyName: "viewportHeight", publicName: "viewportHeight", isSignal: true, isRequired: false, transformFunction: null }, rowHeight: { classPropertyName: "rowHeight", publicName: "rowHeight", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, stateKey: { classPropertyName: "stateKey", publicName: "stateKey", isSignal: true, isRequired: false, transformFunction: null }, columnState: { classPropertyName: "columnState", publicName: "columnState", isSignal: true, isRequired: false, transformFunction: null }, reorderable: { classPropertyName: "reorderable", publicName: "reorderable", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { columnState: "columnStateChange", selectionChange: "selectionChange", syncChange: "syncChange", rowAction: "rowAction", lazyLoad: "lazyLoad" }, host: { properties: { "class.strct-dg-host--compact": "compact()", "class.strct-dg-host--singleline": "singleLine()", "class.strct-dg-host--virtual": "virtual()", "class.strct-dg-host--sticky": "stickyActive()" }, classAttribute: "strct-dg-host" }, queries: [{ propertyName: "detailDef", first: true, predicate: StrctRowDetailDef, descendants: true, isSignal: true }, { propertyName: "actionBarDef", first: true, predicate: StrctDatagridActionBar, descendants: true, isSignal: true }, { propertyName: "cellDefs", predicate: StrctCellDef, isSignal: true }], ngImport: i0, template: `
|
|
8034
8286
|
@if (actionBarDef()) {
|
|
8035
8287
|
<div class="strct-dg__toolbar"><ng-content select="[strctDatagridActionBar]" /></div>
|
|
8036
8288
|
}
|
|
@@ -8080,11 +8332,17 @@ class StrctDatagrid {
|
|
|
8080
8332
|
[style.text-align]="col.align ?? 'start'"
|
|
8081
8333
|
[style.width]="colWidth(col.key) ?? col.width ?? null"
|
|
8082
8334
|
[class.strct-dg__th--sortable]="col.sortable"
|
|
8335
|
+
[class.strct-dg__th--drop]="col.key === dropKey()"
|
|
8083
8336
|
[class.strct-dg__cell--sticky]="isSticky(col)"
|
|
8084
8337
|
[class.strct-dg__cell--sticky-last]="col.key === lastStickyKey()"
|
|
8085
8338
|
[style.insetInlineStart.px]="stickyLeft(col.key)"
|
|
8086
8339
|
[attr.tabindex]="col.sortable ? 0 : null"
|
|
8087
8340
|
[attr.aria-sort]="col.sortable ? ariaSort(col.key) : null"
|
|
8341
|
+
[attr.draggable]="reorderable() ? true : null"
|
|
8342
|
+
(dragstart)="onColDragStart(col.key, $event)"
|
|
8343
|
+
(dragover)="onColDragOver(col.key, $event)"
|
|
8344
|
+
(drop)="onColDrop(col.key)"
|
|
8345
|
+
(dragend)="onColDragEnd()"
|
|
8088
8346
|
(click)="col.sortable && sortBy(col.key)"
|
|
8089
8347
|
(keydown.enter)="col.sortable && sortBy(col.key)"
|
|
8090
8348
|
(keydown.space)="col.sortable && onHeaderSpace($event, col.key)"
|
|
@@ -8141,105 +8399,129 @@ class StrctDatagrid {
|
|
|
8141
8399
|
<td [attr.colspan]="colspan()" [style.height.px]="topPad()"></td>
|
|
8142
8400
|
</tr>
|
|
8143
8401
|
}
|
|
8144
|
-
@for (
|
|
8145
|
-
|
|
8146
|
-
|
|
8147
|
-
|
|
8148
|
-
|
|
8149
|
-
@if (canDetail()) {
|
|
8150
|
-
<td
|
|
8151
|
-
class="strct-dg__expandcell"
|
|
8152
|
-
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8153
|
-
[style.insetInlineStart.px]="utilLeft('detail')"
|
|
8154
|
-
>
|
|
8402
|
+
@for (it of displayItems(); track itemKey(it)) {
|
|
8403
|
+
@if (it.group; as grp) {
|
|
8404
|
+
<!-- Group header: distinct value + count, collapsible. -->
|
|
8405
|
+
<tr class="strct-dg__grouprow">
|
|
8406
|
+
<td [attr.colspan]="colspan()">
|
|
8155
8407
|
<button
|
|
8156
8408
|
type="button"
|
|
8157
|
-
class="strct-
|
|
8158
|
-
[
|
|
8159
|
-
|
|
8160
|
-
[attr.aria-label]="L().openDetail"
|
|
8161
|
-
(click)="openDetail(row)"
|
|
8409
|
+
class="strct-dg__groupbtn"
|
|
8410
|
+
[attr.aria-expanded]="!grp.collapsed"
|
|
8411
|
+
(click)="toggleGroup(grp.key)"
|
|
8162
8412
|
>
|
|
8163
|
-
<
|
|
8413
|
+
<span
|
|
8414
|
+
class="strct-dg__groupchev"
|
|
8415
|
+
[class.strct-dg__groupchev--open]="!grp.collapsed"
|
|
8416
|
+
>
|
|
8417
|
+
<strct-icon name="chevronRight" [size]="12" [strokeWidth]="1.7" />
|
|
8418
|
+
</span>
|
|
8419
|
+
<span class="strct-dg__grouplabel">{{ grp.label }}</span>
|
|
8420
|
+
<span class="strct-dg__groupcount">{{ grp.count }}</span>
|
|
8164
8421
|
</button>
|
|
8165
8422
|
</td>
|
|
8166
|
-
|
|
8167
|
-
|
|
8168
|
-
|
|
8169
|
-
|
|
8170
|
-
|
|
8171
|
-
|
|
8172
|
-
|
|
8173
|
-
|
|
8174
|
-
|
|
8175
|
-
class="strct-
|
|
8176
|
-
[class.strct-
|
|
8177
|
-
[
|
|
8178
|
-
[attr.aria-label]="L().toggleDetail"
|
|
8179
|
-
(click)="toggleExpand(row)"
|
|
8423
|
+
</tr>
|
|
8424
|
+
} @else {
|
|
8425
|
+
@let row = it.row!;
|
|
8426
|
+
<tr
|
|
8427
|
+
[class.strct-dg__row--selected]="isSelected(row)"
|
|
8428
|
+
[class.strct-dg__row--active]="paneOpen() && row === activeRow()"
|
|
8429
|
+
>
|
|
8430
|
+
@if (canDetail()) {
|
|
8431
|
+
<td
|
|
8432
|
+
class="strct-dg__expandcell"
|
|
8433
|
+
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8434
|
+
[style.insetInlineStart.px]="utilLeft('detail')"
|
|
8180
8435
|
>
|
|
8181
|
-
<
|
|
8182
|
-
|
|
8183
|
-
|
|
8184
|
-
|
|
8185
|
-
|
|
8186
|
-
|
|
8187
|
-
|
|
8188
|
-
|
|
8189
|
-
|
|
8190
|
-
|
|
8191
|
-
|
|
8192
|
-
|
|
8193
|
-
|
|
8194
|
-
|
|
8195
|
-
|
|
8196
|
-
|
|
8197
|
-
|
|
8198
|
-
@for (col of visibleColumns(); track col.key) {
|
|
8199
|
-
<td
|
|
8200
|
-
[style.text-align]="col.align ?? 'start'"
|
|
8201
|
-
[class.strct-dg__cell--sticky]="isSticky(col)"
|
|
8202
|
-
[class.strct-dg__cell--sticky-last]="col.key === lastStickyKey()"
|
|
8203
|
-
[style.insetInlineStart.px]="stickyLeft(col.key)"
|
|
8204
|
-
>
|
|
8205
|
-
@if (cellTemplate(col.key); as tpl) {
|
|
8206
|
-
<ng-container
|
|
8207
|
-
[ngTemplateOutlet]="tpl"
|
|
8208
|
-
[ngTemplateOutletContext]="{
|
|
8209
|
-
$implicit: row,
|
|
8210
|
-
value: row[col.key],
|
|
8211
|
-
column: col,
|
|
8212
|
-
}"
|
|
8213
|
-
/>
|
|
8214
|
-
} @else {
|
|
8215
|
-
{{ row[col.key] }}
|
|
8216
|
-
}
|
|
8217
|
-
</td>
|
|
8218
|
-
}
|
|
8219
|
-
@if (canActions()) {
|
|
8220
|
-
<td class="strct-dg__actioncell">
|
|
8221
|
-
<button
|
|
8222
|
-
type="button"
|
|
8223
|
-
class="strct-dg__kebab"
|
|
8224
|
-
[attr.aria-label]="L().rowActions"
|
|
8225
|
-
(click)="openRowMenu(row, $event)"
|
|
8436
|
+
<button
|
|
8437
|
+
type="button"
|
|
8438
|
+
class="strct-dg__detailbtn"
|
|
8439
|
+
[class.strct-dg__detailbtn--active]="row === activeRow()"
|
|
8440
|
+
[attr.aria-expanded]="row === activeRow()"
|
|
8441
|
+
[attr.aria-label]="L().openDetail"
|
|
8442
|
+
(click)="openDetail(row)"
|
|
8443
|
+
>
|
|
8444
|
+
<strct-icon name="chevronDoubleRight" [size]="13" [strokeWidth]="1.6" />
|
|
8445
|
+
</button>
|
|
8446
|
+
</td>
|
|
8447
|
+
}
|
|
8448
|
+
@if (canExpand()) {
|
|
8449
|
+
<td
|
|
8450
|
+
class="strct-dg__expandcell"
|
|
8451
|
+
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8452
|
+
[style.insetInlineStart.px]="utilLeft('expand')"
|
|
8226
8453
|
>
|
|
8227
|
-
<
|
|
8228
|
-
|
|
8229
|
-
|
|
8230
|
-
|
|
8231
|
-
|
|
8232
|
-
|
|
8233
|
-
|
|
8234
|
-
|
|
8235
|
-
|
|
8236
|
-
|
|
8237
|
-
|
|
8238
|
-
|
|
8454
|
+
<button
|
|
8455
|
+
type="button"
|
|
8456
|
+
class="strct-dg__expandbtn"
|
|
8457
|
+
[class.strct-dg__expandbtn--open]="isExpanded(row)"
|
|
8458
|
+
[attr.aria-expanded]="isExpanded(row)"
|
|
8459
|
+
[attr.aria-label]="L().toggleDetail"
|
|
8460
|
+
(click)="toggleExpand(row)"
|
|
8461
|
+
>
|
|
8462
|
+
<strct-icon name="chevronRight" [size]="12" [strokeWidth]="1.7" />
|
|
8463
|
+
</button>
|
|
8464
|
+
</td>
|
|
8465
|
+
}
|
|
8466
|
+
@if (selectable()) {
|
|
8467
|
+
<td
|
|
8468
|
+
class="strct-dg__sel"
|
|
8469
|
+
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8470
|
+
[style.insetInlineStart.px]="utilLeft('sel')"
|
|
8471
|
+
>
|
|
8472
|
+
<strct-checkbox
|
|
8473
|
+
[ariaLabel]="L().selectRow"
|
|
8474
|
+
[checked]="isSelected(row)"
|
|
8475
|
+
(checkedChange)="toggleRow(row)"
|
|
8239
8476
|
/>
|
|
8240
|
-
</
|
|
8241
|
-
|
|
8477
|
+
</td>
|
|
8478
|
+
}
|
|
8479
|
+
@for (col of visibleColumns(); track col.key) {
|
|
8480
|
+
<td
|
|
8481
|
+
[style.text-align]="col.align ?? 'start'"
|
|
8482
|
+
[class.strct-dg__cell--sticky]="isSticky(col)"
|
|
8483
|
+
[class.strct-dg__cell--sticky-last]="col.key === lastStickyKey()"
|
|
8484
|
+
[style.insetInlineStart.px]="stickyLeft(col.key)"
|
|
8485
|
+
>
|
|
8486
|
+
@if (cellTemplate(col.key); as tpl) {
|
|
8487
|
+
<ng-container
|
|
8488
|
+
[ngTemplateOutlet]="tpl"
|
|
8489
|
+
[ngTemplateOutletContext]="{
|
|
8490
|
+
$implicit: row,
|
|
8491
|
+
value: row[col.key],
|
|
8492
|
+
column: col,
|
|
8493
|
+
}"
|
|
8494
|
+
/>
|
|
8495
|
+
} @else {
|
|
8496
|
+
{{ row[col.key] }}
|
|
8497
|
+
}
|
|
8498
|
+
</td>
|
|
8499
|
+
}
|
|
8500
|
+
@if (canActions()) {
|
|
8501
|
+
<td class="strct-dg__actioncell">
|
|
8502
|
+
<button
|
|
8503
|
+
type="button"
|
|
8504
|
+
class="strct-dg__kebab"
|
|
8505
|
+
[attr.aria-label]="L().rowActions"
|
|
8506
|
+
(click)="openRowMenu(row, $event)"
|
|
8507
|
+
>
|
|
8508
|
+
<strct-icon name="dots" [size]="16" />
|
|
8509
|
+
</button>
|
|
8510
|
+
</td>
|
|
8511
|
+
}
|
|
8242
8512
|
</tr>
|
|
8513
|
+
@if (canExpand() && isExpanded(row)) {
|
|
8514
|
+
<tr class="strct-dg__detailrow">
|
|
8515
|
+
<td [attr.colspan]="colspan()">
|
|
8516
|
+
<div class="strct-dg__detail">
|
|
8517
|
+
<ng-container
|
|
8518
|
+
[ngTemplateOutlet]="detailDef()!.template"
|
|
8519
|
+
[ngTemplateOutletContext]="{ $implicit: row }"
|
|
8520
|
+
/>
|
|
8521
|
+
</div>
|
|
8522
|
+
</td>
|
|
8523
|
+
</tr>
|
|
8524
|
+
}
|
|
8243
8525
|
}
|
|
8244
8526
|
} @empty {
|
|
8245
8527
|
<tr>
|
|
@@ -8333,13 +8615,13 @@ class StrctDatagrid {
|
|
|
8333
8615
|
</span>
|
|
8334
8616
|
</div>
|
|
8335
8617
|
<div class="strct-dg__foot-right">
|
|
8336
|
-
@if (pageSize() > 0) {
|
|
8618
|
+
@if (pageSize() > 0 && !groupBy()) {
|
|
8337
8619
|
<strct-pagination [total]="totalCount()" [pageSize]="pageSize()" [(page)]="page" />
|
|
8338
8620
|
}
|
|
8339
8621
|
</div>
|
|
8340
8622
|
</div>
|
|
8341
8623
|
}
|
|
8342
|
-
`, isInline: true, styles: [".strct-dg-host{display:block;border:1px solid var(--b2);border-radius:10px;background:var(--bg-2);box-shadow:var(--shadow-rest)}.strct-dg__scroll{flex:1 1 auto;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.strct-dg-host--virtual .strct-dg__scroll{overflow-y:auto}.strct-dg-host--virtual .strct-dg thead th{position:sticky;top:0;z-index:5}.strct-dg__vspacer td{padding:0;border:0;background:transparent}.strct-dg-host--sticky .strct-dg,.strct-dg-host--virtual .strct-dg{border-collapse:separate;border-spacing:0;overflow:visible;border-radius:0}.strct-dg-host--sticky .strct-dg{width:max-content;min-width:100%}.strct-dg .strct-dg__cell--sticky{position:sticky;z-index:3}.strct-dg thead th.strct-dg__cell--sticky{z-index:6}.strct-dg .strct-dg__cell--sticky-last:after{content:\"\";position:absolute;top:0;bottom:0;inset-inline-end:-1px;width:7px;pointer-events:none;background:linear-gradient(to right,rgba(0,0,0,.14),transparent)}[dir=rtl] .strct-dg .strct-dg__cell--sticky-last:after{background:linear-gradient(to left,rgba(0,0,0,.14),transparent)}.strct-dg-host--sticky .strct-dg__expandcol,.strct-dg-host--sticky .strct-dg__expandcell{width:36px;min-width:36px;max-width:36px;box-sizing:border-box}.strct-dg-host--sticky .strct-dg__sel{width:40px;min-width:40px;max-width:40px;box-sizing:border-box}.strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-3)}.strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-3)}.strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg{width:100%;border-collapse:collapse;font-size:13px;overflow:hidden;background:var(--bg-2)}.strct-dg-host:not(:has(.strct-dg__toolbar)) .strct-dg{border-start-start-radius:9px;border-start-end-radius:9px}.strct-dg-host:not(:has(.strct-dg__foot)) .strct-dg{border-end-start-radius:9px;border-end-end-radius:9px}.strct-dg th,.strct-dg td{padding:9px 13px;text-align:start;border-bottom:1px solid var(--b1)}.strct-dg tbody td{background:var(--bg-1)}[data-theme=dark] .strct-dg tbody td{background:var(--bg-3)}.strct-dg-host--compact .strct-dg th,.strct-dg-host--compact .strct-dg td{padding:5px 11px}.strct-dg-host--singleline .strct-dg tbody tr:not(.strct-dg__detailrow)>td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:360px}.strct-dg th{position:relative;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--t2);background:var(--bg-2);white-space:nowrap;-webkit-user-select:none;user-select:none}.strct-dg__th--sortable{cursor:pointer}.strct-dg__th--sortable:hover{color:var(--t1)}.strct-dg__th--sortable:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__hd{display:inline-flex;align-items:center;gap:5px}.strct-dg__sorticon{color:var(--t3)}.strct-dg__th--sortable:hover .strct-dg__sorticon{color:var(--acc)}.strct-dg__resize{position:absolute;inset-inline-end:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;z-index:2}.strct-dg__resize:hover{background:var(--acc)}.strct-dg td{color:var(--t1)}.strct-dg tbody tr:last-child td{border-bottom:0}.strct-dg tbody tr:not(.strct-dg__detailrow):hover td{background:var(--acc-s)}.strct-dg__row--selected td{background:var(--acc-m)}.strct-dg__sel{width:1%;white-space:nowrap}.strct-dg__sel input{accent-color:var(--acc);width:15px;height:15px;cursor:pointer}.strct-dg__expandcol,.strct-dg__expandcell{width:1%;white-space:nowrap}.strct-dg__actioncol,.strct-dg__actioncell{width:1%;white-space:nowrap;text-align:end}.strct-dg__kebab{display:inline-flex;padding:4px;border:0;border-radius:5px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__kebab:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:transform .15s ease,color .15s ease}.strct-dg__expandbtn:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn--open{transform:rotate(90deg);color:var(--acc)}.strct-dg__detailbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__detailbtn:hover{color:var(--acc);background:var(--bg-3)}.strct-dg__detailbtn--active{color:var(--acc);background:var(--acc-m)}.strct-dg__detailrow td{background:var(--bg-2);padding:0}.strct-dg__detail{padding:14px 16px;font-size:13px;color:var(--t2)}.strct-dg__layout{display:flex;align-items:flex-start;min-width:0}.strct-dg__layout--paned{gap:0}.strct-dg__layout--paned .strct-dg__scroll{flex:0 0 auto;width:260px;min-width:260px;max-width:260px}.strct-dg__layout--paned .strct-dg{width:260px;min-width:260px;max-width:260px;flex-shrink:0;border-top-right-radius:0;border-bottom-right-radius:0}.strct-dg__row--clickable{cursor:pointer}.strct-dg__row--active td{background:var(--acc-m)}.strct-dg__layout--paned .strct-dg__row--active td:last-child{position:relative;padding-inline-end:26px}.strct-dg__layout--paned .strct-dg__row--active td:last-child:after{content:\"\";position:absolute;right:11px;top:50%;width:6px;height:6px;border-top:1.6px solid var(--acc);border-inline-end:1.6px solid var(--acc);transform:translateY(-50%) rotate(45deg)}.strct-dg__pane{flex:1;min-width:0;align-self:stretch;background:var(--bg-1);border:1px solid var(--b2);border-inline-start:2px solid var(--acc);border-radius:0 8px 8px 0;overflow:hidden;animation:strct-dg-pane-in .14s ease}.strct-dg__pane-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px;border-bottom:1px solid var(--b1);font-size:13px;font-weight:600;color:var(--t1)}.strct-dg__pane-close{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer}.strct-dg__pane-close:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__pane-body{padding:14px 16px;font-size:13px;color:var(--t2)}@keyframes strct-dg-pane-in{0%{opacity:0;transform:translate(8px)}}@keyframes strct-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}.strct-dg__skeleton-block{height:12px;background:var(--bg-3);border-radius:var(--radius-sm);animation:strct-skeleton-pulse 1.4s ease infinite}.strct-dg__skeleton-row td{border-bottom:1px solid var(--b1)}.strct-dg__empty{text-align:center;color:var(--t3);padding:22px}.strct-dg__toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;border-bottom:1px solid var(--b2)}.strct-dg__foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 14px;border-top:1px solid var(--b2);flex-wrap:wrap}.strct-dg__foot-left,.strct-dg__foot-right{display:flex;align-items:center;gap:12px}.strct-dg__actions{position:relative}.strct-dg__chooser-menu{position:absolute;bottom:calc(100% + 6px);left:0;z-index:10;min-width:180px;background:var(--bg-1);border:1px solid var(--b2);border-radius:8px;box-shadow:var(--shadow-pop);padding:6px;display:flex;flex-direction:column;gap:2px}.strct-dg__chooser-menu--right{inset-inline-start:auto;inset-inline-end:0}.strct-dg__chooser-item{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;cursor:pointer;font-size:12px;color:var(--t1);transition:background .1s ease;-webkit-user-select:none;user-select:none}.strct-dg__chooser-item:hover{background:var(--bg-3)}.strct-dg__count{font-size:12px;color:var(--t2)}.strct-dg__count-sep{margin:0 8px;color:var(--b2)}.strct-dg__count-sel{color:var(--acc)}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "component", type: StrctPagination, selector: "strct-pagination", inputs: ["prevLabel", "nextLabel", "regionLabel", "total", "pageSize", "page"], outputs: ["pageChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrctCheckbox, selector: "strct-checkbox", inputs: ["checked", "isDisabled", "disabled", "indeterminate", "ariaLabel"], outputs: ["checkedChange", "isDisabledChange"] }, { kind: "component", type: StrctButton, selector: "button[strct-button], a[strct-button]", inputs: ["variant", "size", "solid", "block", "iconOnly"] }, { kind: "component", type: StrctButtonGroup, selector: "strct-button-group" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
8624
|
+
`, isInline: true, styles: [".strct-dg-host{display:block;border:1px solid var(--b2);border-radius:10px;background:var(--bg-2);box-shadow:var(--shadow-rest)}.strct-dg__scroll{flex:1 1 auto;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.strct-dg-host--virtual .strct-dg__scroll{overflow-y:auto}.strct-dg-host--virtual .strct-dg thead th{position:sticky;top:0;z-index:5}.strct-dg__vspacer td{padding:0;border:0;background:transparent}.strct-dg th[draggable]{cursor:grab}.strct-dg__th--drop{box-shadow:inset 3px 0 0 var(--acc)}.strct-dg__grouprow td{background:var(--bg-2)!important;padding:0}.strct-dg__groupbtn{display:flex;align-items:center;gap:8px;width:100%;padding:7px 13px;border:0;background:transparent;color:var(--t1);font-family:var(--font);font-size:12.5px;font-weight:600;cursor:pointer;text-align:start}.strct-dg__groupbtn:hover{background:var(--bg-3)}.strct-dg__groupbtn:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__groupchev{display:inline-flex;color:var(--t3);transition:transform .15s ease}.strct-dg__groupchev--open{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){.strct-dg__groupchev{transition:none}}.strct-dg__groupcount{min-width:18px;height:18px;padding:0 5px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;border-radius:9px;background:var(--acc-m);color:var(--acc);font-variant-numeric:tabular-nums}.strct-dg-host--sticky .strct-dg,.strct-dg-host--virtual .strct-dg{border-collapse:separate;border-spacing:0;overflow:visible;border-radius:0}.strct-dg-host--sticky .strct-dg{width:max-content;min-width:100%}.strct-dg .strct-dg__cell--sticky{position:sticky;z-index:3}.strct-dg thead th.strct-dg__cell--sticky{z-index:6}.strct-dg .strct-dg__cell--sticky-last:after{content:\"\";position:absolute;top:0;bottom:0;inset-inline-end:-1px;width:7px;pointer-events:none;background:linear-gradient(to right,rgba(0,0,0,.14),transparent)}[dir=rtl] .strct-dg .strct-dg__cell--sticky-last:after{background:linear-gradient(to left,rgba(0,0,0,.14),transparent)}.strct-dg-host--sticky .strct-dg__expandcol,.strct-dg-host--sticky .strct-dg__expandcell{width:36px;min-width:36px;max-width:36px;box-sizing:border-box}.strct-dg-host--sticky .strct-dg__sel{width:40px;min-width:40px;max-width:40px;box-sizing:border-box}.strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-3)}.strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-3)}.strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg{width:100%;border-collapse:collapse;font-size:13px;overflow:hidden;background:var(--bg-2)}.strct-dg-host:not(:has(.strct-dg__toolbar)) .strct-dg{border-start-start-radius:9px;border-start-end-radius:9px}.strct-dg-host:not(:has(.strct-dg__foot)) .strct-dg{border-end-start-radius:9px;border-end-end-radius:9px}.strct-dg th,.strct-dg td{padding:9px 13px;text-align:start;border-bottom:1px solid var(--b1)}.strct-dg tbody td{background:var(--bg-1)}[data-theme=dark] .strct-dg tbody td{background:var(--bg-3)}.strct-dg-host--compact .strct-dg th,.strct-dg-host--compact .strct-dg td{padding:5px 11px}.strct-dg-host--singleline .strct-dg tbody tr:not(.strct-dg__detailrow)>td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:360px}.strct-dg th{position:relative;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--t2);background:var(--bg-2);white-space:nowrap;-webkit-user-select:none;user-select:none}.strct-dg__th--sortable{cursor:pointer}.strct-dg__th--sortable:hover{color:var(--t1)}.strct-dg__th--sortable:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__hd{display:inline-flex;align-items:center;gap:5px}.strct-dg__sorticon{color:var(--t3)}.strct-dg__th--sortable:hover .strct-dg__sorticon{color:var(--acc)}.strct-dg__resize{position:absolute;inset-inline-end:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;z-index:2}.strct-dg__resize:hover{background:var(--acc)}.strct-dg td{color:var(--t1)}.strct-dg tbody tr:last-child td{border-bottom:0}.strct-dg tbody tr:not(.strct-dg__detailrow):hover td{background:var(--acc-s)}.strct-dg__row--selected td{background:var(--acc-m)}.strct-dg__sel{width:1%;white-space:nowrap}.strct-dg__sel input{accent-color:var(--acc);width:15px;height:15px;cursor:pointer}.strct-dg__expandcol,.strct-dg__expandcell{width:1%;white-space:nowrap}.strct-dg__actioncol,.strct-dg__actioncell{width:1%;white-space:nowrap;text-align:end}.strct-dg__kebab{display:inline-flex;padding:4px;border:0;border-radius:5px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__kebab:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:transform .15s ease,color .15s ease}.strct-dg__expandbtn:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn--open{transform:rotate(90deg);color:var(--acc)}.strct-dg__detailbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__detailbtn:hover{color:var(--acc);background:var(--bg-3)}.strct-dg__detailbtn--active{color:var(--acc);background:var(--acc-m)}.strct-dg__detailrow td{background:var(--bg-2);padding:0}.strct-dg__detail{padding:14px 16px;font-size:13px;color:var(--t2)}.strct-dg__layout{display:flex;align-items:flex-start;min-width:0}.strct-dg__layout--paned{gap:0}.strct-dg__layout--paned .strct-dg__scroll{flex:0 0 auto;width:260px;min-width:260px;max-width:260px}.strct-dg__layout--paned .strct-dg{width:260px;min-width:260px;max-width:260px;flex-shrink:0;border-top-right-radius:0;border-bottom-right-radius:0}.strct-dg__row--clickable{cursor:pointer}.strct-dg__row--active td{background:var(--acc-m)}.strct-dg__layout--paned .strct-dg__row--active td:last-child{position:relative;padding-inline-end:26px}.strct-dg__layout--paned .strct-dg__row--active td:last-child:after{content:\"\";position:absolute;right:11px;top:50%;width:6px;height:6px;border-top:1.6px solid var(--acc);border-inline-end:1.6px solid var(--acc);transform:translateY(-50%) rotate(45deg)}.strct-dg__pane{flex:1;min-width:0;align-self:stretch;background:var(--bg-1);border:1px solid var(--b2);border-inline-start:2px solid var(--acc);border-radius:0 8px 8px 0;overflow:hidden;animation:strct-dg-pane-in .14s ease}.strct-dg__pane-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px;border-bottom:1px solid var(--b1);font-size:13px;font-weight:600;color:var(--t1)}.strct-dg__pane-close{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer}.strct-dg__pane-close:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__pane-body{padding:14px 16px;font-size:13px;color:var(--t2)}@keyframes strct-dg-pane-in{0%{opacity:0;transform:translate(8px)}}@keyframes strct-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}.strct-dg__skeleton-block{height:12px;background:var(--bg-3);border-radius:var(--radius-sm);animation:strct-skeleton-pulse 1.4s ease infinite}.strct-dg__skeleton-row td{border-bottom:1px solid var(--b1)}.strct-dg__empty{text-align:center;color:var(--t3);padding:22px}.strct-dg__toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;border-bottom:1px solid var(--b2)}.strct-dg__foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 14px;border-top:1px solid var(--b2);flex-wrap:wrap}.strct-dg__foot-left,.strct-dg__foot-right{display:flex;align-items:center;gap:12px}.strct-dg__actions{position:relative}.strct-dg__chooser-menu{position:absolute;bottom:calc(100% + 6px);left:0;z-index:10;min-width:180px;background:var(--bg-1);border:1px solid var(--b2);border-radius:8px;box-shadow:var(--shadow-pop);padding:6px;display:flex;flex-direction:column;gap:2px}.strct-dg__chooser-menu--right{inset-inline-start:auto;inset-inline-end:0}.strct-dg__chooser-item{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;cursor:pointer;font-size:12px;color:var(--t1);transition:background .1s ease;-webkit-user-select:none;user-select:none}.strct-dg__chooser-item:hover{background:var(--bg-3)}.strct-dg__count{font-size:12px;color:var(--t2)}.strct-dg__count-sep{margin:0 8px;color:var(--b2)}.strct-dg__count-sel{color:var(--acc)}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "component", type: StrctPagination, selector: "strct-pagination", inputs: ["prevLabel", "nextLabel", "regionLabel", "total", "pageSize", "page"], outputs: ["pageChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrctCheckbox, selector: "strct-checkbox", inputs: ["checked", "isDisabled", "disabled", "indeterminate", "ariaLabel"], outputs: ["checkedChange", "isDisabledChange"] }, { kind: "component", type: StrctButton, selector: "button[strct-button], a[strct-button]", inputs: ["variant", "size", "solid", "block", "iconOnly"] }, { kind: "component", type: StrctButtonGroup, selector: "strct-button-group" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
8343
8625
|
}
|
|
8344
8626
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StrctDatagrid, decorators: [{
|
|
8345
8627
|
type: Component,
|
|
@@ -8400,11 +8682,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
8400
8682
|
[style.text-align]="col.align ?? 'start'"
|
|
8401
8683
|
[style.width]="colWidth(col.key) ?? col.width ?? null"
|
|
8402
8684
|
[class.strct-dg__th--sortable]="col.sortable"
|
|
8685
|
+
[class.strct-dg__th--drop]="col.key === dropKey()"
|
|
8403
8686
|
[class.strct-dg__cell--sticky]="isSticky(col)"
|
|
8404
8687
|
[class.strct-dg__cell--sticky-last]="col.key === lastStickyKey()"
|
|
8405
8688
|
[style.insetInlineStart.px]="stickyLeft(col.key)"
|
|
8406
8689
|
[attr.tabindex]="col.sortable ? 0 : null"
|
|
8407
8690
|
[attr.aria-sort]="col.sortable ? ariaSort(col.key) : null"
|
|
8691
|
+
[attr.draggable]="reorderable() ? true : null"
|
|
8692
|
+
(dragstart)="onColDragStart(col.key, $event)"
|
|
8693
|
+
(dragover)="onColDragOver(col.key, $event)"
|
|
8694
|
+
(drop)="onColDrop(col.key)"
|
|
8695
|
+
(dragend)="onColDragEnd()"
|
|
8408
8696
|
(click)="col.sortable && sortBy(col.key)"
|
|
8409
8697
|
(keydown.enter)="col.sortable && sortBy(col.key)"
|
|
8410
8698
|
(keydown.space)="col.sortable && onHeaderSpace($event, col.key)"
|
|
@@ -8461,105 +8749,129 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
8461
8749
|
<td [attr.colspan]="colspan()" [style.height.px]="topPad()"></td>
|
|
8462
8750
|
</tr>
|
|
8463
8751
|
}
|
|
8464
|
-
@for (
|
|
8465
|
-
|
|
8466
|
-
|
|
8467
|
-
|
|
8468
|
-
|
|
8469
|
-
@if (canDetail()) {
|
|
8470
|
-
<td
|
|
8471
|
-
class="strct-dg__expandcell"
|
|
8472
|
-
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8473
|
-
[style.insetInlineStart.px]="utilLeft('detail')"
|
|
8474
|
-
>
|
|
8752
|
+
@for (it of displayItems(); track itemKey(it)) {
|
|
8753
|
+
@if (it.group; as grp) {
|
|
8754
|
+
<!-- Group header: distinct value + count, collapsible. -->
|
|
8755
|
+
<tr class="strct-dg__grouprow">
|
|
8756
|
+
<td [attr.colspan]="colspan()">
|
|
8475
8757
|
<button
|
|
8476
8758
|
type="button"
|
|
8477
|
-
class="strct-
|
|
8478
|
-
[
|
|
8479
|
-
|
|
8480
|
-
[attr.aria-label]="L().openDetail"
|
|
8481
|
-
(click)="openDetail(row)"
|
|
8759
|
+
class="strct-dg__groupbtn"
|
|
8760
|
+
[attr.aria-expanded]="!grp.collapsed"
|
|
8761
|
+
(click)="toggleGroup(grp.key)"
|
|
8482
8762
|
>
|
|
8483
|
-
<
|
|
8763
|
+
<span
|
|
8764
|
+
class="strct-dg__groupchev"
|
|
8765
|
+
[class.strct-dg__groupchev--open]="!grp.collapsed"
|
|
8766
|
+
>
|
|
8767
|
+
<strct-icon name="chevronRight" [size]="12" [strokeWidth]="1.7" />
|
|
8768
|
+
</span>
|
|
8769
|
+
<span class="strct-dg__grouplabel">{{ grp.label }}</span>
|
|
8770
|
+
<span class="strct-dg__groupcount">{{ grp.count }}</span>
|
|
8484
8771
|
</button>
|
|
8485
8772
|
</td>
|
|
8486
|
-
|
|
8487
|
-
|
|
8488
|
-
|
|
8489
|
-
|
|
8490
|
-
|
|
8491
|
-
|
|
8492
|
-
|
|
8493
|
-
|
|
8494
|
-
|
|
8495
|
-
class="strct-
|
|
8496
|
-
[class.strct-
|
|
8497
|
-
[
|
|
8498
|
-
[attr.aria-label]="L().toggleDetail"
|
|
8499
|
-
(click)="toggleExpand(row)"
|
|
8773
|
+
</tr>
|
|
8774
|
+
} @else {
|
|
8775
|
+
@let row = it.row!;
|
|
8776
|
+
<tr
|
|
8777
|
+
[class.strct-dg__row--selected]="isSelected(row)"
|
|
8778
|
+
[class.strct-dg__row--active]="paneOpen() && row === activeRow()"
|
|
8779
|
+
>
|
|
8780
|
+
@if (canDetail()) {
|
|
8781
|
+
<td
|
|
8782
|
+
class="strct-dg__expandcell"
|
|
8783
|
+
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8784
|
+
[style.insetInlineStart.px]="utilLeft('detail')"
|
|
8500
8785
|
>
|
|
8501
|
-
<
|
|
8502
|
-
|
|
8503
|
-
|
|
8504
|
-
|
|
8505
|
-
|
|
8506
|
-
|
|
8507
|
-
|
|
8508
|
-
|
|
8509
|
-
|
|
8510
|
-
|
|
8511
|
-
|
|
8512
|
-
|
|
8513
|
-
|
|
8514
|
-
|
|
8515
|
-
|
|
8516
|
-
|
|
8517
|
-
|
|
8518
|
-
@for (col of visibleColumns(); track col.key) {
|
|
8519
|
-
<td
|
|
8520
|
-
[style.text-align]="col.align ?? 'start'"
|
|
8521
|
-
[class.strct-dg__cell--sticky]="isSticky(col)"
|
|
8522
|
-
[class.strct-dg__cell--sticky-last]="col.key === lastStickyKey()"
|
|
8523
|
-
[style.insetInlineStart.px]="stickyLeft(col.key)"
|
|
8524
|
-
>
|
|
8525
|
-
@if (cellTemplate(col.key); as tpl) {
|
|
8526
|
-
<ng-container
|
|
8527
|
-
[ngTemplateOutlet]="tpl"
|
|
8528
|
-
[ngTemplateOutletContext]="{
|
|
8529
|
-
$implicit: row,
|
|
8530
|
-
value: row[col.key],
|
|
8531
|
-
column: col,
|
|
8532
|
-
}"
|
|
8533
|
-
/>
|
|
8534
|
-
} @else {
|
|
8535
|
-
{{ row[col.key] }}
|
|
8536
|
-
}
|
|
8537
|
-
</td>
|
|
8538
|
-
}
|
|
8539
|
-
@if (canActions()) {
|
|
8540
|
-
<td class="strct-dg__actioncell">
|
|
8541
|
-
<button
|
|
8542
|
-
type="button"
|
|
8543
|
-
class="strct-dg__kebab"
|
|
8544
|
-
[attr.aria-label]="L().rowActions"
|
|
8545
|
-
(click)="openRowMenu(row, $event)"
|
|
8786
|
+
<button
|
|
8787
|
+
type="button"
|
|
8788
|
+
class="strct-dg__detailbtn"
|
|
8789
|
+
[class.strct-dg__detailbtn--active]="row === activeRow()"
|
|
8790
|
+
[attr.aria-expanded]="row === activeRow()"
|
|
8791
|
+
[attr.aria-label]="L().openDetail"
|
|
8792
|
+
(click)="openDetail(row)"
|
|
8793
|
+
>
|
|
8794
|
+
<strct-icon name="chevronDoubleRight" [size]="13" [strokeWidth]="1.6" />
|
|
8795
|
+
</button>
|
|
8796
|
+
</td>
|
|
8797
|
+
}
|
|
8798
|
+
@if (canExpand()) {
|
|
8799
|
+
<td
|
|
8800
|
+
class="strct-dg__expandcell"
|
|
8801
|
+
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8802
|
+
[style.insetInlineStart.px]="utilLeft('expand')"
|
|
8546
8803
|
>
|
|
8547
|
-
<
|
|
8548
|
-
|
|
8549
|
-
|
|
8550
|
-
|
|
8551
|
-
|
|
8552
|
-
|
|
8553
|
-
|
|
8554
|
-
|
|
8555
|
-
|
|
8556
|
-
|
|
8557
|
-
|
|
8558
|
-
|
|
8804
|
+
<button
|
|
8805
|
+
type="button"
|
|
8806
|
+
class="strct-dg__expandbtn"
|
|
8807
|
+
[class.strct-dg__expandbtn--open]="isExpanded(row)"
|
|
8808
|
+
[attr.aria-expanded]="isExpanded(row)"
|
|
8809
|
+
[attr.aria-label]="L().toggleDetail"
|
|
8810
|
+
(click)="toggleExpand(row)"
|
|
8811
|
+
>
|
|
8812
|
+
<strct-icon name="chevronRight" [size]="12" [strokeWidth]="1.7" />
|
|
8813
|
+
</button>
|
|
8814
|
+
</td>
|
|
8815
|
+
}
|
|
8816
|
+
@if (selectable()) {
|
|
8817
|
+
<td
|
|
8818
|
+
class="strct-dg__sel"
|
|
8819
|
+
[class.strct-dg__cell--sticky]="stickyActive()"
|
|
8820
|
+
[style.insetInlineStart.px]="utilLeft('sel')"
|
|
8821
|
+
>
|
|
8822
|
+
<strct-checkbox
|
|
8823
|
+
[ariaLabel]="L().selectRow"
|
|
8824
|
+
[checked]="isSelected(row)"
|
|
8825
|
+
(checkedChange)="toggleRow(row)"
|
|
8559
8826
|
/>
|
|
8560
|
-
</
|
|
8561
|
-
|
|
8827
|
+
</td>
|
|
8828
|
+
}
|
|
8829
|
+
@for (col of visibleColumns(); track col.key) {
|
|
8830
|
+
<td
|
|
8831
|
+
[style.text-align]="col.align ?? 'start'"
|
|
8832
|
+
[class.strct-dg__cell--sticky]="isSticky(col)"
|
|
8833
|
+
[class.strct-dg__cell--sticky-last]="col.key === lastStickyKey()"
|
|
8834
|
+
[style.insetInlineStart.px]="stickyLeft(col.key)"
|
|
8835
|
+
>
|
|
8836
|
+
@if (cellTemplate(col.key); as tpl) {
|
|
8837
|
+
<ng-container
|
|
8838
|
+
[ngTemplateOutlet]="tpl"
|
|
8839
|
+
[ngTemplateOutletContext]="{
|
|
8840
|
+
$implicit: row,
|
|
8841
|
+
value: row[col.key],
|
|
8842
|
+
column: col,
|
|
8843
|
+
}"
|
|
8844
|
+
/>
|
|
8845
|
+
} @else {
|
|
8846
|
+
{{ row[col.key] }}
|
|
8847
|
+
}
|
|
8848
|
+
</td>
|
|
8849
|
+
}
|
|
8850
|
+
@if (canActions()) {
|
|
8851
|
+
<td class="strct-dg__actioncell">
|
|
8852
|
+
<button
|
|
8853
|
+
type="button"
|
|
8854
|
+
class="strct-dg__kebab"
|
|
8855
|
+
[attr.aria-label]="L().rowActions"
|
|
8856
|
+
(click)="openRowMenu(row, $event)"
|
|
8857
|
+
>
|
|
8858
|
+
<strct-icon name="dots" [size]="16" />
|
|
8859
|
+
</button>
|
|
8860
|
+
</td>
|
|
8861
|
+
}
|
|
8562
8862
|
</tr>
|
|
8863
|
+
@if (canExpand() && isExpanded(row)) {
|
|
8864
|
+
<tr class="strct-dg__detailrow">
|
|
8865
|
+
<td [attr.colspan]="colspan()">
|
|
8866
|
+
<div class="strct-dg__detail">
|
|
8867
|
+
<ng-container
|
|
8868
|
+
[ngTemplateOutlet]="detailDef()!.template"
|
|
8869
|
+
[ngTemplateOutletContext]="{ $implicit: row }"
|
|
8870
|
+
/>
|
|
8871
|
+
</div>
|
|
8872
|
+
</td>
|
|
8873
|
+
</tr>
|
|
8874
|
+
}
|
|
8563
8875
|
}
|
|
8564
8876
|
} @empty {
|
|
8565
8877
|
<tr>
|
|
@@ -8653,7 +8965,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
8653
8965
|
</span>
|
|
8654
8966
|
</div>
|
|
8655
8967
|
<div class="strct-dg__foot-right">
|
|
8656
|
-
@if (pageSize() > 0) {
|
|
8968
|
+
@if (pageSize() > 0 && !groupBy()) {
|
|
8657
8969
|
<strct-pagination [total]="totalCount()" [pageSize]="pageSize()" [(page)]="page" />
|
|
8658
8970
|
}
|
|
8659
8971
|
</div>
|
|
@@ -8665,8 +8977,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
8665
8977
|
'[class.strct-dg-host--singleline]': 'singleLine()',
|
|
8666
8978
|
'[class.strct-dg-host--virtual]': 'virtual()',
|
|
8667
8979
|
'[class.strct-dg-host--sticky]': 'stickyActive()',
|
|
8668
|
-
}, styles: [".strct-dg-host{display:block;border:1px solid var(--b2);border-radius:10px;background:var(--bg-2);box-shadow:var(--shadow-rest)}.strct-dg__scroll{flex:1 1 auto;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.strct-dg-host--virtual .strct-dg__scroll{overflow-y:auto}.strct-dg-host--virtual .strct-dg thead th{position:sticky;top:0;z-index:5}.strct-dg__vspacer td{padding:0;border:0;background:transparent}.strct-dg-host--sticky .strct-dg,.strct-dg-host--virtual .strct-dg{border-collapse:separate;border-spacing:0;overflow:visible;border-radius:0}.strct-dg-host--sticky .strct-dg{width:max-content;min-width:100%}.strct-dg .strct-dg__cell--sticky{position:sticky;z-index:3}.strct-dg thead th.strct-dg__cell--sticky{z-index:6}.strct-dg .strct-dg__cell--sticky-last:after{content:\"\";position:absolute;top:0;bottom:0;inset-inline-end:-1px;width:7px;pointer-events:none;background:linear-gradient(to right,rgba(0,0,0,.14),transparent)}[dir=rtl] .strct-dg .strct-dg__cell--sticky-last:after{background:linear-gradient(to left,rgba(0,0,0,.14),transparent)}.strct-dg-host--sticky .strct-dg__expandcol,.strct-dg-host--sticky .strct-dg__expandcell{width:36px;min-width:36px;max-width:36px;box-sizing:border-box}.strct-dg-host--sticky .strct-dg__sel{width:40px;min-width:40px;max-width:40px;box-sizing:border-box}.strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-3)}.strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-3)}.strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg{width:100%;border-collapse:collapse;font-size:13px;overflow:hidden;background:var(--bg-2)}.strct-dg-host:not(:has(.strct-dg__toolbar)) .strct-dg{border-start-start-radius:9px;border-start-end-radius:9px}.strct-dg-host:not(:has(.strct-dg__foot)) .strct-dg{border-end-start-radius:9px;border-end-end-radius:9px}.strct-dg th,.strct-dg td{padding:9px 13px;text-align:start;border-bottom:1px solid var(--b1)}.strct-dg tbody td{background:var(--bg-1)}[data-theme=dark] .strct-dg tbody td{background:var(--bg-3)}.strct-dg-host--compact .strct-dg th,.strct-dg-host--compact .strct-dg td{padding:5px 11px}.strct-dg-host--singleline .strct-dg tbody tr:not(.strct-dg__detailrow)>td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:360px}.strct-dg th{position:relative;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--t2);background:var(--bg-2);white-space:nowrap;-webkit-user-select:none;user-select:none}.strct-dg__th--sortable{cursor:pointer}.strct-dg__th--sortable:hover{color:var(--t1)}.strct-dg__th--sortable:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__hd{display:inline-flex;align-items:center;gap:5px}.strct-dg__sorticon{color:var(--t3)}.strct-dg__th--sortable:hover .strct-dg__sorticon{color:var(--acc)}.strct-dg__resize{position:absolute;inset-inline-end:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;z-index:2}.strct-dg__resize:hover{background:var(--acc)}.strct-dg td{color:var(--t1)}.strct-dg tbody tr:last-child td{border-bottom:0}.strct-dg tbody tr:not(.strct-dg__detailrow):hover td{background:var(--acc-s)}.strct-dg__row--selected td{background:var(--acc-m)}.strct-dg__sel{width:1%;white-space:nowrap}.strct-dg__sel input{accent-color:var(--acc);width:15px;height:15px;cursor:pointer}.strct-dg__expandcol,.strct-dg__expandcell{width:1%;white-space:nowrap}.strct-dg__actioncol,.strct-dg__actioncell{width:1%;white-space:nowrap;text-align:end}.strct-dg__kebab{display:inline-flex;padding:4px;border:0;border-radius:5px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__kebab:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:transform .15s ease,color .15s ease}.strct-dg__expandbtn:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn--open{transform:rotate(90deg);color:var(--acc)}.strct-dg__detailbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__detailbtn:hover{color:var(--acc);background:var(--bg-3)}.strct-dg__detailbtn--active{color:var(--acc);background:var(--acc-m)}.strct-dg__detailrow td{background:var(--bg-2);padding:0}.strct-dg__detail{padding:14px 16px;font-size:13px;color:var(--t2)}.strct-dg__layout{display:flex;align-items:flex-start;min-width:0}.strct-dg__layout--paned{gap:0}.strct-dg__layout--paned .strct-dg__scroll{flex:0 0 auto;width:260px;min-width:260px;max-width:260px}.strct-dg__layout--paned .strct-dg{width:260px;min-width:260px;max-width:260px;flex-shrink:0;border-top-right-radius:0;border-bottom-right-radius:0}.strct-dg__row--clickable{cursor:pointer}.strct-dg__row--active td{background:var(--acc-m)}.strct-dg__layout--paned .strct-dg__row--active td:last-child{position:relative;padding-inline-end:26px}.strct-dg__layout--paned .strct-dg__row--active td:last-child:after{content:\"\";position:absolute;right:11px;top:50%;width:6px;height:6px;border-top:1.6px solid var(--acc);border-inline-end:1.6px solid var(--acc);transform:translateY(-50%) rotate(45deg)}.strct-dg__pane{flex:1;min-width:0;align-self:stretch;background:var(--bg-1);border:1px solid var(--b2);border-inline-start:2px solid var(--acc);border-radius:0 8px 8px 0;overflow:hidden;animation:strct-dg-pane-in .14s ease}.strct-dg__pane-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px;border-bottom:1px solid var(--b1);font-size:13px;font-weight:600;color:var(--t1)}.strct-dg__pane-close{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer}.strct-dg__pane-close:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__pane-body{padding:14px 16px;font-size:13px;color:var(--t2)}@keyframes strct-dg-pane-in{0%{opacity:0;transform:translate(8px)}}@keyframes strct-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}.strct-dg__skeleton-block{height:12px;background:var(--bg-3);border-radius:var(--radius-sm);animation:strct-skeleton-pulse 1.4s ease infinite}.strct-dg__skeleton-row td{border-bottom:1px solid var(--b1)}.strct-dg__empty{text-align:center;color:var(--t3);padding:22px}.strct-dg__toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;border-bottom:1px solid var(--b2)}.strct-dg__foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 14px;border-top:1px solid var(--b2);flex-wrap:wrap}.strct-dg__foot-left,.strct-dg__foot-right{display:flex;align-items:center;gap:12px}.strct-dg__actions{position:relative}.strct-dg__chooser-menu{position:absolute;bottom:calc(100% + 6px);left:0;z-index:10;min-width:180px;background:var(--bg-1);border:1px solid var(--b2);border-radius:8px;box-shadow:var(--shadow-pop);padding:6px;display:flex;flex-direction:column;gap:2px}.strct-dg__chooser-menu--right{inset-inline-start:auto;inset-inline-end:0}.strct-dg__chooser-item{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;cursor:pointer;font-size:12px;color:var(--t1);transition:background .1s ease;-webkit-user-select:none;user-select:none}.strct-dg__chooser-item:hover{background:var(--bg-3)}.strct-dg__count{font-size:12px;color:var(--t2)}.strct-dg__count-sep{margin:0 8px;color:var(--b2)}.strct-dg__count-sel{color:var(--acc)}\n"] }]
|
|
8669
|
-
}], ctorParameters: () => [], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: true }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], expandable: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandable", required: false }] }], detailPane: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailPane", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], singleLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleLine", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], columnChooser: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnChooser", required: false }] }], sync: [{ type: i0.Input, args: [{ isSignal: true, alias: "sync", required: false }] }], footerActionsDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerActionsDisabled", required: false }] }], rowId: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowId", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], initialSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelection", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], virtual: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtual", required: false }] }], viewportHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportHeight", required: false }] }], rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], stateKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateKey", required: false }] }], columnState: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnState", required: false }] }, { type: i0.Output, args: ["columnStateChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], syncChange: [{ type: i0.Output, args: ["syncChange"] }], rowAction: [{ type: i0.Output, args: ["rowAction"] }], lazyLoad: [{ type: i0.Output, args: ["lazyLoad"] }], detailDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctRowDetailDef), { isSignal: true }] }], actionBarDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDatagridActionBar), { isSignal: true }] }], cellDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctCellDef), { isSignal: true }] }] } });
|
|
8980
|
+
}, styles: [".strct-dg-host{display:block;border:1px solid var(--b2);border-radius:10px;background:var(--bg-2);box-shadow:var(--shadow-rest)}.strct-dg__scroll{flex:1 1 auto;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.strct-dg-host--virtual .strct-dg__scroll{overflow-y:auto}.strct-dg-host--virtual .strct-dg thead th{position:sticky;top:0;z-index:5}.strct-dg__vspacer td{padding:0;border:0;background:transparent}.strct-dg th[draggable]{cursor:grab}.strct-dg__th--drop{box-shadow:inset 3px 0 0 var(--acc)}.strct-dg__grouprow td{background:var(--bg-2)!important;padding:0}.strct-dg__groupbtn{display:flex;align-items:center;gap:8px;width:100%;padding:7px 13px;border:0;background:transparent;color:var(--t1);font-family:var(--font);font-size:12.5px;font-weight:600;cursor:pointer;text-align:start}.strct-dg__groupbtn:hover{background:var(--bg-3)}.strct-dg__groupbtn:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__groupchev{display:inline-flex;color:var(--t3);transition:transform .15s ease}.strct-dg__groupchev--open{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){.strct-dg__groupchev{transition:none}}.strct-dg__groupcount{min-width:18px;height:18px;padding:0 5px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;border-radius:9px;background:var(--acc-m);color:var(--acc);font-variant-numeric:tabular-nums}.strct-dg-host--sticky .strct-dg,.strct-dg-host--virtual .strct-dg{border-collapse:separate;border-spacing:0;overflow:visible;border-radius:0}.strct-dg-host--sticky .strct-dg{width:max-content;min-width:100%}.strct-dg .strct-dg__cell--sticky{position:sticky;z-index:3}.strct-dg thead th.strct-dg__cell--sticky{z-index:6}.strct-dg .strct-dg__cell--sticky-last:after{content:\"\";position:absolute;top:0;bottom:0;inset-inline-end:-1px;width:7px;pointer-events:none;background:linear-gradient(to right,rgba(0,0,0,.14),transparent)}[dir=rtl] .strct-dg .strct-dg__cell--sticky-last:after{background:linear-gradient(to left,rgba(0,0,0,.14),transparent)}.strct-dg-host--sticky .strct-dg__expandcol,.strct-dg-host--sticky .strct-dg__expandcell{width:36px;min-width:36px;max-width:36px;box-sizing:border-box}.strct-dg-host--sticky .strct-dg__sel{width:40px;min-width:40px;max-width:40px;box-sizing:border-box}.strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-3)}.strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-3)}.strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg{width:100%;border-collapse:collapse;font-size:13px;overflow:hidden;background:var(--bg-2)}.strct-dg-host:not(:has(.strct-dg__toolbar)) .strct-dg{border-start-start-radius:9px;border-start-end-radius:9px}.strct-dg-host:not(:has(.strct-dg__foot)) .strct-dg{border-end-start-radius:9px;border-end-end-radius:9px}.strct-dg th,.strct-dg td{padding:9px 13px;text-align:start;border-bottom:1px solid var(--b1)}.strct-dg tbody td{background:var(--bg-1)}[data-theme=dark] .strct-dg tbody td{background:var(--bg-3)}.strct-dg-host--compact .strct-dg th,.strct-dg-host--compact .strct-dg td{padding:5px 11px}.strct-dg-host--singleline .strct-dg tbody tr:not(.strct-dg__detailrow)>td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:360px}.strct-dg th{position:relative;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--t2);background:var(--bg-2);white-space:nowrap;-webkit-user-select:none;user-select:none}.strct-dg__th--sortable{cursor:pointer}.strct-dg__th--sortable:hover{color:var(--t1)}.strct-dg__th--sortable:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__hd{display:inline-flex;align-items:center;gap:5px}.strct-dg__sorticon{color:var(--t3)}.strct-dg__th--sortable:hover .strct-dg__sorticon{color:var(--acc)}.strct-dg__resize{position:absolute;inset-inline-end:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;z-index:2}.strct-dg__resize:hover{background:var(--acc)}.strct-dg td{color:var(--t1)}.strct-dg tbody tr:last-child td{border-bottom:0}.strct-dg tbody tr:not(.strct-dg__detailrow):hover td{background:var(--acc-s)}.strct-dg__row--selected td{background:var(--acc-m)}.strct-dg__sel{width:1%;white-space:nowrap}.strct-dg__sel input{accent-color:var(--acc);width:15px;height:15px;cursor:pointer}.strct-dg__expandcol,.strct-dg__expandcell{width:1%;white-space:nowrap}.strct-dg__actioncol,.strct-dg__actioncell{width:1%;white-space:nowrap;text-align:end}.strct-dg__kebab{display:inline-flex;padding:4px;border:0;border-radius:5px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__kebab:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:transform .15s ease,color .15s ease}.strct-dg__expandbtn:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn--open{transform:rotate(90deg);color:var(--acc)}.strct-dg__detailbtn{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__detailbtn:hover{color:var(--acc);background:var(--bg-3)}.strct-dg__detailbtn--active{color:var(--acc);background:var(--acc-m)}.strct-dg__detailrow td{background:var(--bg-2);padding:0}.strct-dg__detail{padding:14px 16px;font-size:13px;color:var(--t2)}.strct-dg__layout{display:flex;align-items:flex-start;min-width:0}.strct-dg__layout--paned{gap:0}.strct-dg__layout--paned .strct-dg__scroll{flex:0 0 auto;width:260px;min-width:260px;max-width:260px}.strct-dg__layout--paned .strct-dg{width:260px;min-width:260px;max-width:260px;flex-shrink:0;border-top-right-radius:0;border-bottom-right-radius:0}.strct-dg__row--clickable{cursor:pointer}.strct-dg__row--active td{background:var(--acc-m)}.strct-dg__layout--paned .strct-dg__row--active td:last-child{position:relative;padding-inline-end:26px}.strct-dg__layout--paned .strct-dg__row--active td:last-child:after{content:\"\";position:absolute;right:11px;top:50%;width:6px;height:6px;border-top:1.6px solid var(--acc);border-inline-end:1.6px solid var(--acc);transform:translateY(-50%) rotate(45deg)}.strct-dg__pane{flex:1;min-width:0;align-self:stretch;background:var(--bg-1);border:1px solid var(--b2);border-inline-start:2px solid var(--acc);border-radius:0 8px 8px 0;overflow:hidden;animation:strct-dg-pane-in .14s ease}.strct-dg__pane-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px;border-bottom:1px solid var(--b1);font-size:13px;font-weight:600;color:var(--t1)}.strct-dg__pane-close{display:inline-flex;padding:3px;border:0;border-radius:4px;background:transparent;color:var(--t3);cursor:pointer}.strct-dg__pane-close:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__pane-body{padding:14px 16px;font-size:13px;color:var(--t2)}@keyframes strct-dg-pane-in{0%{opacity:0;transform:translate(8px)}}@keyframes strct-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}.strct-dg__skeleton-block{height:12px;background:var(--bg-3);border-radius:var(--radius-sm);animation:strct-skeleton-pulse 1.4s ease infinite}.strct-dg__skeleton-row td{border-bottom:1px solid var(--b1)}.strct-dg__empty{text-align:center;color:var(--t3);padding:22px}.strct-dg__toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;border-bottom:1px solid var(--b2)}.strct-dg__foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 14px;border-top:1px solid var(--b2);flex-wrap:wrap}.strct-dg__foot-left,.strct-dg__foot-right{display:flex;align-items:center;gap:12px}.strct-dg__actions{position:relative}.strct-dg__chooser-menu{position:absolute;bottom:calc(100% + 6px);left:0;z-index:10;min-width:180px;background:var(--bg-1);border:1px solid var(--b2);border-radius:8px;box-shadow:var(--shadow-pop);padding:6px;display:flex;flex-direction:column;gap:2px}.strct-dg__chooser-menu--right{inset-inline-start:auto;inset-inline-end:0}.strct-dg__chooser-item{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;cursor:pointer;font-size:12px;color:var(--t1);transition:background .1s ease;-webkit-user-select:none;user-select:none}.strct-dg__chooser-item:hover{background:var(--bg-3)}.strct-dg__count{font-size:12px;color:var(--t2)}.strct-dg__count-sep{margin:0 8px;color:var(--b2)}.strct-dg__count-sel{color:var(--acc)}\n"] }]
|
|
8981
|
+
}], ctorParameters: () => [], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: true }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], expandable: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandable", required: false }] }], detailPane: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailPane", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], singleLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleLine", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], columnChooser: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnChooser", required: false }] }], sync: [{ type: i0.Input, args: [{ isSignal: true, alias: "sync", required: false }] }], footerActionsDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerActionsDisabled", required: false }] }], rowId: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowId", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], initialSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelection", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], virtual: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtual", required: false }] }], viewportHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportHeight", required: false }] }], rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], stateKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateKey", required: false }] }], columnState: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnState", required: false }] }, { type: i0.Output, args: ["columnStateChange"] }], reorderable: [{ type: i0.Input, args: [{ isSignal: true, alias: "reorderable", required: false }] }], groupBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupBy", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], syncChange: [{ type: i0.Output, args: ["syncChange"] }], rowAction: [{ type: i0.Output, args: ["rowAction"] }], lazyLoad: [{ type: i0.Output, args: ["lazyLoad"] }], detailDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctRowDetailDef), { isSignal: true }] }], actionBarDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDatagridActionBar), { isSignal: true }] }], cellDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctCellDef), { isSignal: true }] }] } });
|
|
8670
8982
|
|
|
8671
8983
|
/** Vertical timeline container. Wraps `<strct-timeline-item>` children. */
|
|
8672
8984
|
class StrctTimeline {
|
|
@@ -9054,6 +9366,19 @@ class StrctChart {
|
|
|
9054
9366
|
* Double-click, Escape or the reset chip zooms back out.
|
|
9055
9367
|
*/
|
|
9056
9368
|
zoom = input(false, { ...(ngDevMode ? { debugName: "zoom" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
9369
|
+
/**
|
|
9370
|
+
* Stack multi-series values cumulatively: each series draws its line at the
|
|
9371
|
+
* running total and fills the band down to the series below (nulls break the
|
|
9372
|
+
* stack at that slot). Tooltips keep the original per-series values.
|
|
9373
|
+
*/
|
|
9374
|
+
stacked = input(false, { ...(ngDevMode ? { debugName: "stacked" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
9375
|
+
/** Y-axis scale. `log` needs positive values; non-positives clamp to the floor. */
|
|
9376
|
+
scale = input('linear', ...(ngDevMode ? [{ debugName: "scale" }] : /* istanbul ignore next */ []));
|
|
9377
|
+
/**
|
|
9378
|
+
* Per-point timestamps (ms epoch or Date). When set, x positions map to real
|
|
9379
|
+
* time, so uneven sampling renders honestly instead of equally spaced.
|
|
9380
|
+
*/
|
|
9381
|
+
times = input(null, ...(ngDevMode ? [{ debugName: "times" }] : /* istanbul ignore next */ []));
|
|
9057
9382
|
/** Tooltip text for a gap (null) point. */
|
|
9058
9383
|
gapText = input('no data', ...(ngDevMode ? [{ debugName: "gapText" }] : /* istanbul ignore next */ []));
|
|
9059
9384
|
/** Accessible label of the reset-zoom chip (localizable). */
|
|
@@ -9176,7 +9501,8 @@ class StrctChart {
|
|
|
9176
9501
|
const [s, e] = this.domain();
|
|
9177
9502
|
return e > s ? this.chartW() / (e - s) : 0;
|
|
9178
9503
|
}
|
|
9179
|
-
/** Real values inside the visible window (multi-aware; bands included
|
|
9504
|
+
/** Real values inside the visible window (multi-aware; bands included;
|
|
9505
|
+
* per-slot totals when stacked). */
|
|
9180
9506
|
visibleValues = computed(() => {
|
|
9181
9507
|
const [s, e] = this.domain();
|
|
9182
9508
|
const out = [];
|
|
@@ -9185,6 +9511,26 @@ class StrctChart {
|
|
|
9185
9511
|
out.push(v);
|
|
9186
9512
|
};
|
|
9187
9513
|
const ser = this.seriesResolved();
|
|
9514
|
+
if (ser && this.stacked() && ser.length > 1) {
|
|
9515
|
+
const N = this.nx();
|
|
9516
|
+
const totals = new Array(N).fill(0);
|
|
9517
|
+
const has = new Array(N).fill(false);
|
|
9518
|
+
for (const x of ser) {
|
|
9519
|
+
const data = x.data ?? [];
|
|
9520
|
+
const offset = N - data.length;
|
|
9521
|
+
for (let li = 0; li < data.length; li++) {
|
|
9522
|
+
const v = data[li];
|
|
9523
|
+
if (isVal(v)) {
|
|
9524
|
+
totals[offset + li] += v;
|
|
9525
|
+
has[offset + li] = true;
|
|
9526
|
+
}
|
|
9527
|
+
}
|
|
9528
|
+
}
|
|
9529
|
+
for (let gi = s; gi <= Math.min(e, N - 1); gi++)
|
|
9530
|
+
if (has[gi])
|
|
9531
|
+
out.push(totals[gi]);
|
|
9532
|
+
return out;
|
|
9533
|
+
}
|
|
9188
9534
|
if (ser) {
|
|
9189
9535
|
const N = this.nx();
|
|
9190
9536
|
for (const x of ser) {
|
|
@@ -9214,13 +9560,34 @@ class StrctChart {
|
|
|
9214
9560
|
return m === 0 ? 1 : m * 1.1;
|
|
9215
9561
|
}, ...(ngDevMode ? [{ debugName: "yMax" }] : /* istanbul ignore next */ []));
|
|
9216
9562
|
yMin = computed(() => this.min() ?? 0, ...(ngDevMode ? [{ debugName: "yMin" }] : /* istanbul ignore next */ []));
|
|
9563
|
+
/** Smallest positive visible value — the floor of a log axis. */
|
|
9564
|
+
logFloor = computed(() => {
|
|
9565
|
+
const explicit = this.min();
|
|
9566
|
+
if (explicit != null && explicit > 0)
|
|
9567
|
+
return explicit;
|
|
9568
|
+
const positives = this.visibleValues().filter((v) => v > 0);
|
|
9569
|
+
return positives.length ? Math.min(...positives) : 1;
|
|
9570
|
+
}, ...(ngDevMode ? [{ debugName: "logFloor" }] : /* istanbul ignore next */ []));
|
|
9217
9571
|
yOf(v) {
|
|
9572
|
+
if (this.scale() === 'log') {
|
|
9573
|
+
const lo = this.logFloor();
|
|
9574
|
+
const hi = Math.max(this.yMax(), lo * 10);
|
|
9575
|
+
const c = Math.max(lo, Math.min(hi, v));
|
|
9576
|
+
const span = Math.log10(hi) - Math.log10(lo) || 1;
|
|
9577
|
+
const f = (Math.log10(c) - Math.log10(lo)) / span;
|
|
9578
|
+
return PAD.t + (1 - f) * this.chartH();
|
|
9579
|
+
}
|
|
9218
9580
|
const lo = this.yMin();
|
|
9219
9581
|
const hi = this.yMax();
|
|
9220
9582
|
const range = hi - lo || 1;
|
|
9221
9583
|
const c = Math.max(lo, Math.min(hi, v));
|
|
9222
9584
|
return PAD.t + (1 - (c - lo) / range) * this.chartH();
|
|
9223
9585
|
}
|
|
9586
|
+
/** Timestamps normalized to ms (null when the axis is index-based). */
|
|
9587
|
+
timesMs = computed(() => {
|
|
9588
|
+
const t = this.times();
|
|
9589
|
+
return t?.length ? t.map((v) => +v) : null;
|
|
9590
|
+
}, ...(ngDevMode ? [{ debugName: "timesMs" }] : /* istanbul ignore next */ []));
|
|
9224
9591
|
// ── Single-series geometry (gap-aware; null keeps its x-slot) ──
|
|
9225
9592
|
points = computed(() => {
|
|
9226
9593
|
const d = this.data();
|
|
@@ -9250,6 +9617,46 @@ class StrctChart {
|
|
|
9250
9617
|
return [];
|
|
9251
9618
|
const N = this.nx();
|
|
9252
9619
|
const base = this.height() - PAD.b;
|
|
9620
|
+
// Stacked: each series rides on the running total of the ones before it,
|
|
9621
|
+
// filling the band down to that total; a null breaks the stack there.
|
|
9622
|
+
if (this.stacked() && s.length > 1) {
|
|
9623
|
+
const running = new Array(N).fill(0);
|
|
9624
|
+
return s.map((x) => {
|
|
9625
|
+
const data = x.data ?? [];
|
|
9626
|
+
const offset = N - data.length;
|
|
9627
|
+
const pts = [];
|
|
9628
|
+
const lowerPts = [];
|
|
9629
|
+
for (let li = 0; li < data.length; li++) {
|
|
9630
|
+
const v = data[li];
|
|
9631
|
+
const gi = offset + li;
|
|
9632
|
+
if (isVal(v)) {
|
|
9633
|
+
const lo = running[gi];
|
|
9634
|
+
const hi = lo + v;
|
|
9635
|
+
running[gi] = hi;
|
|
9636
|
+
const px = this.xOf(gi);
|
|
9637
|
+
lowerPts.push({ x: px, y: this.yOf(lo) });
|
|
9638
|
+
pts.push({ x: px, y: this.yOf(hi) });
|
|
9639
|
+
}
|
|
9640
|
+
else {
|
|
9641
|
+
lowerPts.push(null);
|
|
9642
|
+
pts.push(null);
|
|
9643
|
+
}
|
|
9644
|
+
}
|
|
9645
|
+
const curve = x.curve ?? this.curve();
|
|
9646
|
+
return {
|
|
9647
|
+
color: COLOR$1[x.status ?? this.status()],
|
|
9648
|
+
label: x.label ?? '',
|
|
9649
|
+
area: false,
|
|
9650
|
+
dash: x.dash ? (typeof x.dash === 'string' ? x.dash : '5 4') : null,
|
|
9651
|
+
pts,
|
|
9652
|
+
path: pathForSegs(pts, curve),
|
|
9653
|
+
areaPath: '',
|
|
9654
|
+
bandPath: bandPath(pts, lowerPts, curve),
|
|
9655
|
+
offset,
|
|
9656
|
+
data,
|
|
9657
|
+
};
|
|
9658
|
+
});
|
|
9659
|
+
}
|
|
9253
9660
|
return s.map((x) => {
|
|
9254
9661
|
const data = x.data ?? [];
|
|
9255
9662
|
const offset = N - data.length; // right-align shorter series
|
|
@@ -9320,10 +9727,23 @@ class StrctChart {
|
|
|
9320
9727
|
yAxisTicks = computed(() => {
|
|
9321
9728
|
if (!this.yAxis())
|
|
9322
9729
|
return [];
|
|
9730
|
+
const out = [];
|
|
9731
|
+
if (this.scale() === 'log') {
|
|
9732
|
+
// Decade ticks between the floor and the max, endpoints included.
|
|
9733
|
+
const lo = this.logFloor();
|
|
9734
|
+
const hi = Math.max(this.yMax(), lo * 10);
|
|
9735
|
+
const values = new Set([lo, hi]);
|
|
9736
|
+
for (let p = Math.ceil(Math.log10(lo)); p <= Math.floor(Math.log10(hi)); p++) {
|
|
9737
|
+
values.add(10 ** p);
|
|
9738
|
+
}
|
|
9739
|
+
for (const v of [...values].sort((a, b) => a - b)) {
|
|
9740
|
+
out.push({ value: v, y: this.yOf(v), text: this.fmtAxis(v) });
|
|
9741
|
+
}
|
|
9742
|
+
return out;
|
|
9743
|
+
}
|
|
9323
9744
|
const n = Math.max(2, this.yTicks());
|
|
9324
9745
|
const lo = this.yMin();
|
|
9325
9746
|
const hi = this.yMax();
|
|
9326
|
-
const out = [];
|
|
9327
9747
|
for (let i = 0; i < n; i++) {
|
|
9328
9748
|
const v = lo + (hi - lo) * (i / (n - 1));
|
|
9329
9749
|
out.push({ value: v, y: this.yOf(v), text: this.fmtAxis(v) });
|
|
@@ -9364,6 +9784,50 @@ class StrctChart {
|
|
|
9364
9784
|
return null;
|
|
9365
9785
|
return this.xOf(i);
|
|
9366
9786
|
}, ...(ngDevMode ? [{ debugName: "hoverX" }] : /* istanbul ignore next */ []));
|
|
9787
|
+
/**
|
|
9788
|
+
* Tooltip edge-flip (FR-CHART-14): near the left edge the balloon
|
|
9789
|
+
* left-aligns, near the right edge it right-aligns, otherwise it stays
|
|
9790
|
+
* centered — so the first/last point's values are never clipped by an
|
|
9791
|
+
* `overflow: hidden` ancestor. Only the balloon shifts; the crosshair
|
|
9792
|
+
* stays on the true point-X.
|
|
9793
|
+
*/
|
|
9794
|
+
tipAlign = computed(() => {
|
|
9795
|
+
const x = this.hoverX();
|
|
9796
|
+
const w = this.width();
|
|
9797
|
+
if (x == null || !w)
|
|
9798
|
+
return 'center';
|
|
9799
|
+
if (x < w * 0.12)
|
|
9800
|
+
return 'start';
|
|
9801
|
+
if (x > w * 0.88)
|
|
9802
|
+
return 'end';
|
|
9803
|
+
return 'center';
|
|
9804
|
+
}, ...(ngDevMode ? [{ debugName: "tipAlign" }] : /* istanbul ignore next */ []));
|
|
9805
|
+
/** Horizontal-only shift (multi / gap tips, anchored below the plot top). */
|
|
9806
|
+
tipShift = computed(() => {
|
|
9807
|
+
switch (this.tipAlign()) {
|
|
9808
|
+
case 'start':
|
|
9809
|
+
return 'translate(8px, 0)';
|
|
9810
|
+
case 'end':
|
|
9811
|
+
return 'translate(calc(-100% - 8px), 0)';
|
|
9812
|
+
default:
|
|
9813
|
+
return 'translate(-50%, 0)';
|
|
9814
|
+
}
|
|
9815
|
+
}, ...(ngDevMode ? [{ debugName: "tipShift" }] : /* istanbul ignore next */ []));
|
|
9816
|
+
/** Shift incl. the single tip's vertical lift above the hover point. */
|
|
9817
|
+
tipShiftRaised = computed(() => {
|
|
9818
|
+
switch (this.tipAlign()) {
|
|
9819
|
+
case 'start':
|
|
9820
|
+
return 'translate(8px, calc(-100% - 10px))';
|
|
9821
|
+
case 'end':
|
|
9822
|
+
return 'translate(calc(-100% - 8px), calc(-100% - 10px))';
|
|
9823
|
+
default:
|
|
9824
|
+
return 'translate(-50%, calc(-100% - 10px))';
|
|
9825
|
+
}
|
|
9826
|
+
}, ...(ngDevMode ? [{ debugName: "tipShiftRaised" }] : /* istanbul ignore next */ []));
|
|
9827
|
+
/** Keep the y-axis value chip vertically inside the plot box. */
|
|
9828
|
+
axisChipY(y) {
|
|
9829
|
+
return Math.max(12, Math.min(this.height() - 12, y));
|
|
9830
|
+
}
|
|
9367
9831
|
hoverPt = computed(() => {
|
|
9368
9832
|
const i = this.dispIdx();
|
|
9369
9833
|
const p = this.points();
|
|
@@ -9535,9 +9999,17 @@ class StrctChart {
|
|
|
9535
9999
|
const value = this.hoverGap() ? this.gapText() : this.hoverValueText();
|
|
9536
10000
|
return `${meta ? meta + ': ' : ''}${value}`;
|
|
9537
10001
|
}, ...(ngDevMode ? [{ debugName: "srText" }] : /* istanbul ignore next */ []));
|
|
9538
|
-
/** Pixel x of a data index (shared by the plot, labels and annotations).
|
|
10002
|
+
/** Pixel x of a data index (shared by the plot, labels and annotations).
|
|
10003
|
+
* With `times`, positions map to real timestamps — uneven sampling shows. */
|
|
9539
10004
|
xOf(i) {
|
|
9540
|
-
const [s] = this.domain();
|
|
10005
|
+
const [s, e] = this.domain();
|
|
10006
|
+
const t = this.timesMs();
|
|
10007
|
+
if (t && e > s) {
|
|
10008
|
+
const clamp = (k) => Math.min(Math.max(k, 0), t.length - 1);
|
|
10009
|
+
const t0 = t[clamp(s)];
|
|
10010
|
+
const span = t[clamp(e)] - t0 || 1;
|
|
10011
|
+
return this.pl() + ((t[clamp(i)] - t0) / span) * this.chartW();
|
|
10012
|
+
}
|
|
9541
10013
|
return this.pl() + (i - s) * this.stepX();
|
|
9542
10014
|
}
|
|
9543
10015
|
/** Set the local hover index, emitting `hoverIndex` on change. */
|
|
@@ -9596,10 +10068,24 @@ class StrctChart {
|
|
|
9596
10068
|
const rect = el.getBoundingClientRect();
|
|
9597
10069
|
if (!rect.width)
|
|
9598
10070
|
return null;
|
|
10071
|
+
const [s, e] = this.domain();
|
|
10072
|
+
if (this.timesMs()) {
|
|
10073
|
+
// Non-uniform x: nearest point by pixel distance.
|
|
10074
|
+
const svgX = ((event.clientX - rect.left) / rect.width) * this.width();
|
|
10075
|
+
let best = s;
|
|
10076
|
+
let bestDist = Infinity;
|
|
10077
|
+
for (let i = s; i <= e; i++) {
|
|
10078
|
+
const d = Math.abs(this.xOf(i) - svgX);
|
|
10079
|
+
if (d < bestDist) {
|
|
10080
|
+
bestDist = d;
|
|
10081
|
+
best = i;
|
|
10082
|
+
}
|
|
10083
|
+
}
|
|
10084
|
+
return best;
|
|
10085
|
+
}
|
|
9599
10086
|
const plFrac = this.pl() / this.width();
|
|
9600
10087
|
const rFrac = PAD.r / this.width();
|
|
9601
10088
|
const fx = ((event.clientX - rect.left) / rect.width - plFrac) / (1 - plFrac - rFrac);
|
|
9602
|
-
const [s, e] = this.domain();
|
|
9603
10089
|
return Math.max(s, Math.min(e, s + Math.round(fx * (e - s))));
|
|
9604
10090
|
}
|
|
9605
10091
|
onDown(event) {
|
|
@@ -9746,7 +10232,7 @@ class StrctChart {
|
|
|
9746
10232
|
});
|
|
9747
10233
|
}
|
|
9748
10234
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StrctChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9749
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: StrctChart, isStandalone: true, selector: "strct-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, series: { classPropertyName: "series", publicName: "series", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, curve: { classPropertyName: "curve", publicName: "curve", isSignal: true, isRequired: false, transformFunction: null }, area: { classPropertyName: "area", publicName: "area", isSignal: true, isRequired: false, transformFunction: null }, glow: { classPropertyName: "glow", publicName: "glow", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null }, interval: { classPropertyName: "interval", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: false, transformFunction: null }, dots: { classPropertyName: "dots", publicName: "dots", isSignal: true, isRequired: false, transformFunction: null }, legend: { classPropertyName: "legend", publicName: "legend", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, xTicks: { classPropertyName: "xTicks", publicName: "xTicks", isSignal: true, isRequired: false, transformFunction: null }, xFormat: { classPropertyName: "xFormat", publicName: "xFormat", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, yAxis: { classPropertyName: "yAxis", publicName: "yAxis", isSignal: true, isRequired: false, transformFunction: null }, yTicks: { classPropertyName: "yTicks", publicName: "yTicks", isSignal: true, isRequired: false, transformFunction: null }, axisFormat: { classPropertyName: "axisFormat", publicName: "axisFormat", isSignal: true, isRequired: false, transformFunction: null }, thresholds: { classPropertyName: "thresholds", publicName: "thresholds", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, agoFormat: { classPropertyName: "agoFormat", publicName: "agoFormat", isSignal: true, isRequired: false, transformFunction: null }, valueFormat: { classPropertyName: "valueFormat", publicName: "valueFormat", isSignal: true, isRequired: false, transformFunction: null }, annotations: { classPropertyName: "annotations", publicName: "annotations", isSignal: true, isRequired: false, transformFunction: null }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, brush: { classPropertyName: "brush", publicName: "brush", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, gapText: { classPropertyName: "gapText", publicName: "gapText", isSignal: true, isRequired: false, transformFunction: null }, resetLabel: { classPropertyName: "resetLabel", publicName: "resetLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hoverIndex: "hoverIndex", brushChange: "brushChange" }, host: { properties: { "class.strct-chart--glow": "glow()", "class.strct-chart--brush": "brush() || zoom()", "style.--strct-chart-c": "color()" }, classAttribute: "strct-chart" }, viewQueries: [{ propertyName: "svgRef", first: true, predicate: ["svg"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
10235
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: StrctChart, isStandalone: true, selector: "strct-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, series: { classPropertyName: "series", publicName: "series", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, curve: { classPropertyName: "curve", publicName: "curve", isSignal: true, isRequired: false, transformFunction: null }, area: { classPropertyName: "area", publicName: "area", isSignal: true, isRequired: false, transformFunction: null }, glow: { classPropertyName: "glow", publicName: "glow", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null }, interval: { classPropertyName: "interval", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: false, transformFunction: null }, dots: { classPropertyName: "dots", publicName: "dots", isSignal: true, isRequired: false, transformFunction: null }, legend: { classPropertyName: "legend", publicName: "legend", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, xTicks: { classPropertyName: "xTicks", publicName: "xTicks", isSignal: true, isRequired: false, transformFunction: null }, xFormat: { classPropertyName: "xFormat", publicName: "xFormat", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, yAxis: { classPropertyName: "yAxis", publicName: "yAxis", isSignal: true, isRequired: false, transformFunction: null }, yTicks: { classPropertyName: "yTicks", publicName: "yTicks", isSignal: true, isRequired: false, transformFunction: null }, axisFormat: { classPropertyName: "axisFormat", publicName: "axisFormat", isSignal: true, isRequired: false, transformFunction: null }, thresholds: { classPropertyName: "thresholds", publicName: "thresholds", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, agoFormat: { classPropertyName: "agoFormat", publicName: "agoFormat", isSignal: true, isRequired: false, transformFunction: null }, valueFormat: { classPropertyName: "valueFormat", publicName: "valueFormat", isSignal: true, isRequired: false, transformFunction: null }, annotations: { classPropertyName: "annotations", publicName: "annotations", isSignal: true, isRequired: false, transformFunction: null }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, brush: { classPropertyName: "brush", publicName: "brush", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, stacked: { classPropertyName: "stacked", publicName: "stacked", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, times: { classPropertyName: "times", publicName: "times", isSignal: true, isRequired: false, transformFunction: null }, gapText: { classPropertyName: "gapText", publicName: "gapText", isSignal: true, isRequired: false, transformFunction: null }, resetLabel: { classPropertyName: "resetLabel", publicName: "resetLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hoverIndex: "hoverIndex", brushChange: "brushChange" }, host: { properties: { "class.strct-chart--glow": "glow()", "class.strct-chart--brush": "brush() || zoom()", "style.--strct-chart-c": "color()" }, classAttribute: "strct-chart" }, viewQueries: [{ propertyName: "svgRef", first: true, predicate: ["svg"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
9750
10236
|
@if (isEmpty()) {
|
|
9751
10237
|
<div class="strct-chart__empty" [style.height.px]="height()">{{ emptyText() }}</div>
|
|
9752
10238
|
} @else {
|
|
@@ -9846,7 +10332,12 @@ class StrctChart {
|
|
|
9846
10332
|
@if (isMulti()) {
|
|
9847
10333
|
@for (s of multiSeries(); track $index) {
|
|
9848
10334
|
@if (s.bandPath) {
|
|
9849
|
-
<path
|
|
10335
|
+
<path
|
|
10336
|
+
class="strct-chart__band"
|
|
10337
|
+
[class.strct-chart__band--stack]="stacked()"
|
|
10338
|
+
[attr.d]="s.bandPath"
|
|
10339
|
+
[attr.fill]="s.color"
|
|
10340
|
+
/>
|
|
9850
10341
|
}
|
|
9851
10342
|
@if (s.area && s.areaPath) {
|
|
9852
10343
|
<path
|
|
@@ -9994,7 +10485,11 @@ class StrctChart {
|
|
|
9994
10485
|
|
|
9995
10486
|
@if (interactive() && hoverX() !== null) {
|
|
9996
10487
|
@if (isMulti()) {
|
|
9997
|
-
<div
|
|
10488
|
+
<div
|
|
10489
|
+
class="strct-chart__tip strct-chart__tip--multi"
|
|
10490
|
+
[style.left.px]="hoverX()"
|
|
10491
|
+
[style.transform]="tipShift()"
|
|
10492
|
+
>
|
|
9998
10493
|
@if (hoverMeta()) {
|
|
9999
10494
|
<span class="strct-chart__tip-l">{{ hoverMeta() }}</span>
|
|
10000
10495
|
}
|
|
@@ -10012,8 +10507,15 @@ class StrctChart {
|
|
|
10012
10507
|
}
|
|
10013
10508
|
</div>
|
|
10014
10509
|
} @else if (hoverPt(); as hp) {
|
|
10015
|
-
<div class="strct-chart__axis-y" [style.top.px]="hp.y">
|
|
10016
|
-
|
|
10510
|
+
<div class="strct-chart__axis-y" [style.top.px]="axisChipY(hp.y)">
|
|
10511
|
+
{{ hoverValueText() }}
|
|
10512
|
+
</div>
|
|
10513
|
+
<div
|
|
10514
|
+
class="strct-chart__tip"
|
|
10515
|
+
[style.left.px]="hp.x"
|
|
10516
|
+
[style.top.px]="hp.y"
|
|
10517
|
+
[style.transform]="tipShiftRaised()"
|
|
10518
|
+
>
|
|
10017
10519
|
<span class="strct-chart__tip-v">{{ hoverValueText() }}</span>
|
|
10018
10520
|
@if (hoverDelta() !== null || hoverMeta()) {
|
|
10019
10521
|
<span class="strct-chart__tip-meta">
|
|
@@ -10038,7 +10540,11 @@ class StrctChart {
|
|
|
10038
10540
|
</div>
|
|
10039
10541
|
} @else if (hoverGap()) {
|
|
10040
10542
|
<!-- A gap point: keep the time slot, say "no data" instead of a value. -->
|
|
10041
|
-
<div
|
|
10543
|
+
<div
|
|
10544
|
+
class="strct-chart__tip strct-chart__tip--gap"
|
|
10545
|
+
[style.left.px]="hoverX()"
|
|
10546
|
+
[style.transform]="tipShift()"
|
|
10547
|
+
>
|
|
10042
10548
|
<span class="strct-chart__tip-v">{{ gapText() }}</span>
|
|
10043
10549
|
@if (hoverMeta()) {
|
|
10044
10550
|
<span class="strct-chart__tip-l">{{ hoverMeta() }}</span>
|
|
@@ -10065,7 +10571,7 @@ class StrctChart {
|
|
|
10065
10571
|
</div>
|
|
10066
10572
|
}
|
|
10067
10573
|
}
|
|
10068
|
-
`, isInline: true, styles: [".strct-chart{display:block;position:relative}.strct-chart__plot{position:relative}.strct-chart__svg{width:100%;display:block;touch-action:none}.strct-chart__svg:focus-visible{outline:2px solid var(--acc50);outline-offset:2px;border-radius:var(--radius-sm)}.strct-chart__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.strct-chart__empty{display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--t3)}.strct-chart__grid{stroke:var(--b1);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__line{vector-effect:non-scaling-stroke;stroke-linejoin:round;stroke-linecap:round}.strct-chart__area{stroke:none}.strct-chart__area--flat{opacity:.14}.strct-chart__dot,.strct-chart__hoverdot,.strct-chart__head-dot{stroke:var(--bg-1);stroke-width:1.5}.strct-chart__cross{stroke:var(--strct-chart-c);stroke-width:1;opacity:.4;stroke-dasharray:3 3;vector-effect:non-scaling-stroke}.strct-chart__threshold{stroke-width:1;opacity:.85;vector-effect:non-scaling-stroke}.strct-chart__threshold--dashed{stroke-dasharray:4 3}.strct-chart__bar{rx:1.5}.strct-chart__band{opacity:.13;stroke:none}.strct-chart__ann{stroke-width:1;opacity:.8;vector-effect:non-scaling-stroke}.strct-chart__ann--dashed{stroke-dasharray:4 3}.strct-chart__ann-label{position:absolute;top:0;transform:translate(-50%);pointer-events:none;font-size:12px;font-weight:600;background:var(--bg-1);padding:0 3px;border-radius:3px;white-space:nowrap}.strct-chart--brush .strct-chart__svg{cursor:crosshair}.strct-chart__brush{fill:var(--acc);opacity:.16;stroke:var(--acc50);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__reset{position:absolute;top:6px;right:8px;z-index:3;display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border:1px solid var(--b2);border-radius:99px;background:var(--bg-a);color:var(--t2);font-family:var(--font);font-size:12px;font-weight:600;cursor:pointer}.strct-chart__reset:hover{color:var(--t1);border-color:var(--acc50)}.strct-chart__reset:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}.strct-chart__tip--gap{top:6px
|
|
10574
|
+
`, isInline: true, styles: [".strct-chart{display:block;position:relative}.strct-chart__plot{position:relative}.strct-chart__svg{width:100%;display:block;touch-action:none}.strct-chart__svg:focus-visible{outline:2px solid var(--acc50);outline-offset:2px;border-radius:var(--radius-sm)}.strct-chart__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.strct-chart__empty{display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--t3)}.strct-chart__grid{stroke:var(--b1);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__line{vector-effect:non-scaling-stroke;stroke-linejoin:round;stroke-linecap:round}.strct-chart__area{stroke:none}.strct-chart__area--flat{opacity:.14}.strct-chart__dot,.strct-chart__hoverdot,.strct-chart__head-dot{stroke:var(--bg-1);stroke-width:1.5}.strct-chart__cross{stroke:var(--strct-chart-c);stroke-width:1;opacity:.4;stroke-dasharray:3 3;vector-effect:non-scaling-stroke}.strct-chart__threshold{stroke-width:1;opacity:.85;vector-effect:non-scaling-stroke}.strct-chart__threshold--dashed{stroke-dasharray:4 3}.strct-chart__bar{rx:1.5}.strct-chart__band{opacity:.13;stroke:none}.strct-chart__band--stack{opacity:.32}.strct-chart__ann{stroke-width:1;opacity:.8;vector-effect:non-scaling-stroke}.strct-chart__ann--dashed{stroke-dasharray:4 3}.strct-chart__ann-label{position:absolute;top:0;transform:translate(-50%);pointer-events:none;font-size:12px;font-weight:600;background:var(--bg-1);padding:0 3px;border-radius:3px;white-space:nowrap}.strct-chart--brush .strct-chart__svg{cursor:crosshair}.strct-chart__brush{fill:var(--acc);opacity:.16;stroke:var(--acc50);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__reset{position:absolute;top:6px;right:8px;z-index:3;display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border:1px solid var(--b2);border-radius:99px;background:var(--bg-a);color:var(--t2);font-family:var(--font);font-size:12px;font-weight:600;cursor:pointer}.strct-chart__reset:hover{color:var(--t1);border-color:var(--acc50)}.strct-chart__reset:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}.strct-chart__tip--gap{top:6px}.strct-chart__tip-ann{font-size:12px;font-weight:600}.strct-chart--glow .strct-chart__line{filter:drop-shadow(0 0 1.5px var(--strct-chart-c)) drop-shadow(0 0 5px var(--strct-chart-c))}.strct-chart--glow .strct-chart__head-dot{filter:drop-shadow(0 0 2px var(--strct-chart-c)) drop-shadow(0 0 6px var(--strct-chart-c))}.strct-chart--glow .strct-chart__hoverdot{filter:drop-shadow(0 0 4px var(--strct-chart-c))}.strct-chart__ytick{position:absolute;left:0;width:34px;text-align:end;transform:translateY(-50%);pointer-events:none;font-family:var(--mono);font-size:12px;color:var(--t3);font-variant-numeric:tabular-nums}.strct-chart__thr{position:absolute;right:2px;transform:translateY(-50%);pointer-events:none;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;background:var(--bg-1);padding:0 3px;border-radius:3px}.strct-chart__axis-y{position:absolute;left:0;transform:translateY(-50%);pointer-events:none;padding:1px 5px;border-radius:var(--radius-sm);background:var(--bg-a);border:1px solid var(--b2);font-family:var(--mono);font-size:12px;font-weight:600;color:var(--t2);font-variant-numeric:tabular-nums;z-index:2}.strct-chart__label--active{color:var(--t1);font-weight:700}.strct-chart__legend{display:flex;flex-wrap:wrap;gap:6px 14px;margin-bottom:8px;font-size:12px;color:var(--t2)}.strct-chart__leg{display:inline-flex;align-items:center;gap:6px}.strct-chart__leg-sw{width:9px;height:3px;border-radius:2px;flex-shrink:0}.strct-chart__tip{position:absolute;pointer-events:none;display:flex;flex-direction:column;align-items:center;gap:1px;padding:4px 8px;border-radius:var(--radius-sm);background:var(--bg-a);border:1px solid var(--b2);box-shadow:var(--shadow-elevated);white-space:nowrap;z-index:2}.strct-chart__tip--multi{top:6px;align-items:stretch;gap:3px}.strct-chart__tip-v{font-size:12px;font-weight:700;color:var(--t1);font-variant-numeric:tabular-nums}.strct-chart__tip-meta{display:inline-flex;align-items:center;gap:5px}.strct-chart__tip-delta{font-size:12px;font-weight:600;color:var(--t3);font-variant-numeric:tabular-nums}.strct-chart__tip-delta--up{color:var(--success)}.strct-chart__tip-delta--down{color:var(--critical)}.strct-chart__tip-l{font-size:12px;color:var(--t3)}.strct-chart__tip-row{display:inline-flex;align-items:center;gap:6px;font-size:12px}.strct-chart__tip-sw{width:8px;height:3px;border-radius:2px;flex-shrink:0}.strct-chart__tip-rl{color:var(--t3);margin-inline-end:auto}.strct-chart__tip-rv{color:var(--t1);font-weight:700;font-variant-numeric:tabular-nums}.strct-chart__labels{position:relative;height:15px;margin-top:6px;font-size:12px;color:var(--t3)}.strct-chart__labels span{position:absolute;transform:translate(-50%);white-space:nowrap}@media(prefers-reduced-motion:no-preference){.strct-chart__line--draw{stroke-dasharray:1;stroke-dashoffset:1;animation:strct-chart-draw .9s ease forwards}.strct-chart__pulse{transform-box:fill-box;transform-origin:center;animation:strct-chart-pulse 2.4s ease-out infinite}}@keyframes strct-chart-draw{to{stroke-dashoffset:0}}@keyframes strct-chart-pulse{0%{transform:scale(1);opacity:.45}70%{opacity:0}to{transform:scale(2.5);opacity:0}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
10069
10575
|
}
|
|
10070
10576
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StrctChart, decorators: [{
|
|
10071
10577
|
type: Component,
|
|
@@ -10169,7 +10675,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
10169
10675
|
@if (isMulti()) {
|
|
10170
10676
|
@for (s of multiSeries(); track $index) {
|
|
10171
10677
|
@if (s.bandPath) {
|
|
10172
|
-
<path
|
|
10678
|
+
<path
|
|
10679
|
+
class="strct-chart__band"
|
|
10680
|
+
[class.strct-chart__band--stack]="stacked()"
|
|
10681
|
+
[attr.d]="s.bandPath"
|
|
10682
|
+
[attr.fill]="s.color"
|
|
10683
|
+
/>
|
|
10173
10684
|
}
|
|
10174
10685
|
@if (s.area && s.areaPath) {
|
|
10175
10686
|
<path
|
|
@@ -10317,7 +10828,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
10317
10828
|
|
|
10318
10829
|
@if (interactive() && hoverX() !== null) {
|
|
10319
10830
|
@if (isMulti()) {
|
|
10320
|
-
<div
|
|
10831
|
+
<div
|
|
10832
|
+
class="strct-chart__tip strct-chart__tip--multi"
|
|
10833
|
+
[style.left.px]="hoverX()"
|
|
10834
|
+
[style.transform]="tipShift()"
|
|
10835
|
+
>
|
|
10321
10836
|
@if (hoverMeta()) {
|
|
10322
10837
|
<span class="strct-chart__tip-l">{{ hoverMeta() }}</span>
|
|
10323
10838
|
}
|
|
@@ -10335,8 +10850,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
10335
10850
|
}
|
|
10336
10851
|
</div>
|
|
10337
10852
|
} @else if (hoverPt(); as hp) {
|
|
10338
|
-
<div class="strct-chart__axis-y" [style.top.px]="hp.y">
|
|
10339
|
-
|
|
10853
|
+
<div class="strct-chart__axis-y" [style.top.px]="axisChipY(hp.y)">
|
|
10854
|
+
{{ hoverValueText() }}
|
|
10855
|
+
</div>
|
|
10856
|
+
<div
|
|
10857
|
+
class="strct-chart__tip"
|
|
10858
|
+
[style.left.px]="hp.x"
|
|
10859
|
+
[style.top.px]="hp.y"
|
|
10860
|
+
[style.transform]="tipShiftRaised()"
|
|
10861
|
+
>
|
|
10340
10862
|
<span class="strct-chart__tip-v">{{ hoverValueText() }}</span>
|
|
10341
10863
|
@if (hoverDelta() !== null || hoverMeta()) {
|
|
10342
10864
|
<span class="strct-chart__tip-meta">
|
|
@@ -10361,7 +10883,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
10361
10883
|
</div>
|
|
10362
10884
|
} @else if (hoverGap()) {
|
|
10363
10885
|
<!-- A gap point: keep the time slot, say "no data" instead of a value. -->
|
|
10364
|
-
<div
|
|
10886
|
+
<div
|
|
10887
|
+
class="strct-chart__tip strct-chart__tip--gap"
|
|
10888
|
+
[style.left.px]="hoverX()"
|
|
10889
|
+
[style.transform]="tipShift()"
|
|
10890
|
+
>
|
|
10365
10891
|
<span class="strct-chart__tip-v">{{ gapText() }}</span>
|
|
10366
10892
|
@if (hoverMeta()) {
|
|
10367
10893
|
<span class="strct-chart__tip-l">{{ hoverMeta() }}</span>
|
|
@@ -10393,8 +10919,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
10393
10919
|
'[class.strct-chart--glow]': 'glow()',
|
|
10394
10920
|
'[class.strct-chart--brush]': 'brush() || zoom()',
|
|
10395
10921
|
'[style.--strct-chart-c]': 'color()',
|
|
10396
|
-
}, styles: [".strct-chart{display:block;position:relative}.strct-chart__plot{position:relative}.strct-chart__svg{width:100%;display:block;touch-action:none}.strct-chart__svg:focus-visible{outline:2px solid var(--acc50);outline-offset:2px;border-radius:var(--radius-sm)}.strct-chart__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.strct-chart__empty{display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--t3)}.strct-chart__grid{stroke:var(--b1);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__line{vector-effect:non-scaling-stroke;stroke-linejoin:round;stroke-linecap:round}.strct-chart__area{stroke:none}.strct-chart__area--flat{opacity:.14}.strct-chart__dot,.strct-chart__hoverdot,.strct-chart__head-dot{stroke:var(--bg-1);stroke-width:1.5}.strct-chart__cross{stroke:var(--strct-chart-c);stroke-width:1;opacity:.4;stroke-dasharray:3 3;vector-effect:non-scaling-stroke}.strct-chart__threshold{stroke-width:1;opacity:.85;vector-effect:non-scaling-stroke}.strct-chart__threshold--dashed{stroke-dasharray:4 3}.strct-chart__bar{rx:1.5}.strct-chart__band{opacity:.13;stroke:none}.strct-chart__ann{stroke-width:1;opacity:.8;vector-effect:non-scaling-stroke}.strct-chart__ann--dashed{stroke-dasharray:4 3}.strct-chart__ann-label{position:absolute;top:0;transform:translate(-50%);pointer-events:none;font-size:12px;font-weight:600;background:var(--bg-1);padding:0 3px;border-radius:3px;white-space:nowrap}.strct-chart--brush .strct-chart__svg{cursor:crosshair}.strct-chart__brush{fill:var(--acc);opacity:.16;stroke:var(--acc50);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__reset{position:absolute;top:6px;right:8px;z-index:3;display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border:1px solid var(--b2);border-radius:99px;background:var(--bg-a);color:var(--t2);font-family:var(--font);font-size:12px;font-weight:600;cursor:pointer}.strct-chart__reset:hover{color:var(--t1);border-color:var(--acc50)}.strct-chart__reset:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}.strct-chart__tip--gap{top:6px
|
|
10397
|
-
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], series: [{ type: i0.Input, args: [{ isSignal: true, alias: "series", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], curve: [{ type: i0.Input, args: [{ isSignal: true, alias: "curve", required: false }] }], area: [{ type: i0.Input, args: [{ isSignal: true, alias: "area", required: false }] }], glow: [{ type: i0.Input, args: [{ isSignal: true, alias: "glow", required: false }] }], live: [{ type: i0.Input, args: [{ isSignal: true, alias: "live", required: false }] }], interval: [{ type: i0.Input, args: [{ isSignal: true, alias: "interval", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: false }] }], dots: [{ type: i0.Input, args: [{ isSignal: true, alias: "dots", required: false }] }], legend: [{ type: i0.Input, args: [{ isSignal: true, alias: "legend", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], xTicks: [{ type: i0.Input, args: [{ isSignal: true, alias: "xTicks", required: false }] }], xFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "xFormat", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], yAxis: [{ type: i0.Input, args: [{ isSignal: true, alias: "yAxis", required: false }] }], yTicks: [{ type: i0.Input, args: [{ isSignal: true, alias: "yTicks", required: false }] }], axisFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "axisFormat", required: false }] }], thresholds: [{ type: i0.Input, args: [{ isSignal: true, alias: "thresholds", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], agoFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "agoFormat", required: false }] }], valueFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueFormat", required: false }] }], annotations: [{ type: i0.Input, args: [{ isSignal: true, alias: "annotations", required: false }] }], activeIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIndex", required: false }] }], brush: [{ type: i0.Input, args: [{ isSignal: true, alias: "brush", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], gapText: [{ type: i0.Input, args: [{ isSignal: true, alias: "gapText", required: false }] }], resetLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetLabel", required: false }] }], hoverIndex: [{ type: i0.Output, args: ["hoverIndex"] }], brushChange: [{ type: i0.Output, args: ["brushChange"] }], svgRef: [{ type: i0.ViewChild, args: ['svg', { isSignal: true }] }] } });
|
|
10922
|
+
}, styles: [".strct-chart{display:block;position:relative}.strct-chart__plot{position:relative}.strct-chart__svg{width:100%;display:block;touch-action:none}.strct-chart__svg:focus-visible{outline:2px solid var(--acc50);outline-offset:2px;border-radius:var(--radius-sm)}.strct-chart__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.strct-chart__empty{display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--t3)}.strct-chart__grid{stroke:var(--b1);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__line{vector-effect:non-scaling-stroke;stroke-linejoin:round;stroke-linecap:round}.strct-chart__area{stroke:none}.strct-chart__area--flat{opacity:.14}.strct-chart__dot,.strct-chart__hoverdot,.strct-chart__head-dot{stroke:var(--bg-1);stroke-width:1.5}.strct-chart__cross{stroke:var(--strct-chart-c);stroke-width:1;opacity:.4;stroke-dasharray:3 3;vector-effect:non-scaling-stroke}.strct-chart__threshold{stroke-width:1;opacity:.85;vector-effect:non-scaling-stroke}.strct-chart__threshold--dashed{stroke-dasharray:4 3}.strct-chart__bar{rx:1.5}.strct-chart__band{opacity:.13;stroke:none}.strct-chart__band--stack{opacity:.32}.strct-chart__ann{stroke-width:1;opacity:.8;vector-effect:non-scaling-stroke}.strct-chart__ann--dashed{stroke-dasharray:4 3}.strct-chart__ann-label{position:absolute;top:0;transform:translate(-50%);pointer-events:none;font-size:12px;font-weight:600;background:var(--bg-1);padding:0 3px;border-radius:3px;white-space:nowrap}.strct-chart--brush .strct-chart__svg{cursor:crosshair}.strct-chart__brush{fill:var(--acc);opacity:.16;stroke:var(--acc50);stroke-width:1;vector-effect:non-scaling-stroke}.strct-chart__reset{position:absolute;top:6px;right:8px;z-index:3;display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border:1px solid var(--b2);border-radius:99px;background:var(--bg-a);color:var(--t2);font-family:var(--font);font-size:12px;font-weight:600;cursor:pointer}.strct-chart__reset:hover{color:var(--t1);border-color:var(--acc50)}.strct-chart__reset:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}.strct-chart__tip--gap{top:6px}.strct-chart__tip-ann{font-size:12px;font-weight:600}.strct-chart--glow .strct-chart__line{filter:drop-shadow(0 0 1.5px var(--strct-chart-c)) drop-shadow(0 0 5px var(--strct-chart-c))}.strct-chart--glow .strct-chart__head-dot{filter:drop-shadow(0 0 2px var(--strct-chart-c)) drop-shadow(0 0 6px var(--strct-chart-c))}.strct-chart--glow .strct-chart__hoverdot{filter:drop-shadow(0 0 4px var(--strct-chart-c))}.strct-chart__ytick{position:absolute;left:0;width:34px;text-align:end;transform:translateY(-50%);pointer-events:none;font-family:var(--mono);font-size:12px;color:var(--t3);font-variant-numeric:tabular-nums}.strct-chart__thr{position:absolute;right:2px;transform:translateY(-50%);pointer-events:none;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;background:var(--bg-1);padding:0 3px;border-radius:3px}.strct-chart__axis-y{position:absolute;left:0;transform:translateY(-50%);pointer-events:none;padding:1px 5px;border-radius:var(--radius-sm);background:var(--bg-a);border:1px solid var(--b2);font-family:var(--mono);font-size:12px;font-weight:600;color:var(--t2);font-variant-numeric:tabular-nums;z-index:2}.strct-chart__label--active{color:var(--t1);font-weight:700}.strct-chart__legend{display:flex;flex-wrap:wrap;gap:6px 14px;margin-bottom:8px;font-size:12px;color:var(--t2)}.strct-chart__leg{display:inline-flex;align-items:center;gap:6px}.strct-chart__leg-sw{width:9px;height:3px;border-radius:2px;flex-shrink:0}.strct-chart__tip{position:absolute;pointer-events:none;display:flex;flex-direction:column;align-items:center;gap:1px;padding:4px 8px;border-radius:var(--radius-sm);background:var(--bg-a);border:1px solid var(--b2);box-shadow:var(--shadow-elevated);white-space:nowrap;z-index:2}.strct-chart__tip--multi{top:6px;align-items:stretch;gap:3px}.strct-chart__tip-v{font-size:12px;font-weight:700;color:var(--t1);font-variant-numeric:tabular-nums}.strct-chart__tip-meta{display:inline-flex;align-items:center;gap:5px}.strct-chart__tip-delta{font-size:12px;font-weight:600;color:var(--t3);font-variant-numeric:tabular-nums}.strct-chart__tip-delta--up{color:var(--success)}.strct-chart__tip-delta--down{color:var(--critical)}.strct-chart__tip-l{font-size:12px;color:var(--t3)}.strct-chart__tip-row{display:inline-flex;align-items:center;gap:6px;font-size:12px}.strct-chart__tip-sw{width:8px;height:3px;border-radius:2px;flex-shrink:0}.strct-chart__tip-rl{color:var(--t3);margin-inline-end:auto}.strct-chart__tip-rv{color:var(--t1);font-weight:700;font-variant-numeric:tabular-nums}.strct-chart__labels{position:relative;height:15px;margin-top:6px;font-size:12px;color:var(--t3)}.strct-chart__labels span{position:absolute;transform:translate(-50%);white-space:nowrap}@media(prefers-reduced-motion:no-preference){.strct-chart__line--draw{stroke-dasharray:1;stroke-dashoffset:1;animation:strct-chart-draw .9s ease forwards}.strct-chart__pulse{transform-box:fill-box;transform-origin:center;animation:strct-chart-pulse 2.4s ease-out infinite}}@keyframes strct-chart-draw{to{stroke-dashoffset:0}}@keyframes strct-chart-pulse{0%{transform:scale(1);opacity:.45}70%{opacity:0}to{transform:scale(2.5);opacity:0}}\n"] }]
|
|
10923
|
+
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], series: [{ type: i0.Input, args: [{ isSignal: true, alias: "series", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], curve: [{ type: i0.Input, args: [{ isSignal: true, alias: "curve", required: false }] }], area: [{ type: i0.Input, args: [{ isSignal: true, alias: "area", required: false }] }], glow: [{ type: i0.Input, args: [{ isSignal: true, alias: "glow", required: false }] }], live: [{ type: i0.Input, args: [{ isSignal: true, alias: "live", required: false }] }], interval: [{ type: i0.Input, args: [{ isSignal: true, alias: "interval", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: false }] }], dots: [{ type: i0.Input, args: [{ isSignal: true, alias: "dots", required: false }] }], legend: [{ type: i0.Input, args: [{ isSignal: true, alias: "legend", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], xTicks: [{ type: i0.Input, args: [{ isSignal: true, alias: "xTicks", required: false }] }], xFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "xFormat", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], yAxis: [{ type: i0.Input, args: [{ isSignal: true, alias: "yAxis", required: false }] }], yTicks: [{ type: i0.Input, args: [{ isSignal: true, alias: "yTicks", required: false }] }], axisFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "axisFormat", required: false }] }], thresholds: [{ type: i0.Input, args: [{ isSignal: true, alias: "thresholds", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], agoFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "agoFormat", required: false }] }], valueFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueFormat", required: false }] }], annotations: [{ type: i0.Input, args: [{ isSignal: true, alias: "annotations", required: false }] }], activeIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIndex", required: false }] }], brush: [{ type: i0.Input, args: [{ isSignal: true, alias: "brush", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], stacked: [{ type: i0.Input, args: [{ isSignal: true, alias: "stacked", required: false }] }], scale: [{ type: i0.Input, args: [{ isSignal: true, alias: "scale", required: false }] }], times: [{ type: i0.Input, args: [{ isSignal: true, alias: "times", required: false }] }], gapText: [{ type: i0.Input, args: [{ isSignal: true, alias: "gapText", required: false }] }], resetLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetLabel", required: false }] }], hoverIndex: [{ type: i0.Output, args: ["hoverIndex"] }], brushChange: [{ type: i0.Output, args: ["brushChange"] }], svgRef: [{ type: i0.ViewChild, args: ['svg', { isSignal: true }] }] } });
|
|
10398
10924
|
|
|
10399
10925
|
const PALETTE = [
|
|
10400
10926
|
'var(--acc)',
|