@furystack/shades-common-components 13.5.0 → 14.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 +58 -0
- package/README.md +3 -3
- package/esm/components/accordion/accordion-item.js +1 -1
- package/esm/components/accordion/accordion-item.js.map +1 -1
- package/esm/components/accordion/accordion.js +1 -1
- package/esm/components/accordion/accordion.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 +1 -1
- package/esm/components/carousel.js.map +1 -1
- package/esm/components/chip.js +1 -1
- package/esm/components/chip.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.js +1 -1
- package/esm/components/command-palette/index.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.js +1 -1
- package/esm/components/data-grid/data-grid-row.js.map +1 -1
- package/esm/components/data-grid/data-grid.d.ts +5 -2
- package/esm/components/data-grid/data-grid.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid.js +5 -3
- package/esm/components/data-grid/data-grid.js.map +1 -1
- package/esm/components/data-grid/data-grid.spec.js +60 -60
- 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.js +1 -1
- package/esm/components/data-grid/selection-cell.js.map +1 -1
- package/esm/components/dialog.js +1 -1
- package/esm/components/dialog.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.js +1 -1
- package/esm/components/dropdown.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.js +2 -2
- package/esm/components/image.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.js +1 -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.js +1 -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.js +1 -1
- package/esm/components/inputs/slider.js.map +1 -1
- package/esm/components/inputs/switch.js +1 -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.js +1 -1
- package/esm/components/list/list-item.js.map +1 -1
- package/esm/components/list/list.js +1 -1
- package/esm/components/list/list.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.js +1 -1
- package/esm/components/markdown/markdown-display.js.map +1 -1
- package/esm/components/markdown/markdown-display.spec.js +1 -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 +1 -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 +1 -1
- package/esm/components/menu/menu.js.map +1 -1
- package/esm/components/modal.js +1 -1
- package/esm/components/modal.js.map +1 -1
- package/esm/components/modal.spec.js +3 -3
- 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 +1 -1
- package/esm/components/page-layout/index.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.js +1 -1
- package/esm/components/rating.js.map +1 -1
- package/esm/components/rating.spec.js +1 -1
- 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.js +1 -1
- package/esm/components/suggest/index.js.map +1 -1
- package/esm/components/suggest/index.spec.js +1 -1
- 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.js +2 -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.js +1 -1
- package/esm/components/tree/tree-item.js.map +1 -1
- package/esm/components/tree/tree.js +1 -1
- package/esm/components/tree/tree.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/package.json +3 -3
- package/src/components/accordion/accordion-item.tsx +1 -1
- package/src/components/accordion/accordion.tsx +1 -1
- 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 +1 -1
- package/src/components/chip.tsx +1 -1
- 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.tsx +1 -1
- 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 +1 -1
- package/src/components/data-grid/data-grid.spec.tsx +62 -36
- package/src/components/data-grid/data-grid.tsx +14 -8
- 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 +1 -1
- package/src/components/dialog.tsx +1 -1
- 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.tsx +1 -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.tsx +2 -2
- package/src/components/inputs/autocomplete.tsx +1 -1
- package/src/components/inputs/checkbox.spec.tsx +1 -1
- package/src/components/inputs/checkbox.tsx +1 -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 +1 -1
- package/src/components/inputs/select.tsx +1 -1
- package/src/components/inputs/slider.tsx +1 -1
- package/src/components/inputs/switch.spec.tsx +1 -1
- package/src/components/inputs/switch.tsx +1 -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 +1 -1
- package/src/components/list/list.tsx +1 -1
- package/src/components/loader.spec.tsx +1 -1
- package/src/components/loader.tsx +1 -1
- package/src/components/markdown/markdown-display.spec.tsx +1 -1
- package/src/components/markdown/markdown-display.tsx +1 -1
- package/src/components/markdown/markdown-editor.spec.tsx +1 -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 +1 -1
- package/src/components/modal.spec.tsx +3 -3
- package/src/components/modal.tsx +1 -1
- 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.tsx +1 -1
- package/src/components/pagination.tsx +1 -1
- package/src/components/paper.tsx +1 -1
- package/src/components/rating.spec.tsx +1 -1
- package/src/components/rating.tsx +1 -1
- package/src/components/result.tsx +1 -1
- package/src/components/skeleton.tsx +1 -1
- package/src/components/suggest/index.spec.tsx +1 -1
- package/src/components/suggest/index.tsx +1 -1
- 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 +2 -2
- package/src/components/timeline.tsx +2 -2
- package/src/components/tooltip.tsx +1 -1
- package/src/components/tree/tree-item.tsx +1 -1
- package/src/components/tree/tree.tsx +1 -1
- package/src/components/typography.tsx +1 -1
- package/src/components/wizard/index.spec.tsx +3 -3
- package/src/components/wizard/index.tsx +1 -1
|
@@ -1,12 +1,41 @@
|
|
|
1
|
-
import type { FindOptions } from '@furystack/core'
|
|
2
1
|
import { Injector } from '@furystack/inject'
|
|
3
|
-
import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
|
|
2
|
+
import { createComponent, flushUpdates, initializeShadeRoot, Shade } from '@furystack/shades'
|
|
4
3
|
import { ObservableValue, usingAsync } from '@furystack/utils'
|
|
5
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
6
5
|
import type { FilterableFindOptions } from './data-grid.js'
|
|
7
6
|
import { DataGridHeader, OrderButton } from './header.js'
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
const OrderButtonWrapper = Shade<{ obs: ObservableValue<FilterableFindOptions>; field: string }>({
|
|
9
|
+
customElementName: 'test-order-button-wrapper',
|
|
10
|
+
render: ({ props, useObservable }) => {
|
|
11
|
+
const [findOptions, setFindOptions] = useObservable('findOptions', props.obs)
|
|
12
|
+
return <OrderButton field={props.field} findOptions={findOptions} onFindOptionsChange={setFindOptions} />
|
|
13
|
+
},
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const HeaderWrapper = Shade<{
|
|
17
|
+
obs: ObservableValue<FilterableFindOptions>
|
|
18
|
+
field: string
|
|
19
|
+
filterConfig?:
|
|
20
|
+
| { type: 'string' }
|
|
21
|
+
| { type: 'number' }
|
|
22
|
+
| { type: 'boolean' }
|
|
23
|
+
| { type: 'date' }
|
|
24
|
+
| { type: 'enum'; values: Array<{ label: string; value: string }> }
|
|
25
|
+
}>({
|
|
26
|
+
customElementName: 'test-header-wrapper',
|
|
27
|
+
render: ({ props, useObservable }) => {
|
|
28
|
+
const [findOptions, setFindOptions] = useObservable('findOptions', props.obs)
|
|
29
|
+
return (
|
|
30
|
+
<DataGridHeader
|
|
31
|
+
field={props.field}
|
|
32
|
+
findOptions={findOptions}
|
|
33
|
+
onFindOptionsChange={setFindOptions}
|
|
34
|
+
filterConfig={props.filterConfig}
|
|
35
|
+
/>
|
|
36
|
+
)
|
|
37
|
+
},
|
|
38
|
+
})
|
|
10
39
|
|
|
11
40
|
describe('DataGridHeader', () => {
|
|
12
41
|
let originalAnimate: typeof Element.prototype.animate
|
|
@@ -41,28 +70,16 @@ describe('DataGridHeader', () => {
|
|
|
41
70
|
Element.prototype.animate = originalAnimate
|
|
42
71
|
})
|
|
43
72
|
|
|
44
|
-
const createFindOptions = (
|
|
45
|
-
options: Partial<FindOptions<TestItem, Array<keyof TestItem>>> = {},
|
|
46
|
-
): ObservableValue<FindOptions<TestItem, Array<keyof TestItem>>> => {
|
|
47
|
-
return new ObservableValue<FindOptions<TestItem, Array<keyof TestItem>>>(options)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const createFilterableFindOptions = (
|
|
51
|
-
options: Partial<FilterableFindOptions> = {},
|
|
52
|
-
): ObservableValue<FilterableFindOptions> => {
|
|
53
|
-
return new ObservableValue<FilterableFindOptions>(options)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
73
|
describe('rendering', () => {
|
|
57
74
|
it('should render with custom element', async () => {
|
|
58
75
|
await usingAsync(new Injector(), async (injector) => {
|
|
59
76
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
60
|
-
const
|
|
77
|
+
const onFindOptionsChange = vi.fn()
|
|
61
78
|
|
|
62
79
|
initializeShadeRoot({
|
|
63
80
|
injector,
|
|
64
81
|
rootElement,
|
|
65
|
-
jsxElement: <DataGridHeader field="name" findOptions={
|
|
82
|
+
jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
|
|
66
83
|
})
|
|
67
84
|
|
|
68
85
|
await flushUpdates()
|
|
@@ -75,12 +92,12 @@ describe('DataGridHeader', () => {
|
|
|
75
92
|
it('should render field name', async () => {
|
|
76
93
|
await usingAsync(new Injector(), async (injector) => {
|
|
77
94
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
78
|
-
const
|
|
95
|
+
const onFindOptionsChange = vi.fn()
|
|
79
96
|
|
|
80
97
|
initializeShadeRoot({
|
|
81
98
|
injector,
|
|
82
99
|
rootElement,
|
|
83
|
-
jsxElement: <DataGridHeader field="name" findOptions={
|
|
100
|
+
jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
|
|
84
101
|
})
|
|
85
102
|
|
|
86
103
|
await flushUpdates()
|
|
@@ -94,12 +111,12 @@ describe('DataGridHeader', () => {
|
|
|
94
111
|
it('should render order button', async () => {
|
|
95
112
|
await usingAsync(new Injector(), async (injector) => {
|
|
96
113
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
97
|
-
const
|
|
114
|
+
const onFindOptionsChange = vi.fn()
|
|
98
115
|
|
|
99
116
|
initializeShadeRoot({
|
|
100
117
|
injector,
|
|
101
118
|
rootElement,
|
|
102
|
-
jsxElement: <DataGridHeader field="name" findOptions={
|
|
119
|
+
jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
|
|
103
120
|
})
|
|
104
121
|
|
|
105
122
|
await flushUpdates()
|
|
@@ -112,12 +129,12 @@ describe('DataGridHeader', () => {
|
|
|
112
129
|
it('should not render filter button when no filterConfig is provided', async () => {
|
|
113
130
|
await usingAsync(new Injector(), async (injector) => {
|
|
114
131
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
115
|
-
const
|
|
132
|
+
const onFindOptionsChange = vi.fn()
|
|
116
133
|
|
|
117
134
|
initializeShadeRoot({
|
|
118
135
|
injector,
|
|
119
136
|
rootElement,
|
|
120
|
-
jsxElement: <DataGridHeader field="name" findOptions={
|
|
137
|
+
jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
|
|
121
138
|
})
|
|
122
139
|
|
|
123
140
|
await flushUpdates()
|
|
@@ -130,12 +147,19 @@ describe('DataGridHeader', () => {
|
|
|
130
147
|
it('should render filter button when filterConfig is provided', async () => {
|
|
131
148
|
await usingAsync(new Injector(), async (injector) => {
|
|
132
149
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
133
|
-
const
|
|
150
|
+
const onFindOptionsChange = vi.fn()
|
|
134
151
|
|
|
135
152
|
initializeShadeRoot({
|
|
136
153
|
injector,
|
|
137
154
|
rootElement,
|
|
138
|
-
jsxElement:
|
|
155
|
+
jsxElement: (
|
|
156
|
+
<DataGridHeader
|
|
157
|
+
field="name"
|
|
158
|
+
findOptions={{}}
|
|
159
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
160
|
+
filterConfig={{ type: 'string' }}
|
|
161
|
+
/>
|
|
162
|
+
),
|
|
139
163
|
})
|
|
140
164
|
|
|
141
165
|
await flushUpdates()
|
|
@@ -150,12 +174,12 @@ describe('DataGridHeader', () => {
|
|
|
150
174
|
it('should show neutral icon when no order is set', async () => {
|
|
151
175
|
await usingAsync(new Injector(), async (injector) => {
|
|
152
176
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
153
|
-
const
|
|
177
|
+
const onFindOptionsChange = vi.fn()
|
|
154
178
|
|
|
155
179
|
initializeShadeRoot({
|
|
156
180
|
injector,
|
|
157
181
|
rootElement,
|
|
158
|
-
jsxElement: <OrderButton field="name" findOptions={
|
|
182
|
+
jsxElement: <OrderButton field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
|
|
159
183
|
})
|
|
160
184
|
|
|
161
185
|
await flushUpdates()
|
|
@@ -165,15 +189,15 @@ describe('DataGridHeader', () => {
|
|
|
165
189
|
})
|
|
166
190
|
})
|
|
167
191
|
|
|
168
|
-
it('should
|
|
192
|
+
it('should call onFindOptionsChange with ASC when clicking on unsorted field', async () => {
|
|
169
193
|
await usingAsync(new Injector(), async (injector) => {
|
|
170
194
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
171
|
-
const
|
|
195
|
+
const onFindOptionsChange = vi.fn()
|
|
172
196
|
|
|
173
197
|
initializeShadeRoot({
|
|
174
198
|
injector,
|
|
175
199
|
rootElement,
|
|
176
|
-
jsxElement: <OrderButton field="name" findOptions={
|
|
200
|
+
jsxElement: <OrderButton field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
|
|
177
201
|
})
|
|
178
202
|
|
|
179
203
|
await flushUpdates()
|
|
@@ -183,20 +207,25 @@ describe('DataGridHeader', () => {
|
|
|
183
207
|
|
|
184
208
|
await flushUpdates()
|
|
185
209
|
|
|
186
|
-
|
|
187
|
-
expect(updatedOptions.order).toEqual({ name: 'ASC' })
|
|
210
|
+
expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ order: { name: 'ASC' } }))
|
|
188
211
|
})
|
|
189
212
|
})
|
|
190
213
|
|
|
191
|
-
it('should
|
|
214
|
+
it('should call onFindOptionsChange with DESC when clicking on ASC-sorted field', async () => {
|
|
192
215
|
await usingAsync(new Injector(), async (injector) => {
|
|
193
216
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
194
|
-
const
|
|
217
|
+
const onFindOptionsChange = vi.fn()
|
|
195
218
|
|
|
196
219
|
initializeShadeRoot({
|
|
197
220
|
injector,
|
|
198
221
|
rootElement,
|
|
199
|
-
jsxElement:
|
|
222
|
+
jsxElement: (
|
|
223
|
+
<OrderButton
|
|
224
|
+
field="name"
|
|
225
|
+
findOptions={{ order: { name: 'ASC' } }}
|
|
226
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
227
|
+
/>
|
|
228
|
+
),
|
|
200
229
|
})
|
|
201
230
|
|
|
202
231
|
await flushUpdates()
|
|
@@ -206,20 +235,25 @@ describe('DataGridHeader', () => {
|
|
|
206
235
|
|
|
207
236
|
await flushUpdates()
|
|
208
237
|
|
|
209
|
-
|
|
210
|
-
expect(updatedOptions.order).toEqual({ name: 'DESC' })
|
|
238
|
+
expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ order: { name: 'DESC' } }))
|
|
211
239
|
})
|
|
212
240
|
})
|
|
213
241
|
|
|
214
|
-
it('should
|
|
242
|
+
it('should call onFindOptionsChange with ASC when clicking on DESC-sorted field', async () => {
|
|
215
243
|
await usingAsync(new Injector(), async (injector) => {
|
|
216
244
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
217
|
-
const
|
|
245
|
+
const onFindOptionsChange = vi.fn()
|
|
218
246
|
|
|
219
247
|
initializeShadeRoot({
|
|
220
248
|
injector,
|
|
221
249
|
rootElement,
|
|
222
|
-
jsxElement:
|
|
250
|
+
jsxElement: (
|
|
251
|
+
<OrderButton
|
|
252
|
+
field="name"
|
|
253
|
+
findOptions={{ order: { name: 'DESC' } }}
|
|
254
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
255
|
+
/>
|
|
256
|
+
),
|
|
223
257
|
})
|
|
224
258
|
|
|
225
259
|
await flushUpdates()
|
|
@@ -229,20 +263,19 @@ describe('DataGridHeader', () => {
|
|
|
229
263
|
|
|
230
264
|
await flushUpdates()
|
|
231
265
|
|
|
232
|
-
|
|
233
|
-
expect(updatedOptions.order).toEqual({ name: 'ASC' })
|
|
266
|
+
expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ order: { name: 'ASC' } }))
|
|
234
267
|
})
|
|
235
268
|
})
|
|
236
269
|
|
|
237
270
|
it('should react to external findOptions changes', async () => {
|
|
238
271
|
await usingAsync(new Injector(), async (injector) => {
|
|
239
272
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
240
|
-
const
|
|
273
|
+
const obs = new ObservableValue<FilterableFindOptions>({})
|
|
241
274
|
|
|
242
275
|
initializeShadeRoot({
|
|
243
276
|
injector,
|
|
244
277
|
rootElement,
|
|
245
|
-
jsxElement: <
|
|
278
|
+
jsxElement: <OrderButtonWrapper obs={obs} field="name" />,
|
|
246
279
|
})
|
|
247
280
|
|
|
248
281
|
await flushUpdates()
|
|
@@ -250,7 +283,7 @@ describe('DataGridHeader', () => {
|
|
|
250
283
|
let button = document.querySelector('data-grid-order-button')
|
|
251
284
|
expect(button?.querySelector('shade-icon')).not.toBeNull()
|
|
252
285
|
|
|
253
|
-
|
|
286
|
+
obs.setValue({ order: { name: 'ASC' } })
|
|
254
287
|
await flushUpdates()
|
|
255
288
|
|
|
256
289
|
button = document.querySelector('data-grid-order-button')
|
|
@@ -263,12 +296,19 @@ describe('DataGridHeader', () => {
|
|
|
263
296
|
it('should show inactive state when no filter is set', async () => {
|
|
264
297
|
await usingAsync(new Injector(), async (injector) => {
|
|
265
298
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
266
|
-
const
|
|
299
|
+
const onFindOptionsChange = vi.fn()
|
|
267
300
|
|
|
268
301
|
initializeShadeRoot({
|
|
269
302
|
injector,
|
|
270
303
|
rootElement,
|
|
271
|
-
jsxElement:
|
|
304
|
+
jsxElement: (
|
|
305
|
+
<DataGridHeader
|
|
306
|
+
field="name"
|
|
307
|
+
findOptions={{}}
|
|
308
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
309
|
+
filterConfig={{ type: 'string' }}
|
|
310
|
+
/>
|
|
311
|
+
),
|
|
272
312
|
})
|
|
273
313
|
|
|
274
314
|
await flushUpdates()
|
|
@@ -281,12 +321,19 @@ describe('DataGridHeader', () => {
|
|
|
281
321
|
it('should show active state when filter is set for field', async () => {
|
|
282
322
|
await usingAsync(new Injector(), async (injector) => {
|
|
283
323
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
284
|
-
const
|
|
324
|
+
const onFindOptionsChange = vi.fn()
|
|
285
325
|
|
|
286
326
|
initializeShadeRoot({
|
|
287
327
|
injector,
|
|
288
328
|
rootElement,
|
|
289
|
-
jsxElement:
|
|
329
|
+
jsxElement: (
|
|
330
|
+
<DataGridHeader
|
|
331
|
+
field="name"
|
|
332
|
+
findOptions={{ filter: { name: { $regex: 'test' } } }}
|
|
333
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
334
|
+
filterConfig={{ type: 'string' }}
|
|
335
|
+
/>
|
|
336
|
+
),
|
|
290
337
|
})
|
|
291
338
|
|
|
292
339
|
await flushUpdates()
|
|
@@ -299,21 +346,22 @@ describe('DataGridHeader', () => {
|
|
|
299
346
|
it('should transition from active to inactive when filter is externally cleared', async () => {
|
|
300
347
|
await usingAsync(new Injector(), async (injector) => {
|
|
301
348
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
302
|
-
const
|
|
349
|
+
const obs = new ObservableValue<FilterableFindOptions>({
|
|
350
|
+
filter: { name: { $regex: 'test' } },
|
|
351
|
+
})
|
|
303
352
|
|
|
304
353
|
initializeShadeRoot({
|
|
305
354
|
injector,
|
|
306
355
|
rootElement,
|
|
307
|
-
jsxElement: <
|
|
356
|
+
jsxElement: <HeaderWrapper obs={obs} field="name" filterConfig={{ type: 'string' }} />,
|
|
308
357
|
})
|
|
309
358
|
|
|
310
|
-
// Parent renders, then child FilterButton renders
|
|
311
359
|
await flushUpdates()
|
|
312
360
|
|
|
313
361
|
const filterButton = document.querySelector('data-grid-filter-button button')
|
|
314
362
|
expect(filterButton?.hasAttribute('data-selected')).toBe(true)
|
|
315
363
|
|
|
316
|
-
|
|
364
|
+
obs.setValue({ filter: {} })
|
|
317
365
|
await flushUpdates()
|
|
318
366
|
|
|
319
367
|
const updatedButton = document.querySelector('data-grid-filter-button button')
|
|
@@ -324,12 +372,19 @@ describe('DataGridHeader', () => {
|
|
|
324
372
|
it('should open filter dropdown when clicked', async () => {
|
|
325
373
|
await usingAsync(new Injector(), async (injector) => {
|
|
326
374
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
327
|
-
const
|
|
375
|
+
const onFindOptionsChange = vi.fn()
|
|
328
376
|
|
|
329
377
|
initializeShadeRoot({
|
|
330
378
|
injector,
|
|
331
379
|
rootElement,
|
|
332
|
-
jsxElement:
|
|
380
|
+
jsxElement: (
|
|
381
|
+
<DataGridHeader
|
|
382
|
+
field="name"
|
|
383
|
+
findOptions={{}}
|
|
384
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
385
|
+
filterConfig={{ type: 'string' }}
|
|
386
|
+
/>
|
|
387
|
+
),
|
|
333
388
|
})
|
|
334
389
|
|
|
335
390
|
await flushUpdates()
|
|
@@ -349,12 +404,19 @@ describe('DataGridHeader', () => {
|
|
|
349
404
|
it('should render StringFilter for string filterConfig', async () => {
|
|
350
405
|
await usingAsync(new Injector(), async (injector) => {
|
|
351
406
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
352
|
-
const
|
|
407
|
+
const onFindOptionsChange = vi.fn()
|
|
353
408
|
|
|
354
409
|
initializeShadeRoot({
|
|
355
410
|
injector,
|
|
356
411
|
rootElement,
|
|
357
|
-
jsxElement:
|
|
412
|
+
jsxElement: (
|
|
413
|
+
<DataGridHeader
|
|
414
|
+
field="name"
|
|
415
|
+
findOptions={{}}
|
|
416
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
417
|
+
filterConfig={{ type: 'string' }}
|
|
418
|
+
/>
|
|
419
|
+
),
|
|
358
420
|
})
|
|
359
421
|
|
|
360
422
|
await flushUpdates()
|
|
@@ -372,12 +434,19 @@ describe('DataGridHeader', () => {
|
|
|
372
434
|
it('should render NumberFilter for number filterConfig', async () => {
|
|
373
435
|
await usingAsync(new Injector(), async (injector) => {
|
|
374
436
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
375
|
-
const
|
|
437
|
+
const onFindOptionsChange = vi.fn()
|
|
376
438
|
|
|
377
439
|
initializeShadeRoot({
|
|
378
440
|
injector,
|
|
379
441
|
rootElement,
|
|
380
|
-
jsxElement:
|
|
442
|
+
jsxElement: (
|
|
443
|
+
<DataGridHeader
|
|
444
|
+
field="id"
|
|
445
|
+
findOptions={{}}
|
|
446
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
447
|
+
filterConfig={{ type: 'number' }}
|
|
448
|
+
/>
|
|
449
|
+
),
|
|
381
450
|
})
|
|
382
451
|
|
|
383
452
|
await flushUpdates()
|
|
@@ -395,12 +464,19 @@ describe('DataGridHeader', () => {
|
|
|
395
464
|
it('should render BooleanFilter for boolean filterConfig', async () => {
|
|
396
465
|
await usingAsync(new Injector(), async (injector) => {
|
|
397
466
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
398
|
-
const
|
|
467
|
+
const onFindOptionsChange = vi.fn()
|
|
399
468
|
|
|
400
469
|
initializeShadeRoot({
|
|
401
470
|
injector,
|
|
402
471
|
rootElement,
|
|
403
|
-
jsxElement:
|
|
472
|
+
jsxElement: (
|
|
473
|
+
<DataGridHeader
|
|
474
|
+
field="name"
|
|
475
|
+
findOptions={{}}
|
|
476
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
477
|
+
filterConfig={{ type: 'boolean' }}
|
|
478
|
+
/>
|
|
479
|
+
),
|
|
404
480
|
})
|
|
405
481
|
|
|
406
482
|
await flushUpdates()
|
|
@@ -418,7 +494,7 @@ describe('DataGridHeader', () => {
|
|
|
418
494
|
it('should render EnumFilter for enum filterConfig', async () => {
|
|
419
495
|
await usingAsync(new Injector(), async (injector) => {
|
|
420
496
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
421
|
-
const
|
|
497
|
+
const onFindOptionsChange = vi.fn()
|
|
422
498
|
|
|
423
499
|
initializeShadeRoot({
|
|
424
500
|
injector,
|
|
@@ -426,7 +502,8 @@ describe('DataGridHeader', () => {
|
|
|
426
502
|
jsxElement: (
|
|
427
503
|
<DataGridHeader
|
|
428
504
|
field="name"
|
|
429
|
-
findOptions={
|
|
505
|
+
findOptions={{}}
|
|
506
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
430
507
|
filterConfig={{ type: 'enum', values: [{ label: 'A', value: 'a' }] }}
|
|
431
508
|
/>
|
|
432
509
|
),
|
|
@@ -447,12 +524,19 @@ describe('DataGridHeader', () => {
|
|
|
447
524
|
it('should render DateFilter for date filterConfig', async () => {
|
|
448
525
|
await usingAsync(new Injector(), async (injector) => {
|
|
449
526
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
450
|
-
const
|
|
527
|
+
const onFindOptionsChange = vi.fn()
|
|
451
528
|
|
|
452
529
|
initializeShadeRoot({
|
|
453
530
|
injector,
|
|
454
531
|
rootElement,
|
|
455
|
-
jsxElement:
|
|
532
|
+
jsxElement: (
|
|
533
|
+
<DataGridHeader
|
|
534
|
+
field="name"
|
|
535
|
+
findOptions={{}}
|
|
536
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
537
|
+
filterConfig={{ type: 'date' }}
|
|
538
|
+
/>
|
|
539
|
+
),
|
|
456
540
|
})
|
|
457
541
|
|
|
458
542
|
await flushUpdates()
|
|
@@ -472,12 +556,12 @@ describe('DataGridHeader', () => {
|
|
|
472
556
|
it('should support both sorting and filtering simultaneously', async () => {
|
|
473
557
|
await usingAsync(new Injector(), async (injector) => {
|
|
474
558
|
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
475
|
-
const
|
|
559
|
+
const obs = new ObservableValue<FilterableFindOptions>({})
|
|
476
560
|
|
|
477
561
|
initializeShadeRoot({
|
|
478
562
|
injector,
|
|
479
563
|
rootElement,
|
|
480
|
-
jsxElement: <
|
|
564
|
+
jsxElement: <HeaderWrapper obs={obs} field="name" filterConfig={{ type: 'string' }} />,
|
|
481
565
|
})
|
|
482
566
|
|
|
483
567
|
await flushUpdates()
|
|
@@ -487,7 +571,7 @@ describe('DataGridHeader', () => {
|
|
|
487
571
|
|
|
488
572
|
await flushUpdates()
|
|
489
573
|
|
|
490
|
-
expect(
|
|
574
|
+
expect(obs.getValue().order).toEqual({ name: 'ASC' })
|
|
491
575
|
|
|
492
576
|
const filterButton = document.querySelector('data-grid-filter-button')?.querySelector('button')
|
|
493
577
|
filterButton?.click()
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import type { FindOptions } from '@furystack/core'
|
|
2
1
|
import type { ChildrenList } from '@furystack/shades'
|
|
3
2
|
import { Shade, createComponent } from '@furystack/shades'
|
|
4
|
-
import type { ObservableValue } from '@furystack/utils'
|
|
5
3
|
import { ToggleButton } from '../button-group.js'
|
|
6
4
|
import { arrowDown, arrowUp, arrowUpDown, filter as filterIcon } from '../icons/icon-definitions.js'
|
|
7
5
|
import { Icon } from '../icons/icon.js'
|
|
@@ -14,22 +12,24 @@ import { FilterDropdown } from './filters/filter-dropdown.js'
|
|
|
14
12
|
import { NumberFilter } from './filters/number-filter.js'
|
|
15
13
|
import { StringFilter } from './filters/string-filter.js'
|
|
16
14
|
|
|
17
|
-
export type DataGridHeaderProps<
|
|
15
|
+
export type DataGridHeaderProps<Column extends string> = {
|
|
18
16
|
field: Column
|
|
19
|
-
findOptions:
|
|
17
|
+
findOptions: FilterableFindOptions
|
|
18
|
+
onFindOptionsChange: (options: FilterableFindOptions) => void
|
|
20
19
|
filterConfig?: ColumnFilterConfig
|
|
21
20
|
}
|
|
22
21
|
|
|
23
22
|
export const OrderButton = Shade<{
|
|
24
23
|
field: string
|
|
25
|
-
findOptions:
|
|
24
|
+
findOptions: FilterableFindOptions
|
|
25
|
+
onFindOptionsChange: (options: FilterableFindOptions) => void
|
|
26
26
|
}>({
|
|
27
|
-
|
|
27
|
+
customElementName: 'data-grid-order-button',
|
|
28
28
|
css: {
|
|
29
29
|
display: 'inline-block',
|
|
30
30
|
},
|
|
31
|
-
render: ({ props
|
|
32
|
-
const
|
|
31
|
+
render: ({ props }) => {
|
|
32
|
+
const { findOptions } = props
|
|
33
33
|
|
|
34
34
|
const currentOrder = Object.keys(findOptions.order || {})[0]
|
|
35
35
|
const currentOrderDirection = Object.values(findOptions.order || {})[0]
|
|
@@ -48,7 +48,7 @@ export const OrderButton = Shade<{
|
|
|
48
48
|
newDirection = currentOrderDirection === 'ASC' ? 'DESC' : 'ASC'
|
|
49
49
|
}
|
|
50
50
|
newOrder[props.field] = newDirection
|
|
51
|
-
onFindOptionsChange({
|
|
51
|
+
props.onFindOptionsChange({
|
|
52
52
|
...findOptions,
|
|
53
53
|
order: newOrder,
|
|
54
54
|
})
|
|
@@ -67,17 +67,15 @@ export const OrderButton = Shade<{
|
|
|
67
67
|
|
|
68
68
|
const FilterButton = Shade<{
|
|
69
69
|
field: string
|
|
70
|
-
findOptions:
|
|
70
|
+
findOptions: FilterableFindOptions
|
|
71
71
|
onclick: () => void
|
|
72
72
|
}>({
|
|
73
|
-
|
|
73
|
+
customElementName: 'data-grid-filter-button',
|
|
74
74
|
css: {
|
|
75
75
|
display: 'inline-block',
|
|
76
76
|
},
|
|
77
|
-
render: ({ props
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
const hasActiveFilter = !!findOptions.filter?.[props.field]
|
|
77
|
+
render: ({ props }) => {
|
|
78
|
+
const hasActiveFilter = !!props.findOptions.filter?.[props.field]
|
|
81
79
|
|
|
82
80
|
return (
|
|
83
81
|
<ToggleButton
|
|
@@ -100,20 +98,57 @@ const FilterButton = Shade<{
|
|
|
100
98
|
const renderFilterComponent = (
|
|
101
99
|
filterConfig: ColumnFilterConfig,
|
|
102
100
|
field: string,
|
|
103
|
-
findOptions:
|
|
101
|
+
findOptions: FilterableFindOptions,
|
|
102
|
+
onFindOptionsChange: (options: FilterableFindOptions) => void,
|
|
104
103
|
onClose: () => void,
|
|
105
104
|
): JSX.Element => {
|
|
106
105
|
switch (filterConfig.type) {
|
|
107
106
|
case 'number':
|
|
108
|
-
return
|
|
107
|
+
return (
|
|
108
|
+
<NumberFilter
|
|
109
|
+
field={field}
|
|
110
|
+
findOptions={findOptions}
|
|
111
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
112
|
+
onClose={onClose}
|
|
113
|
+
/>
|
|
114
|
+
)
|
|
109
115
|
case 'boolean':
|
|
110
|
-
return
|
|
116
|
+
return (
|
|
117
|
+
<BooleanFilter
|
|
118
|
+
field={field}
|
|
119
|
+
findOptions={findOptions}
|
|
120
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
121
|
+
onClose={onClose}
|
|
122
|
+
/>
|
|
123
|
+
)
|
|
111
124
|
case 'enum':
|
|
112
|
-
return
|
|
125
|
+
return (
|
|
126
|
+
<EnumFilter
|
|
127
|
+
field={field}
|
|
128
|
+
values={filterConfig.values}
|
|
129
|
+
findOptions={findOptions}
|
|
130
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
131
|
+
onClose={onClose}
|
|
132
|
+
/>
|
|
133
|
+
)
|
|
113
134
|
case 'date':
|
|
114
|
-
return
|
|
135
|
+
return (
|
|
136
|
+
<DateFilter
|
|
137
|
+
field={field}
|
|
138
|
+
findOptions={findOptions}
|
|
139
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
140
|
+
onClose={onClose}
|
|
141
|
+
/>
|
|
142
|
+
)
|
|
115
143
|
case 'string':
|
|
116
|
-
return
|
|
144
|
+
return (
|
|
145
|
+
<StringFilter
|
|
146
|
+
field={field}
|
|
147
|
+
findOptions={findOptions}
|
|
148
|
+
onFindOptionsChange={onFindOptionsChange}
|
|
149
|
+
onClose={onClose}
|
|
150
|
+
/>
|
|
151
|
+
)
|
|
117
152
|
default: {
|
|
118
153
|
const _exhaustive: never = filterConfig
|
|
119
154
|
throw new Error(`Unknown filter type: ${(_exhaustive as ColumnFilterConfig).type}`)
|
|
@@ -121,11 +156,11 @@ const renderFilterComponent = (
|
|
|
121
156
|
}
|
|
122
157
|
}
|
|
123
158
|
|
|
124
|
-
export const DataGridHeader: <
|
|
125
|
-
props: DataGridHeaderProps<
|
|
159
|
+
export const DataGridHeader: <Column extends string>(
|
|
160
|
+
props: DataGridHeaderProps<Column>,
|
|
126
161
|
children: ChildrenList,
|
|
127
162
|
) => JSX.Element<any> = Shade({
|
|
128
|
-
|
|
163
|
+
customElementName: 'data-grid-header',
|
|
129
164
|
css: {
|
|
130
165
|
display: 'block',
|
|
131
166
|
fontFamily: cssVariableTheme.typography.fontFamily,
|
|
@@ -164,13 +199,14 @@ export const DataGridHeader: <T, Column extends string>(
|
|
|
164
199
|
{props.filterConfig && (
|
|
165
200
|
<FilterButton
|
|
166
201
|
onclick={() => setIsFilterOpen(!isFilterOpen)}
|
|
167
|
-
findOptions={props.findOptions
|
|
202
|
+
findOptions={props.findOptions}
|
|
168
203
|
field={props.field}
|
|
169
204
|
/>
|
|
170
205
|
)}
|
|
171
206
|
<OrderButton
|
|
172
207
|
field={props.field}
|
|
173
|
-
findOptions={props.findOptions
|
|
208
|
+
findOptions={props.findOptions}
|
|
209
|
+
onFindOptionsChange={props.onFindOptionsChange}
|
|
174
210
|
/>
|
|
175
211
|
</div>
|
|
176
212
|
</div>
|
|
@@ -179,7 +215,8 @@ export const DataGridHeader: <T, Column extends string>(
|
|
|
179
215
|
{renderFilterComponent(
|
|
180
216
|
props.filterConfig,
|
|
181
217
|
props.field,
|
|
182
|
-
props.findOptions
|
|
218
|
+
props.findOptions,
|
|
219
|
+
props.onFindOptionsChange,
|
|
183
220
|
closeFilter,
|
|
184
221
|
)}
|
|
185
222
|
</FilterDropdown>
|
|
@@ -3,7 +3,7 @@ import type { CollectionService } from '../../services/collection-service.js'
|
|
|
3
3
|
import { cssVariableTheme } from '../../services/css-variable-theme.js'
|
|
4
4
|
|
|
5
5
|
export const SelectionCell = Shade<{ entry: any; service: CollectionService<any> }>({
|
|
6
|
-
|
|
6
|
+
customElementName: 'shades-data-grid-selection-cell',
|
|
7
7
|
css: {
|
|
8
8
|
display: 'inline-flex',
|
|
9
9
|
fontFamily: cssVariableTheme.typography.fontFamily,
|