igniteui-grid-lite 0.9.0 → 0.11.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 (108) hide show
  1. package/components/cell.d.ts +11 -15
  2. package/components/cell.js +14 -3
  3. package/components/cell.js.map +1 -1
  4. package/components/column.d.ts +2 -2
  5. package/components/column.js.map +1 -1
  6. package/components/filter-row.d.ts +5 -3
  7. package/components/filter-row.js +97 -67
  8. package/components/filter-row.js.map +1 -1
  9. package/components/grid.d.ts +49 -8
  10. package/components/grid.js +116 -79
  11. package/components/grid.js.map +1 -1
  12. package/components/header-row.d.ts +1 -2
  13. package/components/header-row.js +6 -8
  14. package/components/header-row.js.map +1 -1
  15. package/components/header.d.ts +9 -0
  16. package/components/header.js +37 -28
  17. package/components/header.js.map +1 -1
  18. package/components/row.d.ts +4 -4
  19. package/components/row.js +15 -4
  20. package/components/row.js.map +1 -1
  21. package/controllers/data-operation.d.ts +1 -7
  22. package/controllers/data-operation.js +7 -24
  23. package/controllers/data-operation.js.map +1 -1
  24. package/controllers/dom.d.ts +16 -9
  25. package/controllers/dom.js +71 -20
  26. package/controllers/dom.js.map +1 -1
  27. package/controllers/filter.d.ts +17 -13
  28. package/controllers/filter.js +51 -61
  29. package/controllers/filter.js.map +1 -1
  30. package/controllers/navigation.d.ts +13 -18
  31. package/controllers/navigation.js +71 -76
  32. package/controllers/navigation.js.map +1 -1
  33. package/controllers/resize.d.ts +11 -17
  34. package/controllers/resize.js +20 -16
  35. package/controllers/resize.js.map +1 -1
  36. package/controllers/sort.d.ts +13 -6
  37. package/controllers/sort.js +39 -41
  38. package/controllers/sort.js.map +1 -1
  39. package/controllers/state.d.ts +18 -19
  40. package/controllers/state.js +31 -35
  41. package/controllers/state.js.map +1 -1
  42. package/custom-elements.json +970 -488
  43. package/docs/igniteui-grid-lite.json +1293 -782
  44. package/index.d.ts +1 -1
  45. package/index.js.map +1 -1
  46. package/internal/a11y.d.ts +26 -0
  47. package/internal/a11y.js +24 -0
  48. package/internal/a11y.js.map +1 -0
  49. package/internal/body-focus.d.ts +6 -0
  50. package/internal/body-focus.js +46 -0
  51. package/internal/body-focus.js.map +1 -0
  52. package/internal/constants.d.ts +6 -2
  53. package/internal/constants.js +3 -4
  54. package/internal/constants.js.map +1 -1
  55. package/internal/element-from-event-path.d.ts +1 -1
  56. package/internal/element-from-event-path.js +2 -9
  57. package/internal/element-from-event-path.js.map +1 -1
  58. package/internal/normalize-case.d.ts +5 -1
  59. package/internal/normalize-case.js +2 -1
  60. package/internal/normalize-case.js.map +1 -1
  61. package/internal/part-map.js +9 -17
  62. package/internal/part-map.js.map +1 -1
  63. package/internal/tags.d.ts +1 -2
  64. package/internal/tags.js +1 -2
  65. package/internal/tags.js.map +1 -1
  66. package/internal/types.d.ts +19 -8
  67. package/internal/types.js.map +1 -1
  68. package/internal/utils.d.ts +7 -8
  69. package/internal/utils.js +22 -5
  70. package/internal/utils.js.map +1 -1
  71. package/internal/watch.js +8 -9
  72. package/internal/watch.js.map +1 -1
  73. package/operations/base.js +3 -2
  74. package/operations/base.js.map +1 -1
  75. package/operations/filter/state.d.ts +0 -1
  76. package/operations/filter/state.js +2 -8
  77. package/operations/filter/state.js.map +1 -1
  78. package/operations/filter/tree.d.ts +1 -2
  79. package/operations/filter/tree.js +2 -7
  80. package/operations/filter/tree.js.map +1 -1
  81. package/operations/filter/types.d.ts +1 -1
  82. package/operations/filter/types.js.map +1 -1
  83. package/operations/filter.js +16 -3
  84. package/operations/filter.js.map +1 -1
  85. package/operations/sort/types.d.ts +1 -1
  86. package/operations/sort/types.js.map +1 -1
  87. package/operations/sort.d.ts +0 -1
  88. package/operations/sort.js +12 -10
  89. package/operations/sort.js.map +1 -1
  90. package/package.json +2 -3
  91. package/styles/header-cell/header-cell.css.js +1 -1
  92. package/styles/header-cell/header-cell.css.js.map +1 -1
  93. package/styles/themes/filtering-row-themes.js +2 -30
  94. package/styles/themes/filtering-row-themes.js.map +1 -1
  95. package/styles/themes/grid-header-themes.js +2 -20
  96. package/styles/themes/grid-header-themes.js.map +1 -1
  97. package/styles/themes/grid-themes.js +10 -31
  98. package/styles/themes/grid-themes.js.map +1 -1
  99. package/styles/themes/grid.base.css.js +1 -1
  100. package/styles/themes/grid.base.css.js.map +1 -1
  101. package/styles/themes/shared/grid.common.css.js +1 -1
  102. package/styles/themes/shared/grid.common.css.js.map +1 -1
  103. package/components/virtualizer.d.ts +0 -12
  104. package/components/virtualizer.js +0 -20
  105. package/components/virtualizer.js.map +0 -1
  106. package/internal/virt-flow-layout.d.ts +0 -4
  107. package/internal/virt-flow-layout.js +0 -15
  108. package/internal/virt-flow-layout.js.map +0 -1
