spreadsheet should react to slot changes
This commit is contained in:
parent
20c5f528db
commit
690a9bb09e
|
|
@ -180,8 +180,12 @@ export class FolkSpreadsheet extends HTMLElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
#shadow = this.attachShadow({ mode: 'open' });
|
#shadow = this.attachShadow({ mode: 'open' });
|
||||||
|
#columns = document.createElement('s-columns');
|
||||||
#textarea!: HTMLTextAreaElement;
|
#rows = document.createElement('s-rows');
|
||||||
|
#body = document.createElement('s-body');
|
||||||
|
#slot = document.createElement('slot');
|
||||||
|
#textarea = document.createElement('textarea');
|
||||||
|
#cellStyles = new CSSStyleSheet();
|
||||||
|
|
||||||
#editedCell: FolkSpreadSheetCell | null = null;
|
#editedCell: FolkSpreadSheetCell | null = null;
|
||||||
|
|
||||||
|
|
@ -194,12 +198,23 @@ export class FolkSpreadsheet extends HTMLElement {
|
||||||
this.addEventListener('focusin', this);
|
this.addEventListener('focusin', this);
|
||||||
this.addEventListener('focusout', this);
|
this.addEventListener('focusout', this);
|
||||||
|
|
||||||
this.#shadow.adoptedStyleSheets.push(styles);
|
this.#shadow.adoptedStyleSheets.push(styles, this.#cellStyles);
|
||||||
}
|
}
|
||||||
|
|
||||||
connectedCallback() {
|
connectedCallback() {
|
||||||
this.#shadow.textContent = '';
|
const header = document.createElement('s-header');
|
||||||
|
header.setAttribute('empty', '');
|
||||||
|
|
||||||
|
this.#textarea.hidden = true;
|
||||||
|
|
||||||
|
this.#slot.addEventListener('slotchange', this.#onSlotUpdate);
|
||||||
|
|
||||||
|
this.#body.appendChild(this.#slot);
|
||||||
|
|
||||||
|
this.#shadow.append(header, this.#columns, this.#rows, this.#body, this.#textarea);
|
||||||
|
}
|
||||||
|
|
||||||
|
#onSlotUpdate = () => {
|
||||||
const columnNames = new Set();
|
const columnNames = new Set();
|
||||||
const rowNames = new Set();
|
const rowNames = new Set();
|
||||||
|
|
||||||
|
|
@ -213,10 +228,18 @@ export class FolkSpreadsheet extends HTMLElement {
|
||||||
const columns = Array.from({ length: columnNames.size }).map((_, i) => getColumnName(i));
|
const columns = Array.from({ length: columnNames.size }).map((_, i) => getColumnName(i));
|
||||||
const rows = Array.from({ length: rowNames.size }).map((_, i) => i + 1);
|
const rows = Array.from({ length: rowNames.size }).map((_, i) => i + 1);
|
||||||
|
|
||||||
const columnHeaders = columns.map((column) => `<s-header column="${column}">${column}</s-header>`).join('\n');
|
this.#columns.setHTMLUnsafe(
|
||||||
const rowHeaders = rows.map((row) => `<s-header row="${row}">${row}</s-header>`).join('\n');
|
columns.map((column) => `<s-header column="${column}">${column}</s-header>`).join('\n')
|
||||||
|
);
|
||||||
|
|
||||||
|
this.#rows.setHTMLUnsafe(rows.map((row) => `<s-header row="${row}">${row}</s-header>`).join('\n'));
|
||||||
|
|
||||||
|
this.#cellStyles.replaceSync(`
|
||||||
|
:host {
|
||||||
|
--column-count: ${columns.length};
|
||||||
|
--row-count: ${rows.length};
|
||||||
|
}
|
||||||
|
|
||||||
const style = `<style>
|
|
||||||
${columns
|
${columns
|
||||||
.map(
|
.map(
|
||||||
(column) =>
|
(column) =>
|
||||||
|
|
@ -225,25 +248,11 @@ export class FolkSpreadsheet extends HTMLElement {
|
||||||
}; }`
|
}; }`
|
||||||
)
|
)
|
||||||
.join('\n')}
|
.join('\n')}
|
||||||
|
|
||||||
${rows
|
${rows
|
||||||
.map((row) => `s-header[row="${row}"], ::slotted(folk-cell[row="${row}"]) { grid-row: ${row}; }`)
|
.map((row) => `s-header[row="${row}"], ::slotted(folk-cell[row="${row}"]) { grid-row: ${row}; }`)
|
||||||
.join('\n')}
|
.join('\n')}`);
|
||||||
</style>`;
|
};
|
||||||
|
|
||||||
this.style.setProperty('--column-count', columns.length.toString());
|
|
||||||
this.style.setProperty('--row-count', rows.length.toString());
|
|
||||||
|
|
||||||
this.#shadow.setHTMLUnsafe(html`
|
|
||||||
<s-header empty></s-header>
|
|
||||||
<s-columns>${columnHeaders}</s-columns>
|
|
||||||
<s-rows>${rowHeaders}</s-rows>
|
|
||||||
<s-body><slot></slot></s-body>
|
|
||||||
<textarea hidden></textarea>
|
|
||||||
${style}
|
|
||||||
`);
|
|
||||||
|
|
||||||
this.#textarea = this.#shadow.querySelector('textarea')!;
|
|
||||||
}
|
|
||||||
|
|
||||||
#range = '';
|
#range = '';
|
||||||
get range() {
|
get range() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue