apex-grid 1.1.0 → 3.0.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.
Files changed (231) hide show
  1. package/LICENSE +76 -5
  2. package/README.md +523 -10
  3. package/components/cell.d.ts +39 -0
  4. package/components/cell.js +334 -5
  5. package/components/cell.js.map +1 -1
  6. package/components/filter-row.d.ts +7 -5
  7. package/components/filter-row.js +151 -68
  8. package/components/filter-row.js.map +1 -1
  9. package/components/grid.d.ts +955 -4
  10. package/components/grid.js +412 -40
  11. package/components/grid.js.map +1 -1
  12. package/components/header-row.d.ts +21 -1
  13. package/components/header-row.js +140 -7
  14. package/components/header-row.js.map +1 -1
  15. package/components/header.d.ts +7 -0
  16. package/components/header.js +151 -31
  17. package/components/header.js.map +1 -1
  18. package/components/paginator.d.ts +56 -0
  19. package/components/paginator.js +148 -0
  20. package/components/paginator.js.map +1 -0
  21. package/components/row.d.ts +21 -2
  22. package/components/row.js +185 -10
  23. package/components/row.js.map +1 -1
  24. package/components/toolbar.d.ts +60 -0
  25. package/components/toolbar.js +259 -0
  26. package/components/toolbar.js.map +1 -0
  27. package/components/virtualizer.js +1 -1
  28. package/components/virtualizer.js.map +1 -1
  29. package/controllers/data-operation.d.ts +14 -0
  30. package/controllers/data-operation.js +19 -2
  31. package/controllers/data-operation.js.map +1 -1
  32. package/controllers/dom.d.ts +37 -1
  33. package/controllers/dom.js +176 -9
  34. package/controllers/dom.js.map +1 -1
  35. package/controllers/editing.d.ts +130 -0
  36. package/controllers/editing.js +197 -0
  37. package/controllers/editing.js.map +1 -0
  38. package/controllers/expansion.d.ts +68 -0
  39. package/controllers/expansion.js +126 -0
  40. package/controllers/expansion.js.map +1 -0
  41. package/controllers/navigation.d.ts +17 -6
  42. package/controllers/navigation.js +24 -8
  43. package/controllers/navigation.js.map +1 -1
  44. package/controllers/pagination.d.ts +102 -0
  45. package/controllers/pagination.js +106 -0
  46. package/controllers/pagination.js.map +1 -0
  47. package/controllers/reorder.d.ts +78 -0
  48. package/controllers/reorder.js +124 -0
  49. package/controllers/reorder.js.map +1 -0
  50. package/controllers/selection.d.ts +109 -0
  51. package/controllers/selection.js +168 -0
  52. package/controllers/selection.js.map +1 -0
  53. package/controllers/sort.js +28 -0
  54. package/controllers/sort.js.map +1 -1
  55. package/controllers/state.d.ts +47 -1
  56. package/controllers/state.js +48 -1
  57. package/controllers/state.js.map +1 -1
  58. package/controllers/tree.d.ts +87 -0
  59. package/controllers/tree.js +0 -0
  60. package/controllers/tree.js.map +1 -0
  61. package/custom-elements.json +6491 -1355
  62. package/define.js.map +1 -1
  63. package/docs/assets/hierarchy.js +1 -1
  64. package/docs/assets/highlight.css +77 -14
  65. package/docs/assets/icons.js +1 -1
  66. package/docs/assets/icons.svg +1 -1
  67. package/docs/assets/main.js +4 -4
  68. package/docs/assets/navigation.js +1 -1
  69. package/docs/assets/search.js +1 -1
  70. package/docs/assets/style.css +3 -3
  71. package/docs/classes/ApexGrid.html +320 -24
  72. package/docs/functions/setup.html +16 -0
  73. package/docs/hierarchy.html +1 -1
  74. package/docs/index.html +543 -9
  75. package/docs/interfaces/ApexCellValueChangedEvent.html +11 -0
  76. package/docs/interfaces/ApexCellValueChangingEvent.html +13 -0
  77. package/docs/interfaces/ApexColumnMovedEvent.html +8 -0
  78. package/docs/interfaces/ApexColumnMovingEvent.html +11 -0
  79. package/docs/interfaces/ApexColumnPinnedEvent.html +6 -0
  80. package/docs/interfaces/ApexColumnPinningEvent.html +8 -0
  81. package/docs/interfaces/ApexDetailContext.html +8 -0
  82. package/docs/interfaces/ApexFilteredEvent.html +4 -4
  83. package/docs/interfaces/ApexFilteringEvent.html +4 -4
  84. package/docs/interfaces/ApexGridEventMap.html +60 -9
  85. package/docs/interfaces/ApexHeaderContext.html +4 -4
  86. package/docs/interfaces/ApexPageChangedEvent.html +10 -0
  87. package/docs/interfaces/ApexPageChangingEvent.html +10 -0
  88. package/docs/interfaces/ApexQuickFilterChangedEvent.html +4 -0
  89. package/docs/interfaces/ApexQuickFilterChangingEvent.html +6 -0
  90. package/docs/interfaces/ApexRowEditEndedEvent.html +6 -0
  91. package/docs/interfaces/ApexRowEditStartedEvent.html +4 -0
  92. package/docs/interfaces/ApexRowExpandedEvent.html +8 -0
  93. package/docs/interfaces/ApexRowExpandingEvent.html +11 -0
  94. package/docs/interfaces/ApexRowSelectedEvent.html +8 -0
  95. package/docs/interfaces/ApexRowSelectingEvent.html +11 -0
  96. package/docs/interfaces/ApexTreeRowExpandedEvent.html +8 -0
  97. package/docs/interfaces/ApexTreeRowExpandingEvent.html +10 -0
  98. package/docs/interfaces/BaseApexCellContext.html +12 -6
  99. package/docs/interfaces/BaseApexEditorContext.html +19 -0
  100. package/docs/interfaces/BaseColumnConfiguration.html +88 -14
  101. package/docs/interfaces/BaseColumnSortConfiguration.html +4 -4
  102. package/docs/interfaces/BaseFilterExpression.html +5 -5
  103. package/docs/interfaces/BaseSortExpression.html +4 -4
  104. package/docs/interfaces/CSVExportOptions.html +22 -0
  105. package/docs/interfaces/ColumnFilterConfiguration.html +3 -3
  106. package/docs/interfaces/DataPipelineConfiguration.html +13 -4
  107. package/docs/interfaces/ExportFormat.html +10 -0
  108. package/docs/interfaces/ExportOptions.html +15 -0
  109. package/docs/interfaces/GridEditingConfiguration.html +10 -0
  110. package/docs/interfaces/GridExpansionConfiguration.html +15 -0
  111. package/docs/interfaces/GridSelectionConfiguration.html +11 -0
  112. package/docs/interfaces/GridSortConfiguration.html +4 -4
  113. package/docs/interfaces/GridTreeConfiguration.html +33 -0
  114. package/docs/interfaces/PaginationConfiguration.html +18 -0
  115. package/docs/interfaces/PaginationState.html +10 -0
  116. package/docs/media/LICENSE +80 -0
  117. package/docs/media/_tokens.scss +106 -0
  118. package/docs/media/package.json +85 -0
  119. package/docs/modules.html +1 -1
  120. package/docs/types/ApexCellContext.html +2 -2
  121. package/docs/types/ApexEditorContext.html +2 -0
  122. package/docs/types/BasePropertyType.html +2 -2
  123. package/docs/types/BaseSortComparer.html +2 -2
  124. package/docs/types/ColumnConfiguration.html +2 -2
  125. package/docs/types/ColumnDropPosition.html +2 -0
  126. package/docs/types/ColumnSortConfiguration.html +2 -2
  127. package/docs/types/DataPipelineHook.html +2 -2
  128. package/docs/types/DataPipelineParams.html +5 -5
  129. package/docs/types/DataType.html +47 -2
  130. package/docs/types/EditMode.html +6 -0
  131. package/docs/types/EditTrigger.html +4 -0
  132. package/docs/types/ExportCellValue.html +5 -0
  133. package/docs/types/ExportSource.html +8 -0
  134. package/docs/types/FilterCriteria.html +2 -2
  135. package/docs/types/FilterExpression.html +2 -2
  136. package/docs/types/Keys.html +2 -2
  137. package/docs/types/PaginationMode.html +6 -0
  138. package/docs/types/PinPosition.html +5 -0
  139. package/docs/types/PropertyType.html +2 -2
  140. package/docs/types/SelectionMode.html +7 -0
  141. package/docs/types/SortComparer.html +2 -2
  142. package/docs/types/SortExpression.html +2 -2
  143. package/docs/types/SortState.html +2 -2
  144. package/docs/types/SortingDirection.html +1 -1
  145. package/index.d.ts +5 -2
  146. package/index.js +1 -0
  147. package/index.js.map +1 -1
  148. package/internal/column-types.d.ts +94 -0
  149. package/internal/column-types.js +428 -0
  150. package/internal/column-types.js.map +1 -0
  151. package/internal/export.d.ts +114 -0
  152. package/internal/export.js +122 -0
  153. package/internal/export.js.map +1 -0
  154. package/internal/feature-module.d.ts +27 -0
  155. package/internal/feature-module.js +2 -0
  156. package/internal/feature-module.js.map +1 -0
  157. package/internal/flip.d.ts +80 -0
  158. package/internal/flip.js +52 -0
  159. package/internal/flip.js.map +1 -0
  160. package/internal/icons.d.ts +31 -0
  161. package/internal/icons.js +145 -0
  162. package/internal/icons.js.map +1 -0
  163. package/internal/index.d.ts +20 -0
  164. package/internal/index.js +6 -0
  165. package/internal/index.js.map +1 -0
  166. package/internal/tags.d.ts +2 -0
  167. package/internal/tags.js +2 -0
  168. package/internal/tags.js.map +1 -1
  169. package/internal/types.d.ts +473 -3
  170. package/internal/types.js.map +1 -1
  171. package/internal/utils.d.ts +24 -1
  172. package/internal/utils.js +48 -7
  173. package/internal/utils.js.map +1 -1
  174. package/operations/filter/tree.d.ts +1 -1
  175. package/operations/filter/types.js.map +1 -1
  176. package/operations/pagination.d.ts +19 -0
  177. package/operations/pagination.js +12 -0
  178. package/operations/pagination.js.map +1 -0
  179. package/operations/quick-filter.d.ts +21 -0
  180. package/operations/quick-filter.js +26 -0
  181. package/operations/quick-filter.js.map +1 -0
  182. package/operations/sort/types.js.map +1 -1
  183. package/package.json +10 -5
  184. package/setup.d.ts +51 -0
  185. package/setup.js +31 -0
  186. package/setup.js.map +1 -0
  187. package/styles/_checkbox.css.js +3 -0
  188. package/styles/_checkbox.css.js.map +1 -0
  189. package/styles/_tokens.css.js +3 -0
  190. package/styles/_tokens.css.js.map +1 -0
  191. package/styles/body-cell/body-cell.css.js +1 -1
  192. package/styles/body-cell/body-cell.css.js.map +1 -1
  193. package/styles/body-cell/cell-renderers.css.js +3 -0
  194. package/styles/body-cell/cell-renderers.css.js.map +1 -0
  195. package/styles/body-row/body-row.css.js +1 -1
  196. package/styles/body-row/body-row.css.js.map +1 -1
  197. package/styles/filter-row/filter-row.css.js +1 -1
  198. package/styles/filter-row/filter-row.css.js.map +1 -1
  199. package/styles/grid/_grid.base.css.js +1 -1
  200. package/styles/grid/_grid.base.css.js.map +1 -1
  201. package/styles/grid/grid.css.js +3 -0
  202. package/styles/grid/grid.css.js.map +1 -0
  203. package/styles/header-cell/header-cell.css.js +1 -1
  204. package/styles/header-cell/header-cell.css.js.map +1 -1
  205. package/styles/header-row/header-row.base.css.js +1 -1
  206. package/styles/header-row/header-row.base.css.js.map +1 -1
  207. package/styles/paginator/paginator.css.d.ts +1 -0
  208. package/styles/paginator/paginator.css.js +3 -0
  209. package/styles/paginator/paginator.css.js.map +1 -0
  210. package/styles/toolbar/toolbar.css.d.ts +1 -0
  211. package/styles/toolbar/toolbar.css.js +3 -0
  212. package/styles/toolbar/toolbar.css.js.map +1 -0
  213. package/styles.css +17 -0
  214. package/internal/icon-registry.d.ts +0 -1
  215. package/internal/icon-registry.js +0 -29
  216. package/internal/icon-registry.js.map +0 -1
  217. package/internal/theming.d.ts +0 -34
  218. package/internal/theming.js +0 -123
  219. package/internal/theming.js.map +0 -1
  220. package/styles/grid/themes/light/grid.bootstrap.css.js +0 -3
  221. package/styles/grid/themes/light/grid.bootstrap.css.js.map +0 -1
  222. package/styles/grid/themes/light/grid.fluent.css.js +0 -3
  223. package/styles/grid/themes/light/grid.fluent.css.js.map +0 -1
  224. package/styles/grid/themes/light/grid.indigo.css.js +0 -3
  225. package/styles/grid/themes/light/grid.indigo.css.js.map +0 -1
  226. package/styles/grid/themes/light/grid.material.css.js +0 -3
  227. package/styles/grid/themes/light/grid.material.css.js.map +0 -1
  228. /package/styles/{grid/themes/light/grid.bootstrap.css.d.ts → _checkbox.css.d.ts} +0 -0
  229. /package/styles/{grid/themes/light/grid.fluent.css.d.ts → _tokens.css.d.ts} +0 -0
  230. /package/styles/{grid/themes/light/grid.indigo.css.d.ts → body-cell/cell-renderers.css.d.ts} +0 -0
  231. /package/styles/grid/{themes/light/grid.material.css.d.ts → grid.css.d.ts} +0 -0
