@nysds/nys-table 1.17.0 → 1.18.0

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/dist/nys-table.js CHANGED
@@ -5,66 +5,96 @@ import { property as u, state as h } from "lit/decorators.js";
5
5
  * █ █ █ █▄▄▄█ ▀▀▀▄▄ █ █ ▀▀▀▄▄
6
6
  * █ ▀█ █ █▄▄▄█ █▄▄▀ █▄▄▄█
7
7
  *
8
- * Table Component v1.17.0
8
+ * Table Component v1.18.0
9
9
  * Part of the New York State Design System
10
10
  * Repository: https://github.com/its-hcd/nysds
11
11
  * License: MIT
12
12
  */
13
13
  const w = ':host{--_nys-table-width: 100%;--_nys-table-radius: var(--nys-radius-xl, 12px);--_nys-table-padding: var(--nys-space-100, 8px);--_nys-table-border-color: transparent;--_nys-table-border-width: 0;--_nys-table-font-family: var(--nys-font-family-ui, var(--nys-font-family-sans, "Proxima Nova", "Helvetica Neue", Helvetica, Arial, sans-serif));--_nys-table-font-size: var(--nys-font-size-ui-md, 16px);--_nys-table-font-weight: var(--nys-font-weight-regular, 400);--_nys-table-line-height: var(--nys-font-lineheight-ui-md, 24px);--_nys-table-padding--caption: var(--nys-space-250, 20px) var(--nys-space-150, 12px);--_nys-table-font-size--caption: var(--nys-font-size-ui-lg, 18px);--_nys-table-font-weight--caption: var(--nys-font-weight-bold, 700);--_nys-table-padding--cell--x: var(--nys-space-150, 12px);--_nys-table-padding--cell--y: var(--nys-table-padding--cell--y, var(--nys-space-200, 16px));--_nys-table-background-color: var(--nys-color-ink-reverse, #ffffff);--_nys-table-background-color--striped: var(--nys-color-neutral-10, #f6f6f6);--_nys-table-color--code: var(--nys-color-red-600, #b52c2c);--_nys-table-background-color--code: var(--nys-color-neutral-10, #f6f6f6)}:host([bordered]){--_nys-table-border-color: var(--nys-color-neutral-100, #d0d0ce);--_nys-table-border-width: var(--nys-space-1px, 1px)}:host([download]){display:flex;flex-direction:column;gap:var(--nys-space-150, 12px)}.nys-table{width:var(--_nys-table-width);font:var(--_nys-table-font-weight) var(--_nys-table-font-size)/var(--_nys-table-line-height) var(--_nys-table-font-family)}.nys-table table{width:var(--_nys-table-width);border-collapse:collapse;background-color:var(--_nys-table-background-color)}.nys-table caption{padding:var(--_nys-table-padding--caption);font-size:var(--_nys-table-font-size--caption);font-weight:var(--_nys-table-font-weight--caption);text-align:start}.nys-table caption div{display:flex;justify-content:space-between;align-items:center}.nys-table td{padding:var(--_nys-table-padding--cell--y) var(--_nys-table-padding--cell--x);border:var(--_nys-table-border-width) solid var(--_nys-table-border-color)}.nys-table td code{color:var(--_nys-table-color--code);background-color:var(--_nys-table-background-color--code);padding:var(--nys-space-1px) var(--nys-space-2px);border-radius:var(--nys-radius-md)}.nys-table th{border:var(--_nys-table-border-width) solid var(--_nys-table-border-color);overflow:hidden;text-overflow:ellipsis;padding:var(--_nys-table-padding--cell--y) var(--_nys-table-padding--cell--x);text-align:left}.nys-table th:has(nys-button){padding:0}.nys-table th p{margin:0}.nys-table th nys-button{margin:0;width:-moz-available;width:-webkit-fill-available;width:fill-available;justify-content:space-between;--_nys-button-border-width: 0;--_nys-button-border-radius: 0;--_nys-button-padding--x: var(--_nys-table-padding--cell--x);--_nys-button-justify-content: space-between;--_nys-button-outline-offset: -2px}.nys-table th.nys-table__sortedcolumn{background-color:var(--nys-color-theme-weak, #cddde9)}.nys-table td.nys-table__sortedcolumn{position:relative;z-index:0}.nys-table td.nys-table__sortedcolumn:after{content:"";position:absolute;inset:0;background-color:var(--nys-color-theme, #154973);opacity:.1;pointer-events:none;z-index:-1}:host([striped]) .nys-table tbody tr:nth-child(odd){background-color:var(--_nys-table-background-color--striped)}:host([sortable]) .nys-table th{cursor:pointer}.sr-only{border:0!important;clip-path:inset(50%)!important;height:1px!important;overflow:hidden!important;margin:-1px!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}';
