@furystack/shades-common-components 13.5.0 → 15.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.
- package/CHANGELOG.md +109 -0
- package/README.md +3 -3
- package/esm/components/accordion/accordion-item.d.ts.map +1 -1
- package/esm/components/accordion/accordion-item.js +7 -10
- package/esm/components/accordion/accordion-item.js.map +1 -1
- package/esm/components/accordion/accordion.d.ts +7 -0
- package/esm/components/accordion/accordion.d.ts.map +1 -1
- package/esm/components/accordion/accordion.js +5 -2
- package/esm/components/accordion/accordion.js.map +1 -1
- package/esm/components/accordion/accordion.spec.js +91 -50
- package/esm/components/accordion/accordion.spec.js.map +1 -1
- package/esm/components/alert.js +1 -1
- package/esm/components/alert.js.map +1 -1
- package/esm/components/app-bar-link.js +1 -1
- package/esm/components/app-bar-link.js.map +1 -1
- package/esm/components/app-bar.js +1 -1
- package/esm/components/app-bar.js.map +1 -1
- package/esm/components/avatar.js +1 -1
- package/esm/components/avatar.js.map +1 -1
- package/esm/components/badge.js +1 -1
- package/esm/components/badge.js.map +1 -1
- package/esm/components/breadcrumb.js +1 -1
- package/esm/components/breadcrumb.js.map +1 -1
- package/esm/components/breadcrumb.spec.js +3 -3
- package/esm/components/breadcrumb.spec.js.map +1 -1
- package/esm/components/button-group.js +4 -4
- package/esm/components/button-group.js.map +1 -1
- package/esm/components/button.js +1 -1
- package/esm/components/button.js.map +1 -1
- package/esm/components/button.spec.js +1 -1
- package/esm/components/button.spec.js.map +1 -1
- package/esm/components/cache-view.js +1 -1
- package/esm/components/cache-view.js.map +1 -1
- package/esm/components/cache-view.spec.js +2 -2
- package/esm/components/cache-view.spec.js.map +1 -1
- package/esm/components/card.js +5 -5
- package/esm/components/card.js.map +1 -1
- package/esm/components/carousel.js +2 -2
- package/esm/components/carousel.js.map +1 -1
- package/esm/components/chip.d.ts.map +1 -1
- package/esm/components/chip.js +5 -3
- package/esm/components/chip.js.map +1 -1
- package/esm/components/chip.spec.js +42 -0
- package/esm/components/chip.spec.js.map +1 -1
- package/esm/components/circular-progress.d.ts +2 -4
- package/esm/components/circular-progress.d.ts.map +1 -1
- package/esm/components/circular-progress.js +3 -6
- package/esm/components/circular-progress.js.map +1 -1
- package/esm/components/circular-progress.spec.js +19 -14
- package/esm/components/circular-progress.spec.js.map +1 -1
- package/esm/components/command-palette/command-palette-input.js +1 -1
- package/esm/components/command-palette/command-palette-input.js.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.js +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.js.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
- package/esm/components/command-palette/index.d.ts.map +1 -1
- package/esm/components/command-palette/index.js +15 -2
- package/esm/components/command-palette/index.js.map +1 -1
- package/esm/components/command-palette/index.spec.js +78 -33
- package/esm/components/command-palette/index.spec.js.map +1 -1
- package/esm/components/context-menu/context-menu-item.js +1 -1
- package/esm/components/context-menu/context-menu-item.js.map +1 -1
- package/esm/components/context-menu/context-menu.js +1 -1
- package/esm/components/context-menu/context-menu.js.map +1 -1
- package/esm/components/data-grid/body.js +1 -1
- package/esm/components/data-grid/body.js.map +1 -1
- package/esm/components/data-grid/data-grid-row.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid-row.js +19 -3
- package/esm/components/data-grid/data-grid-row.js.map +1 -1
- package/esm/components/data-grid/data-grid.d.ts +12 -2
- package/esm/components/data-grid/data-grid.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid.js +33 -13
- package/esm/components/data-grid/data-grid.js.map +1 -1
- package/esm/components/data-grid/data-grid.spec.js +170 -90
- package/esm/components/data-grid/data-grid.spec.js.map +1 -1
- package/esm/components/data-grid/filters/boolean-filter.d.ts +2 -2
- package/esm/components/data-grid/filters/boolean-filter.d.ts.map +1 -1
- package/esm/components/data-grid/filters/boolean-filter.js +4 -4
- package/esm/components/data-grid/filters/boolean-filter.js.map +1 -1
- package/esm/components/data-grid/filters/boolean-filter.spec.js +18 -17
- package/esm/components/data-grid/filters/boolean-filter.spec.js.map +1 -1
- package/esm/components/data-grid/filters/date-filter.d.ts +2 -2
- package/esm/components/data-grid/filters/date-filter.d.ts.map +1 -1
- package/esm/components/data-grid/filters/date-filter.js +6 -6
- package/esm/components/data-grid/filters/date-filter.js.map +1 -1
- package/esm/components/data-grid/filters/date-filter.spec.js +26 -21
- package/esm/components/data-grid/filters/date-filter.spec.js.map +1 -1
- package/esm/components/data-grid/filters/enum-filter.d.ts +2 -2
- package/esm/components/data-grid/filters/enum-filter.d.ts.map +1 -1
- package/esm/components/data-grid/filters/enum-filter.js +5 -5
- package/esm/components/data-grid/filters/enum-filter.js.map +1 -1
- package/esm/components/data-grid/filters/enum-filter.spec.js +21 -19
- package/esm/components/data-grid/filters/enum-filter.spec.js.map +1 -1
- package/esm/components/data-grid/filters/filter-dropdown.js +1 -1
- package/esm/components/data-grid/filters/filter-dropdown.js.map +1 -1
- package/esm/components/data-grid/filters/number-filter.d.ts +2 -2
- package/esm/components/data-grid/filters/number-filter.d.ts.map +1 -1
- package/esm/components/data-grid/filters/number-filter.js +5 -5
- package/esm/components/data-grid/filters/number-filter.js.map +1 -1
- package/esm/components/data-grid/filters/number-filter.spec.js +23 -21
- package/esm/components/data-grid/filters/number-filter.spec.js.map +1 -1
- package/esm/components/data-grid/filters/string-filter.d.ts +2 -2
- package/esm/components/data-grid/filters/string-filter.d.ts.map +1 -1
- package/esm/components/data-grid/filters/string-filter.js +5 -5
- package/esm/components/data-grid/filters/string-filter.js.map +1 -1
- package/esm/components/data-grid/filters/string-filter.spec.js +21 -19
- package/esm/components/data-grid/filters/string-filter.spec.js.map +1 -1
- package/esm/components/data-grid/footer.d.ts +2 -2
- package/esm/components/data-grid/footer.d.ts.map +1 -1
- package/esm/components/data-grid/footer.js +8 -13
- package/esm/components/data-grid/footer.js.map +1 -1
- package/esm/components/data-grid/footer.spec.js +38 -27
- package/esm/components/data-grid/footer.spec.js.map +1 -1
- package/esm/components/data-grid/header.d.ts +6 -6
- package/esm/components/data-grid/header.d.ts.map +1 -1
- package/esm/components/data-grid/header.js +16 -17
- package/esm/components/data-grid/header.js.map +1 -1
- package/esm/components/data-grid/header.spec.js +66 -60
- package/esm/components/data-grid/header.spec.js.map +1 -1
- package/esm/components/data-grid/selection-cell.d.ts.map +1 -1
- package/esm/components/data-grid/selection-cell.js +2 -2
- package/esm/components/data-grid/selection-cell.js.map +1 -1
- package/esm/components/dialog.d.ts +11 -0
- package/esm/components/dialog.d.ts.map +1 -1
- package/esm/components/dialog.js +3 -3
- package/esm/components/dialog.js.map +1 -1
- package/esm/components/dialog.spec.js +54 -2
- package/esm/components/dialog.spec.js.map +1 -1
- package/esm/components/divider.js +1 -1
- package/esm/components/divider.js.map +1 -1
- package/esm/components/drawer/drawer-toggle-button.js +1 -1
- package/esm/components/drawer/drawer-toggle-button.js.map +1 -1
- package/esm/components/drawer/index.js +1 -1
- package/esm/components/drawer/index.js.map +1 -1
- package/esm/components/dropdown.d.ts.map +1 -1
- package/esm/components/dropdown.js +2 -2
- package/esm/components/dropdown.js.map +1 -1
- package/esm/components/dropdown.spec.js +8 -0
- package/esm/components/dropdown.spec.js.map +1 -1
- package/esm/components/fab.js +1 -1
- package/esm/components/fab.js.map +1 -1
- package/esm/components/form.js +1 -1
- package/esm/components/form.js.map +1 -1
- package/esm/components/grid.js +1 -1
- package/esm/components/grid.js.map +1 -1
- package/esm/components/icons/icon.js +1 -1
- package/esm/components/icons/icon.js.map +1 -1
- package/esm/components/image.d.ts.map +1 -1
- package/esm/components/image.js +17 -8
- package/esm/components/image.js.map +1 -1
- package/esm/components/image.spec.js +60 -0
- package/esm/components/image.spec.js.map +1 -1
- package/esm/components/inputs/autocomplete.js +1 -1
- package/esm/components/inputs/autocomplete.js.map +1 -1
- package/esm/components/inputs/checkbox.d.ts.map +1 -1
- package/esm/components/inputs/checkbox.js +2 -1
- package/esm/components/inputs/checkbox.js.map +1 -1
- package/esm/components/inputs/checkbox.spec.js +1 -1
- package/esm/components/inputs/checkbox.spec.js.map +1 -1
- package/esm/components/inputs/input-number.js +1 -1
- package/esm/components/inputs/input-number.js.map +1 -1
- package/esm/components/inputs/input-number.spec.js +1 -1
- package/esm/components/inputs/input-number.spec.js.map +1 -1
- package/esm/components/inputs/input.js +1 -1
- package/esm/components/inputs/input.js.map +1 -1
- package/esm/components/inputs/input.spec.js +1 -1
- package/esm/components/inputs/input.spec.js.map +1 -1
- package/esm/components/inputs/radio-group.js +1 -1
- package/esm/components/inputs/radio-group.js.map +1 -1
- package/esm/components/inputs/radio-group.spec.js +1 -1
- package/esm/components/inputs/radio-group.spec.js.map +1 -1
- package/esm/components/inputs/radio.d.ts.map +1 -1
- package/esm/components/inputs/radio.js +2 -1
- package/esm/components/inputs/radio.js.map +1 -1
- package/esm/components/inputs/radio.spec.js +1 -1
- package/esm/components/inputs/radio.spec.js.map +1 -1
- package/esm/components/inputs/select.js +1 -1
- package/esm/components/inputs/select.js.map +1 -1
- package/esm/components/inputs/slider.d.ts.map +1 -1
- package/esm/components/inputs/slider.js +2 -1
- package/esm/components/inputs/slider.js.map +1 -1
- package/esm/components/inputs/switch.d.ts.map +1 -1
- package/esm/components/inputs/switch.js +2 -1
- package/esm/components/inputs/switch.js.map +1 -1
- package/esm/components/inputs/switch.spec.js +1 -1
- package/esm/components/inputs/switch.spec.js.map +1 -1
- package/esm/components/inputs/text-area.js +1 -1
- package/esm/components/inputs/text-area.js.map +1 -1
- package/esm/components/inputs/text-area.spec.js +1 -1
- package/esm/components/inputs/text-area.spec.js.map +1 -1
- package/esm/components/linear-progress.d.ts +2 -4
- package/esm/components/linear-progress.d.ts.map +1 -1
- package/esm/components/linear-progress.js +3 -6
- package/esm/components/linear-progress.js.map +1 -1
- package/esm/components/linear-progress.spec.js +21 -18
- package/esm/components/linear-progress.spec.js.map +1 -1
- package/esm/components/list/list-item.d.ts.map +1 -1
- package/esm/components/list/list-item.js +22 -6
- package/esm/components/list/list-item.js.map +1 -1
- package/esm/components/list/list.d.ts +7 -0
- package/esm/components/list/list.d.ts.map +1 -1
- package/esm/components/list/list.js +29 -9
- package/esm/components/list/list.js.map +1 -1
- package/esm/components/list/list.spec.js +117 -23
- package/esm/components/list/list.spec.js.map +1 -1
- package/esm/components/loader.js +1 -1
- package/esm/components/loader.js.map +1 -1
- package/esm/components/loader.spec.js +1 -1
- package/esm/components/loader.spec.js.map +1 -1
- package/esm/components/markdown/markdown-display.d.ts.map +1 -1
- package/esm/components/markdown/markdown-display.js +12 -2
- package/esm/components/markdown/markdown-display.js.map +1 -1
- package/esm/components/markdown/markdown-display.spec.js +98 -1
- package/esm/components/markdown/markdown-display.spec.js.map +1 -1
- package/esm/components/markdown/markdown-editor.js +1 -1
- package/esm/components/markdown/markdown-editor.js.map +1 -1
- package/esm/components/markdown/markdown-editor.spec.js +88 -1
- package/esm/components/markdown/markdown-editor.spec.js.map +1 -1
- package/esm/components/markdown/markdown-input.js +1 -1
- package/esm/components/markdown/markdown-input.js.map +1 -1
- package/esm/components/markdown/markdown-input.spec.js +1 -1
- package/esm/components/markdown/markdown-input.spec.js.map +1 -1
- package/esm/components/menu/menu.js +2 -2
- package/esm/components/menu/menu.js.map +1 -1
- package/esm/components/modal.d.ts +10 -0
- package/esm/components/modal.d.ts.map +1 -1
- package/esm/components/modal.js +25 -5
- package/esm/components/modal.js.map +1 -1
- package/esm/components/modal.spec.js +89 -4
- package/esm/components/modal.spec.js.map +1 -1
- package/esm/components/noty-list.js +2 -2
- package/esm/components/noty-list.js.map +1 -1
- package/esm/components/page-container/index.js +1 -1
- package/esm/components/page-container/index.js.map +1 -1
- package/esm/components/page-container/page-header.js +1 -1
- package/esm/components/page-container/page-header.js.map +1 -1
- package/esm/components/page-layout/index.js +2 -2
- package/esm/components/page-layout/index.js.map +1 -1
- package/esm/components/page-layout/index.spec.js +14 -0
- package/esm/components/page-layout/index.spec.js.map +1 -1
- package/esm/components/pagination.js +1 -1
- package/esm/components/pagination.js.map +1 -1
- package/esm/components/paper.js +1 -1
- package/esm/components/paper.js.map +1 -1
- package/esm/components/rating.d.ts.map +1 -1
- package/esm/components/rating.js +29 -22
- package/esm/components/rating.js.map +1 -1
- package/esm/components/rating.spec.js +152 -5
- package/esm/components/rating.spec.js.map +1 -1
- package/esm/components/result.js +1 -1
- package/esm/components/result.js.map +1 -1
- package/esm/components/skeleton.js +1 -1
- package/esm/components/skeleton.js.map +1 -1
- package/esm/components/suggest/index.d.ts.map +1 -1
- package/esm/components/suggest/index.js +15 -2
- package/esm/components/suggest/index.js.map +1 -1
- package/esm/components/suggest/index.spec.js +99 -44
- package/esm/components/suggest/index.spec.js.map +1 -1
- package/esm/components/suggest/suggest-input.js +1 -1
- package/esm/components/suggest/suggest-input.js.map +1 -1
- package/esm/components/suggest/suggest-input.spec.js +1 -1
- package/esm/components/suggest/suggest-input.spec.js.map +1 -1
- package/esm/components/suggest/suggestion-list.js +1 -1
- package/esm/components/suggest/suggestion-list.js.map +1 -1
- package/esm/components/suggest/suggestion-list.spec.js +1 -1
- package/esm/components/suggest/suggestion-list.spec.js.map +1 -1
- package/esm/components/tabs.d.ts.map +1 -1
- package/esm/components/tabs.js +6 -2
- package/esm/components/tabs.js.map +1 -1
- package/esm/components/timeline.js +2 -2
- package/esm/components/timeline.js.map +1 -1
- package/esm/components/tooltip.js +1 -1
- package/esm/components/tooltip.js.map +1 -1
- package/esm/components/tree/tree-item.d.ts.map +1 -1
- package/esm/components/tree/tree-item.js +19 -6
- package/esm/components/tree/tree-item.js.map +1 -1
- package/esm/components/tree/tree.d.ts +7 -0
- package/esm/components/tree/tree.d.ts.map +1 -1
- package/esm/components/tree/tree.js +13 -4
- package/esm/components/tree/tree.js.map +1 -1
- package/esm/components/tree/tree.spec.js +64 -2
- package/esm/components/tree/tree.spec.js.map +1 -1
- package/esm/components/typography.js +1 -1
- package/esm/components/typography.js.map +1 -1
- package/esm/components/wizard/index.js +1 -1
- package/esm/components/wizard/index.js.map +1 -1
- package/esm/components/wizard/index.spec.js +3 -3
- package/esm/components/wizard/index.spec.js.map +1 -1
- package/esm/services/collection-service.d.ts +9 -0
- package/esm/services/collection-service.d.ts.map +1 -1
- package/esm/services/collection-service.js +33 -11
- package/esm/services/collection-service.js.map +1 -1
- package/esm/services/collection-service.spec.js +33 -24
- package/esm/services/collection-service.spec.js.map +1 -1
- package/esm/services/css-variable-theme.d.ts +7 -0
- package/esm/services/css-variable-theme.d.ts.map +1 -1
- package/esm/services/css-variable-theme.js +23 -0
- package/esm/services/css-variable-theme.js.map +1 -1
- package/esm/services/css-variable-theme.spec.js +1 -0
- package/esm/services/css-variable-theme.spec.js.map +1 -1
- package/esm/services/list-service.d.ts +9 -0
- package/esm/services/list-service.d.ts.map +1 -1
- package/esm/services/list-service.js +13 -13
- package/esm/services/list-service.js.map +1 -1
- package/esm/services/list-service.spec.js +13 -33
- package/esm/services/list-service.spec.js.map +1 -1
- package/esm/services/theme-provider-service.d.ts +3 -0
- package/esm/services/theme-provider-service.d.ts.map +1 -1
- package/esm/services/theme-provider-service.js.map +1 -1
- package/esm/services/tree-service.d.ts.map +1 -1
- package/esm/services/tree-service.js +5 -9
- package/esm/services/tree-service.js.map +1 -1
- package/esm/services/tree-service.spec.js +12 -9
- package/esm/services/tree-service.spec.js.map +1 -1
- package/esm/themes/architect-theme.d.ts +1 -0
- package/esm/themes/architect-theme.d.ts.map +1 -1
- package/esm/themes/architect-theme.js +1 -0
- package/esm/themes/architect-theme.js.map +1 -1
- package/esm/themes/auditore-theme.d.ts +1 -0
- package/esm/themes/auditore-theme.d.ts.map +1 -1
- package/esm/themes/auditore-theme.js +1 -0
- package/esm/themes/auditore-theme.js.map +1 -1
- package/esm/themes/black-mesa-theme.d.ts +1 -0
- package/esm/themes/black-mesa-theme.d.ts.map +1 -1
- package/esm/themes/black-mesa-theme.js +1 -0
- package/esm/themes/black-mesa-theme.js.map +1 -1
- package/esm/themes/chieftain-theme.d.ts +1 -0
- package/esm/themes/chieftain-theme.d.ts.map +1 -1
- package/esm/themes/chieftain-theme.js +1 -0
- package/esm/themes/chieftain-theme.js.map +1 -1
- package/esm/themes/default-dark-theme.d.ts +1 -0
- package/esm/themes/default-dark-theme.d.ts.map +1 -1
- package/esm/themes/default-dark-theme.js +1 -0
- package/esm/themes/default-dark-theme.js.map +1 -1
- package/esm/themes/default-light-theme.d.ts +1 -0
- package/esm/themes/default-light-theme.d.ts.map +1 -1
- package/esm/themes/default-light-theme.js +1 -0
- package/esm/themes/default-light-theme.js.map +1 -1
- package/esm/themes/dragonborn-theme.d.ts +1 -0
- package/esm/themes/dragonborn-theme.d.ts.map +1 -1
- package/esm/themes/dragonborn-theme.js +1 -0
- package/esm/themes/dragonborn-theme.js.map +1 -1
- package/esm/themes/hawkins-theme.d.ts +1 -0
- package/esm/themes/hawkins-theme.d.ts.map +1 -1
- package/esm/themes/hawkins-theme.js +1 -0
- package/esm/themes/hawkins-theme.js.map +1 -1
- package/esm/themes/jedi-theme.d.ts +1 -0
- package/esm/themes/jedi-theme.d.ts.map +1 -1
- package/esm/themes/jedi-theme.js +1 -0
- package/esm/themes/jedi-theme.js.map +1 -1
- package/esm/themes/neon-runner-theme.d.ts +1 -0
- package/esm/themes/neon-runner-theme.d.ts.map +1 -1
- package/esm/themes/neon-runner-theme.js +1 -0
- package/esm/themes/neon-runner-theme.js.map +1 -1
- package/esm/themes/paladin-theme.d.ts +1 -0
- package/esm/themes/paladin-theme.d.ts.map +1 -1
- package/esm/themes/paladin-theme.js +1 -0
- package/esm/themes/paladin-theme.js.map +1 -1
- package/esm/themes/plumber-theme.d.ts +1 -0
- package/esm/themes/plumber-theme.d.ts.map +1 -1
- package/esm/themes/plumber-theme.js +1 -0
- package/esm/themes/plumber-theme.js.map +1 -1
- package/esm/themes/replicant-theme.d.ts +1 -0
- package/esm/themes/replicant-theme.d.ts.map +1 -1
- package/esm/themes/replicant-theme.js +1 -0
- package/esm/themes/replicant-theme.js.map +1 -1
- package/esm/themes/sandworm-theme.d.ts +1 -0
- package/esm/themes/sandworm-theme.d.ts.map +1 -1
- package/esm/themes/sandworm-theme.js +1 -0
- package/esm/themes/sandworm-theme.js.map +1 -1
- package/esm/themes/shadow-broker-theme.d.ts +1 -0
- package/esm/themes/shadow-broker-theme.d.ts.map +1 -1
- package/esm/themes/shadow-broker-theme.js +1 -0
- package/esm/themes/shadow-broker-theme.js.map +1 -1
- package/esm/themes/sith-theme.d.ts +1 -0
- package/esm/themes/sith-theme.d.ts.map +1 -1
- package/esm/themes/sith-theme.js +1 -0
- package/esm/themes/sith-theme.js.map +1 -1
- package/esm/themes/vault-dweller-theme.d.ts +1 -0
- package/esm/themes/vault-dweller-theme.d.ts.map +1 -1
- package/esm/themes/vault-dweller-theme.js +1 -0
- package/esm/themes/vault-dweller-theme.js.map +1 -1
- package/esm/themes/wild-hunt-theme.d.ts +1 -0
- package/esm/themes/wild-hunt-theme.d.ts.map +1 -1
- package/esm/themes/wild-hunt-theme.js +1 -0
- package/esm/themes/wild-hunt-theme.js.map +1 -1
- package/esm/themes/xenomorph-theme.d.ts +1 -0
- package/esm/themes/xenomorph-theme.d.ts.map +1 -1
- package/esm/themes/xenomorph-theme.js +1 -0
- package/esm/themes/xenomorph-theme.js.map +1 -1
- package/package.json +3 -3
- package/src/components/accordion/accordion-item.tsx +10 -15
- package/src/components/accordion/accordion.spec.tsx +134 -79
- package/src/components/accordion/accordion.tsx +14 -2
- package/src/components/alert.tsx +1 -1
- package/src/components/app-bar-link.tsx +1 -1
- package/src/components/app-bar.tsx +1 -1
- package/src/components/avatar.tsx +1 -1
- package/src/components/badge.tsx +1 -1
- package/src/components/breadcrumb.spec.tsx +3 -3
- package/src/components/breadcrumb.tsx +1 -1
- package/src/components/button-group.tsx +4 -4
- package/src/components/button.spec.tsx +1 -1
- package/src/components/button.tsx +1 -1
- package/src/components/cache-view.spec.tsx +2 -2
- package/src/components/cache-view.tsx +3 -3
- package/src/components/card.tsx +5 -5
- package/src/components/carousel.tsx +2 -2
- package/src/components/chip.spec.tsx +64 -0
- package/src/components/chip.tsx +5 -2
- package/src/components/circular-progress.spec.tsx +20 -14
- package/src/components/circular-progress.tsx +5 -11
- package/src/components/command-palette/command-palette-input.tsx +1 -1
- package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +1 -1
- package/src/components/command-palette/command-palette-suggestion-list.tsx +1 -1
- package/src/components/command-palette/index.spec.tsx +95 -33
- package/src/components/command-palette/index.tsx +16 -4
- package/src/components/context-menu/context-menu-item.tsx +1 -1
- package/src/components/context-menu/context-menu.tsx +1 -1
- package/src/components/data-grid/body.tsx +1 -1
- package/src/components/data-grid/data-grid-row.tsx +21 -3
- package/src/components/data-grid/data-grid.spec.tsx +246 -92
- package/src/components/data-grid/data-grid.tsx +52 -21
- package/src/components/data-grid/filters/boolean-filter.spec.tsx +29 -18
- package/src/components/data-grid/filters/boolean-filter.tsx +6 -6
- package/src/components/data-grid/filters/date-filter.spec.tsx +35 -22
- package/src/components/data-grid/filters/date-filter.tsx +8 -8
- package/src/components/data-grid/filters/enum-filter.spec.tsx +35 -20
- package/src/components/data-grid/filters/enum-filter.tsx +7 -7
- package/src/components/data-grid/filters/filter-dropdown.tsx +1 -1
- package/src/components/data-grid/filters/number-filter.spec.tsx +32 -22
- package/src/components/data-grid/filters/number-filter.tsx +7 -7
- package/src/components/data-grid/filters/string-filter.spec.tsx +32 -20
- package/src/components/data-grid/filters/string-filter.tsx +7 -7
- package/src/components/data-grid/footer.spec.tsx +79 -31
- package/src/components/data-grid/footer.tsx +10 -15
- package/src/components/data-grid/header.spec.tsx +152 -68
- package/src/components/data-grid/header.tsx +64 -27
- package/src/components/data-grid/selection-cell.tsx +2 -1
- package/src/components/dialog.spec.tsx +77 -2
- package/src/components/dialog.tsx +15 -2
- package/src/components/divider.tsx +1 -1
- package/src/components/drawer/drawer-toggle-button.tsx +1 -1
- package/src/components/drawer/index.tsx +1 -1
- package/src/components/dropdown.spec.tsx +9 -0
- package/src/components/dropdown.tsx +2 -1
- package/src/components/fab.tsx +1 -1
- package/src/components/form.tsx +1 -1
- package/src/components/grid.tsx +1 -1
- package/src/components/icons/icon.tsx +1 -1
- package/src/components/image.spec.tsx +82 -0
- package/src/components/image.tsx +18 -9
- package/src/components/inputs/autocomplete.tsx +1 -1
- package/src/components/inputs/checkbox.spec.tsx +1 -1
- package/src/components/inputs/checkbox.tsx +2 -1
- package/src/components/inputs/input-number.spec.tsx +1 -1
- package/src/components/inputs/input-number.tsx +1 -1
- package/src/components/inputs/input.spec.tsx +1 -1
- package/src/components/inputs/input.tsx +1 -1
- package/src/components/inputs/radio-group.spec.tsx +1 -1
- package/src/components/inputs/radio-group.tsx +1 -1
- package/src/components/inputs/radio.spec.tsx +1 -1
- package/src/components/inputs/radio.tsx +2 -1
- package/src/components/inputs/select.tsx +1 -1
- package/src/components/inputs/slider.tsx +2 -1
- package/src/components/inputs/switch.spec.tsx +1 -1
- package/src/components/inputs/switch.tsx +2 -1
- package/src/components/inputs/text-area.spec.tsx +1 -1
- package/src/components/inputs/text-area.tsx +1 -1
- package/src/components/linear-progress.spec.tsx +22 -18
- package/src/components/linear-progress.tsx +5 -11
- package/src/components/list/list-item.tsx +23 -5
- package/src/components/list/list.spec.tsx +165 -32
- package/src/components/list/list.tsx +38 -11
- package/src/components/loader.spec.tsx +1 -1
- package/src/components/loader.tsx +1 -1
- package/src/components/markdown/markdown-display.spec.tsx +133 -1
- package/src/components/markdown/markdown-display.tsx +13 -2
- package/src/components/markdown/markdown-editor.spec.tsx +124 -1
- package/src/components/markdown/markdown-editor.tsx +1 -1
- package/src/components/markdown/markdown-input.spec.tsx +1 -1
- package/src/components/markdown/markdown-input.tsx +1 -1
- package/src/components/menu/menu.tsx +2 -2
- package/src/components/modal.spec.tsx +127 -4
- package/src/components/modal.tsx +42 -4
- package/src/components/noty-list.tsx +2 -2
- package/src/components/page-container/index.tsx +1 -1
- package/src/components/page-container/page-header.tsx +1 -1
- package/src/components/page-layout/index.spec.tsx +20 -0
- package/src/components/page-layout/index.tsx +2 -2
- package/src/components/pagination.tsx +1 -1
- package/src/components/paper.tsx +1 -1
- package/src/components/rating.spec.tsx +200 -5
- package/src/components/rating.tsx +29 -23
- package/src/components/result.tsx +1 -1
- package/src/components/skeleton.tsx +1 -1
- package/src/components/suggest/index.spec.tsx +148 -44
- package/src/components/suggest/index.tsx +16 -3
- package/src/components/suggest/suggest-input.spec.tsx +1 -1
- package/src/components/suggest/suggest-input.tsx +1 -1
- package/src/components/suggest/suggestion-list.spec.tsx +1 -1
- package/src/components/suggest/suggestion-list.tsx +1 -1
- package/src/components/tabs.tsx +6 -2
- package/src/components/timeline.tsx +2 -2
- package/src/components/tooltip.tsx +1 -1
- package/src/components/tree/tree-item.tsx +20 -5
- package/src/components/tree/tree.spec.tsx +101 -2
- package/src/components/tree/tree.tsx +22 -4
- package/src/components/typography.tsx +1 -1
- package/src/components/wizard/index.spec.tsx +3 -3
- package/src/components/wizard/index.tsx +1 -1
- package/src/services/collection-service.spec.ts +33 -24
- package/src/services/collection-service.ts +35 -13
- package/src/services/css-variable-theme.spec.ts +1 -0
- package/src/services/css-variable-theme.ts +25 -0
- package/src/services/list-service.spec.ts +13 -42
- package/src/services/list-service.ts +15 -13
- package/src/services/theme-provider-service.ts +2 -0
- package/src/services/tree-service.spec.ts +12 -9
- package/src/services/tree-service.ts +5 -8
- package/src/themes/architect-theme.ts +1 -0
- package/src/themes/auditore-theme.ts +1 -0
- package/src/themes/black-mesa-theme.ts +1 -0
- package/src/themes/chieftain-theme.ts +1 -0
- package/src/themes/default-dark-theme.ts +1 -0
- package/src/themes/default-light-theme.ts +1 -0
- package/src/themes/dragonborn-theme.ts +1 -0
- package/src/themes/hawkins-theme.ts +1 -0
- package/src/themes/jedi-theme.ts +1 -0
- package/src/themes/neon-runner-theme.ts +1 -0
- package/src/themes/paladin-theme.ts +1 -0
- package/src/themes/plumber-theme.ts +1 -0
- package/src/themes/replicant-theme.ts +1 -0
- package/src/themes/sandworm-theme.ts +1 -0
- package/src/themes/shadow-broker-theme.ts +1 -0
- package/src/themes/sith-theme.ts +1 -0
- package/src/themes/vault-dweller-theme.ts +1 -0
- package/src/themes/wild-hunt-theme.ts +1 -0
- package/src/themes/xenomorph-theme.ts +1 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject';
|
|
2
2
|
import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades';
|
|
3
|
-
import {
|
|
3
|
+
import { usingAsync } from '@furystack/utils';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
5
|
import { CollectionService } from '../../services/collection-service.js';
|
|
6
6
|
import { DataGrid } from './data-grid.js';
|
|
@@ -26,20 +26,20 @@ describe('DataGrid', () => {
|
|
|
26
26
|
const withTestGrid = async (fn, opts) => {
|
|
27
27
|
await usingAsync(new Injector(), async (injector) => {
|
|
28
28
|
await usingAsync(opts?.createService?.() ?? createTestService(), async (service) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
});
|
|
29
|
+
const findOptions = {};
|
|
30
|
+
const onFindOptionsChange = vi.fn();
|
|
31
|
+
await fn({ injector, service, findOptions, onFindOptionsChange });
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
};
|
|
35
35
|
describe('rendering', () => {
|
|
36
36
|
it('should render with columns', async () => {
|
|
37
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
37
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
38
38
|
const rootElement = document.getElementById('root');
|
|
39
39
|
initializeShadeRoot({
|
|
40
40
|
injector,
|
|
41
41
|
rootElement,
|
|
42
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
42
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
43
43
|
});
|
|
44
44
|
await flushUpdates();
|
|
45
45
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -49,12 +49,12 @@ describe('DataGrid', () => {
|
|
|
49
49
|
});
|
|
50
50
|
});
|
|
51
51
|
it('should render table structure', async () => {
|
|
52
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
52
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
53
53
|
const rootElement = document.getElementById('root');
|
|
54
54
|
initializeShadeRoot({
|
|
55
55
|
injector,
|
|
56
56
|
rootElement,
|
|
57
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
57
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
58
58
|
});
|
|
59
59
|
await flushUpdates();
|
|
60
60
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -67,12 +67,12 @@ describe('DataGrid', () => {
|
|
|
67
67
|
});
|
|
68
68
|
});
|
|
69
69
|
it('should render custom header components when provided', async () => {
|
|
70
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
70
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
71
71
|
const rootElement = document.getElementById('root');
|
|
72
72
|
initializeShadeRoot({
|
|
73
73
|
injector,
|
|
74
74
|
rootElement,
|
|
75
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {
|
|
75
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {
|
|
76
76
|
id: () => createComponent("span", { "data-testid": "custom-header-id" }, "Custom ID Header"),
|
|
77
77
|
}, rowComponents: {} })),
|
|
78
78
|
});
|
|
@@ -84,12 +84,12 @@ describe('DataGrid', () => {
|
|
|
84
84
|
});
|
|
85
85
|
});
|
|
86
86
|
it('should render default header components from headerComponents.default', async () => {
|
|
87
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
87
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
88
88
|
const rootElement = document.getElementById('root');
|
|
89
89
|
initializeShadeRoot({
|
|
90
90
|
injector,
|
|
91
91
|
rootElement,
|
|
92
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {
|
|
92
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {
|
|
93
93
|
default: (name) => createComponent("span", { "data-testid": `default-header-${name}` },
|
|
94
94
|
"Default: ",
|
|
95
95
|
name),
|
|
@@ -104,12 +104,12 @@ describe('DataGrid', () => {
|
|
|
104
104
|
});
|
|
105
105
|
});
|
|
106
106
|
it('should render DataGridHeader when no custom header is provided', async () => {
|
|
107
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
107
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
108
108
|
const rootElement = document.getElementById('root');
|
|
109
109
|
initializeShadeRoot({
|
|
110
110
|
injector,
|
|
111
111
|
rootElement,
|
|
112
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
112
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
113
113
|
});
|
|
114
114
|
await flushUpdates();
|
|
115
115
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -118,12 +118,12 @@ describe('DataGrid', () => {
|
|
|
118
118
|
});
|
|
119
119
|
});
|
|
120
120
|
it('should render filter buttons when columnFilters are provided', async () => {
|
|
121
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
121
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
122
122
|
const rootElement = document.getElementById('root');
|
|
123
123
|
initializeShadeRoot({
|
|
124
124
|
injector,
|
|
125
125
|
rootElement,
|
|
126
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, columnFilters: { name: { type: 'string' } } })),
|
|
126
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, columnFilters: { name: { type: 'string' } } })),
|
|
127
127
|
});
|
|
128
128
|
await flushUpdates();
|
|
129
129
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -132,12 +132,12 @@ describe('DataGrid', () => {
|
|
|
132
132
|
});
|
|
133
133
|
});
|
|
134
134
|
it('should not render filter buttons when columnFilters is not provided', async () => {
|
|
135
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
135
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
136
136
|
const rootElement = document.getElementById('root');
|
|
137
137
|
initializeShadeRoot({
|
|
138
138
|
injector,
|
|
139
139
|
rootElement,
|
|
140
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {} })),
|
|
140
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {} })),
|
|
141
141
|
});
|
|
142
142
|
await flushUpdates();
|
|
143
143
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -146,12 +146,12 @@ describe('DataGrid', () => {
|
|
|
146
146
|
});
|
|
147
147
|
});
|
|
148
148
|
it('should render without headerComponents and rowComponents', async () => {
|
|
149
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
149
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
150
150
|
const rootElement = document.getElementById('root');
|
|
151
151
|
initializeShadeRoot({
|
|
152
152
|
injector,
|
|
153
153
|
rootElement,
|
|
154
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {} })),
|
|
154
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {} })),
|
|
155
155
|
});
|
|
156
156
|
await flushUpdates();
|
|
157
157
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -160,55 +160,102 @@ describe('DataGrid', () => {
|
|
|
160
160
|
expect(headers?.length).toBe(2);
|
|
161
161
|
});
|
|
162
162
|
});
|
|
163
|
+
it('should render with auto-generated data-nav-section attribute', async () => {
|
|
164
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
165
|
+
const rootElement = document.getElementById('root');
|
|
166
|
+
initializeShadeRoot({
|
|
167
|
+
injector,
|
|
168
|
+
rootElement,
|
|
169
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange })),
|
|
170
|
+
});
|
|
171
|
+
await flushUpdates();
|
|
172
|
+
const wrapper = document.querySelector('.shade-grid-wrapper');
|
|
173
|
+
const navSection = wrapper?.getAttribute('data-nav-section');
|
|
174
|
+
expect(navSection).toBeTruthy();
|
|
175
|
+
expect(navSection).toMatch(/^data-grid-/);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
it('should render with custom navSection', async () => {
|
|
179
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
180
|
+
const rootElement = document.getElementById('root');
|
|
181
|
+
initializeShadeRoot({
|
|
182
|
+
injector,
|
|
183
|
+
rootElement,
|
|
184
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, navSection: "my-grid" })),
|
|
185
|
+
});
|
|
186
|
+
await flushUpdates();
|
|
187
|
+
const wrapper = document.querySelector('.shade-grid-wrapper');
|
|
188
|
+
expect(wrapper?.getAttribute('data-nav-section')).toBe('my-grid');
|
|
189
|
+
});
|
|
190
|
+
});
|
|
163
191
|
});
|
|
164
192
|
describe('focus management', () => {
|
|
165
|
-
it('should
|
|
166
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
193
|
+
it('should clear hasFocus on focusout when focus leaves the grid', async () => {
|
|
194
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
167
195
|
const rootElement = document.getElementById('root');
|
|
196
|
+
const outsideBtn = document.createElement('button');
|
|
197
|
+
document.body.appendChild(outsideBtn);
|
|
198
|
+
initializeShadeRoot({
|
|
199
|
+
injector,
|
|
200
|
+
rootElement,
|
|
201
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange })),
|
|
202
|
+
});
|
|
203
|
+
await flushUpdates();
|
|
204
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
205
|
+
service.hasFocus.setValue(true);
|
|
206
|
+
const wrapper = document.querySelector('.shade-grid-wrapper');
|
|
207
|
+
wrapper?.dispatchEvent(new FocusEvent('focusout', { bubbles: true, relatedTarget: outsideBtn }));
|
|
168
208
|
expect(service.hasFocus.getValue()).toBe(false);
|
|
209
|
+
outsideBtn.remove();
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
it('should clear hasFocus on focusout when focus moves outside', async () => {
|
|
213
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
214
|
+
const rootElement = document.getElementById('root');
|
|
215
|
+
const outsideEl = document.createElement('button');
|
|
216
|
+
outsideEl.textContent = 'Outside';
|
|
217
|
+
document.body.appendChild(outsideEl);
|
|
169
218
|
initializeShadeRoot({
|
|
170
219
|
injector,
|
|
171
220
|
rootElement,
|
|
172
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions,
|
|
221
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange })),
|
|
173
222
|
});
|
|
174
223
|
await flushUpdates();
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
wrapper
|
|
178
|
-
|
|
224
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
225
|
+
service.hasFocus.setValue(true);
|
|
226
|
+
const wrapper = document.querySelector('.shade-grid-wrapper');
|
|
227
|
+
wrapper?.dispatchEvent(new FocusEvent('focusout', { bubbles: true, relatedTarget: outsideEl }));
|
|
228
|
+
expect(service.hasFocus.getValue()).toBe(false);
|
|
229
|
+
outsideEl.remove();
|
|
179
230
|
});
|
|
180
231
|
});
|
|
181
|
-
it('should
|
|
182
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
232
|
+
it('should clear hasFocus on focusout when relatedTarget is null', async () => {
|
|
233
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
183
234
|
const rootElement = document.getElementById('root');
|
|
184
235
|
initializeShadeRoot({
|
|
185
236
|
injector,
|
|
186
237
|
rootElement,
|
|
187
|
-
jsxElement: (createComponent(
|
|
188
|
-
createComponent("div", { "data-testid": "outside" }, "Outside"),
|
|
189
|
-
createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} }))),
|
|
238
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange })),
|
|
190
239
|
});
|
|
191
240
|
await flushUpdates();
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
wrapper
|
|
195
|
-
|
|
196
|
-
const outside = document.querySelector('[data-testid="outside"]');
|
|
197
|
-
outside?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
|
|
241
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
242
|
+
service.hasFocus.setValue(true);
|
|
243
|
+
const wrapper = document.querySelector('.shade-grid-wrapper');
|
|
244
|
+
wrapper?.dispatchEvent(new FocusEvent('focusout', { bubbles: true, relatedTarget: null }));
|
|
198
245
|
expect(service.hasFocus.getValue()).toBe(false);
|
|
199
246
|
});
|
|
200
247
|
});
|
|
201
248
|
});
|
|
202
249
|
describe('keyboard navigation', () => {
|
|
203
|
-
it('should
|
|
204
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
250
|
+
it('should move focus to next entry on ArrowDown', async () => {
|
|
251
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
205
252
|
const rootElement = document.getElementById('root');
|
|
206
253
|
service.hasFocus.setValue(true);
|
|
207
254
|
service.focusedEntry.setValue(service.data.getValue().entries[0]);
|
|
208
255
|
initializeShadeRoot({
|
|
209
256
|
injector,
|
|
210
257
|
rootElement,
|
|
211
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
258
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
212
259
|
});
|
|
213
260
|
await flushUpdates();
|
|
214
261
|
const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true });
|
|
@@ -216,15 +263,15 @@ describe('DataGrid', () => {
|
|
|
216
263
|
expect(service.focusedEntry.getValue()).toEqual({ id: 2, name: 'Second' });
|
|
217
264
|
});
|
|
218
265
|
});
|
|
219
|
-
it('should
|
|
220
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
266
|
+
it('should move focus to previous entry on ArrowUp', async () => {
|
|
267
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
221
268
|
const rootElement = document.getElementById('root');
|
|
222
269
|
service.hasFocus.setValue(true);
|
|
223
270
|
service.focusedEntry.setValue(service.data.getValue().entries[1]);
|
|
224
271
|
initializeShadeRoot({
|
|
225
272
|
injector,
|
|
226
273
|
rootElement,
|
|
227
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
274
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
228
275
|
});
|
|
229
276
|
await flushUpdates();
|
|
230
277
|
const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true });
|
|
@@ -233,14 +280,14 @@ describe('DataGrid', () => {
|
|
|
233
280
|
});
|
|
234
281
|
});
|
|
235
282
|
it('should handle Home to move focus to first entry', async () => {
|
|
236
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
283
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
237
284
|
const rootElement = document.getElementById('root');
|
|
238
285
|
service.hasFocus.setValue(true);
|
|
239
286
|
service.focusedEntry.setValue(service.data.getValue().entries[2]);
|
|
240
287
|
initializeShadeRoot({
|
|
241
288
|
injector,
|
|
242
289
|
rootElement,
|
|
243
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
290
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
244
291
|
});
|
|
245
292
|
await flushUpdates();
|
|
246
293
|
const keydownEvent = new KeyboardEvent('keydown', { key: 'Home', bubbles: true });
|
|
@@ -249,14 +296,14 @@ describe('DataGrid', () => {
|
|
|
249
296
|
});
|
|
250
297
|
});
|
|
251
298
|
it('should handle End to move focus to last entry', async () => {
|
|
252
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
299
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
253
300
|
const rootElement = document.getElementById('root');
|
|
254
301
|
service.hasFocus.setValue(true);
|
|
255
302
|
service.focusedEntry.setValue(service.data.getValue().entries[0]);
|
|
256
303
|
initializeShadeRoot({
|
|
257
304
|
injector,
|
|
258
305
|
rootElement,
|
|
259
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
306
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
260
307
|
});
|
|
261
308
|
await flushUpdates();
|
|
262
309
|
const keydownEvent = new KeyboardEvent('keydown', { key: 'End', bubbles: true });
|
|
@@ -264,23 +311,8 @@ describe('DataGrid', () => {
|
|
|
264
311
|
expect(service.focusedEntry.getValue()).toEqual({ id: 3, name: 'Third' });
|
|
265
312
|
});
|
|
266
313
|
});
|
|
267
|
-
it('should handle Tab to toggle focus', async () => {
|
|
268
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
269
|
-
const rootElement = document.getElementById('root');
|
|
270
|
-
service.hasFocus.setValue(true);
|
|
271
|
-
initializeShadeRoot({
|
|
272
|
-
injector,
|
|
273
|
-
rootElement,
|
|
274
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
275
|
-
});
|
|
276
|
-
await flushUpdates();
|
|
277
|
-
const keydownEvent = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
|
|
278
|
-
window.dispatchEvent(keydownEvent);
|
|
279
|
-
expect(service.hasFocus.getValue()).toBe(false);
|
|
280
|
-
});
|
|
281
|
-
});
|
|
282
314
|
it('should handle Escape to clear selection and search', async () => {
|
|
283
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
315
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
284
316
|
const rootElement = document.getElementById('root');
|
|
285
317
|
const { entries } = service.data.getValue();
|
|
286
318
|
service.hasFocus.setValue(true);
|
|
@@ -289,7 +321,7 @@ describe('DataGrid', () => {
|
|
|
289
321
|
initializeShadeRoot({
|
|
290
322
|
injector,
|
|
291
323
|
rootElement,
|
|
292
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
324
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
293
325
|
});
|
|
294
326
|
await flushUpdates();
|
|
295
327
|
const keydownEvent = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true });
|
|
@@ -299,7 +331,7 @@ describe('DataGrid', () => {
|
|
|
299
331
|
});
|
|
300
332
|
});
|
|
301
333
|
it('should handle Space to toggle selection of focused entry', async () => {
|
|
302
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
334
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
303
335
|
const rootElement = document.getElementById('root');
|
|
304
336
|
const { entries } = service.data.getValue();
|
|
305
337
|
service.hasFocus.setValue(true);
|
|
@@ -307,7 +339,7 @@ describe('DataGrid', () => {
|
|
|
307
339
|
initializeShadeRoot({
|
|
308
340
|
injector,
|
|
309
341
|
rootElement,
|
|
310
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
342
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
311
343
|
});
|
|
312
344
|
await flushUpdates();
|
|
313
345
|
const keydownEvent = new KeyboardEvent('keydown', { key: ' ', bubbles: true });
|
|
@@ -318,13 +350,13 @@ describe('DataGrid', () => {
|
|
|
318
350
|
});
|
|
319
351
|
});
|
|
320
352
|
it('should handle + to select all entries', async () => {
|
|
321
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
353
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
322
354
|
const rootElement = document.getElementById('root');
|
|
323
355
|
service.hasFocus.setValue(true);
|
|
324
356
|
initializeShadeRoot({
|
|
325
357
|
injector,
|
|
326
358
|
rootElement,
|
|
327
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
359
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
328
360
|
});
|
|
329
361
|
await flushUpdates();
|
|
330
362
|
const keydownEvent = new KeyboardEvent('keydown', { key: '+', bubbles: true });
|
|
@@ -333,7 +365,7 @@ describe('DataGrid', () => {
|
|
|
333
365
|
});
|
|
334
366
|
});
|
|
335
367
|
it('should handle - to deselect all entries', async () => {
|
|
336
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
368
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
337
369
|
const rootElement = document.getElementById('root');
|
|
338
370
|
const { entries } = service.data.getValue();
|
|
339
371
|
service.hasFocus.setValue(true);
|
|
@@ -341,7 +373,7 @@ describe('DataGrid', () => {
|
|
|
341
373
|
initializeShadeRoot({
|
|
342
374
|
injector,
|
|
343
375
|
rootElement,
|
|
344
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
376
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
345
377
|
});
|
|
346
378
|
await flushUpdates();
|
|
347
379
|
const keydownEvent = new KeyboardEvent('keydown', { key: '-', bubbles: true });
|
|
@@ -350,7 +382,7 @@ describe('DataGrid', () => {
|
|
|
350
382
|
});
|
|
351
383
|
});
|
|
352
384
|
it('should handle * to invert selection', async () => {
|
|
353
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
385
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
354
386
|
const rootElement = document.getElementById('root');
|
|
355
387
|
const { entries } = service.data.getValue();
|
|
356
388
|
service.hasFocus.setValue(true);
|
|
@@ -358,7 +390,7 @@ describe('DataGrid', () => {
|
|
|
358
390
|
initializeShadeRoot({
|
|
359
391
|
injector,
|
|
360
392
|
rootElement,
|
|
361
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
393
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
362
394
|
});
|
|
363
395
|
await flushUpdates();
|
|
364
396
|
const keydownEvent = new KeyboardEvent('keydown', { key: '*', bubbles: true });
|
|
@@ -370,23 +402,23 @@ describe('DataGrid', () => {
|
|
|
370
402
|
});
|
|
371
403
|
});
|
|
372
404
|
it('should not handle keyboard when not focused', async () => {
|
|
373
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
405
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
374
406
|
const rootElement = document.getElementById('root');
|
|
375
|
-
service.hasFocus.setValue(false);
|
|
376
407
|
service.focusedEntry.setValue(service.data.getValue().entries[0]);
|
|
377
408
|
initializeShadeRoot({
|
|
378
409
|
injector,
|
|
379
410
|
rootElement,
|
|
380
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
411
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
381
412
|
});
|
|
382
413
|
await flushUpdates();
|
|
414
|
+
service.hasFocus.setValue(false);
|
|
383
415
|
const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true });
|
|
384
416
|
window.dispatchEvent(keydownEvent);
|
|
385
417
|
expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
|
|
386
418
|
});
|
|
387
419
|
});
|
|
388
420
|
it('should handle Insert to toggle selection and move to next', async () => {
|
|
389
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
421
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
390
422
|
const rootElement = document.getElementById('root');
|
|
391
423
|
const { entries } = service.data.getValue();
|
|
392
424
|
service.hasFocus.setValue(true);
|
|
@@ -394,7 +426,7 @@ describe('DataGrid', () => {
|
|
|
394
426
|
initializeShadeRoot({
|
|
395
427
|
injector,
|
|
396
428
|
rootElement,
|
|
397
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
429
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
398
430
|
});
|
|
399
431
|
await flushUpdates();
|
|
400
432
|
const keydownEvent = new KeyboardEvent('keydown', { key: 'Insert', bubbles: true });
|
|
@@ -406,12 +438,12 @@ describe('DataGrid', () => {
|
|
|
406
438
|
});
|
|
407
439
|
describe('styles', () => {
|
|
408
440
|
it('should apply wrapper styles when provided', async () => {
|
|
409
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
441
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
410
442
|
const rootElement = document.getElementById('root');
|
|
411
443
|
initializeShadeRoot({
|
|
412
444
|
injector,
|
|
413
445
|
rootElement,
|
|
414
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {
|
|
446
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {
|
|
415
447
|
wrapper: { backgroundColor: 'red' },
|
|
416
448
|
}, headerComponents: {}, rowComponents: {} })),
|
|
417
449
|
});
|
|
@@ -421,12 +453,12 @@ describe('DataGrid', () => {
|
|
|
421
453
|
});
|
|
422
454
|
});
|
|
423
455
|
it('should apply header styles when provided', async () => {
|
|
424
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
456
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
425
457
|
const rootElement = document.getElementById('root');
|
|
426
458
|
initializeShadeRoot({
|
|
427
459
|
injector,
|
|
428
460
|
rootElement,
|
|
429
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {
|
|
461
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {
|
|
430
462
|
header: { color: 'blue' },
|
|
431
463
|
}, headerComponents: {}, rowComponents: {} })),
|
|
432
464
|
});
|
|
@@ -439,12 +471,12 @@ describe('DataGrid', () => {
|
|
|
439
471
|
});
|
|
440
472
|
describe('empty and loading states', () => {
|
|
441
473
|
it('should show empty component when no data', async () => {
|
|
442
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
474
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
443
475
|
const rootElement = document.getElementById('root');
|
|
444
476
|
initializeShadeRoot({
|
|
445
477
|
injector,
|
|
446
478
|
rootElement,
|
|
447
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {}, emptyComponent: createComponent("div", { "data-testid": "empty-state" }, "No data available") })),
|
|
479
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {}, emptyComponent: createComponent("div", { "data-testid": "empty-state" }, "No data available") })),
|
|
448
480
|
});
|
|
449
481
|
await flushUpdates();
|
|
450
482
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -457,7 +489,7 @@ describe('DataGrid', () => {
|
|
|
457
489
|
describe('row interactions', () => {
|
|
458
490
|
it('should pass row click to collectionService', async () => {
|
|
459
491
|
const onRowClick = vi.fn();
|
|
460
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
492
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
461
493
|
const rootElement = document.getElementById('root');
|
|
462
494
|
service.data.setValue({
|
|
463
495
|
count: 1,
|
|
@@ -466,7 +498,7 @@ describe('DataGrid', () => {
|
|
|
466
498
|
initializeShadeRoot({
|
|
467
499
|
injector,
|
|
468
500
|
rootElement,
|
|
469
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
501
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
470
502
|
});
|
|
471
503
|
await flushUpdates();
|
|
472
504
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -477,7 +509,7 @@ describe('DataGrid', () => {
|
|
|
477
509
|
});
|
|
478
510
|
it('should pass row double click to collectionService', async () => {
|
|
479
511
|
const onRowDoubleClick = vi.fn();
|
|
480
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
512
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
481
513
|
const rootElement = document.getElementById('root');
|
|
482
514
|
service.data.setValue({
|
|
483
515
|
count: 1,
|
|
@@ -486,7 +518,7 @@ describe('DataGrid', () => {
|
|
|
486
518
|
initializeShadeRoot({
|
|
487
519
|
injector,
|
|
488
520
|
rootElement,
|
|
489
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
521
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
490
522
|
});
|
|
491
523
|
await flushUpdates();
|
|
492
524
|
const grid = document.querySelector('shade-data-grid');
|
|
@@ -497,16 +529,64 @@ describe('DataGrid', () => {
|
|
|
497
529
|
}, { createService: () => new CollectionService({ onRowDoubleClick }) });
|
|
498
530
|
});
|
|
499
531
|
});
|
|
532
|
+
describe('row spatial navigation attributes', () => {
|
|
533
|
+
it('should set data-spatial-nav-target on rows', async () => {
|
|
534
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
535
|
+
const rootElement = document.getElementById('root');
|
|
536
|
+
initializeShadeRoot({
|
|
537
|
+
injector,
|
|
538
|
+
rootElement,
|
|
539
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange })),
|
|
540
|
+
});
|
|
541
|
+
await flushUpdates();
|
|
542
|
+
const rows = document.querySelectorAll('shades-data-grid-row');
|
|
543
|
+
for (const row of rows) {
|
|
544
|
+
expect(row.hasAttribute('data-spatial-nav-target')).toBe(true);
|
|
545
|
+
}
|
|
546
|
+
});
|
|
547
|
+
});
|
|
548
|
+
it('should set tabIndex 0 on focused row and -1 on others', async () => {
|
|
549
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
550
|
+
const rootElement = document.getElementById('root');
|
|
551
|
+
service.focusedEntry.setValue(service.data.getValue().entries[1]);
|
|
552
|
+
initializeShadeRoot({
|
|
553
|
+
injector,
|
|
554
|
+
rootElement,
|
|
555
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange })),
|
|
556
|
+
});
|
|
557
|
+
await flushUpdates();
|
|
558
|
+
const rows = document.querySelectorAll('shades-data-grid-row');
|
|
559
|
+
expect(rows[0]?.tabIndex).toBe(-1);
|
|
560
|
+
expect(rows[1]?.tabIndex).toBe(0);
|
|
561
|
+
expect(rows[2]?.tabIndex).toBe(-1);
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
it('should sync focusedEntry on row onfocus', async () => {
|
|
565
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
566
|
+
const rootElement = document.getElementById('root');
|
|
567
|
+
initializeShadeRoot({
|
|
568
|
+
injector,
|
|
569
|
+
rootElement,
|
|
570
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange })),
|
|
571
|
+
});
|
|
572
|
+
await flushUpdates();
|
|
573
|
+
const rows = document.querySelectorAll('shades-data-grid-row');
|
|
574
|
+
rows[2]?.dispatchEvent(new FocusEvent('focus'));
|
|
575
|
+
expect(service.focusedEntry.getValue()).toEqual({ id: 3, name: 'Third' });
|
|
576
|
+
expect(service.hasFocus.getValue()).toBe(true);
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
});
|
|
500
580
|
describe('keyboard listener cleanup', () => {
|
|
501
581
|
it('should remove keyboard listener when component is disconnected', async () => {
|
|
502
|
-
await withTestGrid(async ({ injector, service, findOptions }) => {
|
|
582
|
+
await withTestGrid(async ({ injector, service, findOptions, onFindOptionsChange }) => {
|
|
503
583
|
const rootElement = document.getElementById('root');
|
|
504
584
|
service.hasFocus.setValue(true);
|
|
505
585
|
service.focusedEntry.setValue(service.data.getValue().entries[0]);
|
|
506
586
|
initializeShadeRoot({
|
|
507
587
|
injector,
|
|
508
588
|
rootElement,
|
|
509
|
-
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
589
|
+
jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, onFindOptionsChange: onFindOptionsChange, styles: {}, headerComponents: {}, rowComponents: {} })),
|
|
510
590
|
});
|
|
511
591
|
await flushUpdates();
|
|
512
592
|
const grid = document.querySelector('shade-data-grid');
|