@@ -5,29 +5,51 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { consume } from '@lit/context';
8
- import { IgcDropdownComponent, IgcInputComponent, } from 'igniteui-webcomponents';
9
8
  import { html, LitElement, nothing } from 'lit';
10
- import { property, query } from 'lit/decorators.js';
9
+ import { property, query, state } from 'lit/decorators.js';
11
10
  import { ifDefined } from 'lit/directives/if-defined.js';
12
11
  import { gridStateContext } from '../controllers/state.js';
13
12
  import { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';
13
+ import { renderIcon } from '../internal/icons.js';
14
14
  import { registerComponent } from '../internal/register.js';
15
15
  import { GRID_FILTER_ROW_TAG } from '../internal/tags.js';
16
- import { getFilterOperandsFor } from '../internal/utils.js';
16
+ import { getDisplayColumns, getFilterOperandsFor, getPinEdge } from '../internal/utils.js';
17
17
  import { watch } from '../internal/watch.js';
18
18
  import { styles } from '../styles/filter-row/filter-row.css.js';
19
- function prefixedIcon(icon) {
20
- return html `<igc-icon
21
- slot="prefix"
22
- name=${ifDefined(icon)}
23
- collection="internal"
24
- ></igc-icon>`;
25
- }
26
19
  export default class ApexFilterRow extends LitElement {
27
20
  constructor() {
28
21
  super(...arguments);
29
22
  this.active = false;
23
+ this.dropdownOpen = false;
30
24
  this.column = DEFAULT_COLUMN_CONFIG;
25
+ this.#handleDropdownItemClick = (event) => {
26
+ event.stopPropagation();
27
+ const target = event.target.closest('[data-value]');
28
+ if (!target)
29
+ return;
30
+ const value = target.dataset.value;
31
+ this.#applyCondition(value);
32
+ this.dropdownOpen = false;
33
+ this.input?.focus();
34
+ };
35
+ this.#handleOutsidePointer = (event) => {
36
+ if (!this.dropdownOpen)
37
+ return;
38
+ const path = event.composedPath();
39
+ if (path.includes(this.dropdown) || path.includes(this.conditionElement))
40
+ return;
41
+ this.dropdownOpen = false;
42
+ };
43
+ this.#handleDocumentKey = (event) => {
44
+ if (this.dropdownOpen && event.key === 'Escape') {
45
+ event.stopPropagation();
46
+ this.dropdownOpen = false;
47
+ this.conditionElement?.focus();
48
+ }
49
+ };
50
+ this.#openDropdownList = () => {
51
+ this.dropdownOpen = !this.dropdownOpen;
52
+ };
31
53
  }