14
- var x = Object.defineProperty, y = (m, t, s, r) => {
14
+ var x = Object.defineProperty, b = (m, t, r, s) => {
15
15
  for (var e = void 0, n = m.length - 1, o; n >= 0; n--)
16
- (o = m[n]) && (e = o(t, s, e) || e);
17
- return e && x(t, s, e), e;
16
+ (o = m[n]) && (e = o(t, r, e) || e);
17
+ return e && x(t, r, e), e;
18
18
  };
19
19
  let C = 0;
20
20
  const f = class f extends v {
21
21
  /**************** Lifecycle Methods ****************/
22
22
  constructor() {
23
- super(), this.id = "", this.name = "", this.striped = !1, this.sortable = !1, this.bordered = !1, this.download = "", this._sortColumn = null, this._sortDirection = "none", this._captionText = "";
23
+ super(), this.id = "", this.name = "", this.striped = !1, this.sortable = !1, this.bordered = !1, this.download = "", this._sortColumn = null, this._sortDirection = "none", this._captionText = "", this._observer = null;
24
24
  }
25
25
  // Generate a unique ID if one is not provided
26
26
  connectedCallback() {
27
27
  super.connectedCallback(), this.id || (this.id = `nys-table-${Date.now()}-${C++}`);
28
28
  }
29
- /******************** Functions ********************/
30
- // Placeholder for generic functions (component-specific)
31
29
  firstUpdated() {
32
- this.shadowRoot?.querySelector("slot")?.addEventListener("slotchange", () => this._handleSlotChange()), this._handleSlotChange();
30
+ this.shadowRoot?.querySelector("slot")?.addEventListener("slotchange", () => this._handleSlotChange()), this._handleSlotChange(), this._setupMutationObserver();
31
+ }
32
+ disconnectedCallback() {
33
+ super.disconnectedCallback(), this._observer?.disconnect();
34
+ }
35
+ willUpdate() {
36
+ const t = Array.from(this.children).find(
37
+ (e) => e.tagName === "TABLE"
38
+ );
39
+ if (!t) return;
40
+ const s = t.querySelector("caption")?.textContent?.trim() ?? "";
41
+ this._captionText !== s && (this._captionText = s);
33
42
  }
43
+ /******************** Functions ********************/
34
44
  _handleSlotChange() {
35
45
  const t = this.shadowRoot?.querySelector(
36
46
  "slot"
37
- ), s = this.shadowRoot?.querySelector(
47
+ ), r = this.shadowRoot?.querySelector(
38
48
  ".table-container"
39
49
  );
40
- if (!t || !s) return;
41
- s.innerHTML = "";
50
+ if (!t || !r) return;
51
+ r.innerHTML = "";
42
52
  const e = t.assignedElements({ flatten: !0 }).find((o) => o.tagName === "TABLE");
43
53
  if (!e) return;
44
54
  const n = e.cloneNode(!0);
45
- this._normalizeTableDOM(n), this.sortable && this._addSortIcons(n), s.appendChild(n);
55
+ this._normalizeTableDOM(n), this.sortable && this._addSortIcons(n), r.appendChild(n);
56
+ }
57
+ _setupMutationObserver() {
58
+ const t = this.shadowRoot?.querySelector(
59
+ "slot"
60
+ );
61
+ if (!t) return;
62
+ this._observer = new MutationObserver(() => {
63
+ this._handleSlotChange();
64
+ });
65
+ const r = () => {
66
+ const e = t.assignedElements({ flatten: !0 }).find(
67
+ (n) => n.tagName === "TABLE"
68
+ );
69
+ e && this._observer?.observe(e, {
70
+ childList: !0,
71
+ subtree: !0,
72
+ characterData: !0
73
+ });
74
+ };
75
+ r(), t.addEventListener("slotchange", r);
46
76
  }
47
77
  _normalizeTableDOM(t) {
48
- const s = t.querySelector("thead"), r = t.querySelector("tbody");
49
- if (s && r) return;
78
+ const r = t.querySelector("thead"), s = t.querySelector("tbody");
79
+ if (r && s) return;
50
80
  const e = t.querySelector(
51
81
  "caption"
52
82
  ), n = Array.from(t.querySelectorAll("tr"));
53
83
  if (n.length === 0) return;
54
- const o = document.createElement("thead"), i = document.createElement("tbody"), p = n.findIndex((a) => a.querySelector("th"));
55
- if (p === -1)
84
+ const o = document.createElement("thead"), i = document.createElement("tbody"), y = n.findIndex((a) => a.querySelector("th"));
85
+ if (y === -1)
56
86
  n.forEach((a) => i.appendChild(a));
57
87
  else {
58
- const a = n[p];
88
+ const a = n[y];
59
89
  a.querySelectorAll("th").forEach((d) => {
60
90
  Array.from(d.childNodes).forEach((c) => {
61
91
  if (c.nodeType === Node.TEXT_NODE && c.textContent?.trim()) {
62
- const b = document.createElement("p");
63
- b.textContent = c.textContent, d.replaceChild(b, c);
92
+ const p = document.createElement("p");
93
+ p.textContent = c.textContent, d.replaceChild(p, c);
64
94
  }
65
95
  });
66
96
  }), o.appendChild(a), n.forEach((d, c) => {
67
- c !== p && i.appendChild(d);
97
+ c !== y && i.appendChild(d);
68
98
  });
69
99
  }
70
100
  if (t.innerHTML = "", e && t.appendChild(e), this.sortable) {
@@ -78,69 +108,61 @@ const f = class f extends v {
78
108
  }
79
109
  t.appendChild(o), t.appendChild(i);
80
110
  }
81
- willUpdate() {
82
- const t = Array.from(this.children).find(
83
- (e) => e.tagName === "TABLE"
84
- );
85
- if (!t) return;
86
- const r = t.querySelector("caption")?.textContent?.trim() ?? "";
87
- this._captionText !== r && (this._captionText = r);
88
- }
89
111
  _addSortIcons(t) {
90
- const s = Array.from(t.querySelectorAll("thead th"));
91
- s.length !== 0 && s.forEach((r, e) => {
92
- if (r.querySelector("nys-button[part='sort-button']")) return;
93
- const n = r.textContent?.trim();
112
+ const r = Array.from(t.querySelectorAll("thead th"));
113
+ r.length !== 0 && r.forEach((s, e) => {
114
+ if (s.querySelector("nys-button[part='sort-button']")) return;
115
+ const n = s.textContent?.trim();
94
116
  if (!n) return;
95
- r.textContent = "";
117
+ s.textContent = "";
96
118
  const o = document.createElement("nys-button");
97
119
  o.setAttribute("part", "sort-button"), o.setAttribute("variant", "ghost"), o.setAttribute("label", n), o.setAttribute("suffixIcon", "slotted"), o.setAttribute("fullWidth", "true");
98
120
  const i = document.createElement("nys-icon");
99
- i.setAttribute("slot", "suffix-icon"), i.setAttribute("name", "height"), i.setAttribute("size", "24"), i.setAttribute("color", "var(--nys-color-text-weak, #4a4d4f)"), o.appendChild(i), o.addEventListener("nys-click", (p) => {
100
- p.stopPropagation(), this._onSortClick(e, t);
101
- }), r.appendChild(o);
121
+ i.setAttribute("slot", "suffix-icon"), i.setAttribute("name", "height"), i.setAttribute("size", "24"), i.setAttribute("color", "var(--nys-color-text-weak, #4a4d4f)"), o.appendChild(i), o.addEventListener("nys-click", (y) => {
122
+ y.stopPropagation(), this._onSortClick(e, t);
123
+ }), s.appendChild(o);
102
124
  });
103
125
  }
104
126
  _updateSortIcons(t) {
105
- t.querySelectorAll("thead th").forEach((r, e) => {
106
- const n = r.querySelector("nys-button[part='sort-button']"), o = n?.querySelector(
127
+ t.querySelectorAll("thead th").forEach((s, e) => {
128
+ const n = s.querySelector("nys-button[part='sort-button']"), o = n?.querySelector(
107
129
  "nys-icon[slot='suffix-icon']"
108
130
  );
109
131
  if (!(!n || !o))
110
132
  if (e === this._sortColumn)
111
- switch (r.classList.add("nys-table__sortedcolumn"), this._sortDirection) {
133
+ switch (s.classList.add("nys-table__sortedcolumn"), this._sortDirection) {
112
134
  case "asc":
113
- o.setAttribute("name", "straight"), o.setAttribute("color", "var(--nys-color-ink, #1b1b1b)"), o.style.transform = "rotate(0deg)", r.setAttribute("aria-sort", "ascending");
135
+ o.setAttribute("name", "straight"), o.setAttribute("color", "var(--nys-color-ink, #1b1b1b)"), o.style.transform = "rotate(0deg)", s.setAttribute("aria-sort", "ascending");
114
136
  break;
115
137
  case "desc":
116
- o.setAttribute("name", "straight"), o.setAttribute("color", "var(--nys-color-ink, #1b1b1b)"), o.style.transform = "rotate(180deg)", r.setAttribute("aria-sort", "descending");
138
+ o.setAttribute("name", "straight"), o.setAttribute("color", "var(--nys-color-ink, #1b1b1b)"), o.style.transform = "rotate(180deg)", s.setAttribute("aria-sort", "descending");
117
139
  break;
118
140
  }
119
141
  else
120
- r.classList.remove("nys-table__sortedcolumn"), o.setAttribute("name", "height"), o.setAttribute("color", "var(--nys-color-text-weak, #4a4d4f)"), o.style.transform = "", r.removeAttribute("aria-sort");
142
+ s.classList.remove("nys-table__sortedcolumn"), o.setAttribute("name", "height"), o.setAttribute("color", "var(--nys-color-text-weak, #4a4d4f)"), o.style.transform = "", s.removeAttribute("aria-sort");
121
143
  });
122
144
  }
123
- _onSortClick(t, s) {
124
- const e = Array.from(s.querySelectorAll("thead th"))[t]?.querySelector("nys-button[part='sort-button']")?.getAttribute("label") ?? "", n = this._sortColumn !== t ? "asc" : this._sortDirection === "asc" ? "desc" : "asc";
145
+ _onSortClick(t, r) {
146
+ const e = Array.from(r.querySelectorAll("thead th"))[t]?.querySelector("nys-button[part='sort-button']")?.getAttribute("label") ?? "", n = this._sortColumn !== t ? "asc" : this._sortDirection === "asc" ? "desc" : "asc";
125
147
  this._emitColumnSortEvent(
126
148
  t,
127
149
  e,
128
150
  n
129
- ) || (this._sortColumn = t, this._sortDirection = n, this._updateSortIcons(s), this._sortTable(s, t, this._sortDirection));
151
+ ) || (this._sortColumn = t, this._sortDirection = n, this._updateSortIcons(r), this._sortTable(r, t, this._sortDirection));
130
152
  }
131
- _sortTable(t, s, r) {
153
+ _sortTable(t, r, s) {
132
154
  const e = t.querySelector("tbody");
133
155
  if (!e) return;
134
156
  const n = Array.from(e.querySelectorAll("tr"));
135
157
  n.sort((o, i) => {
136
- const p = o.children[s]?.textContent?.trim() ?? "", a = i.children[s]?.textContent?.trim() ?? "", d = Number(p), c = Number(a);
137
- let b;
138
- return !isNaN(d) && !isNaN(c) ? b = d - c : b = p.localeCompare(a), r === "asc" ? b : -b;
158
+ const y = o.children[r]?.textContent?.trim() ?? "", a = i.children[r]?.textContent?.trim() ?? "", d = Number(y), c = Number(a);
159
+ let p;
160
+ return !isNaN(d) && !isNaN(c) ? p = d - c : p = y.localeCompare(a), s === "asc" ? p : -p;
139
161
  }), n.forEach((o) => e.appendChild(o)), this._updateSortedColumnStyles(t);
140
162
  }
141
163
  _updateSortedColumnStyles(t) {
142
- t.querySelectorAll("tbody tr").forEach((r) => {
143
- Array.from(r.children).forEach((e, n) => {
164
+ t.querySelectorAll("tbody tr").forEach((s) => {
165
+ Array.from(s.children).forEach((e, n) => {
144
166
  n === this._sortColumn ? e.classList.add("nys-table__sortedcolumn") : e.classList.remove("nys-table__sortedcolumn");
145
167
  });
146
168
  });
@@ -157,9 +179,9 @@ const f = class f extends v {
157
179
  * @param columnLabel - The text label of the sorted column header.
158
180
  * @param sortDirection - The new sort direction: "asc", "desc", or "none".
159
181
  */
160
- _emitColumnSortEvent(t, s, r) {
182
+ _emitColumnSortEvent(t, r, s) {
161
183
  const e = new CustomEvent("nys-column-sort", {
162
- detail: { columnIndex: t, columnLabel: s, sortDirection: r },
184
+ detail: { columnIndex: t, columnLabel: r, sortDirection: s },
163
185
  bubbles: !0,
164
186
  composed: !0,
165
187
  cancelable: !0
@@ -187,31 +209,31 @@ const f = class f extends v {
187
209
  };
188
210
  f.styles = g(w);
189
211
  let l = f;
190
- y([
212
+ b([
191
213
  u({ type: String, reflect: !0 })
192
214
  ], l.prototype, "id");
193
- y([
215
+ b([
194
216
  u({ type: String, reflect: !0 })
195
217
  ], l.prototype, "name");
196
- y([
218
+ b([
197
219
  u({ type: Boolean, reflect: !0 })
198
220
  ], l.prototype, "striped");
199
- y([
221
+ b([
200
222
  u({ type: Boolean, reflect: !0 })
201
223
  ], l.prototype, "sortable");
202
- y([
224
+ b([
203
225
  u({ type: Boolean, reflect: !0 })
204
226
  ], l.prototype, "bordered");
205
- y([
227
+ b([
206
228
  u({ type: String, reflect: !0 })
207
229
  ], l.prototype, "download");
208
- y([
230
+ b([
209
231
  h()
210
232
  ], l.prototype, "_sortColumn");
211
- y([
233
+ b([
212
234
  h()
213
235
  ], l.prototype, "_sortDirection");
214
- y([
236
+ b([
215
237
  h()
216
238
  ], l.prototype, "_captionText");
217
239
  customElements.get("nys-table") || customElements.define("nys-table", l);
@@ -1 +1 @@
1
- {"version":3,"file":"nys-table.js","sources":["../src/nys-table.ts"],"sourcesContent":["import { LitElement, html, unsafeCSS } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\n// @ts-ignore: SCSS module imported via bundler as inline\nimport styles from \"./nys-table.scss?inline\";\n\nlet componentIdCounter = 0;\n\n/**\n * `<nys-table>` is a responsive table component that can display native HTML tables,\n * supports striped and bordered styling, sortable columns, and CSV download.\n *\n * @slot - Accepts a `<table>` element. Only the first table is rendered.\n *\n * @fires nys-click - Fired when the download button or sortable headers are clicked.\n * @fires nys-column-sort - Fired when a sortable column header is clicked. Can be prevented by calling `event.preventDefault()` to override default sort behavior.\n * Detail: { columnIndex: number, columnLabel: string, sortDirection: \"asc\" | \"desc\" | \"none\" }\n *\n * @method downloadFile - Triggers download of the CSV file if `download` is set.\n */\nexport class NysTable extends LitElement {\n static styles = unsafeCSS(styles);\n\n @property({ type: String, reflect: true }) id = \"\";\n @property({ type: String, reflect: true }) name = \"\";\n @property({ type: Boolean, reflect: true }) striped = false;\n @property({ type: Boolean, reflect: true }) sortable = false;\n @property({ type: Boolean, reflect: true }) bordered = false;\n @property({ type: String, reflect: true }) download = \"\";\n\n @state() private _sortColumn: number | null = null;\n @state() private _sortDirection: \"asc\" | \"desc\" | \"none\" = \"none\";\n @state() private _captionText = \"\";\n\n /**************** Lifecycle Methods ****************/\n constructor() {\n super();\n }\n\n // Generate a unique ID if one is not provided\n connectedCallback() {\n super.connectedCallback();\n if (!this.id) {\n this.id = `nys-table-${Date.now()}-${componentIdCounter++}`;\n }\n }\n\n /******************** Functions ********************/\n // Placeholder for generic functions (component-specific)\n\n firstUpdated() {\n const slot = this.shadowRoot?.querySelector(\"slot\");\n slot?.addEventListener(\"slotchange\", () => this._handleSlotChange());\n this._handleSlotChange();\n }\n\n _handleSlotChange() {\n const slot = this.shadowRoot?.querySelector(\n \"slot\",\n ) as HTMLSlotElement | null;\n const container = this.shadowRoot?.querySelector(\n \".table-container\",\n ) as HTMLElement | null;\n\n if (!slot || !container) return;\n\n container.innerHTML = \"\";\n\n const assigned = slot.assignedElements({ flatten: true });\n const tableEl = assigned.find((el) => el.tagName === \"TABLE\") as\n | HTMLTableElement\n | undefined;\n\n if (!tableEl) return;\n\n const table = tableEl.cloneNode(true) as HTMLTableElement;\n\n this._normalizeTableDOM(table);\n\n if (this.sortable) {\n this._addSortIcons(table);\n }\n\n container.appendChild(table);\n }\n\n _normalizeTableDOM(table: HTMLTableElement) {\n const hasThead = table.querySelector(\"thead\");\n const hasTbody = table.querySelector(\"tbody\");\n\n if (hasThead && hasTbody) return;\n\n // Pull caption first\n const caption = table.querySelector(\n \"caption\",\n ) as HTMLTableCaptionElement | null;\n\n // Collect all rows\n const rows = Array.from(table.querySelectorAll(\"tr\"));\n if (rows.length === 0) return;\n\n const thead = document.createElement(\"thead\");\n const tbody = document.createElement(\"tbody\");\n\n // Find first row containing th\n const headerRowIndex = rows.findIndex((r) => r.querySelector(\"th\"));\n\n if (headerRowIndex === -1) {\n rows.forEach((r) => tbody.appendChild(r));\n } else {\n const headerRow = rows[headerRowIndex];\n\n // Wrap text nodes in <p> for each <th>\n headerRow.querySelectorAll(\"th\").forEach((th) => {\n // Only wrap text nodes, leave icons or other children\n Array.from(th.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {\n const p = document.createElement(\"p\");\n p.textContent = node.textContent;\n th.replaceChild(p, node);\n }\n });\n });\n\n thead.appendChild(headerRow);\n\n // Move remaining rows to tbody\n rows.forEach((r, i) => {\n if (i !== headerRowIndex) tbody.appendChild(r);\n });\n }\n\n // Wipe original table content\n table.innerHTML = \"\";\n\n // Handle caption and sortable message\n if (caption) {\n table.appendChild(caption);\n }\n\n if (this.sortable) {\n const srOnly = document.createElement(\"span\");\n srOnly.setAttribute(\"class\", \"sr-only\");\n srOnly.textContent = \"Column headers with buttons are sortable.\";\n\n if (caption) {\n caption.appendChild(srOnly);\n } else {\n const nextCaption = document.createElement(\"caption\");\n nextCaption.appendChild(srOnly);\n table.appendChild(nextCaption);\n }\n }\n\n table.appendChild(thead);\n table.appendChild(tbody);\n }\n\n willUpdate() {\n const table = Array.from(this.children).find(\n (el) => el.tagName === \"TABLE\",\n ) as HTMLTableElement | undefined;\n\n if (!table) return;\n\n const caption = table.querySelector(\"caption\");\n const nextCaption = caption?.textContent?.trim() ?? \"\";\n\n if (this._captionText !== nextCaption) {\n this._captionText = nextCaption;\n }\n }\n\n _addSortIcons(table: HTMLTableElement) {\n const ths = Array.from(table.querySelectorAll(\"thead th\"));\n if (ths.length === 0) return;\n\n ths.forEach((th, index) => {\n // Prevent duplicates on slotchange or re-render\n if (th.querySelector(\"nys-button[part='sort-button']\")) return;\n\n // Get existing text content\n const label = th.textContent?.trim();\n if (!label) return;\n\n // Clear existing content\n th.textContent = \"\";\n\n const button = document.createElement(\"nys-button\");\n button.setAttribute(\"part\", \"sort-button\");\n button.setAttribute(\"variant\", \"ghost\");\n button.setAttribute(\"label\", label);\n button.setAttribute(\"suffixIcon\", \"slotted\");\n button.setAttribute(\"fullWidth\", \"true\");\n\n const icon = document.createElement(\"nys-icon\");\n icon.setAttribute(\"slot\", \"suffix-icon\");\n icon.setAttribute(\"name\", \"height\");\n icon.setAttribute(\"size\", \"24\");\n icon.setAttribute(\"color\", \"var(--nys-color-text-weak, #4a4d4f)\");\n\n button.appendChild(icon);\n\n button.addEventListener(\"nys-click\", (e) => {\n e.stopPropagation();\n this._onSortClick(index, table);\n });\n\n th.appendChild(button);\n });\n }\n\n _updateSortIcons(table: HTMLTableElement) {\n const ths = table.querySelectorAll(\"thead th\");\n\n ths.forEach((th, index) => {\n const button = th.querySelector(\"nys-button[part='sort-button']\");\n const icon = button?.querySelector(\n \"nys-icon[slot='suffix-icon']\",\n ) as HTMLElement | null;\n\n if (!button || !icon) return;\n\n if (index === this._sortColumn) {\n th.classList.add(\"nys-table__sortedcolumn\");\n switch (this._sortDirection) {\n case \"asc\":\n icon.setAttribute(\"name\", \"straight\");\n icon.setAttribute(\"color\", \"var(--nys-color-ink, #1b1b1b)\");\n icon.style.transform = \"rotate(0deg)\";\n th.setAttribute(\"aria-sort\", \"ascending\");\n break;\n case \"desc\":\n icon.setAttribute(\"name\", \"straight\");\n icon.setAttribute(\"color\", \"var(--nys-color-ink, #1b1b1b)\");\n icon.style.transform = \"rotate(180deg)\";\n th.setAttribute(\"aria-sort\", \"descending\");\n break;\n }\n } else {\n // Reset for all other columns\n th.classList.remove(\"nys-table__sortedcolumn\");\n icon.setAttribute(\"name\", \"height\");\n icon.setAttribute(\"color\", \"var(--nys-color-text-weak, #4a4d4f)\");\n icon.style.transform = \"\";\n th.removeAttribute(\"aria-sort\");\n }\n });\n }\n\n private _onSortClick(columnIndex: number, table: HTMLTableElement) {\n const ths = Array.from(table.querySelectorAll(\"thead th\"));\n const columnLabel =\n ths[columnIndex]\n ?.querySelector(\"nys-button[part='sort-button']\")\n ?.getAttribute(\"label\") ?? \"\";\n\n const nextDirection: \"asc\" | \"desc\" =\n this._sortColumn !== columnIndex\n ? \"asc\"\n : this._sortDirection === \"asc\"\n ? \"desc\"\n : \"asc\";\n\n const prevented = this._emitColumnSortEvent(\n columnIndex,\n columnLabel,\n nextDirection,\n );\n\n if (prevented) return;\n\n this._sortColumn = columnIndex;\n this._sortDirection = nextDirection;\n\n this._updateSortIcons(table);\n this._sortTable(table, columnIndex, this._sortDirection);\n }\n\n _sortTable(\n table: HTMLTableElement,\n columnIndex: number,\n direction: \"asc\" | \"desc\",\n ) {\n const tbody = table.querySelector(\"tbody\");\n if (!tbody) return;\n\n const rows = Array.from(tbody.querySelectorAll(\"tr\"));\n\n rows.sort((a, b) => {\n const aText = a.children[columnIndex]?.textContent?.trim() ?? \"\";\n const bText = b.children[columnIndex]?.textContent?.trim() ?? \"\";\n\n const aNum = Number(aText);\n const bNum = Number(bText);\n\n let result;\n\n if (!isNaN(aNum) && !isNaN(bNum)) {\n result = aNum - bNum;\n } else {\n result = aText.localeCompare(bText);\n }\n\n return direction === \"asc\" ? result : -result;\n });\n\n // Re-append sorted rows\n rows.forEach((r) => tbody.appendChild(r));\n this._updateSortedColumnStyles(table);\n }\n\n _updateSortedColumnStyles(table: HTMLTableElement) {\n const rows = table.querySelectorAll(\"tbody tr\");\n\n rows.forEach((row) => {\n Array.from(row.children).forEach((cell, index) => {\n if (index === this._sortColumn) {\n cell.classList.add(\"nys-table__sortedcolumn\");\n } else {\n cell.classList.remove(\"nys-table__sortedcolumn\");\n }\n });\n });\n }\n\n downloadFile() {\n // read file from this.download and trigger download\n const link = document.createElement(\"a\");\n link.href = this.download;\n link.download = this.download.split(\"/\").pop() || \"table-data.csv\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /****************** Event Handlers ******************/\n\n /**\n * Dispatches the `nys-column-sort` custom event.\n *\n * @param columnIndex - Zero-based index of the sorted column.\n * @param columnLabel - The text label of the sorted column header.\n * @param sortDirection - The new sort direction: \"asc\", \"desc\", or \"none\".\n */\n private _emitColumnSortEvent(\n columnIndex: number,\n columnLabel: string,\n sortDirection: \"asc\" | \"desc\" | \"none\",\n ): boolean {\n const event = new CustomEvent(\"nys-column-sort\", {\n detail: { columnIndex, columnLabel, sortDirection },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(event);\n return event.defaultPrevented;\n }\n\n /****************** Render ******************/\n\n render() {\n return html`\n <div class=\"nys-table\">\n <div class=\"table-container\"></div>\n </div>\n ${this.download\n ? html` <nys-button\n id=\"${this.id}-download-button\"\n label=\"Download table\"\n aria-label=${this._captionText\n ? `Download ${this._captionText}`\n : \"Download table\"}\n size=\"sm\"\n variant=\"outline\"\n prefixIcon=\"download\"\n @nys-click=${this.downloadFile}\n ></nys-button>`\n : \"\"}\n <slot style=\"display:none\"></slot>\n `;\n }\n}\n\nif (!customElements.get(\"nys-table\")) {\n customElements.define(\"nys-table\", NysTable);\n}\n"],"names":["componentIdCounter","_NysTable","LitElement","slot","container","tableEl","el","table","hasThead","hasTbody","caption","rows","thead","tbody","headerRowIndex","r","headerRow","th","node","p","i","srOnly","nextCaption","ths","index","label","button","icon","e","columnIndex","columnLabel","nextDirection","direction","a","b","aText","bText","aNum","bNum","result","row","cell","link","sortDirection","event","html","unsafeCSS","styles","NysTable","__decorateClass","property","state"],"mappings":"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"}
1
+ {"version":3,"file":"nys-table.js","sources":["../src/nys-table.ts"],"sourcesContent":["import { LitElement, html, unsafeCSS } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\n// @ts-ignore: SCSS module imported via bundler as inline\nimport styles from \"./nys-table.scss?inline\";\n\nlet componentIdCounter = 0;\n\n/**\n * `<nys-table>` is a responsive table component that can display native HTML tables,\n * supports striped and bordered styling, sortable columns, and CSV download.\n *\n * @slot - Accepts a `<table>` element. Only the first table is rendered.\n *\n * @fires nys-click - Fired when the download button or sortable headers are clicked.\n * @fires nys-column-sort - Fired when a sortable column header is clicked. Can be prevented by calling `event.preventDefault()` to override default sort behavior.\n * Detail: { columnIndex: number, columnLabel: string, sortDirection: \"asc\" | \"desc\" | \"none\" }\n *\n * @method downloadFile - Triggers download of the CSV file if `download` is set.\n */\nexport class NysTable extends LitElement {\n static styles = unsafeCSS(styles);\n\n @property({ type: String, reflect: true }) id = \"\";\n @property({ type: String, reflect: true }) name = \"\";\n @property({ type: Boolean, reflect: true }) striped = false;\n @property({ type: Boolean, reflect: true }) sortable = false;\n @property({ type: Boolean, reflect: true }) bordered = false;\n @property({ type: String, reflect: true }) download = \"\";\n\n @state() private _sortColumn: number | null = null;\n @state() private _sortDirection: \"asc\" | \"desc\" | \"none\" = \"none\";\n @state() private _captionText = \"\";\n\n private _observer: MutationObserver | null = null;\n\n /**************** Lifecycle Methods ****************/\n constructor() {\n super();\n }\n\n // Generate a unique ID if one is not provided\n connectedCallback() {\n super.connectedCallback();\n if (!this.id) {\n this.id = `nys-table-${Date.now()}-${componentIdCounter++}`;\n }\n }\n\n firstUpdated() {\n const slot = this.shadowRoot?.querySelector(\"slot\");\n slot?.addEventListener(\"slotchange\", () => this._handleSlotChange());\n this._handleSlotChange();\n this._setupMutationObserver();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._observer?.disconnect();\n }\n\n willUpdate() {\n const table = Array.from(this.children).find(\n (el) => el.tagName === \"TABLE\",\n ) as HTMLTableElement | undefined;\n\n if (!table) return;\n\n const caption = table.querySelector(\"caption\");\n const nextCaption = caption?.textContent?.trim() ?? \"\";\n\n if (this._captionText !== nextCaption) {\n this._captionText = nextCaption;\n }\n }\n\n /******************** Functions ********************/\n\n private _handleSlotChange() {\n const slot = this.shadowRoot?.querySelector(\n \"slot\",\n ) as HTMLSlotElement | null;\n const container = this.shadowRoot?.querySelector(\n \".table-container\",\n ) as HTMLElement | null;\n\n if (!slot || !container) return;\n\n container.innerHTML = \"\";\n\n const assigned = slot.assignedElements({ flatten: true });\n const tableEl = assigned.find((el) => el.tagName === \"TABLE\") as\n | HTMLTableElement\n | undefined;\n\n if (!tableEl) return;\n\n const table = tableEl.cloneNode(true) as HTMLTableElement;\n\n this._normalizeTableDOM(table);\n\n if (this.sortable) {\n this._addSortIcons(table);\n }\n\n container.appendChild(table);\n }\n\n private _setupMutationObserver() {\n const slot = this.shadowRoot?.querySelector(\n \"slot\",\n ) as HTMLSlotElement | null;\n if (!slot) return;\n\n this._observer = new MutationObserver(() => {\n this._handleSlotChange();\n });\n\n const observeSlottedContent = () => {\n const assigned = slot.assignedElements({ flatten: true });\n const tableEl = assigned.find(\n (el) => el.tagName === \"TABLE\",\n ) as HTMLTableElement;\n\n if (tableEl) {\n this._observer?.observe(tableEl, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n };\n\n observeSlottedContent(); // initial observation\n slot.addEventListener(\"slotchange\", observeSlottedContent);\n }\n\n private _normalizeTableDOM(table: HTMLTableElement) {\n const hasThead = table.querySelector(\"thead\");\n const hasTbody = table.querySelector(\"tbody\");\n\n if (hasThead && hasTbody) return;\n\n // Pull caption first\n const caption = table.querySelector(\n \"caption\",\n ) as HTMLTableCaptionElement | null;\n\n // Collect all rows\n const rows = Array.from(table.querySelectorAll(\"tr\"));\n if (rows.length === 0) return;\n\n const thead = document.createElement(\"thead\");\n const tbody = document.createElement(\"tbody\");\n\n // Find first row containing th\n const headerRowIndex = rows.findIndex((r) => r.querySelector(\"th\"));\n\n if (headerRowIndex === -1) {\n rows.forEach((r) => tbody.appendChild(r));\n } else {\n const headerRow = rows[headerRowIndex];\n\n // Wrap text nodes in <p> for each <th>\n headerRow.querySelectorAll(\"th\").forEach((th) => {\n // Only wrap text nodes, leave icons or other children\n Array.from(th.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {\n const p = document.createElement(\"p\");\n p.textContent = node.textContent;\n th.replaceChild(p, node);\n }\n });\n });\n\n thead.appendChild(headerRow);\n\n // Move remaining rows to tbody\n rows.forEach((r, i) => {\n if (i !== headerRowIndex) tbody.appendChild(r);\n });\n }\n\n // Wipe original table content\n table.innerHTML = \"\";\n\n // Handle caption and sortable message\n if (caption) {\n table.appendChild(caption);\n }\n\n if (this.sortable) {\n const srOnly = document.createElement(\"span\");\n srOnly.setAttribute(\"class\", \"sr-only\");\n srOnly.textContent = \"Column headers with buttons are sortable.\";\n\n if (caption) {\n caption.appendChild(srOnly);\n } else {\n const nextCaption = document.createElement(\"caption\");\n nextCaption.appendChild(srOnly);\n table.appendChild(nextCaption);\n }\n }\n\n table.appendChild(thead);\n table.appendChild(tbody);\n }\n\n private _addSortIcons(table: HTMLTableElement) {\n const ths = Array.from(table.querySelectorAll(\"thead th\"));\n if (ths.length === 0) return;\n\n ths.forEach((th, index) => {\n // Prevent duplicates on slotchange or re-render\n if (th.querySelector(\"nys-button[part='sort-button']\")) return;\n\n // Get existing text content\n const label = th.textContent?.trim();\n if (!label) return;\n\n // Clear existing content\n th.textContent = \"\";\n\n const button = document.createElement(\"nys-button\");\n button.setAttribute(\"part\", \"sort-button\");\n button.setAttribute(\"variant\", \"ghost\");\n button.setAttribute(\"label\", label);\n button.setAttribute(\"suffixIcon\", \"slotted\");\n button.setAttribute(\"fullWidth\", \"true\");\n\n const icon = document.createElement(\"nys-icon\");\n icon.setAttribute(\"slot\", \"suffix-icon\");\n icon.setAttribute(\"name\", \"height\");\n icon.setAttribute(\"size\", \"24\");\n icon.setAttribute(\"color\", \"var(--nys-color-text-weak, #4a4d4f)\");\n\n button.appendChild(icon);\n\n button.addEventListener(\"nys-click\", (e) => {\n e.stopPropagation();\n this._onSortClick(index, table);\n });\n\n th.appendChild(button);\n });\n }\n\n private _updateSortIcons(table: HTMLTableElement) {\n const ths = table.querySelectorAll(\"thead th\");\n\n ths.forEach((th, index) => {\n const button = th.querySelector(\"nys-button[part='sort-button']\");\n const icon = button?.querySelector(\n \"nys-icon[slot='suffix-icon']\",\n ) as HTMLElement | null;\n\n if (!button || !icon) return;\n\n if (index === this._sortColumn) {\n th.classList.add(\"nys-table__sortedcolumn\");\n switch (this._sortDirection) {\n case \"asc\":\n icon.setAttribute(\"name\", \"straight\");\n icon.setAttribute(\"color\", \"var(--nys-color-ink, #1b1b1b)\");\n icon.style.transform = \"rotate(0deg)\";\n th.setAttribute(\"aria-sort\", \"ascending\");\n break;\n case \"desc\":\n icon.setAttribute(\"name\", \"straight\");\n icon.setAttribute(\"color\", \"var(--nys-color-ink, #1b1b1b)\");\n icon.style.transform = \"rotate(180deg)\";\n th.setAttribute(\"aria-sort\", \"descending\");\n break;\n }\n } else {\n // Reset for all other columns\n th.classList.remove(\"nys-table__sortedcolumn\");\n icon.setAttribute(\"name\", \"height\");\n icon.setAttribute(\"color\", \"var(--nys-color-text-weak, #4a4d4f)\");\n icon.style.transform = \"\";\n th.removeAttribute(\"aria-sort\");\n }\n });\n }\n\n private _onSortClick(columnIndex: number, table: HTMLTableElement) {\n const ths = Array.from(table.querySelectorAll(\"thead th\"));\n const columnLabel =\n ths[columnIndex]\n ?.querySelector(\"nys-button[part='sort-button']\")\n ?.getAttribute(\"label\") ?? \"\";\n\n const nextDirection: \"asc\" | \"desc\" =\n this._sortColumn !== columnIndex\n ? \"asc\"\n : this._sortDirection === \"asc\"\n ? \"desc\"\n : \"asc\";\n\n const prevented = this._emitColumnSortEvent(\n columnIndex,\n columnLabel,\n nextDirection,\n );\n\n if (prevented) return;\n\n this._sortColumn = columnIndex;\n this._sortDirection = nextDirection;\n\n this._updateSortIcons(table);\n this._sortTable(table, columnIndex, this._sortDirection);\n }\n\n private _sortTable(\n table: HTMLTableElement,\n columnIndex: number,\n direction: \"asc\" | \"desc\",\n ) {\n const tbody = table.querySelector(\"tbody\");\n if (!tbody) return;\n\n const rows = Array.from(tbody.querySelectorAll(\"tr\"));\n\n rows.sort((a, b) => {\n const aText = a.children[columnIndex]?.textContent?.trim() ?? \"\";\n const bText = b.children[columnIndex]?.textContent?.trim() ?? \"\";\n\n const aNum = Number(aText);\n const bNum = Number(bText);\n\n let result;\n\n if (!isNaN(aNum) && !isNaN(bNum)) {\n result = aNum - bNum;\n } else {\n result = aText.localeCompare(bText);\n }\n\n return direction === \"asc\" ? result : -result;\n });\n\n // Re-append sorted rows\n rows.forEach((r) => tbody.appendChild(r));\n this._updateSortedColumnStyles(table);\n }\n\n private _updateSortedColumnStyles(table: HTMLTableElement) {\n const rows = table.querySelectorAll(\"tbody tr\");\n\n rows.forEach((row) => {\n Array.from(row.children).forEach((cell, index) => {\n if (index === this._sortColumn) {\n cell.classList.add(\"nys-table__sortedcolumn\");\n } else {\n cell.classList.remove(\"nys-table__sortedcolumn\");\n }\n });\n });\n }\n\n public downloadFile() {\n // read file from this.download and trigger download\n const link = document.createElement(\"a\");\n link.href = this.download;\n link.download = this.download.split(\"/\").pop() || \"table-data.csv\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /****************** Event Handlers ******************/\n\n /**\n * Dispatches the `nys-column-sort` custom event.\n *\n * @param columnIndex - Zero-based index of the sorted column.\n * @param columnLabel - The text label of the sorted column header.\n * @param sortDirection - The new sort direction: \"asc\", \"desc\", or \"none\".\n */\n private _emitColumnSortEvent(\n columnIndex: number,\n columnLabel: string,\n sortDirection: \"asc\" | \"desc\" | \"none\",\n ): boolean {\n const event = new CustomEvent(\"nys-column-sort\", {\n detail: { columnIndex, columnLabel, sortDirection },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(event);\n return event.defaultPrevented;\n }\n\n /****************** Render ******************/\n\n render() {\n return html`\n <div class=\"nys-table\">\n <div class=\"table-container\"></div>\n </div>\n ${this.download\n ? html` <nys-button\n id=\"${this.id}-download-button\"\n label=\"Download table\"\n aria-label=${this._captionText\n ? `Download ${this._captionText}`\n : \"Download table\"}\n size=\"sm\"\n variant=\"outline\"\n prefixIcon=\"download\"\n @nys-click=${this.downloadFile}\n ></nys-button>`\n : \"\"}\n <slot style=\"display:none\"></slot>\n `;\n }\n}\n\nif (!customElements.get(\"nys-table\")) {\n customElements.define(\"nys-table\", NysTable);\n}\n"],"names":["componentIdCounter","_NysTable","LitElement","table","el","nextCaption","slot","container","tableEl","observeSlottedContent","hasThead","hasTbody","caption","rows","thead","tbody","headerRowIndex","r","headerRow","th","node","i","srOnly","ths","index","label","button","icon","e","columnIndex","columnLabel","nextDirection","direction","a","b","aText","bText","aNum","bNum","result","row","cell","link","sortDirection","event","html","unsafeCSS","styles","NysTable","__decorateClass","property","state"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nysds/nys-table",
3
- "version": "1.17.0",
3
+ "version": "1.18.0",
4
4
  "description": "The Table component from the NYS Design System.",
5
5
  "module": "dist/nys-table.js",
6
6
  "types": "dist/index.d.ts",
@@ -23,8 +23,8 @@
23
23
  "lit-analyze": "lit-analyzer '*.ts'"
24
24
  },
25
25
  "dependencies": {
26
- "@nysds/nys-icon": "^1.17.0",
27
- "@nysds/nys-button": "^1.17.0"
26
+ "@nysds/nys-icon": "^1.18.0",
27
+ "@nysds/nys-button": "^1.18.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "lit": "^3.3.1",