@design.estate/dees-catalog 3.62.0 → 3.63.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_bundle/bundle.js +280 -76
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.d.ts +46 -1
- package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.js +302 -77
- package/dist_ts_web/elements/00group-dataview/dees-table/styles.js +46 -18
- package/dist_watch/bundle.js +278 -74
- package/dist_watch/bundle.js.map +3 -3
- package/package.json +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/00group-dataview/dees-table/dees-table.ts +309 -71
- package/ts_web/elements/00group-dataview/dees-table/styles.ts +45 -17
|
@@ -113,29 +113,48 @@ export const tableStyles = [
|
|
|
113
113
|
border-bottom-width: 0px;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
/* Default mode (Mode B, page sticky): horizontal scroll lives on
|
|
117
|
+
.tableScroll (so wide tables don't get clipped by an ancestor
|
|
118
|
+
overflow:hidden such as dees-tile). Vertical sticky is handled by
|
|
119
|
+
a JS-managed floating header (.floatingHeader, position:fixed),
|
|
120
|
+
which is unaffected by ancestor overflow. */
|
|
116
121
|
.tableScroll {
|
|
117
|
-
|
|
122
|
+
position: relative;
|
|
118
123
|
overflow-x: auto;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
124
|
+
overflow-y: visible;
|
|
125
|
+
scrollbar-gutter: stable;
|
|
126
|
+
}
|
|
127
|
+
/* Mode A, internal scroll: opt-in via fixed-height attribute.
|
|
128
|
+
The table scrolls inside its own box and the header sticks via plain CSS sticky. */
|
|
129
|
+
:host([fixed-height]) .tableScroll {
|
|
130
|
+
max-height: var(--table-max-height, 360px);
|
|
131
|
+
overflow: auto;
|
|
122
132
|
scrollbar-gutter: stable both-edges;
|
|
123
133
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
134
|
+
:host([fixed-height]) .tableScroll::-webkit-scrollbar:horizontal {
|
|
135
|
+
height: 0px;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Floating header overlay (Mode B). Position is managed by JS so it
|
|
139
|
+
escapes any ancestor overflow:hidden (position:fixed is not clipped
|
|
140
|
+
by overflow ancestors). */
|
|
141
|
+
.floatingHeader {
|
|
142
|
+
position: fixed;
|
|
143
|
+
top: 0;
|
|
144
|
+
left: 0;
|
|
145
|
+
z-index: 100;
|
|
146
|
+
visibility: hidden;
|
|
147
|
+
overflow: hidden;
|
|
148
|
+
pointer-events: none;
|
|
128
149
|
}
|
|
129
|
-
|
|
130
|
-
|
|
150
|
+
.floatingHeader.active {
|
|
151
|
+
visibility: visible;
|
|
131
152
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
height: 0px;
|
|
153
|
+
.floatingHeader table {
|
|
154
|
+
margin: 0;
|
|
135
155
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
overflow: auto;
|
|
156
|
+
.floatingHeader th {
|
|
157
|
+
pointer-events: auto;
|
|
139
158
|
}
|
|
140
159
|
|
|
141
160
|
table {
|
|
@@ -158,11 +177,20 @@ export const tableStyles = [
|
|
|
158
177
|
background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 9%)')};
|
|
159
178
|
border-bottom: 1px solid var(--dees-color-border-strong);
|
|
160
179
|
}
|
|
161
|
-
|
|
180
|
+
/* th needs its own background so sticky cells paint over scrolled rows
|
|
181
|
+
(browsers don't paint the <thead> box behind a sticky <th>). */
|
|
182
|
+
th {
|
|
183
|
+
background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 9%)')};
|
|
184
|
+
}
|
|
185
|
+
/* Mode A — internal scroll sticky */
|
|
186
|
+
:host([fixed-height]) thead th {
|
|
162
187
|
position: sticky;
|
|
163
188
|
top: 0;
|
|
164
189
|
z-index: 2;
|
|
165
190
|
}
|
|
191
|
+
:host([fixed-height]) thead tr.filtersRow th {
|
|
192
|
+
top: 36px; /* matches th { height: 36px } below */
|
|
193
|
+
}
|
|
166
194
|
|
|
167
195
|
tbody tr {
|
|
168
196
|
transition: background-color 0.15s ease;
|
|
@@ -462,4 +490,4 @@ export const tableStyles = [
|
|
|
462
490
|
}
|
|
463
491
|
`,
|
|
464
492
|
];
|
|
465
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
493
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy10YWJsZS9zdHlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQWtCLE1BQU0sNkJBQTZCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFnQjtJQUN0QyxrQkFBa0I7SUFDbEIsVUFBVSxDQUFDLGFBQWE7SUFDeEIsR0FBRyxDQUFBOzs7Ozs7Ozs7dUJBU2tCLGtCQUFrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQWlDeEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkE0SHBFLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLENBQUM7Ozs7c0JBSS9ELFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDOzs7Ozs7c0JBTXhELFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkF5Q3hELFVBQVUsQ0FBQyxPQUFPLENBQUMsK0JBQStCLEVBQUUsK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztzQkFlcEYsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsRUFBRSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQW1EcEYsVUFBVSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSwrQkFBK0IsQ0FBQzs7OztzQkFJbkYsVUFBVSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7O2lCQVN2RixVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBd0JwRSxVQUFVLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQixDQUFDO3NCQUM3RCxVQUFVLENBQUMsT0FBTyxDQUFDLCtCQUErQixFQUFFLCtCQUErQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBeURwRixVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozt3QkFVbEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQzs7O2dDQUc5RCxVQUFVLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFLDhCQUE4QixDQUFDOzs7Ozs7Ozs7Ozs7OztzQkFjNUYsVUFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBZ0J6RCxVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDOzs7Ozs7c0JBTS9ELFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7aUJBQ2hFLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQzs7OztzQkFJOUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQW9DaEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7c0JBUS9ELFVBQVUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7aUJBQzdELFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQzs7Ozs7OztHQU9qRTtDQUNGLENBQUMifQ==
|
package/dist_watch/bundle.js
CHANGED
|
@@ -169260,29 +169260,48 @@ var tableStyles = [
|
|
|
169260
169260
|
border-bottom-width: 0px;
|
|
169261
169261
|
}
|
|
169262
169262
|
|
|
169263
|
+
/* Default mode (Mode B, page sticky): horizontal scroll lives on
|
|
169264
|
+
.tableScroll (so wide tables don't get clipped by an ancestor
|
|
169265
|
+
overflow:hidden such as dees-tile). Vertical sticky is handled by
|
|
169266
|
+
a JS-managed floating header (.floatingHeader, position:fixed),
|
|
169267
|
+
which is unaffected by ancestor overflow. */
|
|
169263
169268
|
.tableScroll {
|
|
169264
|
-
|
|
169269
|
+
position: relative;
|
|
169265
169270
|
overflow-x: auto;
|
|
169266
|
-
|
|
169267
|
-
|
|
169268
|
-
|
|
169271
|
+
overflow-y: visible;
|
|
169272
|
+
scrollbar-gutter: stable;
|
|
169273
|
+
}
|
|
169274
|
+
/* Mode A, internal scroll: opt-in via fixed-height attribute.
|
|
169275
|
+
The table scrolls inside its own box and the header sticks via plain CSS sticky. */
|
|
169276
|
+
:host([fixed-height]) .tableScroll {
|
|
169277
|
+
max-height: var(--table-max-height, 360px);
|
|
169278
|
+
overflow: auto;
|
|
169269
169279
|
scrollbar-gutter: stable both-edges;
|
|
169270
169280
|
}
|
|
169271
|
-
|
|
169272
|
-
|
|
169273
|
-
-ms-overflow-style: none; /* IE/Edge */
|
|
169274
|
-
scrollbar-width: none; /* Firefox (hides both axes) */
|
|
169281
|
+
:host([fixed-height]) .tableScroll::-webkit-scrollbar:horizontal {
|
|
169282
|
+
height: 0px;
|
|
169275
169283
|
}
|
|
169276
|
-
|
|
169277
|
-
|
|
169284
|
+
|
|
169285
|
+
/* Floating header overlay (Mode B). Position is managed by JS so it
|
|
169286
|
+
escapes any ancestor overflow:hidden (position:fixed is not clipped
|
|
169287
|
+
by overflow ancestors). */
|
|
169288
|
+
.floatingHeader {
|
|
169289
|
+
position: fixed;
|
|
169290
|
+
top: 0;
|
|
169291
|
+
left: 0;
|
|
169292
|
+
z-index: 100;
|
|
169293
|
+
visibility: hidden;
|
|
169294
|
+
overflow: hidden;
|
|
169295
|
+
pointer-events: none;
|
|
169278
169296
|
}
|
|
169279
|
-
|
|
169280
|
-
|
|
169281
|
-
height: 0px;
|
|
169297
|
+
.floatingHeader.active {
|
|
169298
|
+
visibility: visible;
|
|
169282
169299
|
}
|
|
169283
|
-
|
|
169284
|
-
|
|
169285
|
-
|
|
169300
|
+
.floatingHeader table {
|
|
169301
|
+
margin: 0;
|
|
169302
|
+
}
|
|
169303
|
+
.floatingHeader th {
|
|
169304
|
+
pointer-events: auto;
|
|
169286
169305
|
}
|
|
169287
169306
|
|
|
169288
169307
|
table {
|
|
@@ -169305,11 +169324,20 @@ var tableStyles = [
|
|
|
169305
169324
|
background: ${cssManager.bdTheme("hsl(210 40% 96.1%)", "hsl(0 0% 9%)")};
|
|
169306
169325
|
border-bottom: 1px solid var(--dees-color-border-strong);
|
|
169307
169326
|
}
|
|
169308
|
-
|
|
169327
|
+
/* th needs its own background so sticky cells paint over scrolled rows
|
|
169328
|
+
(browsers don't paint the <thead> box behind a sticky <th>). */
|
|
169329
|
+
th {
|
|
169330
|
+
background: ${cssManager.bdTheme("hsl(210 40% 96.1%)", "hsl(0 0% 9%)")};
|
|
169331
|
+
}
|
|
169332
|
+
/* Mode A — internal scroll sticky */
|
|
169333
|
+
:host([fixed-height]) thead th {
|
|
169309
169334
|
position: sticky;
|
|
169310
169335
|
top: 0;
|
|
169311
169336
|
z-index: 2;
|
|
169312
169337
|
}
|
|
169338
|
+
:host([fixed-height]) thead tr.filtersRow th {
|
|
169339
|
+
top: 36px; /* matches th { height: 36px } below */
|
|
169340
|
+
}
|
|
169313
169341
|
|
|
169314
169342
|
tbody tr {
|
|
169315
169343
|
transition: background-color 0.15s ease;
|
|
@@ -169867,7 +169895,7 @@ __name(compileLucenePredicate, "compileLucenePredicate");
|
|
|
169867
169895
|
init_dist_ts30();
|
|
169868
169896
|
init_dist_ts29();
|
|
169869
169897
|
init_theme();
|
|
169870
|
-
var _selectedIds_dec, _selectionMode_dec, _searchMode_dec,
|
|
169898
|
+
var _selectedIds_dec, _selectionMode_dec, _searchMode_dec, _fixedHeight_dec, _showColumnFilters_dec, _columnFilters_dec, _filterText_dec, _sortBy_dec, _showGrid_dec, _showHorizontalLines_dec, _showVerticalLines_dec, _editableFields_dec, _selectedDataRow_dec, _reverseDisplayFunction_dec, _displayFunction_dec, _augmentFromDisplayFunction_dec, _rowKey_dec, _columns_dec, _dataActions_dec, _searchable_dec, _dataName_dec, _required_dec3, _disabled_dec3, _label_dec3, _key_dec2, _data_dec, _heading2_dec, _heading1_dec, _a42, _DeesTable_decorators, _init39, _heading1, _heading22, _data, _key2, _label3, _disabled3, _required3, _dataName, _searchable, _dataActions, _columns, _rowKey, _augmentFromDisplayFunction, _displayFunction, _reverseDisplayFunction, _selectedDataRow, _editableFields, _showVerticalLines, _showHorizontalLines, _showGrid, _sortBy, _filterText, _columnFilters, _showColumnFilters, _fixedHeight, _searchMode, _selectionMode, _selectedIds;
|
|
169871
169899
|
function ordinalLabel(n12) {
|
|
169872
169900
|
const s10 = ["th", "st", "nd", "rd"];
|
|
169873
169901
|
const v5 = n12 % 100;
|
|
@@ -169916,7 +169944,7 @@ var _DeesTable = class _DeesTable extends (_a42 = DeesElement, _heading1_dec = [
|
|
|
169916
169944
|
type: Boolean,
|
|
169917
169945
|
reflect: true,
|
|
169918
169946
|
attribute: "show-grid"
|
|
169919
|
-
})], _sortBy_dec = [n5({ attribute: false })], _filterText_dec = [n5({ type: String })], _columnFilters_dec = [n5({ attribute: false })], _showColumnFilters_dec = [n5({ type: Boolean, attribute: "show-column-filters" })],
|
|
169947
|
+
})], _sortBy_dec = [n5({ attribute: false })], _filterText_dec = [n5({ type: String })], _columnFilters_dec = [n5({ attribute: false })], _showColumnFilters_dec = [n5({ type: Boolean, attribute: "show-column-filters" })], _fixedHeight_dec = [n5({ type: Boolean, reflect: true, attribute: "fixed-height" })], _searchMode_dec = [n5({ type: String })], _selectionMode_dec = [n5({ type: String })], _selectedIds_dec = [n5({ attribute: false })], _a42) {
|
|
169920
169948
|
constructor() {
|
|
169921
169949
|
super();
|
|
169922
169950
|
__privateAdd(this, _heading1, __runInitializers(_init39, 8, this, "heading 1")), __runInitializers(_init39, 11, this);
|
|
@@ -169947,7 +169975,7 @@ var _DeesTable = class _DeesTable extends (_a42 = DeesElement, _heading1_dec = [
|
|
|
169947
169975
|
__privateAdd(this, _filterText, __runInitializers(_init39, 92, this, "")), __runInitializers(_init39, 95, this);
|
|
169948
169976
|
__privateAdd(this, _columnFilters, __runInitializers(_init39, 96, this, {})), __runInitializers(_init39, 99, this);
|
|
169949
169977
|
__privateAdd(this, _showColumnFilters, __runInitializers(_init39, 100, this, false)), __runInitializers(_init39, 103, this);
|
|
169950
|
-
__privateAdd(this,
|
|
169978
|
+
__privateAdd(this, _fixedHeight, __runInitializers(_init39, 104, this, false)), __runInitializers(_init39, 107, this);
|
|
169951
169979
|
__privateAdd(this, _searchMode, __runInitializers(_init39, 108, this, "table")), __runInitializers(_init39, 111, this);
|
|
169952
169980
|
__publicField(this, "__searchTextSub");
|
|
169953
169981
|
__publicField(this, "__searchModeSub");
|
|
@@ -169955,6 +169983,11 @@ var _DeesTable = class _DeesTable extends (_a42 = DeesElement, _heading1_dec = [
|
|
|
169955
169983
|
__privateAdd(this, _selectedIds, __runInitializers(_init39, 116, this, /* @__PURE__ */ new Set())), __runInitializers(_init39, 119, this);
|
|
169956
169984
|
__publicField(this, "_rowIdMap", /* @__PURE__ */ new WeakMap());
|
|
169957
169985
|
__publicField(this, "_rowIdCounter", 0);
|
|
169986
|
+
// ─── Floating header (page-sticky) lifecycle ─────────────────────────
|
|
169987
|
+
__publicField(this, "__floatingResizeObserver");
|
|
169988
|
+
__publicField(this, "__floatingScrollHandler");
|
|
169989
|
+
__publicField(this, "__floatingActive", false);
|
|
169990
|
+
__publicField(this, "__scrollAncestors", []);
|
|
169958
169991
|
__publicField(this, "__debounceTimer");
|
|
169959
169992
|
}
|
|
169960
169993
|
get value() {
|
|
@@ -170045,58 +170078,7 @@ var _DeesTable = class _DeesTable extends (_a42 = DeesElement, _heading1_dec = [
|
|
|
170045
170078
|
<div class="tableScroll">
|
|
170046
170079
|
<table>
|
|
170047
170080
|
<thead>
|
|
170048
|
-
|
|
170049
|
-
${this.selectionMode !== "none" ? b2`
|
|
170050
|
-
<th style="width:42px; text-align:center;">
|
|
170051
|
-
${this.selectionMode === "multi" ? b2`
|
|
170052
|
-
<dees-input-checkbox
|
|
170053
|
-
.value=${this.areAllVisibleSelected()}
|
|
170054
|
-
.indeterminate=${this.isVisibleSelectionIndeterminate()}
|
|
170055
|
-
@newValue=${(e11) => {
|
|
170056
|
-
e11.stopPropagation();
|
|
170057
|
-
this.setSelectVisible(e11.detail === true);
|
|
170058
|
-
}}
|
|
170059
|
-
></dees-input-checkbox>
|
|
170060
|
-
` : b2``}
|
|
170061
|
-
</th>
|
|
170062
|
-
` : b2``}
|
|
170063
|
-
${effectiveColumns.filter((c11) => !c11.hidden).map((col) => {
|
|
170064
|
-
const isSortable = !!col.sortable;
|
|
170065
|
-
const ariaSort = this.getAriaSort(col);
|
|
170066
|
-
return b2`
|
|
170067
|
-
<th
|
|
170068
|
-
role="columnheader"
|
|
170069
|
-
aria-sort=${ariaSort}
|
|
170070
|
-
style="${isSortable ? "cursor: pointer;" : ""}"
|
|
170071
|
-
@click=${(eventArg) => isSortable ? this.handleHeaderClick(eventArg, col, effectiveColumns) : null}
|
|
170072
|
-
@contextmenu=${(eventArg) => isSortable ? this.openHeaderContextMenu(eventArg, col, effectiveColumns) : null}
|
|
170073
|
-
>
|
|
170074
|
-
${col.header ?? col.key}
|
|
170075
|
-
${this.renderSortIndicator(col)}
|
|
170076
|
-
</th>`;
|
|
170077
|
-
})}
|
|
170078
|
-
${(() => {
|
|
170079
|
-
if (this.dataActions && this.dataActions.length > 0) {
|
|
170080
|
-
return b2` <th class="actionsCol">Actions</th> `;
|
|
170081
|
-
}
|
|
170082
|
-
})()}
|
|
170083
|
-
</tr>
|
|
170084
|
-
${this.showColumnFilters ? b2`<tr class="filtersRow">
|
|
170085
|
-
${this.selectionMode !== "none" ? b2`<th style="width:42px;"></th>` : b2``}
|
|
170086
|
-
${effectiveColumns.filter((c11) => !c11.hidden).map((col) => {
|
|
170087
|
-
const key2 = String(col.key);
|
|
170088
|
-
if (col.filterable === false) return b2`<th></th>`;
|
|
170089
|
-
return b2`<th>
|
|
170090
|
-
<input type="text" placeholder="Filter..." .value=${this.columnFilters[key2] || ""}
|
|
170091
|
-
@input=${(e11) => this.setColumnFilter(key2, e11.target.value)} />
|
|
170092
|
-
</th>`;
|
|
170093
|
-
})}
|
|
170094
|
-
${(() => {
|
|
170095
|
-
if (this.dataActions && this.dataActions.length > 0) {
|
|
170096
|
-
return b2` <th></th> `;
|
|
170097
|
-
}
|
|
170098
|
-
})()}
|
|
170099
|
-
</tr>` : b2``}
|
|
170081
|
+
${this.renderHeaderRows(effectiveColumns)}
|
|
170100
170082
|
</thead>
|
|
170101
170083
|
<tbody>
|
|
170102
170084
|
${viewData.map((itemArg, rowIndex) => {
|
|
@@ -170230,6 +170212,13 @@ var _DeesTable = class _DeesTable extends (_a42 = DeesElement, _heading1_dec = [
|
|
|
170230
170212
|
</tbody>
|
|
170231
170213
|
</table>
|
|
170232
170214
|
</div>
|
|
170215
|
+
<div class="floatingHeader" aria-hidden="true">
|
|
170216
|
+
<table>
|
|
170217
|
+
<thead>
|
|
170218
|
+
${this.renderHeaderRows(effectiveColumns)}
|
|
170219
|
+
</thead>
|
|
170220
|
+
</table>
|
|
170221
|
+
</div>
|
|
170233
170222
|
` : b2` <div class="noDataSet">No data set!</div> `}
|
|
170234
170223
|
<div slot="footer" class="footer">
|
|
170235
170224
|
<div class="tableStatistics">
|
|
@@ -170264,11 +170253,226 @@ var _DeesTable = class _DeesTable extends (_a42 = DeesElement, _heading1_dec = [
|
|
|
170264
170253
|
</dees-tile>
|
|
170265
170254
|
`;
|
|
170266
170255
|
}
|
|
170256
|
+
/**
|
|
170257
|
+
* Renders the header rows. Used twice per render: once inside the real
|
|
170258
|
+
* `<thead>` and once inside the floating-header clone, so sort indicators
|
|
170259
|
+
* and filter inputs stay in sync automatically.
|
|
170260
|
+
*/
|
|
170261
|
+
renderHeaderRows(effectiveColumns) {
|
|
170262
|
+
return b2`
|
|
170263
|
+
<tr>
|
|
170264
|
+
${this.selectionMode !== "none" ? b2`
|
|
170265
|
+
<th style="width:42px; text-align:center;">
|
|
170266
|
+
${this.selectionMode === "multi" ? b2`
|
|
170267
|
+
<dees-input-checkbox
|
|
170268
|
+
.value=${this.areAllVisibleSelected()}
|
|
170269
|
+
.indeterminate=${this.isVisibleSelectionIndeterminate()}
|
|
170270
|
+
@newValue=${(e11) => {
|
|
170271
|
+
e11.stopPropagation();
|
|
170272
|
+
this.setSelectVisible(e11.detail === true);
|
|
170273
|
+
}}
|
|
170274
|
+
></dees-input-checkbox>
|
|
170275
|
+
` : b2``}
|
|
170276
|
+
</th>
|
|
170277
|
+
` : b2``}
|
|
170278
|
+
${effectiveColumns.filter((c11) => !c11.hidden).map((col) => {
|
|
170279
|
+
const isSortable = !!col.sortable;
|
|
170280
|
+
const ariaSort = this.getAriaSort(col);
|
|
170281
|
+
return b2`
|
|
170282
|
+
<th
|
|
170283
|
+
role="columnheader"
|
|
170284
|
+
aria-sort=${ariaSort}
|
|
170285
|
+
style="${isSortable ? "cursor: pointer;" : ""}"
|
|
170286
|
+
@click=${(eventArg) => isSortable ? this.handleHeaderClick(eventArg, col, effectiveColumns) : null}
|
|
170287
|
+
@contextmenu=${(eventArg) => isSortable ? this.openHeaderContextMenu(eventArg, col, effectiveColumns) : null}
|
|
170288
|
+
>
|
|
170289
|
+
${col.header ?? col.key}
|
|
170290
|
+
${this.renderSortIndicator(col)}
|
|
170291
|
+
</th>`;
|
|
170292
|
+
})}
|
|
170293
|
+
${this.dataActions && this.dataActions.length > 0 ? b2`<th class="actionsCol">Actions</th>` : b2``}
|
|
170294
|
+
</tr>
|
|
170295
|
+
${this.showColumnFilters ? b2`<tr class="filtersRow">
|
|
170296
|
+
${this.selectionMode !== "none" ? b2`<th style="width:42px;"></th>` : b2``}
|
|
170297
|
+
${effectiveColumns.filter((c11) => !c11.hidden).map((col) => {
|
|
170298
|
+
const key2 = String(col.key);
|
|
170299
|
+
if (col.filterable === false) return b2`<th></th>`;
|
|
170300
|
+
return b2`<th>
|
|
170301
|
+
<input type="text" placeholder="Filter..." .value=${this.columnFilters[key2] || ""}
|
|
170302
|
+
@input=${(e11) => this.setColumnFilter(key2, e11.target.value)} />
|
|
170303
|
+
</th>`;
|
|
170304
|
+
})}
|
|
170305
|
+
${this.dataActions && this.dataActions.length > 0 ? b2`<th></th>` : b2``}
|
|
170306
|
+
</tr>` : b2``}
|
|
170307
|
+
`;
|
|
170308
|
+
}
|
|
170309
|
+
get __floatingHeaderEl() {
|
|
170310
|
+
return this.shadowRoot?.querySelector(".floatingHeader") ?? null;
|
|
170311
|
+
}
|
|
170312
|
+
get __realTableEl() {
|
|
170313
|
+
return this.shadowRoot?.querySelector(".tableScroll > table") ?? null;
|
|
170314
|
+
}
|
|
170315
|
+
get __floatingTableEl() {
|
|
170316
|
+
return this.shadowRoot?.querySelector(".floatingHeader > table") ?? null;
|
|
170317
|
+
}
|
|
170318
|
+
/**
|
|
170319
|
+
* Walks up the DOM (and through shadow roots) collecting every ancestor
|
|
170320
|
+
* element whose computed `overflow-y` makes it a scroll container, plus
|
|
170321
|
+
* `window` at the end. We listen for scroll on all of them so the floating
|
|
170322
|
+
* header reacts whether the user scrolls the page or any nested container.
|
|
170323
|
+
*/
|
|
170324
|
+
__collectScrollAncestors() {
|
|
170325
|
+
const result = [];
|
|
170326
|
+
let node2 = this;
|
|
170327
|
+
const scrollish = /* @__PURE__ */ __name((v5) => v5 === "auto" || v5 === "scroll" || v5 === "overlay", "scrollish");
|
|
170328
|
+
while (node2) {
|
|
170329
|
+
if (node2 instanceof Element) {
|
|
170330
|
+
const style2 = getComputedStyle(node2);
|
|
170331
|
+
const sy = scrollish(style2.overflowY);
|
|
170332
|
+
const sx = scrollish(style2.overflowX);
|
|
170333
|
+
if (sy || sx) {
|
|
170334
|
+
result.push({ target: node2, scrollsY: sy, scrollsX: sx });
|
|
170335
|
+
}
|
|
170336
|
+
}
|
|
170337
|
+
const parent = node2.assignedSlot ? node2.assignedSlot : node2.parentNode;
|
|
170338
|
+
if (parent) {
|
|
170339
|
+
node2 = parent;
|
|
170340
|
+
} else if (node2.host) {
|
|
170341
|
+
node2 = node2.host;
|
|
170342
|
+
} else {
|
|
170343
|
+
node2 = null;
|
|
170344
|
+
}
|
|
170345
|
+
}
|
|
170346
|
+
result.push({ target: window, scrollsY: true, scrollsX: true });
|
|
170347
|
+
return result;
|
|
170348
|
+
}
|
|
170349
|
+
/**
|
|
170350
|
+
* Returns the "stick line" — the y-coordinate (in viewport space) at which
|
|
170351
|
+
* the floating header should appear. Defaults to 0 (page top), but if the
|
|
170352
|
+
* table is inside a scroll container we use that container's content-box
|
|
170353
|
+
* top so the header sits inside the container's border/padding instead of
|
|
170354
|
+
* floating over it.
|
|
170355
|
+
*/
|
|
170356
|
+
__getStickContext() {
|
|
170357
|
+
let top = 0;
|
|
170358
|
+
let left = 0;
|
|
170359
|
+
let right = window.innerWidth;
|
|
170360
|
+
for (const a5 of this.__scrollAncestors) {
|
|
170361
|
+
if (a5.target === window) continue;
|
|
170362
|
+
const el = a5.target;
|
|
170363
|
+
const r11 = el.getBoundingClientRect();
|
|
170364
|
+
const cs = getComputedStyle(el);
|
|
170365
|
+
if (a5.scrollsY) {
|
|
170366
|
+
const bt = parseFloat(cs.borderTopWidth) || 0;
|
|
170367
|
+
top = Math.max(top, r11.top + bt);
|
|
170368
|
+
}
|
|
170369
|
+
if (a5.scrollsX) {
|
|
170370
|
+
const bl = parseFloat(cs.borderLeftWidth) || 0;
|
|
170371
|
+
const br = parseFloat(cs.borderRightWidth) || 0;
|
|
170372
|
+
left = Math.max(left, r11.left + bl);
|
|
170373
|
+
right = Math.min(right, r11.right - br);
|
|
170374
|
+
}
|
|
170375
|
+
}
|
|
170376
|
+
return { top, left, right };
|
|
170377
|
+
}
|
|
170378
|
+
setupFloatingHeader() {
|
|
170379
|
+
this.teardownFloatingHeader();
|
|
170380
|
+
if (this.fixedHeight) return;
|
|
170381
|
+
const realTable = this.__realTableEl;
|
|
170382
|
+
if (!realTable) return;
|
|
170383
|
+
this.__scrollAncestors = this.__collectScrollAncestors();
|
|
170384
|
+
const tableScrollEl = this.shadowRoot?.querySelector(".tableScroll");
|
|
170385
|
+
if (tableScrollEl) {
|
|
170386
|
+
this.__scrollAncestors.unshift({ target: tableScrollEl, scrollsY: false, scrollsX: true });
|
|
170387
|
+
}
|
|
170388
|
+
this.__floatingResizeObserver = new ResizeObserver(() => {
|
|
170389
|
+
this.__syncFloatingHeader();
|
|
170390
|
+
});
|
|
170391
|
+
this.__floatingResizeObserver.observe(realTable);
|
|
170392
|
+
this.__floatingScrollHandler = () => this.__syncFloatingHeader();
|
|
170393
|
+
for (const a5 of this.__scrollAncestors) {
|
|
170394
|
+
a5.target.addEventListener("scroll", this.__floatingScrollHandler, { passive: true });
|
|
170395
|
+
}
|
|
170396
|
+
window.addEventListener("resize", this.__floatingScrollHandler, { passive: true });
|
|
170397
|
+
this.__syncFloatingHeader();
|
|
170398
|
+
}
|
|
170399
|
+
teardownFloatingHeader() {
|
|
170400
|
+
this.__floatingResizeObserver?.disconnect();
|
|
170401
|
+
this.__floatingResizeObserver = void 0;
|
|
170402
|
+
if (this.__floatingScrollHandler) {
|
|
170403
|
+
for (const a5 of this.__scrollAncestors) {
|
|
170404
|
+
a5.target.removeEventListener("scroll", this.__floatingScrollHandler);
|
|
170405
|
+
}
|
|
170406
|
+
window.removeEventListener("resize", this.__floatingScrollHandler);
|
|
170407
|
+
this.__floatingScrollHandler = void 0;
|
|
170408
|
+
}
|
|
170409
|
+
this.__scrollAncestors = [];
|
|
170410
|
+
this.__floatingActive = false;
|
|
170411
|
+
const fh = this.__floatingHeaderEl;
|
|
170412
|
+
if (fh) fh.classList.remove("active");
|
|
170413
|
+
}
|
|
170414
|
+
/**
|
|
170415
|
+
* Single function that drives both activation and geometry of the floating
|
|
170416
|
+
* header. Called on scroll, resize, table-resize, and after each render.
|
|
170417
|
+
*/
|
|
170418
|
+
__syncFloatingHeader() {
|
|
170419
|
+
const fh = this.__floatingHeaderEl;
|
|
170420
|
+
const realTable = this.__realTableEl;
|
|
170421
|
+
const floatTable = this.__floatingTableEl;
|
|
170422
|
+
if (!fh || !realTable || !floatTable) return;
|
|
170423
|
+
const tableRect = realTable.getBoundingClientRect();
|
|
170424
|
+
const stick = this.__getStickContext();
|
|
170425
|
+
floatTable.style.tableLayout = realTable.style.tableLayout || "auto";
|
|
170426
|
+
const realHeadRows = realTable.tHead?.rows;
|
|
170427
|
+
const floatHeadRows = floatTable.tHead?.rows;
|
|
170428
|
+
let headerHeight = 0;
|
|
170429
|
+
if (realHeadRows && floatHeadRows) {
|
|
170430
|
+
for (let r11 = 0; r11 < realHeadRows.length && r11 < floatHeadRows.length; r11++) {
|
|
170431
|
+
headerHeight += realHeadRows[r11].getBoundingClientRect().height;
|
|
170432
|
+
const realCells = realHeadRows[r11].cells;
|
|
170433
|
+
const floatCells = floatHeadRows[r11].cells;
|
|
170434
|
+
for (let c11 = 0; c11 < realCells.length && c11 < floatCells.length; c11++) {
|
|
170435
|
+
const w4 = realCells[c11].getBoundingClientRect().width;
|
|
170436
|
+
floatCells[c11].style.width = `${w4}px`;
|
|
170437
|
+
floatCells[c11].style.minWidth = `${w4}px`;
|
|
170438
|
+
floatCells[c11].style.maxWidth = `${w4}px`;
|
|
170439
|
+
}
|
|
170440
|
+
}
|
|
170441
|
+
}
|
|
170442
|
+
const shouldBeActive = tableRect.top < stick.top && tableRect.bottom > stick.top + Math.min(headerHeight, 1);
|
|
170443
|
+
if (shouldBeActive !== this.__floatingActive) {
|
|
170444
|
+
this.__floatingActive = shouldBeActive;
|
|
170445
|
+
fh.classList.toggle("active", shouldBeActive);
|
|
170446
|
+
}
|
|
170447
|
+
if (!shouldBeActive) return;
|
|
170448
|
+
const clipLeft = Math.max(tableRect.left, stick.left);
|
|
170449
|
+
const clipRight = Math.min(tableRect.right, stick.right);
|
|
170450
|
+
const clipWidth = Math.max(0, clipRight - clipLeft);
|
|
170451
|
+
fh.style.top = `${stick.top}px`;
|
|
170452
|
+
fh.style.left = `${clipLeft}px`;
|
|
170453
|
+
fh.style.width = `${clipWidth}px`;
|
|
170454
|
+
floatTable.style.width = `${tableRect.width}px`;
|
|
170455
|
+
floatTable.style.marginLeft = `${tableRect.left - clipLeft}px`;
|
|
170456
|
+
}
|
|
170457
|
+
async disconnectedCallback() {
|
|
170458
|
+
super.disconnectedCallback();
|
|
170459
|
+
this.teardownFloatingHeader();
|
|
170460
|
+
}
|
|
170267
170461
|
async firstUpdated() {
|
|
170268
170462
|
}
|
|
170269
170463
|
async updated(changedProperties) {
|
|
170270
170464
|
super.updated(changedProperties);
|
|
170271
170465
|
this.determineColumnWidths();
|
|
170466
|
+
if (changedProperties.has("fixedHeight") || changedProperties.has("data") || changedProperties.has("columns") || !this.__floatingScrollHandler) {
|
|
170467
|
+
if (!this.fixedHeight && this.data.length > 0) {
|
|
170468
|
+
this.setupFloatingHeader();
|
|
170469
|
+
} else {
|
|
170470
|
+
this.teardownFloatingHeader();
|
|
170471
|
+
}
|
|
170472
|
+
}
|
|
170473
|
+
if (!this.fixedHeight && this.data.length > 0) {
|
|
170474
|
+
this.__syncFloatingHeader();
|
|
170475
|
+
}
|
|
170272
170476
|
if (this.searchable) {
|
|
170273
170477
|
const existing = this.dataActions.find((actionArg) => actionArg.type?.includes("header") && actionArg.name === "Search");
|
|
170274
170478
|
if (!existing) {
|
|
@@ -170829,7 +171033,7 @@ _sortBy = new WeakMap();
|
|
|
170829
171033
|
_filterText = new WeakMap();
|
|
170830
171034
|
_columnFilters = new WeakMap();
|
|
170831
171035
|
_showColumnFilters = new WeakMap();
|
|
170832
|
-
|
|
171036
|
+
_fixedHeight = new WeakMap();
|
|
170833
171037
|
_searchMode = new WeakMap();
|
|
170834
171038
|
_selectionMode = new WeakMap();
|
|
170835
171039
|
_selectedIds = new WeakMap();
|
|
@@ -170857,7 +171061,7 @@ __decorateElement(_init39, 4, "sortBy", _sortBy_dec, _DeesTable, _sortBy);
|
|
|
170857
171061
|
__decorateElement(_init39, 4, "filterText", _filterText_dec, _DeesTable, _filterText);
|
|
170858
171062
|
__decorateElement(_init39, 4, "columnFilters", _columnFilters_dec, _DeesTable, _columnFilters);
|
|
170859
171063
|
__decorateElement(_init39, 4, "showColumnFilters", _showColumnFilters_dec, _DeesTable, _showColumnFilters);
|
|
170860
|
-
__decorateElement(_init39, 4, "
|
|
171064
|
+
__decorateElement(_init39, 4, "fixedHeight", _fixedHeight_dec, _DeesTable, _fixedHeight);
|
|
170861
171065
|
__decorateElement(_init39, 4, "searchMode", _searchMode_dec, _DeesTable, _searchMode);
|
|
170862
171066
|
__decorateElement(_init39, 4, "selectionMode", _selectionMode_dec, _DeesTable, _selectionMode);
|
|
170863
171067
|
__decorateElement(_init39, 4, "selectedIds", _selectedIds_dec, _DeesTable, _selectedIds);
|