32
54
  static get tagName() {
33
55
  return GRID_FILTER_ROW_TAG;
@@ -56,18 +78,20 @@ export default class ApexFilterRow extends LitElement {
56
78
  await this.updateComplete;
57
79
  this.input?.select();
58
80
  }
59
- #handleConditionChanged(event) {
60
- event.stopPropagation();
61
- const key = event.detail.value;
81
+ #applyCondition(key) {
62
82
  this.expression.condition = getFilterOperandsFor(this.column)[key];
63
83
  if (this.input.value || this.expression.condition.unary) {
64
84
  this.filterController.filterWithEvent(this.expression, 'modify');
65
85
  }
66
86
  this.requestUpdate();
67
87
  }
88
+ #handleDropdownItemClick;
89
+ #handleOutsidePointer;
90
+ #handleDocumentKey;
68
91
  #handleInput(event) {
69
92
  event.stopPropagation();
70
- const value = this.isNumeric ? Number.parseFloat(event.detail) : event.detail;
93
+ const raw = event.target.value ?? '';
94
+ const value = this.isNumeric ? Number.parseFloat(raw) : raw;
71
95
  const shouldUpdate = this.isNumeric ? !Number.isNaN(value) : !!value;
72
96
  const type = this.filterController.get(this.expression.key)?.has(this.expression)