@@ -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 θaddAdoptedStylesController as addAdoptedStylesController,\n θaddThemingController as addThemingController,\n IgcDropdownComponent,\n type IgcDropdownItemComponent,\n type IgcIconComponent,\n IgcInputComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { StateController } from '../controllers/state.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';\nimport { GRID_STATE_CONTEXT } from '../internal/context.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_FILTER_ROW_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, PropertyType } 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';\nimport { all } from '../styles/themes/filtering-row-themes.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`\n <igc-icon\n slot=\"prefix\"\n name=${ifDefined(icon)}\n collection=\"internal\"\n ></igc-icon>\n `;\n}\n\nexport default class IgcFilterRow<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(IgcFilterRow);\n }\n\n private readonly _adoptedStylesController = addAdoptedStylesController(this);\n\n @consume({ context: GRID_STATE_CONTEXT, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n protected get isNumeric() {\n return this.column.dataType === '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 @property({ attribute: false })\n public adoptRootStyles = false;\n\n constructor() {\n super();\n\n addThemingController(this, all, {\n themeChange: this._handleThemeChange,\n });\n }\n\n private _handleThemeChange() {\n this._adoptedStylesController.invalidateCache(this.ownerDocument);\n this._adoptedStylesController.shouldAdoptStyles(\n this.adoptRootStyles && this.column.headerTemplate != null\n );\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles')) {\n this._adoptedStylesController.shouldAdoptStyles(\n this.adoptRootStyles && this.column.headerTemplate != null\n );\n }\n\n super.update(props);\n }\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<PropertyType<T, typeof this.column.field>>;\n\n // XXX: Types\n this.expression.condition = (getFilterOperandsFor(this.column) as any)[key] as FilterOperation<\n PropertyType<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.field);\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`\n <igc-button\n variant=\"flat\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </igc-button>\n `\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`\n <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\n protected renderActiveChips() {\n const state = this.filterController.get(this.column.field);\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`\n <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\n protected renderActiveState() {\n return html`\n <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\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.field);\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.field}\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.columns.map((column) =>\n column.hidden\n ? nothing\n : html`\n <div part=\"filter-row-preview\">\n ${column.filterable ? 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 [IgcFilterRow.tagName]: IgcFilterRow<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 {\n θaddAdoptedStylesController as addAdoptedStylesController,\n θaddThemingController as addThemingController,\n IgcButtonComponent,\n IgcChipComponent,\n IgcDropdownComponent,\n type IgcDropdownItemComponent,\n type IgcIconComponent,\n IgcInputComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { StateController } from '../controllers/state.js';\nimport { addA11y, FILTER_ROW_INDEX } from '../internal/a11y.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';\nimport { GRID_STATE_CONTEXT } from '../internal/context.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_FILTER_ROW_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, Keys, PropertyType } from '../internal/types.js';\nimport { getFilterOperandsFor, resolveCondition, visibleColumns } from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpressionTree } from '../operations/filter/tree.js';\nimport type { FilterExpression, FilterOperation } from '../operations/filter/types.js';\nimport { styles } from '../styles/filter-row/filter-row.css.js';\nimport { all } from '../styles/themes/filtering-row-themes.js';\n\n/** Expression count at which the preview collapses into one counted chip. */\nconst MAX_PREVIEW_CHIPS = 3;\n\n/** Filter row accessible name. */\nconst FILTER_ROW_LABEL = 'Column filters';\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`\n <igc-icon\n slot=\"prefix\"\n name=${ifDefined(icon)}\n collection=\"internal\"\n ></igc-icon>\n `;\n}\n\nexport default class IgcFilterRow<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 /** Deferred by the grid until a filterable column shows: only this row uses the editors. */\n public static register() {\n registerComponent(\n IgcFilterRow,\n IgcButtonComponent,\n IgcChipComponent,\n IgcInputComponent,\n IgcDropdownComponent\n );\n }\n\n private readonly _adoptedStylesController = addAdoptedStylesController(this);\n\n @consume({ context: GRID_STATE_CONTEXT, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n protected get isNumeric() {\n return this.column.dataType === '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 @property({ attribute: false })\n public adoptRootStyles = false;\n\n constructor() {\n super();\n\n // `role=grid` allows only rows and rowgroups, so no `search` landmark. Modeled\n // as the second header row: one `gridcell` per column.\n addA11y(this, 'row').set({\n ariaRowIndex: `${FILTER_ROW_INDEX}`,\n ariaLabel: FILTER_ROW_LABEL,\n });\n\n addThemingController(this, all, {\n themeChange: this._handleThemeChange,\n });\n }\n\n private get _shouldAdoptStyles(): boolean {\n return this.adoptRootStyles && this.column.headerTemplate != null;\n }\n\n private _handleThemeChange() {\n this._adoptedStylesController.invalidateCache(this.ownerDocument);\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles')) {\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n super.update(props);\n }\n\n #setDefaultExpression() {\n this.expression = this.filterController.getDefaultExpression(this.column);\n }\n\n async #selectInput() {\n await this.updateComplete;\n this.input?.select();\n }\n\n #show() {\n this.active = true;\n this.#selectInput();\n }\n\n #handleConditionChanged(event: CustomEvent<IgcDropdownItemComponent>) {\n event.stopPropagation();\n\n const condition = resolveCondition(this.column, event.detail.value) as FilterOperation<\n PropertyType<T, keyof T>\n >;\n\n if (this.input.value || condition.unary) {\n this.filterController.filterWithEvent(\n { ...this.expression, condition },\n 'modify',\n this.expression\n );\n } else {\n // Nothing to filter by yet - the condition is only staged in the UI.\n this.expression.condition = condition;\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\n if (shouldUpdate) {\n const type = this.filterController.get(this.expression.key)?.has(this.expression)\n ? 'modify'\n : 'add';\n\n this.filterController.filterWithEvent(\n { ...this.expression, searchTerm: value as any },\n type,\n this.expression\n );\n } else {\n this.filterController.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 }\n }\n\n #handleResetClick() {\n this.filterController.removeAllExpressions(this.column.field);\n this.requestUpdate();\n }\n\n #openDropdownList() {\n this.dropdown.toggle(this.input);\n }\n\n #handleConditionKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n // The trigger sits in the prefix slot of the input. The keystroke must not\n // reach the input and commit a filter behind the open dropdown.\n event.preventDefault();\n event.stopPropagation();\n\n this.#openDropdownList();\n }\n\n /** Header text of a column. Names the filter controls that act on it. */\n #nameFor(field: Keys<T>): string {\n const column = this.state.columns.find((each) => each.field === field);\n return String(column?.header ?? field);\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 // The header row marks the column whose filter editor is open.\n this.state.updateObservers();\n }\n\n #chipCriteriaFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n\n const criteria = expression.criteria === 'and' ? 'or' : 'and';\n\n this.filterController.filterWithEvent({ ...expression, criteria }, 'modify', expression);\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.#selectInput();\n };\n }\n\n #chipRemoveFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.filterController.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`\n <igc-button\n variant=\"flat\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </igc-button>\n `\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 // The chip names its actions in its shadow root. Resource strings are the only hook.\n const expression = `${this.#nameFor(props.expression.key)} ${name} ${unary ? '' : term}`.trim();\n\n return html`\n <igc-chip\n selectable\n removable\n .resourceStrings=${{\n chip_remove: `Remove filter ${expression}`,\n chip_select: `Edit filter ${expression}`,\n }}\n ?selected=${props.selected}\n @igcRemove=${props.onRemove}\n @igcSelect=${props.onSelect}\n >\n ${prefix}${unary ? name : term}\n </igc-chip>\n `;\n }\n\n /** Chip list for a column's filter state. `onSelectFor` builds each chip's select action. */\n #renderChips(\n state: FilterExpressionTree<T>,\n onSelectFor: (expression: FilterExpression<T>) => (e: Event) => Promise<void>\n ) {\n return Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: this.active && this.expression === expression,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: onSelectFor(expression),\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;\n });\n }\n\n protected renderActiveChips() {\n const state = this.filterController.get(this.column.field);\n\n return state ? this.#renderChips(state, (expr) => this.#chipSelectFor(expr)) : nothing;\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 const condition = this.condition.label ?? this.condition.name;\n\n return html`<igc-icon\n id=\"condition\"\n slot=\"prefix\"\n collection=\"internal\"\n role=\"button\"\n tabindex=\"0\"\n aria-haspopup=\"listbox\"\n aria-label=${`Filter condition: ${condition}`}\n .name=${this.condition.name}\n @click=${this.#openDropdownList}\n @keydown=${this.#handleConditionKeydown}\n >\n </igc-icon>`;\n }\n\n protected renderInputArea() {\n // `igc-input` names its inner control from a slotted label or the placeholder\n // only, so the placeholder carries the column name.\n return html`\n <igc-input\n outlined\n value=${ifDefined(this.expression.searchTerm)}\n placeholder=${`Filter ${this.#nameFor(this.column.field)}`}\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\n protected renderActiveState() {\n return html`\n <div\n part=\"active-state\"\n role=\"gridcell\"\n >\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\n protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>) {\n return this.#renderChips(state, (expression) => async (e: Event) => {\n e.stopPropagation();\n this.column = column;\n this.expression = expression;\n this.#show();\n });\n }\n\n protected renderFilterState(column: ColumnConfiguration<T>) {\n const state = this.filterController.get(column.field);\n\n // Short lists render inline. Longer ones collapse into one counted chip.\n if (state && state.length < MAX_PREVIEW_CHIPS) {\n return this.renderInactiveChips(column, state);\n }\n\n const open = () => {\n this.column = column;\n this.#setDefaultExpression();\n this.#show();\n };\n\n const count = state ? html`<span slot=\"suffix\">${state.length}</span>` : nothing;\n\n return html`<igc-chip\n data-column=${column.field}\n aria-label=${`Filter ${this.#nameFor(column.field)}`}\n @click=${open}\n >${prefixedIcon('filter')}Filter${count}</igc-chip\n >`;\n }\n\n protected renderInactiveState() {\n return visibleColumns(this.state.columns).map(\n (column, index) => html`\n <div\n part=\"filter-row-preview\"\n role=\"gridcell\"\n aria-colindex=${index + 1}\n >\n ${column.filterable ? this.renderFilterState(column) : nothing}\n </div>\n `\n );\n }\n\n protected override render() {\n return this.active ? this.renderActiveState() : this.renderInactiveState();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcFilterRow.tagName]: IgcFilterRow<object>;\n }\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  import { ContextProvider } from '@lit/context';
2
- import type { RenderItemFunction } from '@lit-labs/virtualizer/virtualize.js';
2
+ import { type VirtualScrollItemTemplate } from 'igniteui-webcomponents';
3
+ import { type PropertyValues } from 'lit';
3
4
  import { EventEmitterBase } from '../internal/mixins/event-emitter.js';
4
- import type { ColumnConfiguration, DataPipelineConfiguration, GridLiteSortingOptions, Keys } from '../internal/types.js';
5
+ import type { ColumnConfiguration, DataPipelineConfiguration, GridLiteSortingOptions, Keys, NavigateToOptions } from '../internal/types.js';
5
6
  import type { FilterExpression } from '../operations/filter/types.js';
6
7
  import type { SortingExpression } from '../operations/sort/types.js';
7
8
  import IgcGridLiteRow from './row.js';
@@ -99,8 +100,9 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
99
100
  static get tagName(): "igc-grid-lite";
100
101
  static styles: import("lit").CSSResult[];
101
102
  static register(): void;
102
- protected readonly _stateController: import("../controllers/state.js").StateController<T>;
103
+ private readonly _a11y;
103
104
  protected readonly _domController: import("../controllers/dom.js").GridDOMController<T>;
105
+ protected readonly _stateController: import("../controllers/state.js").StateController<T>;
104
106
  protected readonly _dataController: import("../controllers/data-operation.js").DataOperationsController<T>;
105
107
  protected readonly _stateProvider: ContextProvider<{
106
108
  __context__: import("../controllers/state.js").StateController<any>;
@@ -108,9 +110,16 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
108
110
  protected readonly _columnUpdateProvider: ContextProvider<{
109
111
  __context__: (config: import("../index.js").BaseColumnConfiguration<object>) => void;
110
112
  }, this>;
111
- private _updateObservers;
112
- private _updateConfiguration;
113
113
  protected _dataState: T[];
114
+ /** Id of the latest pipeline run. */
115
+ private _pipelineEpoch;
116
+ private _pipelineTask;
117
+ /**
118
+ * Resolves once the latest pipeline run renders. `sorted` and `filtered` await it.
119
+ *
120
+ * @internal
121
+ */
122
+ get _pipelineComplete(): Promise<void>;
114
123
  adoptRootStyles: boolean;
115
124
  /** The data source for the grid. */
116
125
  data: T[];
@@ -161,6 +170,17 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
161
170
  * Get the filter state for the grid.
162
171
  */
163
172
  get filterExpressions(): FilterExpression<T>[];
173
+ /**
174
+ * Sets the column configuration for the grid.
175
+ *
176
+ * @remarks
177
+ * Passing an empty collection resets the columns, which - with `autoGenerate` -
178
+ * lets the next data source binding re-generate them.
179
+ */
180
+ set columns(configuration: ColumnConfiguration<T>[]);
181
+ /**
182
+ * Returns the column configuration of the grid.
183
+ */
164
184
  get columns(): ColumnConfiguration<T>[];
165
185
  /**
166
186
  * Returns the collection of rendered row elements in the grid.
@@ -179,11 +199,23 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
179
199
  * The total number of items in the {@link IgcGridLite.dataView} collection.
180
200
  */
181
201
  get totalItems(): number;
202
+ protected sortingOptionsChanged(): void;
182
203
  protected dataChanged(): void;
183
- protected pipeline(): Promise<void>;
204
+ /**
205
+ * NOTE: `PIPELINE` equals this method's name, so `@watch` fires on each request.
206
+ * Renaming the method silently disables the pipeline.
207
+ */
208
+ protected pipeline(): void;
209
+ /** Runs the data operations. Discards results superseded by a newer run. */
210
+ private _runPipeline;
184
211
  constructor();
212
+ /** Columns the row renderer was built from. */
213
+ private _rowColumns?;
214
+ protected willUpdate(props: PropertyValues<this>): void;
185
215
  protected createRenderRoot(): HTMLElement | DocumentFragment;
186
216
  protected firstUpdated(): void;
217
+ /** The column elements assigned to the slot, either direct or nested in a container. */
218
+ private _assignedColumns;
187
219
  private _hasAssignedColumns;
188
220
  private _handleSlotChange;
189
221
  /**
@@ -202,11 +234,18 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
202
234
  * Resets the current filter state of the control.
203
235
  */
204
236
  clearFilter(key?: Keys<T>): void;
237
+ /**
238
+ * Navigates to a position in the grid based on provided row index and column field.
239
+ * @param row The row index to navigate to
240
+ * @param options The column field to navigate to and whether to activate the cell
241
+ */
242
+ navigateTo(row: number, options?: NavigateToOptions<T>): Promise<void>;
205
243
  /**
206
244
  * Navigates to a position in the grid based on provided row index and column field.
207
245
  * @param row The row index to navigate to
208
246
  * @param column The column field to navigate to, if any
209
247
  * @param activate Optionally also activate the navigated cell
248
+ * @deprecated Use `navigateTo(row, options)` instead.
210
249
  */
211
250
  navigateTo(row: number, column?: Keys<T>, activate?: boolean): Promise<void>;
212
251
  /**
@@ -215,10 +254,12 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
215
254
  getColumn(id: Keys<T> | number): ColumnConfiguration<T> | undefined;
216
255
  protected _bodyClickHandler(event: PointerEvent): void;
217
256
  protected _bodyKeydownHandler(event: KeyboardEvent): void;
218
- protected _renderRow: RenderItemFunction<T>;
257
+ /** Rebuilt in {@link IgcGridLite.willUpdate}. */
258
+ protected _renderRow: VirtualScrollItemTemplate<T>;
259
+ private _createRowRenderer;
219
260
  protected _renderHeaderRow(): import("lit-html").TemplateResult<1>;
220
261
  protected _renderBody(): import("lit-html").TemplateResult<1>;
221
- protected _renderFilterRow(): import("lit-html").TemplateResult<1>;
262
+ protected _renderFilterRow(): import("lit-html/directive.js").DirectiveResult<typeof import("lit-html/directives/cache.js").CacheDirective>;
222
263
  protected render(): import("lit-html").TemplateResult<1>;
223
264
  }
224
265
  declare global {
@@ -5,21 +5,23 @@ 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 { ContextProvider } from '@lit/context';
8
- import { θaddThemingController as addThemingController, IgcButtonComponent, IgcChipComponent, IgcDropdownComponent, IgcInputComponent, } from 'igniteui-webcomponents';
8
+ import { θaddThemingController as addThemingController, IgcVirtualScrollComponent, } from 'igniteui-webcomponents';
9
9
  import { html, nothing } from 'lit';
10
10
  import { eventOptions, property, state } from 'lit/decorators.js';
11
11
  import { cache } from 'lit/directives/cache.js';
12
12
  import { styleMap } from 'lit/directives/style-map.js';
13
13
  import { createDataOperationsController } from '../controllers/data-operation.js';
14
14
  import { createDomController } from '../controllers/dom.js';
15
+ import { activeNodeFor } from '../controllers/navigation.js';
15
16
  import { createStateController } from '../controllers/state.js';
16
- import { PIPELINE } from '../internal/constants.js';
17
+ import { addA11y, headerRowsFor } from '../internal/a11y.js';
18
+ import { FOCUS_WITHIN, NO_SCROLL, PIPELINE } from '../internal/constants.js';
17
19
  import { COLUMN_UPDATE_CONTEXT, GRID_STATE_CONTEXT } from '../internal/context.js';
18
20
  import { getElementFromEventPath } from '../internal/element-from-event-path.js';
19
21
  import { EventEmitterBase } from '../internal/mixins/event-emitter.js';
20
22
  import { registerComponent } from '../internal/register.js';
21
23
  import { GRID_TAG } from '../internal/tags.js';
22
- import { asArray, getFilterOperandsFor, isNumber, isString } from '../internal/utils.js';
24
+ import { asArray, isNumber, isString, resolveCondition, visibleColumns, } from '../internal/utils.js';
23
25
  import { watch } from '../internal/watch.js';
24
26
  import { styles as base } from '../styles/themes/grid.base.css.js';
25
27
  import { all } from '../styles/themes/grid-themes.js';
@@ -29,27 +31,16 @@ import { IgcGridLiteColumn } from './column.js';
29
31
  import IgcFilterRow from './filter-row.js';
30
32
  import IgcGridLiteHeaderRow from './header-row.js';
31
33
  import IgcGridLiteRow from './row.js';
32
- import IgcVirtualizer from './virtualizer.js';
33
- function columnReducer(acc, el) {
34
- const tag = IgcGridLiteColumn.tagName;
35
- const column = el.matches(tag) ? el : el.querySelector(tag);
36
- if (column)
37
- acc.push(column);
38
- return acc;
39
- }
40
34
  export class IgcGridLite extends EventEmitterBase {
41
35
  static get tagName() {
42
36
  return GRID_TAG;
43
37
  }
44
38
  static { this.styles = [base, shared]; }
45
39
  static register() {
46
- registerComponent(IgcGridLite, IgcGridLiteColumn, IgcVirtualizer, IgcGridLiteRow, IgcGridLiteHeaderRow, IgcFilterRow, IgcButtonComponent, IgcChipComponent, IgcInputComponent, IgcDropdownComponent);
47
- }
48
- _updateObservers() {
49
- this._stateProvider.updateObservers();
40
+ registerComponent(IgcGridLite, IgcGridLiteColumn, IgcVirtualScrollComponent, IgcGridLiteRow, IgcGridLiteHeaderRow);
50
41
  }
51
- _updateConfiguration(config) {
52
- this._stateController.updateColumnsConfiguration(asArray(config));
42
+ get _pipelineComplete() {
43
+ return this.updateComplete.then(() => this._pipelineTask);
53
44
  }
54
45
  set sortingExpressions(expressions) {
55
46
  this._stateController.sorting.reset();
@@ -63,7 +54,7 @@ export class IgcGridLite extends EventEmitterBase {
63
54
  }
64
55
  }
65
56
  get sortingExpressions() {
66
- return Array.from(this._stateController.sorting.state.values());
57
+ return Array.from(this._stateController.sorting.state.values(), (expr) => ({ ...expr }));
67
58
  }
68
59
  set filterExpressions(expressions) {
69
60
  this._stateController.filtering.reset();
@@ -75,13 +66,16 @@ export class IgcGridLite extends EventEmitterBase {
75
66
  }
76
67
  }
77
68
  get filterExpressions() {
78
- return this._stateController.filtering.state.values.flatMap((each) => each.all);
69
+ return this._stateController.filtering.state.values.flatMap((each) => each.all.map((expr) => ({ ...expr })));
70
+ }
71
+ set columns(configuration) {
72
+ this._stateController.setColumnConfiguration(asArray(configuration));
79
73
  }
80
74
  get columns() {
81
75
  return this._stateController.columns.map((col) => ({ ...col }));
82
76
  }
83
77
  get rows() {
84
- return this._stateController.rows;
78
+ return this._domController.rows;
85
79
  }
86
80
  get dataView() {
87
81
  return this._dataState;
@@ -89,22 +83,41 @@ export class IgcGridLite extends EventEmitterBase {
89
83
  get totalItems() {
90
84
  return this._dataState.length;
91
85
  }
86
+ sortingOptionsChanged() {
87
+ this._stateController.updateObservers();
88
+ }
92
89
  dataChanged() {
93
90
  this._dataState = [...this.data];
94
- if (this.hasUpdated) {
95
- if (!this._hasAssignedColumns()) {
96
- this._stateController.setAutoColumnConfiguration();
97
- }
98
- this.pipeline();
91
+ if (!this.hasUpdated) {
92
+ return;
93
+ }
94
+ if (!this._hasAssignedColumns()) {
95
+ this._stateController.setAutoColumnConfiguration();
99
96
  }
97
+ this.pipeline();
100
98
  }
101
- async pipeline() {
102
- this._dataState = await this._dataController.apply([...this.data], this._stateController);
99
+ pipeline() {
100
+ this._pipelineTask = this._runPipeline();
101
+ }
102
+ async _runPipeline() {
103
+ const epoch = ++this._pipelineEpoch;
104
+ try {
105
+ const state = await this._dataController.apply([...this.data], this._stateController);
106
+ if (epoch !== this._pipelineEpoch) {
107
+ return;
108
+ }
109
+ this._dataState = state;
110
+ }
111
+ catch (e) {
112
+ console.error(e);
113
+ }
114
+ await this.updateComplete;
103
115
  }
104
116
  constructor() {
105
117
  super();
106
- this._stateController = createStateController(this, this._updateObservers);
107
- this._domController = createDomController(this, this._stateController);
118
+ this._a11y = addA11y(this, 'grid');
119
+ this._domController = createDomController(this);
120
+ this._stateController = createStateController(this, this._domController, () => this._stateProvider.updateObservers());
108
121
  this._dataController = createDataOperationsController(this);
109
122
  this._stateProvider = new ContextProvider(this, {
110
123
  context: GRID_STATE_CONTEXT,
@@ -113,37 +126,32 @@ export class IgcGridLite extends EventEmitterBase {
113
126
  this._columnUpdateProvider = new ContextProvider(this, {
114
127
  context: COLUMN_UPDATE_CONTEXT,
115
128
  initialValue: ((config) => {
116
- this._updateConfiguration(config);
129
+ this._stateController.updateColumnsConfiguration(asArray(config));
117
130
  }),
118
131
  });
119
132
  this._dataState = [];
133
+ this._pipelineEpoch = 0;
134
+ this._pipelineTask = Promise.resolve();
120
135
  this.adoptRootStyles = false;
121
136
  this.data = [];
122
137
  this.autoGenerate = false;
123
138
  this.sortingOptions = {
124
139
  mode: 'multiple',
125
140
  };
126
- this._renderRow = (item, index) => {
127
- const styles = {
128
- ...this._domController.columnSizes,
129
- ...this._domController.getActiveRowStyles(index),
130
- };
131
- const activeNode = this._stateController.active;
132
- return html `
133
- <igc-grid-lite-row
134
- part="row"
135
- exportparts="cell"
136
- style=${styleMap(styles)}
137
- .adoptRootStyles=${this.adoptRootStyles}
138
- .index=${index}
139
- .activeNode=${activeNode}
140
- .data=${item}
141
- .columns=${this._stateController.columns}
142
- ></igc-grid-lite-row>
143
- `;
144
- };
145
141
  addThemingController(this, all);
146
142
  }
143
+ willUpdate(props) {
144
+ const { columns } = this._stateController;
145
+ this._domController.setColumns(columns);
146
+ this._a11y.set({
147
+ ariaRowCount: `${headerRowsFor(columns) + this._dataState.length}`,
148
+ ariaColCount: `${visibleColumns(columns).length}`,
149
+ });
150
+ if (columns !== this._rowColumns || props.has('adoptRootStyles')) {
151
+ this._rowColumns = columns;
152
+ this._renderRow = this._createRowRenderer(columns);
153
+ }
154
+ }
147
155
  createRenderRoot() {
148
156
  const root = super.createRenderRoot();
149
157
  root.addEventListener('slotchange', this._handleSlotChange.bind(this));
@@ -156,30 +164,27 @@ export class IgcGridLite extends EventEmitterBase {
156
164
  }
157
165
  });
158
166
  }
159
- _hasAssignedColumns() {
167
+ _assignedColumns() {
160
168
  const slot = this.renderRoot.querySelector('slot');
161
- const assignedNodes = slot
169
+ const tag = IgcGridLiteColumn.tagName;
170
+ return slot
162
171
  .assignedElements({ flatten: true })
163
- .reduce(columnReducer, []);
164
- return assignedNodes.length > 0;
172
+ .flatMap((el) => (el.matches(tag) ? el : Array.from(el.querySelectorAll(tag))));
165
173
  }
166
- _handleSlotChange(event) {
167
- const slot = event.target;
168
- const assignedNodes = slot
169
- .assignedElements({ flatten: true })
170
- .reduce(columnReducer, []);
171
- this._stateController.setColumnConfiguration(assignedNodes);
174
+ _hasAssignedColumns() {
175
+ return this._assignedColumns().length > 0;
176
+ }
177
+ _handleSlotChange() {
178
+ this._stateController.setColumnConfiguration(this._assignedColumns());
172
179
  }
173
180
  filter(config) {
174
- const expressions = asArray(config).filter((expr) => {
175
- const column = this.getColumn(expr.key);
176
- return column !== undefined;
177
- });
181
+ const expressions = asArray(config)
182
+ .filter((expr) => this.getColumn(expr.key) !== undefined)
183
+ .map((expr) => ({ ...expr }));
178
184
  for (const expr of expressions) {
179
- if (!isString(expr.condition)) {
180
- continue;
185
+ if (isString(expr.condition)) {
186
+ expr.condition = resolveCondition(this.getColumn(expr.key), expr.condition);
181
187
  }
182
- expr.condition = getFilterOperandsFor(this.getColumn(expr.key))[expr.condition];
183
188
  }
184
189
  this._stateController.filtering.filter(expressions);
185
190
  }
@@ -194,23 +199,44 @@ export class IgcGridLite extends EventEmitterBase {
194
199
  this._stateController.filtering.reset(key);
195
200
  this.requestUpdate(PIPELINE);
196
201
  }
197
- async navigateTo(row, column, activate = false) {
198
- await this._stateController.navigation.navigateTo(row, column, activate);
202
+ async navigateTo(row, columnOrOptions, activate) {
203
+ const options = typeof columnOrOptions === 'object' ? columnOrOptions : { column: columnOrOptions, activate };
204
+ await this._stateController.navigation.navigateTo(row, options);
199
205
  }
200
206
  getColumn(id) {
201
- return this._stateController.columns.find((column, index) => isNumber(id) ? index === id : column.field === id);
207
+ const columns = this._stateController.columns;
208
+ return isNumber(id) ? columns[id] : columns.find((column) => column.field === id);
202
209
  }
203
210
  _bodyClickHandler(event) {
204
211
  const target = getElementFromEventPath(IgcGridLiteCell.tagName, event);
205
- if (target) {
206
- this._stateController.active = { column: target.column.field, row: target.row.index };
212
+ if (!target) {
213
+ return;
214
+ }
215
+ this._stateController.active = { column: target.column.field, row: target.row.index };
216
+ if (!target.matches(FOCUS_WITHIN)) {
217
+ target.focus(NO_SCROLL);
207
218
  }
208
219
  }
209
220
  _bodyKeydownHandler(event) {
210
- if (event.target === this._stateController.virtualizer) {
221
+ const [origin] = event.composedPath();
222
+ if (origin === event.currentTarget || origin instanceof IgcGridLiteCell) {
211
223
  this._stateController.navigation.navigate(event);
212
224
  }
213
225
  }
226
+ _createRowRenderer(columns) {
227
+ return ({ value, index }) => html `
228
+ <igc-grid-lite-row
229
+ part="row"
230
+ exportparts="cell"
231
+ style=${styleMap(this._domController.columnSizes)}
232
+ .adoptRootStyles=${this.adoptRootStyles}
233
+ .index=${index}
234
+ .activeNode=${activeNodeFor(this._stateController.active, index)}
235
+ .data=${value}
236
+ .columns=${columns}
237
+ ></igc-grid-lite-row>
238
+ `;
239
+ }
214
240
  _renderHeaderRow() {
215
241
  return html `
216
242
  <igc-grid-lite-header-row
@@ -223,19 +249,27 @@ export class IgcGridLite extends EventEmitterBase {
223
249
  }
224
250
  _renderBody() {
225
251
  return html `
226
- <igc-virtualizer
252
+ <igc-virtual-scroll
253
+ role="rowgroup"
254
+ .overScan=${10}
227
255
  tabindex="0"
228
- .items=${this._dataState}
229
- .renderItem=${this._renderRow}
256
+ .data=${this._dataState}
257
+ .itemTemplate=${this._renderRow}
230
258
  @click=${this._bodyClickHandler}
231
259
  @keydown=${this._bodyKeydownHandler}
232
- ></igc-virtualizer>
260
+ ></igc-virtual-scroll>
233
261
  `;
234
262
  }
235
263
  _renderFilterRow() {
236
- return html `${cache(this._stateController.columns.some((column) => column.filterable)
237
- ? html `<igc-filter-row style=${styleMap(this._domController.columnSizes)}></igc-filter-row>`
238
- : nothing)}`;
264
+ const filterable = this._stateController.columns.some((column) => column.filterable);
265
+ if (filterable) {
266
+ IgcFilterRow.register();
267
+ }
268
+ return cache(filterable
269
+ ? html `<igc-grid-lite-filter-row
270
+ style=${styleMap(this._domController.columnSizes)}
271
+ ></igc-grid-lite-filter-row>`
272
+ : nothing);
239
273
  }
240
274
  render() {
241
275
  return html `
@@ -269,6 +303,9 @@ __decorate([
269
303
  __decorate([
270
304
  property({ attribute: false })
271
305
  ], IgcGridLite.prototype, "filterExpressions", null);
306
+ __decorate([
307
+ watch('sortingOptions', { waitUntilFirstUpdate: true })
308
+ ], IgcGridLite.prototype, "sortingOptionsChanged", null);
272
309
  __decorate([
273
310
  watch('data')
274
311
  ], IgcGridLite.prototype, "dataChanged", null);