@furystack/shades-common-components 12.4.0 → 12.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +119 -0
- package/esm/components/app-bar-link.spec.js +16 -19
- package/esm/components/app-bar-link.spec.js.map +1 -1
- package/esm/components/app-bar.spec.js +6 -4
- package/esm/components/app-bar.spec.js.map +1 -1
- package/esm/components/avatar.spec.js +9 -9
- package/esm/components/avatar.spec.js.map +1 -1
- package/esm/components/breadcrumb.spec.js +2 -2
- package/esm/components/breadcrumb.spec.js.map +1 -1
- package/esm/components/button-group.d.ts +32 -0
- package/esm/components/button-group.d.ts.map +1 -1
- package/esm/components/button-group.js +26 -2
- package/esm/components/button-group.js.map +1 -1
- package/esm/components/button-group.spec.js +127 -11
- package/esm/components/button-group.spec.js.map +1 -1
- package/esm/components/button.spec.js +4 -4
- package/esm/components/button.spec.js.map +1 -1
- package/esm/components/cache-view.spec.js +2 -3
- package/esm/components/cache-view.spec.js.map +1 -1
- package/esm/components/carousel.spec.js +47 -47
- package/esm/components/carousel.spec.js.map +1 -1
- package/esm/components/circular-progress.spec.js +2 -2
- package/esm/components/command-palette/command-palette-input.spec.js +23 -19
- package/esm/components/command-palette/command-palette-input.spec.js.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js +27 -27
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
- package/esm/components/command-palette/index.spec.js +64 -51
- package/esm/components/command-palette/index.spec.js.map +1 -1
- package/esm/components/context-menu/context-menu.spec.js +33 -33
- package/esm/components/context-menu/context-menu.spec.js.map +1 -1
- package/esm/components/data-grid/body.spec.js +13 -13
- package/esm/components/data-grid/body.spec.js.map +1 -1
- package/esm/components/data-grid/data-grid-row.spec.js +8 -8
- package/esm/components/data-grid/data-grid-row.spec.js.map +1 -1
- package/esm/components/data-grid/data-grid.d.ts +47 -3
- package/esm/components/data-grid/data-grid.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid.js +8 -11
- package/esm/components/data-grid/data-grid.js.map +1 -1
- package/esm/components/data-grid/data-grid.spec.js +71 -28
- package/esm/components/data-grid/data-grid.spec.js.map +1 -1
- package/esm/components/data-grid/filters/boolean-filter.d.ts +12 -0
- package/esm/components/data-grid/filters/boolean-filter.d.ts.map +1 -0
- package/esm/components/data-grid/filters/boolean-filter.js +27 -0
- package/esm/components/data-grid/filters/boolean-filter.js.map +1 -0
- package/esm/components/data-grid/filters/boolean-filter.spec.d.ts +2 -0
- package/esm/components/data-grid/filters/boolean-filter.spec.d.ts.map +1 -0
- package/esm/components/data-grid/filters/boolean-filter.spec.js +114 -0
- package/esm/components/data-grid/filters/boolean-filter.spec.js.map +1 -0
- package/esm/components/data-grid/filters/date-filter.d.ts +12 -0
- package/esm/components/data-grid/filters/date-filter.d.ts.map +1 -0
- package/esm/components/data-grid/filters/date-filter.js +109 -0
- package/esm/components/data-grid/filters/date-filter.js.map +1 -0
- package/esm/components/data-grid/filters/date-filter.spec.d.ts +2 -0
- package/esm/components/data-grid/filters/date-filter.spec.d.ts.map +1 -0
- package/esm/components/data-grid/filters/date-filter.spec.js +145 -0
- package/esm/components/data-grid/filters/date-filter.spec.js.map +1 -0
- package/esm/components/data-grid/filters/enum-filter.d.ts +16 -0
- package/esm/components/data-grid/filters/enum-filter.d.ts.map +1 -0
- package/esm/components/data-grid/filters/enum-filter.js +72 -0
- package/esm/components/data-grid/filters/enum-filter.js.map +1 -0
- package/esm/components/data-grid/filters/enum-filter.spec.d.ts +2 -0
- package/esm/components/data-grid/filters/enum-filter.spec.d.ts.map +1 -0
- package/esm/components/data-grid/filters/enum-filter.spec.js +136 -0
- package/esm/components/data-grid/filters/enum-filter.spec.js.map +1 -0
- package/esm/components/data-grid/filters/filter-dropdown.d.ts +6 -0
- package/esm/components/data-grid/filters/filter-dropdown.d.ts.map +1 -0
- package/esm/components/data-grid/filters/filter-dropdown.js +41 -0
- package/esm/components/data-grid/filters/filter-dropdown.js.map +1 -0
- package/esm/components/data-grid/filters/filter-dropdown.spec.d.ts +2 -0
- package/esm/components/data-grid/filters/filter-dropdown.spec.d.ts.map +1 -0
- package/esm/components/data-grid/filters/filter-dropdown.spec.js +69 -0
- package/esm/components/data-grid/filters/filter-dropdown.spec.js.map +1 -0
- package/esm/components/data-grid/filters/filter-styles.d.ts +24 -0
- package/esm/components/data-grid/filters/filter-styles.d.ts.map +1 -0
- package/esm/components/data-grid/filters/filter-styles.js +25 -0
- package/esm/components/data-grid/filters/filter-styles.js.map +1 -0
- package/esm/components/data-grid/filters/index.d.ts +7 -0
- package/esm/components/data-grid/filters/index.d.ts.map +1 -0
- package/esm/components/data-grid/filters/index.js +7 -0
- package/esm/components/data-grid/filters/index.js.map +1 -0
- package/esm/components/data-grid/filters/number-filter.d.ts +12 -0
- package/esm/components/data-grid/filters/number-filter.d.ts.map +1 -0
- package/esm/components/data-grid/filters/number-filter.js +65 -0
- package/esm/components/data-grid/filters/number-filter.js.map +1 -0
- package/esm/components/data-grid/filters/number-filter.spec.d.ts +2 -0
- package/esm/components/data-grid/filters/number-filter.spec.d.ts.map +1 -0
- package/esm/components/data-grid/filters/number-filter.spec.js +142 -0
- package/esm/components/data-grid/filters/number-filter.spec.js.map +1 -0
- package/esm/components/data-grid/filters/string-filter.d.ts +12 -0
- package/esm/components/data-grid/filters/string-filter.d.ts.map +1 -0
- package/esm/components/data-grid/filters/string-filter.js +63 -0
- package/esm/components/data-grid/filters/string-filter.js.map +1 -0
- package/esm/components/data-grid/filters/string-filter.spec.d.ts +2 -0
- package/esm/components/data-grid/filters/string-filter.spec.d.ts.map +1 -0
- package/esm/components/data-grid/filters/string-filter.spec.js +128 -0
- package/esm/components/data-grid/filters/string-filter.spec.js.map +1 -0
- package/esm/components/data-grid/footer.d.ts +1 -0
- package/esm/components/data-grid/footer.d.ts.map +1 -1
- package/esm/components/data-grid/footer.js +24 -16
- package/esm/components/data-grid/footer.js.map +1 -1
- package/esm/components/data-grid/footer.spec.js +111 -71
- package/esm/components/data-grid/footer.spec.js.map +1 -1
- package/esm/components/data-grid/header.d.ts +6 -9
- package/esm/components/data-grid/header.d.ts.map +1 -1
- package/esm/components/data-grid/header.js +51 -117
- package/esm/components/data-grid/header.js.map +1 -1
- package/esm/components/data-grid/header.spec.js +116 -187
- package/esm/components/data-grid/header.spec.js.map +1 -1
- package/esm/components/data-grid/index.d.ts +1 -0
- package/esm/components/data-grid/index.d.ts.map +1 -1
- package/esm/components/data-grid/index.js +1 -0
- package/esm/components/data-grid/index.js.map +1 -1
- package/esm/components/data-grid/selection-cell.spec.js +8 -8
- package/esm/components/data-grid/selection-cell.spec.js.map +1 -1
- package/esm/components/drawer/drawer-toggle-button.spec.js +22 -22
- package/esm/components/drawer/drawer-toggle-button.spec.js.map +1 -1
- package/esm/components/drawer/index.spec.js +36 -36
- package/esm/components/drawer/index.spec.js.map +1 -1
- package/esm/components/dropdown.spec.js +38 -30
- package/esm/components/dropdown.spec.js.map +1 -1
- package/esm/components/fab.spec.js +4 -4
- package/esm/components/fab.spec.js.map +1 -1
- package/esm/components/form.spec.js +37 -37
- package/esm/components/form.spec.js.map +1 -1
- package/esm/components/grid.d.ts +3 -0
- package/esm/components/grid.d.ts.map +1 -1
- package/esm/components/grid.js +3 -0
- package/esm/components/grid.js.map +1 -1
- package/esm/components/grid.spec.js +3 -3
- package/esm/components/grid.spec.js.map +1 -1
- package/esm/components/image.spec.js +55 -52
- package/esm/components/image.spec.js.map +1 -1
- package/esm/components/inputs/autocomplete.d.ts +3 -0
- package/esm/components/inputs/autocomplete.d.ts.map +1 -1
- package/esm/components/inputs/autocomplete.js +3 -0
- package/esm/components/inputs/autocomplete.js.map +1 -1
- package/esm/components/inputs/autocomplete.spec.js +7 -14
- package/esm/components/inputs/autocomplete.spec.js.map +1 -1
- package/esm/components/inputs/checkbox.spec.js +22 -22
- package/esm/components/inputs/checkbox.spec.js.map +1 -1
- package/esm/components/inputs/input-number.spec.js +47 -47
- package/esm/components/inputs/input-number.spec.js.map +1 -1
- package/esm/components/inputs/input.spec.js +53 -53
- package/esm/components/inputs/input.spec.js.map +1 -1
- package/esm/components/inputs/radio-group.spec.js +14 -14
- package/esm/components/inputs/radio-group.spec.js.map +1 -1
- package/esm/components/inputs/radio.spec.js +16 -16
- package/esm/components/inputs/radio.spec.js.map +1 -1
- package/esm/components/inputs/select.spec.js +74 -74
- package/esm/components/inputs/select.spec.js.map +1 -1
- package/esm/components/inputs/slider.spec.js +16 -16
- package/esm/components/inputs/slider.spec.js.map +1 -1
- package/esm/components/inputs/switch.spec.js +24 -24
- package/esm/components/inputs/switch.spec.js.map +1 -1
- package/esm/components/inputs/text-area.spec.js +17 -17
- package/esm/components/inputs/text-area.spec.js.map +1 -1
- package/esm/components/linear-progress.spec.js +2 -2
- package/esm/components/list/list.d.ts +10 -0
- package/esm/components/list/list.d.ts.map +1 -1
- package/esm/components/list/list.js +23 -2
- package/esm/components/list/list.js.map +1 -1
- package/esm/components/list/list.spec.js +137 -36
- package/esm/components/list/list.spec.js.map +1 -1
- package/esm/components/markdown/markdown-display.spec.js +15 -15
- package/esm/components/markdown/markdown-display.spec.js.map +1 -1
- package/esm/components/markdown/markdown-editor.spec.js +8 -8
- package/esm/components/markdown/markdown-editor.spec.js.map +1 -1
- package/esm/components/markdown/markdown-input.d.ts +14 -0
- package/esm/components/markdown/markdown-input.d.ts.map +1 -1
- package/esm/components/markdown/markdown-input.js +48 -2
- package/esm/components/markdown/markdown-input.js.map +1 -1
- package/esm/components/markdown/markdown-input.spec.js +114 -17
- package/esm/components/markdown/markdown-input.spec.js.map +1 -1
- package/esm/components/menu/menu.spec.js +28 -28
- package/esm/components/menu/menu.spec.js.map +1 -1
- package/esm/components/modal.spec.js +15 -18
- package/esm/components/modal.spec.js.map +1 -1
- package/esm/components/noty-list.spec.js +25 -23
- package/esm/components/noty-list.spec.js.map +1 -1
- package/esm/components/page-container/index.spec.js +16 -16
- package/esm/components/page-container/index.spec.js.map +1 -1
- package/esm/components/page-container/page-header.spec.js +16 -16
- package/esm/components/page-container/page-header.spec.js.map +1 -1
- package/esm/components/page-layout/index.spec.js +29 -29
- package/esm/components/page-layout/index.spec.js.map +1 -1
- package/esm/components/paper.spec.js +3 -3
- package/esm/components/paper.spec.js.map +1 -1
- package/esm/components/rating.spec.js +61 -61
- package/esm/components/rating.spec.js.map +1 -1
- package/esm/components/skeleton.spec.js +10 -6
- package/esm/components/skeleton.spec.js.map +1 -1
- package/esm/components/suggest/index.d.ts +10 -2
- package/esm/components/suggest/index.d.ts.map +1 -1
- package/esm/components/suggest/index.js +21 -1
- package/esm/components/suggest/index.js.map +1 -1
- package/esm/components/suggest/index.spec.js +50 -0
- package/esm/components/suggest/index.spec.js.map +1 -1
- package/esm/components/suggest/suggest-input.spec.js +4 -10
- package/esm/components/suggest/suggest-input.spec.js.map +1 -1
- package/esm/components/tabs.spec.js +30 -30
- package/esm/components/tabs.spec.js.map +1 -1
- package/esm/components/tree/tree.spec.js +27 -27
- package/esm/components/tree/tree.spec.js.map +1 -1
- package/esm/components/typography.spec.js +3 -3
- package/esm/components/typography.spec.js.map +1 -1
- package/esm/components/wizard/index.d.ts +8 -0
- package/esm/components/wizard/index.d.ts.map +1 -1
- package/esm/components/wizard/index.js +90 -0
- package/esm/components/wizard/index.js.map +1 -1
- package/esm/components/wizard/index.spec.js +84 -7
- package/esm/components/wizard/index.spec.js.map +1 -1
- package/esm/utils/promisify-animation.d.ts.map +1 -1
- package/esm/utils/promisify-animation.js +3 -0
- package/esm/utils/promisify-animation.js.map +1 -1
- package/package.json +3 -3
- package/src/components/app-bar-link.spec.tsx +16 -19
- package/src/components/app-bar.spec.tsx +6 -4
- package/src/components/avatar.spec.tsx +9 -9
- package/src/components/breadcrumb.spec.tsx +2 -2
- package/src/components/button-group.spec.tsx +155 -11
- package/src/components/button-group.tsx +49 -2
- package/src/components/button.spec.tsx +4 -4
- package/src/components/cache-view.spec.tsx +3 -3
- package/src/components/carousel.spec.tsx +47 -47
- package/src/components/circular-progress.spec.tsx +2 -2
- package/src/components/command-palette/command-palette-input.spec.tsx +23 -19
- package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +27 -27
- package/src/components/command-palette/index.spec.tsx +64 -51
- package/src/components/context-menu/context-menu.spec.tsx +33 -33
- package/src/components/data-grid/body.spec.tsx +13 -13
- package/src/components/data-grid/data-grid-row.spec.tsx +8 -8
- package/src/components/data-grid/data-grid.spec.tsx +106 -28
- package/src/components/data-grid/data-grid.tsx +57 -13
- package/src/components/data-grid/filters/boolean-filter.spec.tsx +142 -0
- package/src/components/data-grid/filters/boolean-filter.tsx +45 -0
- package/src/components/data-grid/filters/date-filter.spec.tsx +181 -0
- package/src/components/data-grid/filters/date-filter.tsx +162 -0
- package/src/components/data-grid/filters/enum-filter.spec.tsx +168 -0
- package/src/components/data-grid/filters/enum-filter.tsx +119 -0
- package/src/components/data-grid/filters/filter-dropdown.spec.tsx +89 -0
- package/src/components/data-grid/filters/filter-dropdown.tsx +60 -0
- package/src/components/data-grid/filters/filter-styles.ts +26 -0
- package/src/components/data-grid/filters/index.ts +6 -0
- package/src/components/data-grid/filters/number-filter.spec.tsx +174 -0
- package/src/components/data-grid/filters/number-filter.tsx +115 -0
- package/src/components/data-grid/filters/string-filter.spec.tsx +157 -0
- package/src/components/data-grid/filters/string-filter.tsx +112 -0
- package/src/components/data-grid/footer.spec.tsx +130 -74
- package/src/components/data-grid/footer.tsx +41 -34
- package/src/components/data-grid/header.spec.tsx +128 -212
- package/src/components/data-grid/header.tsx +95 -183
- package/src/components/data-grid/index.tsx +1 -0
- package/src/components/data-grid/selection-cell.spec.tsx +8 -8
- package/src/components/drawer/drawer-toggle-button.spec.tsx +22 -22
- package/src/components/drawer/index.spec.tsx +36 -36
- package/src/components/dropdown.spec.tsx +38 -30
- package/src/components/fab.spec.tsx +4 -4
- package/src/components/form.spec.tsx +37 -37
- package/src/components/grid.spec.tsx +3 -3
- package/src/components/grid.tsx +3 -0
- package/src/components/image.spec.tsx +55 -52
- package/src/components/inputs/autocomplete.spec.tsx +7 -14
- package/src/components/inputs/autocomplete.tsx +3 -0
- package/src/components/inputs/checkbox.spec.tsx +22 -22
- package/src/components/inputs/input-number.spec.tsx +47 -47
- package/src/components/inputs/input.spec.tsx +53 -53
- package/src/components/inputs/radio-group.spec.tsx +14 -14
- package/src/components/inputs/radio.spec.tsx +16 -16
- package/src/components/inputs/select.spec.tsx +74 -74
- package/src/components/inputs/slider.spec.tsx +16 -16
- package/src/components/inputs/switch.spec.tsx +24 -24
- package/src/components/inputs/text-area.spec.tsx +17 -17
- package/src/components/linear-progress.spec.tsx +2 -2
- package/src/components/list/list.spec.tsx +209 -36
- package/src/components/list/list.tsx +56 -19
- package/src/components/markdown/markdown-display.spec.tsx +15 -15
- package/src/components/markdown/markdown-editor.spec.tsx +8 -8
- package/src/components/markdown/markdown-input.spec.tsx +159 -17
- package/src/components/markdown/markdown-input.tsx +65 -1
- package/src/components/menu/menu.spec.tsx +28 -28
- package/src/components/modal.spec.tsx +15 -18
- package/src/components/noty-list.spec.tsx +25 -23
- package/src/components/page-container/index.spec.tsx +16 -16
- package/src/components/page-container/page-header.spec.tsx +16 -16
- package/src/components/page-layout/index.spec.tsx +29 -29
- package/src/components/paper.spec.tsx +3 -3
- package/src/components/rating.spec.tsx +61 -61
- package/src/components/skeleton.spec.tsx +10 -6
- package/src/components/suggest/index.spec.tsx +83 -0
- package/src/components/suggest/index.tsx +36 -3
- package/src/components/suggest/suggest-input.spec.tsx +4 -10
- package/src/components/tabs.spec.tsx +30 -30
- package/src/components/tree/tree.spec.tsx +27 -27
- package/src/components/typography.spec.tsx +3 -3
- package/src/components/wizard/index.spec.tsx +123 -6
- package/src/components/wizard/index.tsx +125 -0
- package/src/utils/promisify-animation.ts +3 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject'
|
|
2
|
-
import { createComponent, initializeShadeRoot } from '@furystack/shades'
|
|
3
|
-
import {
|
|
2
|
+
import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
|
|
3
|
+
import { usingAsync } from '@furystack/utils'
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
5
5
|
import { ThemeProviderService } from '../services/theme-provider-service.js'
|
|
6
6
|
import { Rating } from './rating.js'
|
|
@@ -25,7 +25,7 @@ describe('Rating', () => {
|
|
|
25
25
|
jsxElement: <Rating />,
|
|
26
26
|
})
|
|
27
27
|
|
|
28
|
-
await
|
|
28
|
+
await flushUpdates()
|
|
29
29
|
|
|
30
30
|
const rating = document.querySelector('shade-rating')
|
|
31
31
|
expect(rating).not.toBeNull()
|
|
@@ -42,7 +42,7 @@ describe('Rating', () => {
|
|
|
42
42
|
jsxElement: <Rating />,
|
|
43
43
|
})
|
|
44
44
|
|
|
45
|
-
await
|
|
45
|
+
await flushUpdates()
|
|
46
46
|
|
|
47
47
|
const stars = document.querySelectorAll('shade-rating .rating-star')
|
|
48
48
|
expect(stars.length).toBe(5)
|
|
@@ -59,7 +59,7 @@ describe('Rating', () => {
|
|
|
59
59
|
jsxElement: <Rating max={10} />,
|
|
60
60
|
})
|
|
61
61
|
|
|
62
|
-
await
|
|
62
|
+
await flushUpdates()
|
|
63
63
|
|
|
64
64
|
const stars = document.querySelectorAll('shade-rating .rating-star')
|
|
65
65
|
expect(stars.length).toBe(10)
|
|
@@ -77,7 +77,7 @@ describe('Rating', () => {
|
|
|
77
77
|
jsxElement: <Rating value={3} />,
|
|
78
78
|
})
|
|
79
79
|
|
|
80
|
-
await
|
|
80
|
+
await flushUpdates()
|
|
81
81
|
|
|
82
82
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
83
83
|
expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
|
|
@@ -98,7 +98,7 @@ describe('Rating', () => {
|
|
|
98
98
|
jsxElement: <Rating value={2.5} precision={0.5} />,
|
|
99
99
|
})
|
|
100
100
|
|
|
101
|
-
await
|
|
101
|
+
await flushUpdates()
|
|
102
102
|
|
|
103
103
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
104
104
|
expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
|
|
@@ -119,7 +119,7 @@ describe('Rating', () => {
|
|
|
119
119
|
jsxElement: <Rating value={0} />,
|
|
120
120
|
})
|
|
121
121
|
|
|
122
|
-
await
|
|
122
|
+
await flushUpdates()
|
|
123
123
|
|
|
124
124
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
125
125
|
expect(filledSpans.length).toBe(5)
|
|
@@ -142,12 +142,12 @@ describe('Rating', () => {
|
|
|
142
142
|
jsxElement: <Rating value={0} onValueChange={onchange} />,
|
|
143
143
|
})
|
|
144
144
|
|
|
145
|
-
await
|
|
145
|
+
await flushUpdates()
|
|
146
146
|
|
|
147
147
|
const stars = document.querySelectorAll('shade-rating .rating-star')
|
|
148
148
|
;(stars[2] as HTMLElement).dispatchEvent(new MouseEvent('click', { bubbles: true }))
|
|
149
149
|
|
|
150
|
-
await
|
|
150
|
+
await flushUpdates()
|
|
151
151
|
|
|
152
152
|
expect(onchange).toHaveBeenCalledWith(3)
|
|
153
153
|
})
|
|
@@ -164,12 +164,12 @@ describe('Rating', () => {
|
|
|
164
164
|
jsxElement: <Rating value={0} onValueChange={onchange} disabled />,
|
|
165
165
|
})
|
|
166
166
|
|
|
167
|
-
await
|
|
167
|
+
await flushUpdates()
|
|
168
168
|
|
|
169
169
|
const stars = document.querySelectorAll('shade-rating .rating-star')
|
|
170
170
|
;(stars[2] as HTMLElement).dispatchEvent(new MouseEvent('click', { bubbles: true }))
|
|
171
171
|
|
|
172
|
-
await
|
|
172
|
+
await flushUpdates()
|
|
173
173
|
|
|
174
174
|
expect(onchange).not.toHaveBeenCalled()
|
|
175
175
|
})
|
|
@@ -186,12 +186,12 @@ describe('Rating', () => {
|
|
|
186
186
|
jsxElement: <Rating value={3} onValueChange={onchange} readOnly />,
|
|
187
187
|
})
|
|
188
188
|
|
|
189
|
-
await
|
|
189
|
+
await flushUpdates()
|
|
190
190
|
|
|
191
191
|
const stars = document.querySelectorAll('shade-rating .rating-star')
|
|
192
192
|
;(stars[0] as HTMLElement).dispatchEvent(new MouseEvent('click', { bubbles: true }))
|
|
193
193
|
|
|
194
|
-
await
|
|
194
|
+
await flushUpdates()
|
|
195
195
|
|
|
196
196
|
expect(onchange).not.toHaveBeenCalled()
|
|
197
197
|
})
|
|
@@ -210,12 +210,12 @@ describe('Rating', () => {
|
|
|
210
210
|
jsxElement: <Rating value={3} onValueChange={onchange} />,
|
|
211
211
|
})
|
|
212
212
|
|
|
213
|
-
await
|
|
213
|
+
await flushUpdates()
|
|
214
214
|
|
|
215
215
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
216
216
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
|
|
217
217
|
|
|
218
|
-
await
|
|
218
|
+
await flushUpdates()
|
|
219
219
|
|
|
220
220
|
expect(onchange).toHaveBeenCalledWith(4)
|
|
221
221
|
})
|
|
@@ -232,12 +232,12 @@ describe('Rating', () => {
|
|
|
232
232
|
jsxElement: <Rating value={3} onValueChange={onchange} />,
|
|
233
233
|
})
|
|
234
234
|
|
|
235
|
-
await
|
|
235
|
+
await flushUpdates()
|
|
236
236
|
|
|
237
237
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
238
238
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
|
|
239
239
|
|
|
240
|
-
await
|
|
240
|
+
await flushUpdates()
|
|
241
241
|
|
|
242
242
|
expect(onchange).toHaveBeenCalledWith(2)
|
|
243
243
|
})
|
|
@@ -254,12 +254,12 @@ describe('Rating', () => {
|
|
|
254
254
|
jsxElement: <Rating value={3} precision={0.5} onValueChange={onchange} />,
|
|
255
255
|
})
|
|
256
256
|
|
|
257
|
-
await
|
|
257
|
+
await flushUpdates()
|
|
258
258
|
|
|
259
259
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
260
260
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
|
|
261
261
|
|
|
262
|
-
await
|
|
262
|
+
await flushUpdates()
|
|
263
263
|
|
|
264
264
|
expect(onchange).toHaveBeenCalledWith(3.5)
|
|
265
265
|
})
|
|
@@ -276,12 +276,12 @@ describe('Rating', () => {
|
|
|
276
276
|
jsxElement: <Rating value={5} onValueChange={onchange} />,
|
|
277
277
|
})
|
|
278
278
|
|
|
279
|
-
await
|
|
279
|
+
await flushUpdates()
|
|
280
280
|
|
|
281
281
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
282
282
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
|
|
283
283
|
|
|
284
|
-
await
|
|
284
|
+
await flushUpdates()
|
|
285
285
|
|
|
286
286
|
expect(onchange).not.toHaveBeenCalled()
|
|
287
287
|
})
|
|
@@ -298,12 +298,12 @@ describe('Rating', () => {
|
|
|
298
298
|
jsxElement: <Rating value={0} onValueChange={onchange} />,
|
|
299
299
|
})
|
|
300
300
|
|
|
301
|
-
await
|
|
301
|
+
await flushUpdates()
|
|
302
302
|
|
|
303
303
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
304
304
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
|
|
305
305
|
|
|
306
|
-
await
|
|
306
|
+
await flushUpdates()
|
|
307
307
|
|
|
308
308
|
expect(onchange).not.toHaveBeenCalled()
|
|
309
309
|
})
|
|
@@ -321,7 +321,7 @@ describe('Rating', () => {
|
|
|
321
321
|
jsxElement: <Rating disabled />,
|
|
322
322
|
})
|
|
323
323
|
|
|
324
|
-
await
|
|
324
|
+
await flushUpdates()
|
|
325
325
|
|
|
326
326
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
327
327
|
expect(wrapper.hasAttribute('data-disabled')).toBe(true)
|
|
@@ -339,7 +339,7 @@ describe('Rating', () => {
|
|
|
339
339
|
jsxElement: <Rating />,
|
|
340
340
|
})
|
|
341
341
|
|
|
342
|
-
await
|
|
342
|
+
await flushUpdates()
|
|
343
343
|
|
|
344
344
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
345
345
|
expect(wrapper.hasAttribute('data-disabled')).toBe(false)
|
|
@@ -358,7 +358,7 @@ describe('Rating', () => {
|
|
|
358
358
|
jsxElement: <Rating readOnly />,
|
|
359
359
|
})
|
|
360
360
|
|
|
361
|
-
await
|
|
361
|
+
await flushUpdates()
|
|
362
362
|
|
|
363
363
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
364
364
|
expect(wrapper.hasAttribute('data-readonly')).toBe(true)
|
|
@@ -378,7 +378,7 @@ describe('Rating', () => {
|
|
|
378
378
|
jsxElement: <Rating value={1} icon="❤️" emptyIcon="🤍" />,
|
|
379
379
|
})
|
|
380
380
|
|
|
381
|
-
await
|
|
381
|
+
await flushUpdates()
|
|
382
382
|
|
|
383
383
|
const emptySpans = document.querySelectorAll('shade-rating .star-empty')
|
|
384
384
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
@@ -400,7 +400,7 @@ describe('Rating', () => {
|
|
|
400
400
|
jsxElement: <Rating size="large" />,
|
|
401
401
|
})
|
|
402
402
|
|
|
403
|
-
await
|
|
403
|
+
await flushUpdates()
|
|
404
404
|
|
|
405
405
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
406
406
|
expect(wrapper.getAttribute('data-size')).toBe('large')
|
|
@@ -417,7 +417,7 @@ describe('Rating', () => {
|
|
|
417
417
|
jsxElement: <Rating />,
|
|
418
418
|
})
|
|
419
419
|
|
|
420
|
-
await
|
|
420
|
+
await flushUpdates()
|
|
421
421
|
|
|
422
422
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
423
423
|
expect(wrapper.getAttribute('data-size')).toBe('medium')
|
|
@@ -436,7 +436,7 @@ describe('Rating', () => {
|
|
|
436
436
|
jsxElement: <Rating />,
|
|
437
437
|
})
|
|
438
438
|
|
|
439
|
-
await
|
|
439
|
+
await flushUpdates()
|
|
440
440
|
|
|
441
441
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
442
442
|
const themeService = injector.getInstance(ThemeProviderService)
|
|
@@ -454,7 +454,7 @@ describe('Rating', () => {
|
|
|
454
454
|
jsxElement: <Rating color="primary" />,
|
|
455
455
|
})
|
|
456
456
|
|
|
457
|
-
await
|
|
457
|
+
await flushUpdates()
|
|
458
458
|
|
|
459
459
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
460
460
|
const themeService = injector.getInstance(ThemeProviderService)
|
|
@@ -474,7 +474,7 @@ describe('Rating', () => {
|
|
|
474
474
|
jsxElement: <Rating value={3} max={5} />,
|
|
475
475
|
})
|
|
476
476
|
|
|
477
|
-
await
|
|
477
|
+
await flushUpdates()
|
|
478
478
|
|
|
479
479
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
480
480
|
expect(wrapper.getAttribute('role')).toBe('slider')
|
|
@@ -495,7 +495,7 @@ describe('Rating', () => {
|
|
|
495
495
|
jsxElement: <Rating value={3} max={5} readOnly />,
|
|
496
496
|
})
|
|
497
497
|
|
|
498
|
-
await
|
|
498
|
+
await flushUpdates()
|
|
499
499
|
|
|
500
500
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
501
501
|
expect(wrapper.getAttribute('role')).toBe('img')
|
|
@@ -516,7 +516,7 @@ describe('Rating', () => {
|
|
|
516
516
|
jsxElement: <Rating name="userRating" value={4} />,
|
|
517
517
|
})
|
|
518
518
|
|
|
519
|
-
await
|
|
519
|
+
await flushUpdates()
|
|
520
520
|
|
|
521
521
|
const input = document.querySelector('shade-rating input[type="hidden"]') as HTMLInputElement
|
|
522
522
|
expect(input).not.toBeNull()
|
|
@@ -535,7 +535,7 @@ describe('Rating', () => {
|
|
|
535
535
|
jsxElement: <Rating value={4} />,
|
|
536
536
|
})
|
|
537
537
|
|
|
538
|
-
await
|
|
538
|
+
await flushUpdates()
|
|
539
539
|
|
|
540
540
|
const input = document.querySelector('shade-rating input[type="hidden"]')
|
|
541
541
|
expect(input).toBeNull()
|
|
@@ -555,12 +555,12 @@ describe('Rating', () => {
|
|
|
555
555
|
jsxElement: <Rating value={3} max={5} onValueChange={onchange} />,
|
|
556
556
|
})
|
|
557
557
|
|
|
558
|
-
await
|
|
558
|
+
await flushUpdates()
|
|
559
559
|
|
|
560
560
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
561
561
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'End', bubbles: true }))
|
|
562
562
|
|
|
563
|
-
await
|
|
563
|
+
await flushUpdates()
|
|
564
564
|
|
|
565
565
|
expect(onchange).toHaveBeenCalledWith(5)
|
|
566
566
|
})
|
|
@@ -577,12 +577,12 @@ describe('Rating', () => {
|
|
|
577
577
|
jsxElement: <Rating value={3} onValueChange={onchange} />,
|
|
578
578
|
})
|
|
579
579
|
|
|
580
|
-
await
|
|
580
|
+
await flushUpdates()
|
|
581
581
|
|
|
582
582
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
583
583
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'Home', bubbles: true }))
|
|
584
584
|
|
|
585
|
-
await
|
|
585
|
+
await flushUpdates()
|
|
586
586
|
|
|
587
587
|
expect(onchange).toHaveBeenCalledWith(0)
|
|
588
588
|
})
|
|
@@ -599,12 +599,12 @@ describe('Rating', () => {
|
|
|
599
599
|
jsxElement: <Rating value={2} onValueChange={onchange} />,
|
|
600
600
|
})
|
|
601
601
|
|
|
602
|
-
await
|
|
602
|
+
await flushUpdates()
|
|
603
603
|
|
|
604
604
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
605
605
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }))
|
|
606
606
|
|
|
607
|
-
await
|
|
607
|
+
await flushUpdates()
|
|
608
608
|
|
|
609
609
|
expect(onchange).toHaveBeenCalledWith(3)
|
|
610
610
|
})
|
|
@@ -621,12 +621,12 @@ describe('Rating', () => {
|
|
|
621
621
|
jsxElement: <Rating value={3} onValueChange={onchange} />,
|
|
622
622
|
})
|
|
623
623
|
|
|
624
|
-
await
|
|
624
|
+
await flushUpdates()
|
|
625
625
|
|
|
626
626
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
627
627
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
|
|
628
628
|
|
|
629
|
-
await
|
|
629
|
+
await flushUpdates()
|
|
630
630
|
|
|
631
631
|
expect(onchange).toHaveBeenCalledWith(2)
|
|
632
632
|
})
|
|
@@ -643,12 +643,12 @@ describe('Rating', () => {
|
|
|
643
643
|
jsxElement: <Rating value={3} onValueChange={onchange} />,
|
|
644
644
|
})
|
|
645
645
|
|
|
646
|
-
await
|
|
646
|
+
await flushUpdates()
|
|
647
647
|
|
|
648
648
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
649
649
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'a', bubbles: true }))
|
|
650
650
|
|
|
651
|
-
await
|
|
651
|
+
await flushUpdates()
|
|
652
652
|
|
|
653
653
|
expect(onchange).not.toHaveBeenCalled()
|
|
654
654
|
})
|
|
@@ -665,12 +665,12 @@ describe('Rating', () => {
|
|
|
665
665
|
jsxElement: <Rating value={3} disabled onValueChange={onchange} />,
|
|
666
666
|
})
|
|
667
667
|
|
|
668
|
-
await
|
|
668
|
+
await flushUpdates()
|
|
669
669
|
|
|
670
670
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
671
671
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
|
|
672
672
|
|
|
673
|
-
await
|
|
673
|
+
await flushUpdates()
|
|
674
674
|
|
|
675
675
|
expect(onchange).not.toHaveBeenCalled()
|
|
676
676
|
})
|
|
@@ -687,12 +687,12 @@ describe('Rating', () => {
|
|
|
687
687
|
jsxElement: <Rating value={3} readOnly onValueChange={onchange} />,
|
|
688
688
|
})
|
|
689
689
|
|
|
690
|
-
await
|
|
690
|
+
await flushUpdates()
|
|
691
691
|
|
|
692
692
|
const ratingEl = document.querySelector('shade-rating') as HTMLElement
|
|
693
693
|
ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
|
|
694
694
|
|
|
695
|
-
await
|
|
695
|
+
await flushUpdates()
|
|
696
696
|
|
|
697
697
|
expect(onchange).not.toHaveBeenCalled()
|
|
698
698
|
})
|
|
@@ -710,12 +710,12 @@ describe('Rating', () => {
|
|
|
710
710
|
jsxElement: <Rating value={2} />,
|
|
711
711
|
})
|
|
712
712
|
|
|
713
|
-
await
|
|
713
|
+
await flushUpdates()
|
|
714
714
|
|
|
715
715
|
const container = document.querySelector('shade-rating .rating-container') as HTMLElement
|
|
716
716
|
container.dispatchEvent(new MouseEvent('mouseleave', { bubbles: true }))
|
|
717
717
|
|
|
718
|
-
await
|
|
718
|
+
await flushUpdates()
|
|
719
719
|
|
|
720
720
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
721
721
|
expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
|
|
@@ -734,7 +734,7 @@ describe('Rating', () => {
|
|
|
734
734
|
jsxElement: <Rating value={1} />,
|
|
735
735
|
})
|
|
736
736
|
|
|
737
|
-
await
|
|
737
|
+
await flushUpdates()
|
|
738
738
|
|
|
739
739
|
const stars = document.querySelectorAll('shade-rating .rating-star')
|
|
740
740
|
const star4 = stars[3] as HTMLElement
|
|
@@ -748,7 +748,7 @@ describe('Rating', () => {
|
|
|
748
748
|
}),
|
|
749
749
|
)
|
|
750
750
|
|
|
751
|
-
await
|
|
751
|
+
await flushUpdates()
|
|
752
752
|
|
|
753
753
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
754
754
|
// Stars 0-3 should be filled (hover value = 4)
|
|
@@ -770,12 +770,12 @@ describe('Rating', () => {
|
|
|
770
770
|
jsxElement: <Rating value={1} disabled />,
|
|
771
771
|
})
|
|
772
772
|
|
|
773
|
-
await
|
|
773
|
+
await flushUpdates()
|
|
774
774
|
|
|
775
775
|
const stars = document.querySelectorAll('shade-rating .rating-star')
|
|
776
776
|
;(stars[3] as HTMLElement).dispatchEvent(new MouseEvent('mousemove', { bubbles: true, clientX: 100 }))
|
|
777
777
|
|
|
778
|
-
await
|
|
778
|
+
await flushUpdates()
|
|
779
779
|
|
|
780
780
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
781
781
|
// Only first star should be filled (no hover effect)
|
|
@@ -794,12 +794,12 @@ describe('Rating', () => {
|
|
|
794
794
|
jsxElement: <Rating value={2} disabled />,
|
|
795
795
|
})
|
|
796
796
|
|
|
797
|
-
await
|
|
797
|
+
await flushUpdates()
|
|
798
798
|
|
|
799
799
|
const container = document.querySelector('shade-rating .rating-container') as HTMLElement
|
|
800
800
|
container.dispatchEvent(new MouseEvent('mouseleave', { bubbles: true }))
|
|
801
801
|
|
|
802
|
-
await
|
|
802
|
+
await flushUpdates()
|
|
803
803
|
|
|
804
804
|
const filledSpans = document.querySelectorAll('shade-rating .star-filled')
|
|
805
805
|
expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
|
|
@@ -820,7 +820,7 @@ describe('Rating', () => {
|
|
|
820
820
|
jsxElement: <Rating size="small" />,
|
|
821
821
|
})
|
|
822
822
|
|
|
823
|
-
await
|
|
823
|
+
await flushUpdates()
|
|
824
824
|
|
|
825
825
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
826
826
|
expect(wrapper.getAttribute('data-size')).toBe('small')
|
|
@@ -839,7 +839,7 @@ describe('Rating', () => {
|
|
|
839
839
|
jsxElement: <Rating readOnly value={3} />,
|
|
840
840
|
})
|
|
841
841
|
|
|
842
|
-
await
|
|
842
|
+
await flushUpdates()
|
|
843
843
|
|
|
844
844
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
845
845
|
expect(wrapper.getAttribute('aria-readonly')).toBe('true')
|
|
@@ -856,7 +856,7 @@ describe('Rating', () => {
|
|
|
856
856
|
jsxElement: <Rating value={3} />,
|
|
857
857
|
})
|
|
858
858
|
|
|
859
|
-
await
|
|
859
|
+
await flushUpdates()
|
|
860
860
|
|
|
861
861
|
const wrapper = document.querySelector('shade-rating') as HTMLElement
|
|
862
862
|
expect(wrapper.hasAttribute('aria-readonly')).toBe(false)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject'
|
|
2
|
-
import { createComponent, initializeShadeRoot } from '@furystack/shades'
|
|
3
|
-
import {
|
|
2
|
+
import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
|
|
3
|
+
import { usingAsync } from '@furystack/utils'
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
5
5
|
import { Skeleton } from './skeleton.js'
|
|
6
6
|
|
|
@@ -56,7 +56,8 @@ describe('Skeleton', () => {
|
|
|
56
56
|
jsxElement: <Skeleton />,
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
await
|
|
59
|
+
await flushUpdates()
|
|
60
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 0))
|
|
60
61
|
|
|
61
62
|
const skeleton = document.querySelector('shade-skeleton')
|
|
62
63
|
expect(skeleton).not.toBeNull()
|
|
@@ -87,7 +88,8 @@ describe('Skeleton', () => {
|
|
|
87
88
|
jsxElement: <Skeleton delay={500} />,
|
|
88
89
|
})
|
|
89
90
|
|
|
90
|
-
await
|
|
91
|
+
await flushUpdates()
|
|
92
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 0))
|
|
91
93
|
|
|
92
94
|
const fadeInCall = animateCalls.find(
|
|
93
95
|
(call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'opacity' in kf),
|
|
@@ -108,7 +110,8 @@ describe('Skeleton', () => {
|
|
|
108
110
|
jsxElement: <Skeleton delay={100} />,
|
|
109
111
|
})
|
|
110
112
|
|
|
111
|
-
await
|
|
113
|
+
await flushUpdates()
|
|
114
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 0))
|
|
112
115
|
|
|
113
116
|
const fadeInCall = animateCalls.find(
|
|
114
117
|
(call) =>
|
|
@@ -138,7 +141,8 @@ describe('Skeleton', () => {
|
|
|
138
141
|
jsxElement: <Skeleton delay={0} />,
|
|
139
142
|
})
|
|
140
143
|
|
|
141
|
-
await
|
|
144
|
+
await flushUpdates()
|
|
145
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 50))
|
|
142
146
|
|
|
143
147
|
const backgroundAnimation = animateCalls.find(
|
|
144
148
|
(call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'backgroundPosition' in kf),
|
|
@@ -882,4 +882,87 @@ describe('Suggest', () => {
|
|
|
882
882
|
})
|
|
883
883
|
})
|
|
884
884
|
})
|
|
885
|
+
|
|
886
|
+
describe('synchronous suggestions mode', () => {
|
|
887
|
+
it('should render with string[] suggestions', async () => {
|
|
888
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
889
|
+
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
890
|
+
const onSelectSuggestion = vi.fn()
|
|
891
|
+
|
|
892
|
+
initializeShadeRoot({
|
|
893
|
+
injector,
|
|
894
|
+
rootElement,
|
|
895
|
+
jsxElement: (
|
|
896
|
+
<Suggest
|
|
897
|
+
defaultPrefix="🔍"
|
|
898
|
+
suggestions={['Apple', 'Banana', 'Cherry']}
|
|
899
|
+
onSelectSuggestion={onSelectSuggestion}
|
|
900
|
+
/>
|
|
901
|
+
),
|
|
902
|
+
})
|
|
903
|
+
|
|
904
|
+
await advanceTimers(50)
|
|
905
|
+
|
|
906
|
+
const suggest = document.querySelector('shade-suggest') as HTMLElement
|
|
907
|
+
expect(suggest).not.toBeNull()
|
|
908
|
+
})
|
|
909
|
+
})
|
|
910
|
+
|
|
911
|
+
it('should render input in sync mode', async () => {
|
|
912
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
913
|
+
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
914
|
+
const onSelectSuggestion = vi.fn()
|
|
915
|
+
|
|
916
|
+
initializeShadeRoot({
|
|
917
|
+
injector,
|
|
918
|
+
rootElement,
|
|
919
|
+
jsxElement: (
|
|
920
|
+
<Suggest
|
|
921
|
+
defaultPrefix="🔍"
|
|
922
|
+
suggestions={['Apple', 'Banana', 'Cherry']}
|
|
923
|
+
onSelectSuggestion={onSelectSuggestion}
|
|
924
|
+
/>
|
|
925
|
+
),
|
|
926
|
+
})
|
|
927
|
+
|
|
928
|
+
await advanceTimers(50)
|
|
929
|
+
|
|
930
|
+
const suggest = document.querySelector('shade-suggest') as HTMLElement
|
|
931
|
+
const input = suggest?.querySelector('input')
|
|
932
|
+
expect(input).not.toBeNull()
|
|
933
|
+
})
|
|
934
|
+
})
|
|
935
|
+
|
|
936
|
+
it('should show filtered suggestions in sync mode', async () => {
|
|
937
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
938
|
+
const rootElement = document.getElementById('root') as HTMLDivElement
|
|
939
|
+
const onSelectSuggestion = vi.fn()
|
|
940
|
+
|
|
941
|
+
initializeShadeRoot({
|
|
942
|
+
injector,
|
|
943
|
+
rootElement,
|
|
944
|
+
jsxElement: (
|
|
945
|
+
<Suggest
|
|
946
|
+
defaultPrefix="🔍"
|
|
947
|
+
suggestions={['Apple', 'Apricot', 'Banana']}
|
|
948
|
+
onSelectSuggestion={onSelectSuggestion}
|
|
949
|
+
/>
|
|
950
|
+
),
|
|
951
|
+
})
|
|
952
|
+
|
|
953
|
+
await advanceTimers(50)
|
|
954
|
+
|
|
955
|
+
const suggest = document.querySelector('shade-suggest') as HTMLElement
|
|
956
|
+
const input = suggest?.querySelector('input') as HTMLInputElement
|
|
957
|
+
|
|
958
|
+
input.value = 'ap'
|
|
959
|
+
input.dispatchEvent(new KeyboardEvent('keyup', { key: 'p', bubbles: true }))
|
|
960
|
+
|
|
961
|
+
await advanceTimers(300)
|
|
962
|
+
|
|
963
|
+
const suggestionItems = suggest?.querySelectorAll('.suggestion-item')
|
|
964
|
+
expect(suggestionItems?.length).toBe(2)
|
|
965
|
+
})
|
|
966
|
+
})
|
|
967
|
+
})
|
|
885
968
|
})
|
|
@@ -15,7 +15,7 @@ export * from './suggest-manager.js'
|
|
|
15
15
|
export * from './suggestion-list.js'
|
|
16
16
|
export * from './suggestion-result.js'
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
type SuggestAsyncProps<T> = {
|
|
19
19
|
defaultPrefix: JSX.Element | string
|
|
20
20
|
getEntries: (term: string) => Promise<T[]>
|
|
21
21
|
getSuggestionEntry: (entry: T) => SuggestionResult
|
|
@@ -23,6 +23,20 @@ export interface SuggestProps<T> {
|
|
|
23
23
|
style?: Partial<CSSStyleDeclaration>
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
type SuggestSyncProps = {
|
|
27
|
+
defaultPrefix: JSX.Element | string
|
|
28
|
+
/** Static list of string suggestions. Filtered client-side by the search term. When the term is empty, all suggestions are shown. */
|
|
29
|
+
suggestions: string[]
|
|
30
|
+
onSelectSuggestion: (entry: string) => void
|
|
31
|
+
style?: Partial<CSSStyleDeclaration>
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type SuggestProps<T> = SuggestAsyncProps<T> | SuggestSyncProps
|
|
35
|
+
|
|
36
|
+
const isSyncProps = (props: SuggestProps<unknown>): props is SuggestSyncProps => {
|
|
37
|
+
return 'suggestions' in props
|
|
38
|
+
}
|
|
39
|
+
|
|
26
40
|
export const Suggest: <T>(props: SuggestProps<T>, children: ChildrenList) => JSX.Element<any> = Shade<
|
|
27
41
|
SuggestProps<any>
|
|
28
42
|
>({
|
|
@@ -35,7 +49,24 @@ export const Suggest: <T>(props: SuggestProps<T>, children: ChildrenList) => JSX
|
|
|
35
49
|
},
|
|
36
50
|
},
|
|
37
51
|
render: ({ props, injector, useDisposable, useRef, useHostProps, useObservable }) => {
|
|
38
|
-
|
|
52
|
+
let getEntries: (term: string) => Promise<unknown[]>
|
|
53
|
+
let getSuggestionEntry: (entry: unknown) => SuggestionResult
|
|
54
|
+
|
|
55
|
+
if (isSyncProps(props)) {
|
|
56
|
+
const { suggestions } = props
|
|
57
|
+
getEntries = async (term: string) => {
|
|
58
|
+
const lower = term.toLowerCase()
|
|
59
|
+
return suggestions.filter((s) => s.toLowerCase().includes(lower))
|
|
60
|
+
}
|
|
61
|
+
getSuggestionEntry = (entry: unknown) => ({
|
|
62
|
+
element: <>{entry as string}</>,
|
|
63
|
+
score: 1,
|
|
64
|
+
})
|
|
65
|
+
} else {
|
|
66
|
+
;({ getEntries, getSuggestionEntry } = props)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const manager = useDisposable('manager', () => new SuggestManager(getEntries, getSuggestionEntry))
|
|
39
70
|
const wrapperRef = useRef<HTMLDivElement>('wrapper')
|
|
40
71
|
const loaderRef = useRef<HTMLSpanElement>('loader')
|
|
41
72
|
|
|
@@ -65,7 +96,9 @@ export const Suggest: <T>(props: SuggestProps<T>, children: ChildrenList) => JSX
|
|
|
65
96
|
})
|
|
66
97
|
}
|
|
67
98
|
})
|
|
68
|
-
useDisposable('onSelectSuggestion', () =>
|
|
99
|
+
useDisposable('onSelectSuggestion', () =>
|
|
100
|
+
manager.subscribe('onSelectSuggestion', props.onSelectSuggestion as (entry: unknown) => void),
|
|
101
|
+
)
|
|
69
102
|
return (
|
|
70
103
|
<div
|
|
71
104
|
ref={wrapperRef}
|