73
97
  ? 'modify'
@@ -99,8 +123,18 @@ export default class ApexFilterRow extends LitElement {
99
123
  this.filterController.removeAllExpressions(this.column.key);
100
124
  this.requestUpdate();
101
125
  }
102
- #openDropdownList() {
103
- this.dropdown.toggle(this.input);
126
+ #openDropdownList;
127
+ connectedCallback() {
128
+ super.connectedCallback();
129
+ this.setAttribute('role', 'row');
130
+ this.setAttribute('aria-rowindex', '2');
131
+ document.addEventListener('pointerdown', this.#handleOutsidePointer, true);
132
+ document.addEventListener('keydown', this.#handleDocumentKey, true);
133
+ }
134
+ disconnectedCallback() {
135
+ document.removeEventListener('pointerdown', this.#handleOutsidePointer, true);
136
+ document.removeEventListener('keydown', this.#handleDocumentKey, true);
137
+ super.disconnectedCallback();
104
138
  }
105
139
  activeChanged() {
106
140
  this.style.display = this.active ? 'flex' : '';
@@ -139,27 +173,39 @@ export default class ApexFilterRow extends LitElement {
139
173
  }
140
174
  renderCriteriaButton(expr, index) {
141
175
  return index
142
- ? html `<igc-button
143
- variant="flat"
176
+ ? html `<button
177
+ type="button"
178
+ part="criteria"
144
179
  @click=${this.#chipCriteriaFor(expr)}
145
180
  >
146
181
  ${expr.criteria}
147
- </igc-button>`
182
+ </button>`
148
183
  : nothing;
149
184
  }
150
185
  renderExpressionChip(props) {
151
186
  const { name, unary } = props.expression.condition;
152
187
  const { searchTerm: term } = props.expression;
153
- const prefix = html `<span slot="select"></span>${prefixedIcon(name)}`;
154
- return html `<igc-chip
155
- selectable
156
- removable
188
+ return html `<div
189
+ part="expression-chip"
157
190
  ?selected=${props.selected}
158
- @igcRemove=${props.onRemove}
159
- @igcSelect=${props.onSelect}
160
191
  >
161
- ${prefix}${unary ? name : term}
162
- </igc-chip>`;
192
+ <button
193
+ part="chip-body"
194
+ type="button"
195
+ @click=${props.onSelect}
196
+ >
197
+ ${renderIcon(name)}
198
+ <span>${unary ? name : term}</span>
199
+ </button>
200
+ <button
201
+ part="chip-remove"
202
+ type="button"
203
+ aria-label="Remove filter"
204
+ @click=${props.onRemove}
205
+ >
206
+ ${renderIcon('close')}
207
+ </button>
208
+ </div>`;
163
209
  }
164
210
  renderActiveChips() {
165
211
  const state = this.filterController.get(this.column.key);
@@ -177,62 +223,75 @@ export default class ApexFilterRow extends LitElement {
177
223
  }
178
224
  renderFilterActions() {
179
225
  return html `
180
- <igc-button
226
+ <button
181
227
  id="reset"
182
- variant="flat"
228
+ type="button"
229
+ part="action"
183
230
  @click=${this.#handleResetClick}
184
231
  >
185
- ${prefixedIcon('refresh')} Reset
186
- </igc-button>
187
- <igc-button
232
+ ${renderIcon('refresh')} Reset
233
+ </button>
234
+ <button
188
235
  id="close"
189
- variant="flat"
236
+ type="button"
237
+ part="action"
190
238
  @click=${() => {
191
239
  this.active = false;
192
240
  }}
193
241
  >
194
- ${prefixedIcon('close')} Close
195
- </igc-button>
242
+ ${renderIcon('close')} Close
243
+ </button>
196
244
  `;
197
245
  }
198
246
  renderDropdown() {
199
- return html `<igc-dropdown
200
- flip
201
- same-width
202
- @igcChange=${this.#handleConditionChanged}
247
+ return html `<ul
248
+ part="dropdown"
249
+ role="listbox"
250
+ aria-label="Filter condition"
251
+ ?hidden=${!this.dropdownOpen}
252
+ @click=${this.#handleDropdownItemClick}
203
253
  >
204
254
  ${Object.entries(getFilterOperandsFor(this.column)).map(([key, operand]) => html `
205
- <igc-dropdown-item
206
- .value=${key}
255
+ <li
256
+ part="dropdown-item"
257
+ role="option"
258
+ tabindex="-1"
259
+ data-value=${key}
260
+ aria-selected=${this.condition.name === key}
207
261
  ?selected=${this.condition.name === key}
208
262
  >
209
- ${prefixedIcon(key)}${operand?.label ?? key}
210
- </igc-dropdown-item>
263
+ ${renderIcon(key)}<span>${operand?.label ?? key}</span>
264
+ </li>
211
265
  `)}
212
- </igc-dropdown>`;
266
+ </ul>`;
213
267
  }
214
268
  renderDropdownTarget() {
215
- return html `<igc-icon
269
+ return html `<button
216
270
  id="condition"
217
- slot="prefix"
218
- collection="internal"
219
- .name=${this.condition.name}
271
+ type="button"
272
+ part="condition-trigger"
273
+ aria-label="Change filter condition"
274
+ aria-haspopup="listbox"
275
+ aria-expanded=${this.dropdownOpen ? 'true' : 'false'}
220
276
  @click=${this.#openDropdownList}
221
277
  >
222
- </igc-icon>`;
278
+ ${renderIcon(this.condition.name)}
279
+ </button>`;
223
280
  }
224
281
  renderInputArea() {
225
- return html `<igc-input
226
- outlined
227
- value=${ifDefined(this.expression.searchTerm)}
282
+ return html `<div part="filter-field">
283
+ ${this.renderDropdownTarget()}
284
+ <input
285
+ part="filter-input"
286
+ type="text"
287
+ .value=${ifDefined(this.expression.searchTerm)}
228
288
  placeholder="Add filter value"
229
289
  ?readonly=${this.condition.unary}
230
- @igcInput=${this.#handleInput}
290
+ @input=${this.#handleInput}
231
291
  @keydown=${this.#handleKeydown}
232
- >
233
- ${this.renderDropdownTarget()}
234
- </igc-input>
235
- ${this.renderDropdown()}`;
292
+ />
293
+ ${this.renderDropdown()}
294
+ </div>`;
236
295
  }
237
296
  renderActiveState() {
238
297
  return html `<div part="active-state">
@@ -266,20 +325,41 @@ export default class ApexFilterRow extends LitElement {
266
325
  this.#setDefaultExpression();
267
326
  this.#show();
268
327
  };
269
- const count = hidden ? html `<span slot="suffix">${state.length}</span>` : nothing;
270
- const chip = html `<igc-chip
328
+ const count = hidden ? html `<span part="filter-chip-count">${state.length}</span>` : nothing;
329
+ const chip = html `<button
330
+ part="filter-chip"
331
+ type="button"
271
332
  data-column=${column.key}
272
333
  @click=${open}
273
- >${prefixedIcon('filter')}Filter${count}</igc-chip
274
- >`;
334
+ >
335
+ ${renderIcon('filter')}<span>Filter</span>${count}
336
+ </button>`;
275
337
  return partial ? this.renderInactiveChips(column, state) : chip;
276
338
  }
277
339
  renderInactiveState() {
278
- return this.state.host.columns.map((column) => column.hidden
279
- ? nothing
280
- : html `<div part="filter-row-preview">
281
- ${column.filter ? this.renderFilterState(column) : nothing}
282
- </div>`);
340
+ const pinOffsets = this.state.pinOffsets;
341
+ const displayColumns = getDisplayColumns(this.state.host.columns);
342
+ const selectionPlaceholder = this.state.selection.showCheckboxColumn
343
+ ? html `<div part="filter-row-preview" data-pinned="start"></div>`
344
+ : nothing;
345
+ const expansionPlaceholder = this.state.expansion.showToggleColumn
346
+ ? html `<div part="filter-row-preview" data-pinned="start"></div>`
347
+ : nothing;
348
+ return html `${selectionPlaceholder}${expansionPlaceholder}${displayColumns.map((column, index) => {
349
+ if (column.hidden)
350
+ return nothing;
351
+ const offset = pinOffsets.get(column.key);
352
+ const pinStyle = column.pinned && typeof offset === 'number' ? `--apex-pin-offset:${offset}px` : '';
353
+ const edge = getPinEdge(displayColumns, index);
354
+ return html `<div
355
+ part="filter-row-preview"
356
+ data-pinned=${column.pinned ?? 'none'}
357
+ data-pin-edge=${edge ?? 'none'}
358
+ style=${pinStyle}
359
+ >
360
+ ${column.filter ? this.renderFilterState(column) : nothing}
361
+ </div>`;
362
+ })}`;
283
363
  }
284
364
  render() {
285
365
  return html `${this.active ? this.renderActiveState() : this.renderInactiveState()}`;
@@ -293,14 +373,17 @@ __decorate([
293
373
  property({ attribute: false })
294
374
  ], ApexFilterRow.prototype, "active", void 0);
295
375
  __decorate([
296
- query(IgcInputComponent.tagName)
376
+ query('input')
297
377
  ], ApexFilterRow.prototype, "input", void 0);
298
378
  __decorate([
299
379
  query('#condition')
300
380
  ], ApexFilterRow.prototype, "conditionElement", void 0);
301
381
  __decorate([
302
- query(IgcDropdownComponent.tagName)
382
+ query('[part~="dropdown"]')
303
383
  ], ApexFilterRow.prototype, "dropdown", void 0);
384
+ __decorate([
385
+ state()
386
+ ], ApexFilterRow.prototype, "dropdownOpen", void 0);
304
387
  __decorate([
305
388
  property({ attribute: false })
306
389
  ], ApexFilterRow.prototype, "column", void 0);
@@ -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 {\n IgcDropdownComponent,\n type IgcDropdownItemComponent,\n type IgcIconComponent,\n IgcInputComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { gridStateContext, type StateController } from '../controllers/state.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.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 { FilterExpressionTree } from '../operations/filter/tree.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\nfunction prefixedIcon(icon?: string) {\n return html`<igc-icon\n slot=\"prefix\"\n name=${ifDefined(icon)}\n collection=\"internal\"\n ></igc-icon>`;\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 @query(IgcInputComponent.tagName)\n public input!: IgcInputComponent;\n\n @query('#condition')\n public conditionElement!: IgcIconComponent;\n\n @query(IgcDropdownComponent.tagName)\n public dropdown!: IgcDropdownComponent;\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 async #show() {\n this.active = true;\n\n await this.updateComplete;\n this.input?.select();\n }\n\n #handleConditionChanged(event: CustomEvent<IgcDropdownItemComponent>) {\n event.stopPropagation();\n const key = event.detail.value as OperandKeys<T[typeof this.column.key]>;\n\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 #handleInput(event: CustomEvent<string>) {\n event.stopPropagation();\n\n const value = this.isNumeric ? Number.parseFloat(event.detail) : event.detail;\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\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 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.requestUpdate();\n }\n\n #openDropdownList() {\n this.dropdown.toggle(this.input);\n }\n\n @watch('active', { waitUntilFirstUpdate: true })\n protected activeChanged() {\n this.style.display = this.active ? 'flex' : '';\n\n if (!this.active) {\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\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`<igc-button\n variant=\"flat\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </igc-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 const prefix = html`<span slot=\"select\"></span>${prefixedIcon(name)}`;\n\n return html`<igc-chip\n selectable\n removable\n ?selected=${props.selected}\n @igcRemove=${props.onRemove}\n @igcSelect=${props.onSelect}\n >\n ${prefix}${unary ? name : term}\n </igc-chip>`;\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 <igc-button\n id=\"reset\"\n variant=\"flat\"\n @click=${this.#handleResetClick}\n >\n ${prefixedIcon('refresh')} Reset\n </igc-button>\n <igc-button\n id=\"close\"\n variant=\"flat\"\n @click=${() => {\n this.active = false;\n }}\n >\n ${prefixedIcon('close')} Close\n </igc-button>\n `;\n }\n\n protected renderDropdown() {\n return html`<igc-dropdown\n flip\n same-width\n @igcChange=${this.#handleConditionChanged}\n >\n ${Object.entries(getFilterOperandsFor(this.column)).map(\n ([key, operand]) => html`\n <igc-dropdown-item\n .value=${key}\n ?selected=${this.condition.name === key}\n >\n ${prefixedIcon(key)}${operand?.label ?? key}\n </igc-dropdown-item>\n `\n )}\n </igc-dropdown>`;\n }\n\n protected renderDropdownTarget() {\n return html`<igc-icon\n id=\"condition\"\n slot=\"prefix\"\n collection=\"internal\"\n .name=${this.condition.name}\n @click=${this.#openDropdownList}\n >\n </igc-icon>`;\n }\n\n protected renderInputArea() {\n return html`<igc-input\n outlined\n value=${ifDefined(this.expression.searchTerm)}\n placeholder=\"Add filter value\"\n ?readonly=${this.condition.unary}\n @igcInput=${this.#handleInput}\n @keydown=${this.#handleKeydown}\n >\n ${this.renderDropdownTarget()}\n </igc-input>\n ${this.renderDropdown()}`;\n }\n\n protected renderActiveState() {\n return html`<div part=\"active-state\">\n <div part=\"filter-row-input\">${this.renderInputArea()}</div>\n <div part=\"filter-row-filters\">${this.renderActiveChips()}</div>\n <div part=\"filter-row-actions\">${this.renderFilterActions()}</div>\n </div> `;\n }\n\n protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>) {\n return Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: false,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: async (e: Event) => {\n e.stopPropagation();\n this.column = column;\n this.expression = expression;\n this.#show();\n },\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;\n });\n }\n\n protected renderFilterState(column: ColumnConfiguration<T>) {\n const state = this.filterController.get(column.key);\n\n const partial = state && state.length < 3;\n const hidden = state && state.length >= 3;\n\n const open = () => {\n this.column = column;\n this.#setDefaultExpression();\n this.#show();\n };\n\n const count = hidden ? html`<span slot=\"suffix\">${state.length}</span>` : nothing;\n const chip = html`<igc-chip\n data-column=${column.key}\n @click=${open}\n >${prefixedIcon('filter')}Filter${count}</igc-chip\n >`;\n\n return partial ? this.renderInactiveChips(column, state) : chip;\n }\n\n protected renderInactiveState() {\n return this.state.host.columns.map((column) =>\n column.hidden\n ? nothing\n : html`<div part=\"filter-row-preview\">\n ${column.filter ? this.renderFilterState(column) : nothing}\n </div>`\n );\n }\n\n protected override render() {\n return html`${this.active ? this.renderActiveState() : this.renderInactiveState()}`;\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 { ifDefined } from 'lit/directives/if-defined.js';\nimport { gridStateContext, type StateController } from '../controllers/state.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 { getDisplayColumns, getFilterOperandsFor, getPinEdge } from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpressionTree } from '../operations/filter/tree.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 @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 async #show() {\n this.active = true;\n\n await this.updateComplete;\n this.input?.select();\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 #handleDropdownItemClick = (event: Event) => {\n event.stopPropagation();\n const target = (event.target as HTMLElement).closest<HTMLElement>('[data-value]');\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 #handleOutsidePointer = (event: PointerEvent) => {\n if (!this.dropdownOpen) return;\n const path = event.composedPath();\n if (path.includes(this.dropdown) || path.includes(this.conditionElement)) return;\n this.dropdownOpen = false;\n };\n\n #handleDocumentKey = (event: KeyboardEvent) => {\n if (this.dropdownOpen && event.key === 'Escape') {\n event.stopPropagation();\n this.dropdownOpen = false;\n this.conditionElement?.focus();\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\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 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.requestUpdate();\n }\n\n #openDropdownList = () => {\n this.dropdownOpen = !this.dropdownOpen;\n };\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('role', 'row');\n this.setAttribute('aria-rowindex', '2');\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 activeChanged() {\n this.style.display = this.active ? 'flex' : '';\n\n if (!this.active) {\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\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=\"Remove filter\"\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')} 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')} Close\n </button>\n `;\n }\n\n protected renderDropdown() {\n return html`<ul\n part=\"dropdown\"\n role=\"listbox\"\n aria-label=\"Filter condition\"\n ?hidden=${!this.dropdownOpen}\n @click=${this.#handleDropdownItemClick}\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>${operand?.label ?? key}</span>\n </li>\n `\n )}\n </ul>`;\n }\n\n protected renderDropdownTarget() {\n return html`<button\n id=\"condition\"\n type=\"button\"\n part=\"condition-trigger\"\n aria-label=\"Change filter condition\"\n aria-haspopup=\"listbox\"\n aria-expanded=${this.dropdownOpen ? 'true' : 'false'}\n @click=${this.#openDropdownList}\n >\n ${renderIcon(this.condition.name)}\n </button>`;\n }\n\n protected renderInputArea() {\n return html`<div part=\"filter-field\">\n ${this.renderDropdownTarget()}\n <input\n part=\"filter-input\"\n type=\"text\"\n .value=${ifDefined(this.expression.searchTerm as string | undefined) as string}\n placeholder=\"Add filter value\"\n ?readonly=${this.condition.unary}\n @input=${this.#handleInput}\n @keydown=${this.#handleKeydown}\n />\n ${this.renderDropdown()}\n </div>`;\n }\n\n protected renderActiveState() {\n return html`<div part=\"active-state\">\n <div part=\"filter-row-input\">${this.renderInputArea()}</div>\n <div part=\"filter-row-filters\">${this.renderActiveChips()}</div>\n <div part=\"filter-row-actions\">${this.renderFilterActions()}</div>\n </div> `;\n }\n\n protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>) {\n return Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: false,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: async (e: Event) => {\n e.stopPropagation();\n this.column = column;\n this.expression = expression;\n this.#show();\n },\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;\n });\n }\n\n protected renderFilterState(column: ColumnConfiguration<T>) {\n const state = this.filterController.get(column.key);\n\n const partial = state && state.length < 3;\n const hidden = state && state.length >= 3;\n\n const open = () => {\n this.column = column;\n this.#setDefaultExpression();\n this.#show();\n };\n\n const count = hidden ? html`<span part=\"filter-chip-count\">${state.length}</span>` : nothing;\n const chip = html`<button\n part=\"filter-chip\"\n type=\"button\"\n data-column=${column.key}\n @click=${open}\n >\n ${renderIcon('filter')}<span>Filter</span>${count}\n </button>`;\n\n return partial ? this.renderInactiveChips(column, state) : chip;\n }\n\n protected renderInactiveState() {\n const pinOffsets = this.state.pinOffsets;\n const displayColumns = getDisplayColumns(this.state.host.columns);\n // Reserve a track to align with the row's selection checkbox column.\n const selectionPlaceholder = this.state.selection.showCheckboxColumn\n ? html`<div part=\"filter-row-preview\" data-pinned=\"start\"></div>`\n : nothing;\n // And another for the row's expansion chevron column.\n const expansionPlaceholder = this.state.expansion.showToggleColumn\n ? html`<div part=\"filter-row-preview\" data-pinned=\"start\"></div>`\n : nothing;\n\n return html`${selectionPlaceholder}${expansionPlaceholder}${displayColumns.map(\n (column, index) => {\n if (column.hidden) return nothing;\n const offset = pinOffsets.get(column.key);\n const pinStyle =\n column.pinned && typeof offset === 'number' ? `--apex-pin-offset:${offset}px` : '';\n const edge = getPinEdge(displayColumns, index);\n return html`<div\n part=\"filter-row-preview\"\n data-pinned=${column.pinned ?? 'none'}\n data-pin-edge=${edge ?? 'none'}\n style=${pinStyle}\n >\n ${column.filter ? this.renderFilterState(column) : nothing}\n </div>`;\n }\n )}`;\n }\n\n protected override render() {\n return html`${this.active ? this.renderActiveState() : this.renderInactiveState()}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ApexFilterRow.tagName]: ApexFilterRow<object>;\n }\n}\n"]}