apex-grid 3.4.0 → 3.6.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/CHANGELOG.md +439 -0
- package/LICENSE.md +125 -0
- package/README.md +107 -14
- package/components/cell.d.ts +30 -4
- package/components/cell.js +199 -53
- package/components/cell.js.map +1 -1
- package/components/filter-row.d.ts +2 -0
- package/components/filter-row.js +82 -28
- package/components/filter-row.js.map +1 -1
- package/components/grid.d.ts +257 -20
- package/components/grid.js +463 -99
- package/components/grid.js.map +1 -1
- package/components/group-header-row.js +28 -25
- package/components/group-header-row.js.map +1 -1
- package/components/header-row.d.ts +7 -5
- package/components/header-row.js +19 -9
- package/components/header-row.js.map +1 -1
- package/components/header.js +36 -22
- package/components/header.js.map +1 -1
- package/components/row.d.ts +19 -3
- package/components/row.js +96 -22
- package/components/row.js.map +1 -1
- package/components/toolbar.js +2 -1
- package/components/toolbar.js.map +1 -1
- package/components/virtualizer.d.ts +45 -1
- package/components/virtualizer.js +184 -3
- package/components/virtualizer.js.map +1 -1
- package/controllers/dom.d.ts +4 -4
- package/controllers/dom.js +40 -22
- package/controllers/dom.js.map +1 -1
- package/controllers/editing.d.ts +104 -37
- package/controllers/editing.js +230 -78
- package/controllers/editing.js.map +1 -1
- package/controllers/expansion.d.ts +14 -5
- package/controllers/expansion.js +24 -1
- package/controllers/expansion.js.map +1 -1
- package/controllers/filter.d.ts +10 -2
- package/controllers/filter.js +62 -17
- package/controllers/filter.js.map +1 -1
- package/controllers/history.d.ts +45 -8
- package/controllers/history.js +58 -20
- package/controllers/history.js.map +1 -1
- package/controllers/navigation.d.ts +68 -13
- package/controllers/navigation.js +196 -51
- package/controllers/navigation.js.map +1 -1
- package/controllers/pagination.d.ts +6 -0
- package/controllers/pagination.js +10 -2
- package/controllers/pagination.js.map +1 -1
- package/controllers/reorder.js +42 -24
- package/controllers/reorder.js.map +1 -1
- package/controllers/resize.d.ts +17 -2
- package/controllers/resize.js +16 -6
- package/controllers/resize.js.map +1 -1
- package/controllers/row-pin.d.ts +20 -2
- package/controllers/row-pin.js +16 -9
- package/controllers/row-pin.js.map +1 -1
- package/controllers/row-reorder.d.ts +31 -11
- package/controllers/row-reorder.js +117 -37
- package/controllers/row-reorder.js.map +1 -1
- package/controllers/selection.d.ts +11 -4
- package/controllers/selection.js +26 -11
- package/controllers/selection.js.map +1 -1
- package/controllers/sort.d.ts +22 -2
- package/controllers/sort.js +29 -23
- package/controllers/sort.js.map +1 -1
- package/controllers/state.d.ts +65 -10
- package/controllers/state.js +86 -6
- package/controllers/state.js.map +1 -1
- package/controllers/tree.d.ts +15 -10
- package/controllers/tree.js +0 -0
- package/controllers/tree.js.map +1 -1
- package/custom-elements.json +3589 -452
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/highlight.css +15 -8
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/ApexGrid.html +660 -0
- package/docs/classes/ApexGridPaginator.html +36 -0
- package/docs/classes/ApexGridToolbar.html +67 -0
- package/docs/functions/localize.html +2 -2
- package/docs/functions/setup.html +1 -2
- package/docs/hierarchy.html +1 -1
- package/docs/index.html +105 -15
- package/docs/interfaces/ApexCellValidationFailedEvent.html +3 -2
- package/docs/interfaces/ApexCellValueChangedEvent.html +4 -2
- package/docs/interfaces/ApexCellValueChangingEvent.html +3 -2
- package/docs/interfaces/ApexColumnMovedEvent.html +2 -2
- package/docs/interfaces/ApexColumnMovingEvent.html +1 -1
- package/docs/interfaces/ApexDetailContext.html +2 -2
- package/docs/interfaces/ApexGridEventMap.html +9 -6
- package/docs/interfaces/ApexRowEditEndedEvent.html +2 -1
- package/docs/interfaces/ApexRowEditStartedEvent.html +2 -1
- package/docs/interfaces/ApexRowMovingEvent.html +9 -3
- package/docs/interfaces/ApexRowPinningEvent.html +1 -1
- package/docs/interfaces/ApexTreeRowExpandedEvent.html +4 -1
- package/docs/interfaces/ApexTreeRowExpandingEvent.html +4 -1
- package/docs/interfaces/BaseApexCellContext.html +1 -1
- package/docs/interfaces/BaseApexEditorContext.html +1 -1
- package/docs/interfaces/BaseColumnConfiguration.html +3 -3
- package/docs/interfaces/BaseFilterExpression.html +2 -2
- package/docs/interfaces/CSVExportOptions.html +13 -5
- package/docs/interfaces/DataPipelineConfiguration.html +2 -2
- package/docs/interfaces/EditingHistoryConfiguration.html +1 -1
- package/docs/interfaces/ExportFormat.html +2 -2
- package/docs/interfaces/ExportOptions.html +5 -3
- package/docs/interfaces/GridExpansionConfiguration.html +6 -2
- package/docs/interfaces/GridRowPinningConfiguration.html +1 -1
- package/docs/interfaces/GridRowReorderingConfiguration.html +2 -2
- package/docs/interfaces/PaginationConfiguration.html +1 -1
- package/docs/interfaces/PaginationState.html +1 -1
- package/docs/interfaces/SetStateResult.html +3 -2
- package/docs/interfaces/ValidatorContext.html +7 -2
- package/docs/media/_token-values.scss +118 -0
- package/docs/media/package.json +5 -5
- package/docs/media/state-persistence.html +0 -10
- package/docs/modules.html +1 -1
- package/docs/types/DataPipelineParams.html +2 -2
- package/docs/types/EditMode.html +2 -2
- package/docs/types/ExportSource.html +6 -4
- package/docs/types/GridLocaleText.html +1 -1
- package/docs/types/OperandKeys.html +9 -0
- package/docs/types/PaginationMode.html +1 -1
- package/docs/variables/EN_LOCALE.html +3 -3
- package/docs/variables/esLocale.html +1 -1
- package/i18n/en.d.ts +19 -0
- package/i18n/en.js +19 -0
- package/i18n/en.js.map +1 -1
- package/i18n/es.js +19 -0
- package/i18n/es.js.map +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/internal/column-types.d.ts +27 -1
- package/internal/column-types.js +75 -49
- package/internal/column-types.js.map +1 -1
- package/internal/constants.d.ts +1 -2
- package/internal/constants.js +0 -4
- package/internal/constants.js.map +1 -1
- package/internal/document-styles.d.ts +30 -0
- package/internal/document-styles.js +48 -0
- package/internal/document-styles.js.map +1 -0
- package/internal/export.d.ts +39 -7
- package/internal/export.js +35 -34
- package/internal/export.js.map +1 -1
- package/internal/feature-module.d.ts +82 -3
- package/internal/feature-module.js +11 -0
- package/internal/feature-module.js.map +1 -1
- package/internal/index.d.ts +6 -4
- package/internal/index.js +5 -3
- package/internal/index.js.map +1 -1
- package/internal/normalize-case.d.ts +8 -1
- package/internal/normalize-case.js +3 -2
- package/internal/normalize-case.js.map +1 -1
- package/internal/state-snapshot.d.ts +60 -8
- package/internal/state-snapshot.js +87 -19
- package/internal/state-snapshot.js.map +1 -1
- package/internal/types.d.ts +17 -2
- package/internal/types.js.map +1 -1
- package/internal/utils.d.ts +48 -6
- package/internal/utils.js +35 -21
- package/internal/utils.js.map +1 -1
- package/internal/validators.js +1 -0
- package/internal/validators.js.map +1 -1
- package/operations/filter/operands/number.js +9 -6
- package/operations/filter/operands/number.js.map +1 -1
- package/operations/filter/operands/string.js +2 -3
- package/operations/filter/operands/string.js.map +1 -1
- package/operations/filter/types.d.ts +13 -1
- package/operations/filter/types.js.map +1 -1
- package/operations/filter.d.ts +6 -0
- package/operations/filter.js +23 -7
- package/operations/filter.js.map +1 -1
- package/operations/quick-filter.js +2 -5
- package/operations/quick-filter.js.map +1 -1
- package/operations/sort.d.ts +21 -2
- package/operations/sort.js +41 -14
- package/operations/sort.js.map +1 -1
- package/package.json +8 -4
- package/setup.d.ts +23 -11
- package/setup.js +19 -21
- package/setup.js.map +1 -1
- package/styles/_common.css.js +1 -1
- package/styles/_common.css.js.map +1 -1
- package/styles/_token-values.css.d.ts +1 -0
- package/styles/_token-values.css.js +3 -0
- package/styles/_token-values.css.js.map +1 -0
- package/styles/_tokens.css.js +1 -1
- package/styles/_tokens.css.js.map +1 -1
- package/styles/body-cell/body-cell.css.js +1 -1
- package/styles/body-cell/body-cell.css.js.map +1 -1
- package/styles/body-cell/cell-renderers.css.js +1 -1
- package/styles/body-cell/cell-renderers.css.js.map +1 -1
- package/styles/body-row/body-row.css.js +1 -1
- package/styles/body-row/body-row.css.js.map +1 -1
- package/styles/document-tokens.css.d.ts +1 -0
- package/styles/document-tokens.css.js +3 -0
- package/styles/document-tokens.css.js.map +1 -0
- package/styles/filter-row/filter-row.css.js +1 -1
- package/styles/filter-row/filter-row.css.js.map +1 -1
- package/styles/grid/_grid.base.css.js +1 -1
- package/styles/grid/_grid.base.css.js.map +1 -1
- package/styles/grid/grid.css.js +1 -1
- package/styles/grid/grid.css.js.map +1 -1
- package/styles/group-header-row/group-header-row.css.js +1 -1
- package/styles/group-header-row/group-header-row.css.js.map +1 -1
- package/styles/header-cell/header-cell.css.js +1 -1
- package/styles/header-cell/header-cell.css.js.map +1 -1
- package/styles/header-row/header-row.base.css.js +1 -1
- package/styles/header-row/header-row.base.css.js.map +1 -1
- package/styles/paginator/paginator.css.js +1 -1
- package/styles/paginator/paginator.css.js.map +1 -1
- package/styles/toolbar/toolbar.css.js +1 -1
- package/styles/toolbar/toolbar.css.js.map +1 -1
- package/tokens.css +78 -0
- package/LICENSE +0 -80
- package/docs/media/LICENSE +0 -80
- package/docs/media/_tokens.scss +0 -193
|
@@ -28,6 +28,8 @@ export default class ApexFilterRow<T extends object> extends LitElement {
|
|
|
28
28
|
expression: FilterExpression<T>;
|
|
29
29
|
connectedCallback(): void;
|
|
30
30
|
disconnectedCallback(): void;
|
|
31
|
+
/** Switching the open panel to another column moves it under that column. */
|
|
32
|
+
protected triggerChanged(): void;
|
|
31
33
|
protected activeChanged(): Promise<void>;
|
|
32
34
|
protected renderCriteriaButton(expr: FilterExpression<T>, index: number): import("lit-html").TemplateResult<1> | typeof nothing;
|
|
33
35
|
protected renderExpressionChip(props: ExpressionChipProps<T>): import("lit-html").TemplateResult<1>;
|
package/components/filter-row.js
CHANGED
|
@@ -78,12 +78,14 @@ export default class ApexFilterRow extends LitElement {
|
|
|
78
78
|
}
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
|
-
if (this.active && !
|
|
81
|
+
if (this.active && !this.#fromPanel(event)) {
|
|
82
82
|
this.active = false;
|
|
83
83
|
}
|
|
84
84
|
};
|
|
85
85
|
this.#handleDocumentKey = (event) => {
|
|
86
|
-
|
|
86
|
+
const origin = event.composedPath()[0];
|
|
87
|
+
const unowned = origin === document.body || origin === document.documentElement;
|
|
88
|
+
if (event.key !== 'Escape' || !this.active || !(unowned || this.#fromPanel(event)))
|
|
87
89
|
return;
|
|
88
90
|
if (this.dropdownOpen) {
|
|
89
91
|
event.stopPropagation();
|
|
@@ -99,6 +101,19 @@ export default class ApexFilterRow extends LitElement {
|
|
|
99
101
|
this.#openDropdownList = () => {
|
|
100
102
|
this.dropdownOpen = !this.dropdownOpen;
|
|
101
103
|
};
|
|
104
|
+
this.#position = () => {
|
|
105
|
+
const rect = this.#trigger()?.getBoundingClientRect() ?? this.triggerRect;
|
|
106
|
+
if (!rect)
|
|
107
|
+
return;
|
|
108
|
+
const width = this.offsetWidth;
|
|
109
|
+
const viewportWidth = window.innerWidth;
|
|
110
|
+
let left = rect.left;
|
|
111
|
+
if (left + width > viewportWidth - 8) {
|
|
112
|
+
left = Math.max(8, viewportWidth - width - 8);
|
|
113
|
+
}
|
|
114
|
+
this.style.setProperty('--fp-top', `${rect.bottom + 4}px`);
|
|
115
|
+
this.style.setProperty('--fp-left', `${left}px`);
|
|
116
|
+
};
|
|
102
117
|
}
|
|
103
118
|
static get tagName() {
|
|
104
119
|
return GRID_FILTER_ROW_TAG;
|
|
@@ -108,7 +123,7 @@ export default class ApexFilterRow extends LitElement {
|
|
|
108
123
|
registerComponent(ApexFilterRow);
|
|
109
124
|
}
|
|
110
125
|
get isNumeric() {
|
|
111
|
-
return this.column
|
|
126
|
+
return this.state.isNumericColumn(this.column);
|
|
112
127
|
}
|
|
113
128
|
get filterController() {
|
|
114
129
|
return this.state.filtering;
|
|
@@ -120,12 +135,23 @@ export default class ApexFilterRow extends LitElement {
|
|
|
120
135
|
this.expression = this.filterController.getDefaultExpression(this.column);
|
|
121
136
|
}
|
|
122
137
|
#removeExpression(expression) {
|
|
123
|
-
this.filterController.removeExpression(expression);
|
|
138
|
+
return this.filterController.removeExpression(expression);
|
|
124
139
|
}
|
|
125
|
-
#
|
|
126
|
-
this.
|
|
127
|
-
|
|
128
|
-
|
|
140
|
+
#isApplied(expression) {
|
|
141
|
+
return Boolean(this.filterController.get(expression.key)?.has(expression));
|
|
142
|
+
}
|
|
143
|
+
#commit(expression, change) {
|
|
144
|
+
return this.filterController.filterWithEvent({ ...expression, ...change }, this.#isApplied(expression) ? 'modify' : 'add', expression);
|
|
145
|
+
}
|
|
146
|
+
async #applyCondition(key) {
|
|
147
|
+
const expression = this.expression;
|
|
148
|
+
const condition = getFilterOperandsFor(this.column)[key];
|
|
149
|
+
const term = expression.searchTerm;
|
|
150
|
+
if (condition.unary || (term != null && term !== '')) {
|
|
151
|
+
await this.#commit(expression, { condition });
|
|
152
|
+
}
|
|
153
|
+
else if (!this.#isApplied(expression) || (await this.#removeExpression(expression))) {
|
|
154
|
+
expression.condition = condition;
|
|
129
155
|
}
|
|
130
156
|
this.requestUpdate();
|
|
131
157
|
}
|
|
@@ -149,22 +175,31 @@ export default class ApexFilterRow extends LitElement {
|
|
|
149
175
|
}
|
|
150
176
|
#handleTriggerKeydown;
|
|
151
177
|
#handleDropdownKeydown;
|
|
178
|
+
#trigger() {
|
|
179
|
+
return this.state.headerRow?.headers
|
|
180
|
+
.find((header) => header.column.key === this.column.key)
|
|
181
|
+
?.renderRoot.querySelector('[part~="filter-btn"]');
|
|
182
|
+
}
|
|
183
|
+
#fromPanel(event) {
|
|
184
|
+
const path = event.composedPath();
|
|
185
|
+
const trigger = this.#trigger();
|
|
186
|
+
return path.includes(this) || (!!trigger && path.includes(trigger));
|
|
187
|
+
}
|
|
152
188
|
#handleOutsidePointer;
|
|
153
189
|
#handleDocumentKey;
|
|
154
|
-
#handleInput(event) {
|
|
190
|
+
async #handleInput(event) {
|
|
155
191
|
event.stopPropagation();
|
|
156
192
|
const raw = event.target.value ?? '';
|
|
157
193
|
const value = this.isNumeric ? Number.parseFloat(raw) : raw;
|
|
158
194
|
const shouldUpdate = this.isNumeric ? !Number.isNaN(value) : !!value;
|
|
159
|
-
const
|
|
160
|
-
? 'modify'
|
|
161
|
-
: 'add';
|
|
195
|
+
const expression = this.expression;
|
|
162
196
|
if (shouldUpdate) {
|
|
163
|
-
this
|
|
164
|
-
this.filterController.filterWithEvent(this.expression, type);
|
|
197
|
+
await this.#commit(expression, { searchTerm: value });
|
|
165
198
|
}
|
|
166
|
-
else
|
|
167
|
-
|
|
199
|
+
else if ((!this.#isApplied(expression) || (await this.#removeExpression(expression))) &&
|
|
200
|
+
raw === '' &&
|
|
201
|
+
!this.#isApplied(expression)) {
|
|
202
|
+
expression.searchTerm = undefined;
|
|
168
203
|
}
|
|
169
204
|
this.requestUpdate();
|
|
170
205
|
}
|
|
@@ -193,23 +228,31 @@ export default class ApexFilterRow extends LitElement {
|
|
|
193
228
|
super.connectedCallback();
|
|
194
229
|
document.addEventListener('pointerdown', this.#handleOutsidePointer, true);
|
|
195
230
|
document.addEventListener('keydown', this.#handleDocumentKey, true);
|
|
231
|
+
if (this.active)
|
|
232
|
+
this.#listenForMoves(true);
|
|
196
233
|
}
|
|
197
234
|
disconnectedCallback() {
|
|
198
235
|
document.removeEventListener('pointerdown', this.#handleOutsidePointer, true);
|
|
199
236
|
document.removeEventListener('keydown', this.#handleDocumentKey, true);
|
|
237
|
+
this.#listenForMoves(false);
|
|
200
238
|
super.disconnectedCallback();
|
|
201
239
|
}
|
|
240
|
+
#listenForMoves(on) {
|
|
241
|
+
const method = on ? 'addEventListener' : 'removeEventListener';
|
|
242
|
+
window[method]('scroll', this.#position, true);
|
|
243
|
+
window[method]('resize', this.#position);
|
|
244
|
+
this.state?.host[method]('scroll', this.#position);
|
|
245
|
+
}
|
|
246
|
+
#position;
|
|
247
|
+
triggerChanged() {
|
|
248
|
+
if (this.active)
|
|
249
|
+
this.#position();
|
|
250
|
+
}
|
|
202
251
|
async activeChanged() {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const viewportWidth = window.innerWidth;
|
|
206
|
-
let left = this.triggerRect.left;
|
|
207
|
-
if (left + panelWidth > viewportWidth - 8) {
|
|
208
|
-
left = Math.max(8, viewportWidth - panelWidth - 8);
|
|
209
|
-
}
|
|
210
|
-
this.style.setProperty('--fp-top', `${this.triggerRect.bottom + 4}px`);
|
|
211
|
-
this.style.setProperty('--fp-left', `${left}px`);
|
|
252
|
+
this.#listenForMoves(this.active);
|
|
253
|
+
if (this.active) {
|
|
212
254
|
this.setAttribute('data-active', '');
|
|
255
|
+
this.#position();
|
|
213
256
|
await this.updateComplete;
|
|
214
257
|
this.input?.select();
|
|
215
258
|
}
|
|
@@ -224,8 +267,7 @@ export default class ApexFilterRow extends LitElement {
|
|
|
224
267
|
#chipCriteriaFor(expression) {
|
|
225
268
|
return async (e) => {
|
|
226
269
|
e.stopPropagation();
|
|
227
|
-
expression
|
|
228
|
-
this.filterController.filterWithEvent(expression, 'modify');
|
|
270
|
+
await this.#commit(expression, { criteria: expression.criteria === 'and' ? 'or' : 'and' });
|
|
229
271
|
this.requestUpdate();
|
|
230
272
|
};
|
|
231
273
|
}
|
|
@@ -260,6 +302,15 @@ export default class ApexFilterRow extends LitElement {
|
|
|
260
302
|
</button>`
|
|
261
303
|
: nothing;
|
|
262
304
|
}
|
|
305
|
+
#termLabel(term) {
|
|
306
|
+
if (!Array.isArray(term))
|
|
307
|
+
return term;
|
|
308
|
+
return term
|
|
309
|
+
.map((value) => typeof value === 'string' && value.startsWith('\u0000')
|
|
310
|
+
? this.state.localize('setFilter.blanks')
|
|
311
|
+
: String(value))
|
|
312
|
+
.join(', ');
|
|
313
|
+
}
|
|
263
314
|
renderExpressionChip(props) {
|
|
264
315
|
const { name, unary } = props.expression.condition;
|
|
265
316
|
const { searchTerm: term } = props.expression;
|
|
@@ -273,7 +324,7 @@ export default class ApexFilterRow extends LitElement {
|
|
|
273
324
|
@click=${props.onSelect}
|
|
274
325
|
>
|
|
275
326
|
${renderIcon(name)}
|
|
276
|
-
<span>${unary ? name : term}</span>
|
|
327
|
+
<span>${unary ? name : this.#termLabel(term)}</span>
|
|
277
328
|
</button>
|
|
278
329
|
<button
|
|
279
330
|
part="chip-remove"
|
|
@@ -419,6 +470,9 @@ __decorate([
|
|
|
419
470
|
__decorate([
|
|
420
471
|
property({ attribute: false })
|
|
421
472
|
], ApexFilterRow.prototype, "expression", void 0);
|
|
473
|
+
__decorate([
|
|
474
|
+
watch('triggerRect', { waitUntilFirstUpdate: true })
|
|
475
|
+
], ApexFilterRow.prototype, "triggerChanged", null);
|
|
422
476
|
__decorate([
|
|
423
477
|
watch('active', { waitUntilFirstUpdate: true })
|
|
424
478
|
], ApexFilterRow.prototype, "activeChanged", null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-row.js","sourceRoot":"","sources":["../../src/components/filter-row.ts"],"names":[],"mappings":"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","sourcesContent":["import { consume } from '@lit/context';\nimport { html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { gridStateContext, type StateController } from '../controllers/state.js';\nimport type { GridLocaleKey } from '../i18n/index.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';\nimport { renderIcon } from '../internal/icons.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_FILTER_ROW_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration } from '../internal/types.js';\nimport { getFilterOperandsFor } from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpression, FilterOperation, OperandKeys } from '../operations/filter/types.js';\nimport { styles } from '../styles/filter-row/filter-row.css.js';\n\ntype ExpressionChipProps<T> = {\n expression: FilterExpression<T>;\n selected: boolean;\n onRemove: (e: Event) => Promise<void>;\n onSelect: (e: Event) => Promise<void>;\n};\n\nexport default class ApexFilterRow<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_FILTER_ROW_TAG;\n }\n\n public static override styles = styles;\n\n public static register() {\n registerComponent(ApexFilterRow);\n }\n\n @consume({ context: gridStateContext, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n protected get isNumeric() {\n return this.column.type === 'number';\n }\n\n protected get filterController() {\n return this.state.filtering;\n }\n\n protected get condition() {\n return this.expression.condition as FilterOperation<T>;\n }\n\n @property({ attribute: false })\n public active = false;\n\n /** Bounding rect of the filter icon that opened this panel. Used for positioning. */\n @property({ attribute: false })\n public triggerRect: DOMRect | null = null;\n\n @query('input')\n public input!: HTMLInputElement;\n\n @query('#condition')\n public conditionElement!: HTMLElement;\n\n @query('[part~=\"dropdown\"]')\n public dropdown!: HTMLElement;\n\n @state()\n protected dropdownOpen = false;\n\n @property({ attribute: false })\n public column: ColumnConfiguration<T> = DEFAULT_COLUMN_CONFIG as ColumnConfiguration<T>;\n\n @property({ attribute: false })\n public expression!: FilterExpression<T>;\n\n #setDefaultExpression() {\n this.expression = this.filterController.getDefaultExpression(this.column);\n }\n\n #removeExpression(expression: FilterExpression<T>) {\n this.filterController.removeExpression(expression);\n }\n\n #applyCondition(key: OperandKeys<T[typeof this.column.key]>) {\n // XXX: Types\n this.expression.condition = (getFilterOperandsFor(this.column) as any)[key] as FilterOperation<\n T[keyof T]\n >;\n\n if (this.input?.value || this.expression.condition.unary) {\n this.filterController.filterWithEvent(this.expression, 'modify');\n }\n\n this.requestUpdate();\n }\n\n #selectOption(target: HTMLElement | null) {\n if (!target) return;\n const value = target.dataset.value as OperandKeys<T[typeof this.column.key]>;\n this.#applyCondition(value);\n this.dropdownOpen = false;\n this.input?.focus();\n }\n\n #handleDropdownItemClick = (event: Event) => {\n event.stopPropagation();\n this.#selectOption((event.target as HTMLElement).closest<HTMLElement>('[data-value]'));\n };\n\n #dropdownOptions(): HTMLElement[] {\n return Array.from(this.dropdown?.querySelectorAll<HTMLElement>('[role=\"option\"]') ?? []);\n }\n\n /** Moves focus into the dropdown, landing on the selected (or first) option. */\n #focusDropdownOption() {\n requestAnimationFrame(() => {\n const options = this.#dropdownOptions();\n (options.find((option) => option.matches('[aria-selected=\"true\"]')) ?? options[0])?.focus();\n });\n }\n\n /** ArrowDown on the condition trigger opens the listbox and focuses into it. */\n #handleTriggerKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'ArrowDown' && event.key !== 'Down') return;\n event.preventDefault();\n event.stopPropagation();\n this.dropdownOpen = true;\n this.#focusDropdownOption();\n };\n\n /** Listbox keyboard pattern: arrows/Home/End rove, Enter/Space pick. */\n #handleDropdownKeydown = (event: KeyboardEvent) => {\n const options = this.#dropdownOptions();\n const current = options.findIndex((option) => option.matches(':focus'));\n switch (event.key) {\n case 'ArrowDown':\n case 'Down':\n event.preventDefault();\n event.stopPropagation();\n options[Math.min(current + 1, options.length - 1)]?.focus();\n return;\n case 'ArrowUp':\n case 'Up':\n event.preventDefault();\n event.stopPropagation();\n options[Math.max(current - 1, 0)]?.focus();\n return;\n case 'Home':\n event.preventDefault();\n event.stopPropagation();\n options[0]?.focus();\n return;\n case 'End':\n event.preventDefault();\n event.stopPropagation();\n options[options.length - 1]?.focus();\n return;\n case 'Enter':\n case ' ':\n event.preventDefault();\n event.stopPropagation();\n this.#selectOption(options[current] ?? null);\n return;\n default:\n return;\n }\n };\n\n #handleOutsidePointer = (event: PointerEvent) => {\n const path = event.composedPath();\n\n // Close the condition dropdown if clicking outside it.\n if (this.dropdownOpen) {\n if (!path.includes(this.dropdown) && !path.includes(this.conditionElement)) {\n this.dropdownOpen = false;\n }\n return;\n }\n\n // Close the whole panel if clicking outside it.\n if (this.active && !path.includes(this)) {\n this.active = false;\n }\n };\n\n #handleDocumentKey = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n\n if (this.dropdownOpen) {\n event.stopPropagation();\n this.dropdownOpen = false;\n this.conditionElement?.focus();\n return;\n }\n\n if (this.active) {\n event.stopPropagation();\n this.active = false;\n }\n };\n\n #handleInput(event: Event) {\n event.stopPropagation();\n\n const raw = (event.target as HTMLInputElement).value ?? '';\n const value = this.isNumeric ? Number.parseFloat(raw) : raw;\n const shouldUpdate = this.isNumeric ? !Number.isNaN(value as number) : !!value;\n const type = this.filterController.get(this.expression.key)?.has(this.expression)\n ? 'modify'\n : 'add';\n\n if (shouldUpdate) {\n this.expression.searchTerm = value as any;\n this.filterController.filterWithEvent(this.expression, type);\n } else {\n this.#removeExpression(this.expression);\n }\n\n this.requestUpdate();\n }\n\n #handleKeydown(event: KeyboardEvent) {\n event.stopPropagation();\n\n switch (event.key) {\n case 'Enter':\n if (this.input) this.input.value = '';\n this.#setDefaultExpression();\n return;\n case 'Escape':\n this.active = false;\n return;\n default:\n return;\n }\n }\n\n #handleResetClick() {\n this.filterController.removeAllExpressions(this.column.key);\n this.#setDefaultExpression();\n this.requestUpdate();\n }\n\n #openDropdownList = () => {\n this.dropdownOpen = !this.dropdownOpen;\n };\n\n public override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('pointerdown', this.#handleOutsidePointer, true);\n document.addEventListener('keydown', this.#handleDocumentKey, true);\n }\n\n public override disconnectedCallback(): void {\n document.removeEventListener('pointerdown', this.#handleOutsidePointer, true);\n document.removeEventListener('keydown', this.#handleDocumentKey, true);\n super.disconnectedCallback();\n }\n\n @watch('active', { waitUntilFirstUpdate: true })\n protected async activeChanged() {\n if (this.active && this.triggerRect) {\n const panelWidth = 240;\n const viewportWidth = window.innerWidth;\n let left = this.triggerRect.left;\n // Clamp so the panel doesn't overflow the right edge of the viewport.\n if (left + panelWidth > viewportWidth - 8) {\n left = Math.max(8, viewportWidth - panelWidth - 8);\n }\n this.style.setProperty('--fp-top', `${this.triggerRect.bottom + 4}px`);\n this.style.setProperty('--fp-left', `${left}px`);\n this.setAttribute('data-active', '');\n await this.updateComplete;\n this.input?.select();\n } else {\n this.removeAttribute('data-active');\n this.style.removeProperty('--fp-top');\n this.style.removeProperty('--fp-left');\n this.column = DEFAULT_COLUMN_CONFIG as ColumnConfiguration<T>;\n }\n\n this.state.host.requestUpdate();\n }\n\n #chipCriteriaFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n expression.criteria = expression.criteria === 'and' ? 'or' : 'and';\n this.filterController.filterWithEvent(expression, 'modify');\n this.requestUpdate();\n };\n }\n\n #chipSelectFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.expression = expression;\n await this.updateComplete;\n this.input?.select();\n };\n }\n\n #chipRemoveFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.#removeExpression(expression);\n\n if (this.active && this.expression === expression) {\n this.#setDefaultExpression();\n await this.updateComplete;\n this.input?.focus();\n }\n\n this.requestUpdate();\n };\n }\n\n protected renderCriteriaButton(expr: FilterExpression<T>, index: number) {\n return index\n ? html`<button\n type=\"button\"\n part=\"criteria\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </button>`\n : nothing;\n }\n\n protected renderExpressionChip(props: ExpressionChipProps<T>) {\n const { name, unary } = props.expression.condition as FilterOperation<T>;\n const { searchTerm: term } = props.expression;\n\n return html`<div\n part=\"expression-chip\"\n ?selected=${props.selected}\n >\n <button\n part=\"chip-body\"\n type=\"button\"\n @click=${props.onSelect}\n >\n ${renderIcon(name)}\n <span>${unary ? name : term}</span>\n </button>\n <button\n part=\"chip-remove\"\n type=\"button\"\n aria-label=${this.state.localize('filter.removeFilter')}\n @click=${props.onRemove}\n >\n ${renderIcon('close')}\n </button>\n </div>`;\n }\n\n protected renderActiveChips() {\n const state = this.filterController.get(this.column.key);\n\n return !state\n ? nothing\n : Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: this.expression === expression,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: this.#chipSelectFor(expression),\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(\n props\n )}`;\n });\n }\n\n protected renderFilterActions() {\n return html`\n <button\n id=\"reset\"\n type=\"button\"\n part=\"action\"\n @click=${this.#handleResetClick}\n >\n ${renderIcon('refresh')} ${this.state.localize('filter.reset')}\n </button>\n <button\n id=\"close\"\n type=\"button\"\n part=\"action\"\n @click=${() => {\n this.active = false;\n }}\n >\n ${renderIcon('close')} ${this.state.localize('filter.close')}\n </button>\n `;\n }\n\n protected renderDropdown() {\n return html`<ul\n part=\"dropdown\"\n role=\"listbox\"\n aria-label=${this.state.localize('filter.conditionList')}\n ?hidden=${!this.dropdownOpen}\n @click=${this.#handleDropdownItemClick}\n @keydown=${this.#handleDropdownKeydown}\n >\n ${Object.entries(getFilterOperandsFor(this.column)).map(\n ([key, operand]) => html`\n <li\n part=\"dropdown-item\"\n role=\"option\"\n tabindex=\"-1\"\n data-value=${key}\n aria-selected=${this.condition.name === key}\n ?selected=${this.condition.name === key}\n >\n ${renderIcon(key)}<span\n >${this.state.localize(\n `filter.operator.${key}` as GridLocaleKey,\n undefined,\n operand?.label ?? key\n )}</span\n >\n </li>\n `\n )}\n </ul>`;\n }\n\n protected renderDropdownTarget() {\n const conditionLabel = this.state.localize(\n `filter.operator.${this.condition.name}` as GridLocaleKey,\n undefined,\n (this.condition as FilterOperation<T>).label ?? this.condition.name\n );\n return html`<button\n id=\"condition\"\n type=\"button\"\n part=\"condition-trigger\"\n aria-label=${this.state.localize('filter.changeCondition')}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.dropdownOpen ? 'true' : 'false'}\n @click=${this.#openDropdownList}\n @keydown=${this.#handleTriggerKeydown}\n >\n <span>${conditionLabel}</span>\n ${renderIcon('chevron-down')}\n </button>`;\n }\n\n protected renderActiveState() {\n const hasChips = Boolean(this.filterController.get(this.column.key)?.length);\n return html`\n <div part=\"panel\">\n <div part=\"condition-row\">\n ${this.renderDropdownTarget()}\n ${this.renderDropdown()}\n </div>\n ${\n !this.condition.unary\n ? html`<div part=\"panel-input-row\">\n <input\n part=\"filter-input\"\n type=\"text\"\n .value=${(this.expression?.searchTerm as string) ?? ''}\n placeholder=${this.state.localize('filter.inputPlaceholder')}\n @input=${this.#handleInput}\n @keydown=${this.#handleKeydown}\n />\n </div>`\n : nothing\n }\n ${hasChips ? html`<div part=\"chips-row\">${this.renderActiveChips()}</div>` : nothing}\n <div part=\"panel-footer\">${this.renderFilterActions()}</div>\n </div>\n `;\n }\n\n protected override render() {\n return html`${this.active ? this.renderActiveState() : nothing}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ApexFilterRow.tagName]: ApexFilterRow<object>;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"filter-row.js","sourceRoot":"","sources":["../../src/components/filter-row.ts"],"names":[],"mappings":"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","sourcesContent":["import { consume } from '@lit/context';\nimport { html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { gridStateContext, type StateController } from '../controllers/state.js';\nimport type { GridLocaleKey } from '../i18n/index.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';\nimport { renderIcon } from '../internal/icons.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_FILTER_ROW_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration } from '../internal/types.js';\nimport { getFilterOperandsFor } from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpression, FilterOperation, OperandKeys } from '../operations/filter/types.js';\nimport { styles } from '../styles/filter-row/filter-row.css.js';\n\ntype ExpressionChipProps<T> = {\n expression: FilterExpression<T>;\n selected: boolean;\n onRemove: (e: Event) => Promise<void>;\n onSelect: (e: Event) => Promise<void>;\n};\n\nexport default class ApexFilterRow<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_FILTER_ROW_TAG;\n }\n\n public static override styles = styles;\n\n public static register() {\n registerComponent(ApexFilterRow);\n }\n\n @consume({ context: gridStateContext, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n protected get isNumeric() {\n return this.state.isNumericColumn(this.column);\n }\n\n protected get filterController() {\n return this.state.filtering;\n }\n\n protected get condition() {\n return this.expression.condition as FilterOperation<T>;\n }\n\n @property({ attribute: false })\n public active = false;\n\n /** Bounding rect of the filter icon that opened this panel. Used for positioning. */\n @property({ attribute: false })\n public triggerRect: DOMRect | null = null;\n\n @query('input')\n public input!: HTMLInputElement;\n\n @query('#condition')\n public conditionElement!: HTMLElement;\n\n @query('[part~=\"dropdown\"]')\n public dropdown!: HTMLElement;\n\n @state()\n protected dropdownOpen = false;\n\n @property({ attribute: false })\n public column: ColumnConfiguration<T> = DEFAULT_COLUMN_CONFIG as ColumnConfiguration<T>;\n\n @property({ attribute: false })\n public expression!: FilterExpression<T>;\n\n #setDefaultExpression() {\n this.expression = this.filterController.getDefaultExpression(this.column);\n }\n\n #removeExpression(expression: FilterExpression<T>) {\n return this.filterController.removeExpression(expression);\n }\n\n #isApplied(expression: FilterExpression<T>) {\n return Boolean(this.filterController.get(expression.key)?.has(expression));\n }\n\n /**\n * Proposes `change` to `expression` through the cancelable `filtering`\n * event: `add` while the expression is the draft, `modify` once it is\n * applied. The expression itself changes only when the event passes.\n */\n #commit(expression: FilterExpression<T>, change: Record<string, unknown>) {\n return this.filterController.filterWithEvent(\n { ...expression, ...change } as FilterExpression<T>,\n this.#isApplied(expression) ? 'modify' : 'add',\n expression\n );\n }\n\n async #applyCondition(key: OperandKeys<T[typeof this.column.key]>) {\n const expression = this.expression;\n // XXX: Types\n const condition = (getFilterOperandsFor(this.column) as any)[key] as FilterOperation<\n T[keyof T]\n >;\n const term = expression.searchTerm;\n\n if (condition.unary || (term != null && term !== '')) {\n await this.#commit(expression, { condition });\n } else if (!this.#isApplied(expression) || (await this.#removeExpression(expression))) {\n // A binary condition without a term filters nothing yet: it stays the\n // draft until a term is typed, and an applied unary filter is dropped.\n expression.condition = condition;\n }\n\n this.requestUpdate();\n }\n\n #selectOption(target: HTMLElement | null) {\n if (!target) return;\n const value = target.dataset.value as OperandKeys<T[typeof this.column.key]>;\n this.#applyCondition(value);\n this.dropdownOpen = false;\n this.input?.focus();\n }\n\n #handleDropdownItemClick = (event: Event) => {\n event.stopPropagation();\n this.#selectOption((event.target as HTMLElement).closest<HTMLElement>('[data-value]'));\n };\n\n #dropdownOptions(): HTMLElement[] {\n return Array.from(this.dropdown?.querySelectorAll<HTMLElement>('[role=\"option\"]') ?? []);\n }\n\n /** Moves focus into the dropdown, landing on the selected (or first) option. */\n #focusDropdownOption() {\n requestAnimationFrame(() => {\n const options = this.#dropdownOptions();\n (options.find((option) => option.matches('[aria-selected=\"true\"]')) ?? options[0])?.focus();\n });\n }\n\n /** ArrowDown on the condition trigger opens the listbox and focuses into it. */\n #handleTriggerKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'ArrowDown' && event.key !== 'Down') return;\n event.preventDefault();\n event.stopPropagation();\n this.dropdownOpen = true;\n this.#focusDropdownOption();\n };\n\n /** Listbox keyboard pattern: arrows/Home/End rove, Enter/Space pick. */\n #handleDropdownKeydown = (event: KeyboardEvent) => {\n const options = this.#dropdownOptions();\n const current = options.findIndex((option) => option.matches(':focus'));\n switch (event.key) {\n case 'ArrowDown':\n case 'Down':\n event.preventDefault();\n event.stopPropagation();\n options[Math.min(current + 1, options.length - 1)]?.focus();\n return;\n case 'ArrowUp':\n case 'Up':\n event.preventDefault();\n event.stopPropagation();\n options[Math.max(current - 1, 0)]?.focus();\n return;\n case 'Home':\n event.preventDefault();\n event.stopPropagation();\n options[0]?.focus();\n return;\n case 'End':\n event.preventDefault();\n event.stopPropagation();\n options[options.length - 1]?.focus();\n return;\n case 'Enter':\n case ' ':\n event.preventDefault();\n event.stopPropagation();\n this.#selectOption(options[current] ?? null);\n return;\n default:\n return;\n }\n };\n\n /** The filter button of the open column, found live so the panel tracks it. */\n #trigger() {\n return this.state.headerRow?.headers\n .find((header) => header.column.key === this.column.key)\n ?.renderRoot.querySelector('[part~=\"filter-btn\"]');\n }\n\n /** Whether an event came from the panel or from the button that opened it. */\n #fromPanel(event: Event) {\n const path = event.composedPath();\n const trigger = this.#trigger();\n return path.includes(this) || (!!trigger && path.includes(trigger));\n }\n\n #handleOutsidePointer = (event: PointerEvent) => {\n const path = event.composedPath();\n\n // Close the condition dropdown if clicking outside it.\n if (this.dropdownOpen) {\n if (!path.includes(this.dropdown) && !path.includes(this.conditionElement)) {\n this.dropdownOpen = false;\n }\n return;\n }\n\n // Close the whole panel if clicking outside it. A press on the open\n // column's filter button is left to its click, which toggles the panel.\n if (this.active && !this.#fromPanel(event)) {\n this.active = false;\n }\n };\n\n #handleDocumentKey = (event: KeyboardEvent) => {\n // Escape belongs to whatever has focus outside the panel. With focus on\n // the page itself (a click on panel chrome drops it there) nobody else\n // owns it, so it still closes the panel.\n const origin = event.composedPath()[0];\n const unowned = origin === document.body || origin === document.documentElement;\n if (event.key !== 'Escape' || !this.active || !(unowned || this.#fromPanel(event))) return;\n\n if (this.dropdownOpen) {\n event.stopPropagation();\n this.dropdownOpen = false;\n this.conditionElement?.focus();\n return;\n }\n\n if (this.active) {\n event.stopPropagation();\n this.active = false;\n }\n };\n\n async #handleInput(event: Event) {\n event.stopPropagation();\n\n const raw = (event.target as HTMLInputElement).value ?? '';\n const value = this.isNumeric ? Number.parseFloat(raw) : raw;\n const shouldUpdate = this.isNumeric ? !Number.isNaN(value as number) : !!value;\n const expression = this.expression;\n\n // A cancelled change leaves the typed text alone: the chip shows the\n // term still in effect, and resetting the input would fight the user.\n if (shouldUpdate) {\n await this.#commit(expression, { searchTerm: value });\n } else if (\n (!this.#isApplied(expression) || (await this.#removeExpression(expression))) &&\n raw === '' &&\n !this.#isApplied(expression)\n ) {\n // An emptied input leaves a draft with no term, as the input shows.\n // A partial number ('-', '.') keeps the old term so the value binding\n // does not wipe the typed character, and an input event that applied\n // the expression again while the removal settled keeps its term.\n expression.searchTerm = undefined;\n }\n\n this.requestUpdate();\n }\n\n #handleKeydown(event: KeyboardEvent) {\n event.stopPropagation();\n\n switch (event.key) {\n case 'Enter':\n if (this.input) this.input.value = '';\n this.#setDefaultExpression();\n return;\n case 'Escape':\n this.active = false;\n return;\n default:\n return;\n }\n }\n\n #handleResetClick() {\n this.filterController.removeAllExpressions(this.column.key);\n this.#setDefaultExpression();\n this.requestUpdate();\n }\n\n #openDropdownList = () => {\n this.dropdownOpen = !this.dropdownOpen;\n };\n\n public override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('pointerdown', this.#handleOutsidePointer, true);\n document.addEventListener('keydown', this.#handleDocumentKey, true);\n if (this.active) this.#listenForMoves(true);\n }\n\n public override disconnectedCallback(): void {\n document.removeEventListener('pointerdown', this.#handleOutsidePointer, true);\n document.removeEventListener('keydown', this.#handleDocumentKey, true);\n this.#listenForMoves(false);\n super.disconnectedCallback();\n }\n\n /** Keeps the panel under its trigger while the page or the grid scrolls or resizes. */\n #listenForMoves(on: boolean) {\n const method = on ? 'addEventListener' : 'removeEventListener';\n // Scroll does not bubble or cross shadow roots: capture the page's\n // scrollers on window and listen on the grid, which scrolls itself.\n window[method]('scroll', this.#position, true);\n window[method]('resize', this.#position);\n this.state?.host[method]('scroll', this.#position);\n }\n\n #position = () => {\n const rect = this.#trigger()?.getBoundingClientRect() ?? this.triggerRect;\n if (!rect) return;\n // Measured, so a root font size other than 16px still clamps correctly.\n const width = this.offsetWidth;\n const viewportWidth = window.innerWidth;\n let left = rect.left;\n // Clamp so the panel doesn't overflow the right edge of the viewport.\n if (left + width > viewportWidth - 8) {\n left = Math.max(8, viewportWidth - width - 8);\n }\n this.style.setProperty('--fp-top', `${rect.bottom + 4}px`);\n this.style.setProperty('--fp-left', `${left}px`);\n };\n\n /** Switching the open panel to another column moves it under that column. */\n @watch('triggerRect', { waitUntilFirstUpdate: true })\n protected triggerChanged() {\n if (this.active) this.#position();\n }\n\n @watch('active', { waitUntilFirstUpdate: true })\n protected async activeChanged() {\n this.#listenForMoves(this.active);\n if (this.active) {\n this.setAttribute('data-active', '');\n this.#position();\n await this.updateComplete;\n this.input?.select();\n } else {\n this.removeAttribute('data-active');\n this.style.removeProperty('--fp-top');\n this.style.removeProperty('--fp-left');\n this.column = DEFAULT_COLUMN_CONFIG as ColumnConfiguration<T>;\n }\n\n this.state.host.requestUpdate();\n }\n\n #chipCriteriaFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n await this.#commit(expression, { criteria: expression.criteria === 'and' ? 'or' : 'and' });\n this.requestUpdate();\n };\n }\n\n #chipSelectFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.expression = expression;\n await this.updateComplete;\n this.input?.select();\n };\n }\n\n #chipRemoveFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.#removeExpression(expression);\n\n if (this.active && this.expression === expression) {\n this.#setDefaultExpression();\n await this.updateComplete;\n this.input?.focus();\n }\n\n this.requestUpdate();\n };\n }\n\n protected renderCriteriaButton(expr: FilterExpression<T>, index: number) {\n return index\n ? html`<button\n type=\"button\"\n part=\"criteria\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </button>`\n : nothing;\n }\n\n /**\n * Chip text for a term. An array of values (a set filter selection) reads as a list, and a\n * token starting with a NUL character (the set filter's blank token) as the blanks label.\n */\n #termLabel(term: unknown): unknown {\n if (!Array.isArray(term)) return term;\n return term\n .map((value) =>\n typeof value === 'string' && value.startsWith('\\u0000')\n ? this.state.localize('setFilter.blanks')\n : String(value)\n )\n .join(', ');\n }\n\n protected renderExpressionChip(props: ExpressionChipProps<T>) {\n const { name, unary } = props.expression.condition as FilterOperation<T>;\n const { searchTerm: term } = props.expression;\n\n return html`<div\n part=\"expression-chip\"\n ?selected=${props.selected}\n >\n <button\n part=\"chip-body\"\n type=\"button\"\n @click=${props.onSelect}\n >\n ${renderIcon(name)}\n <span>${unary ? name : this.#termLabel(term)}</span>\n </button>\n <button\n part=\"chip-remove\"\n type=\"button\"\n aria-label=${this.state.localize('filter.removeFilter')}\n @click=${props.onRemove}\n >\n ${renderIcon('close')}\n </button>\n </div>`;\n }\n\n protected renderActiveChips() {\n const state = this.filterController.get(this.column.key);\n\n return !state\n ? nothing\n : Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: this.expression === expression,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: this.#chipSelectFor(expression),\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(\n props\n )}`;\n });\n }\n\n protected renderFilterActions() {\n return html`\n <button\n id=\"reset\"\n type=\"button\"\n part=\"action\"\n @click=${this.#handleResetClick}\n >\n ${renderIcon('refresh')} ${this.state.localize('filter.reset')}\n </button>\n <button\n id=\"close\"\n type=\"button\"\n part=\"action\"\n @click=${() => {\n this.active = false;\n }}\n >\n ${renderIcon('close')} ${this.state.localize('filter.close')}\n </button>\n `;\n }\n\n protected renderDropdown() {\n return html`<ul\n part=\"dropdown\"\n role=\"listbox\"\n aria-label=${this.state.localize('filter.conditionList')}\n ?hidden=${!this.dropdownOpen}\n @click=${this.#handleDropdownItemClick}\n @keydown=${this.#handleDropdownKeydown}\n >\n ${Object.entries(getFilterOperandsFor(this.column)).map(\n ([key, operand]) => html`\n <li\n part=\"dropdown-item\"\n role=\"option\"\n tabindex=\"-1\"\n data-value=${key}\n aria-selected=${this.condition.name === key}\n ?selected=${this.condition.name === key}\n >\n ${renderIcon(key)}<span\n >${this.state.localize(\n `filter.operator.${key}` as GridLocaleKey,\n undefined,\n operand?.label ?? key\n )}</span\n >\n </li>\n `\n )}\n </ul>`;\n }\n\n protected renderDropdownTarget() {\n const conditionLabel = this.state.localize(\n `filter.operator.${this.condition.name}` as GridLocaleKey,\n undefined,\n (this.condition as FilterOperation<T>).label ?? this.condition.name\n );\n return html`<button\n id=\"condition\"\n type=\"button\"\n part=\"condition-trigger\"\n aria-label=${this.state.localize('filter.changeCondition')}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.dropdownOpen ? 'true' : 'false'}\n @click=${this.#openDropdownList}\n @keydown=${this.#handleTriggerKeydown}\n >\n <span>${conditionLabel}</span>\n ${renderIcon('chevron-down')}\n </button>`;\n }\n\n protected renderActiveState() {\n const hasChips = Boolean(this.filterController.get(this.column.key)?.length);\n return html`\n <div part=\"panel\">\n <div part=\"condition-row\">\n ${this.renderDropdownTarget()}\n ${this.renderDropdown()}\n </div>\n ${\n !this.condition.unary\n ? html`<div part=\"panel-input-row\">\n <input\n part=\"filter-input\"\n type=\"text\"\n .value=${(this.expression?.searchTerm as string) ?? ''}\n placeholder=${this.state.localize('filter.inputPlaceholder')}\n @input=${this.#handleInput}\n @keydown=${this.#handleKeydown}\n />\n </div>`\n : nothing\n }\n ${hasChips ? html`<div part=\"chips-row\">${this.renderActiveChips()}</div>` : nothing}\n <div part=\"panel-footer\">${this.renderFilterActions()}</div>\n </div>\n `;\n }\n\n protected override render() {\n return html`${this.active ? this.renderActiveState() : nothing}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ApexFilterRow.tagName]: ApexFilterRow<object>;\n }\n}\n"]}
|