@box/metadata-taxonomy-picker 2.18.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/LICENSE +379 -0
- package/README.md +57 -0
- package/dist/chunks/empty-state.js +22 -0
- package/dist/chunks/error-state.js +41 -0
- package/dist/chunks/load-more-error-row.js +53 -0
- package/dist/chunks/load-more-loading-row.js +17 -0
- package/dist/chunks/loading-state.js +17 -0
- package/dist/chunks/metadata-taxonomy-picker-shell.js +278 -0
- package/dist/chunks/taxonomy-ancestor-breadcrumb.js +115 -0
- package/dist/chunks/taxonomy-items-list.js +114 -0
- package/dist/chunks/taxonomy-level-filter.js +47 -0
- package/dist/chunks/taxonomy-menu-item.js +99 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/lib/components/metadata-taxonomy-picker-shell/index.js +2 -0
- package/dist/esm/lib/components/metadata-taxonomy-picker-shell/messages.js +24 -0
- package/dist/esm/lib/components/metadata-taxonomy-picker-shell/metadata-taxonomy-picker-shell.js +2 -0
- package/dist/esm/lib/components/taxonomy-ancestor-breadcrumb/index.js +2 -0
- package/dist/esm/lib/components/taxonomy-ancestor-breadcrumb/taxonomy-ancestor-breadcrumb.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/empty-state/empty-state.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/empty-state/index.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/error-state/error-state.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/error-state/index.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/index.js +6 -0
- package/dist/esm/lib/components/taxonomy-items-list/load-more-feedback/index.js +3 -0
- package/dist/esm/lib/components/taxonomy-items-list/load-more-feedback/load-more-error-row.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/load-more-feedback/load-more-loading-row.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/load-more-feedback/messages.js +20 -0
- package/dist/esm/lib/components/taxonomy-items-list/loading-state/index.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/loading-state/loading-state.js +2 -0
- package/dist/esm/lib/components/taxonomy-items-list/messages.js +36 -0
- package/dist/esm/lib/components/taxonomy-items-list/taxonomy-items-list.js +2 -0
- package/dist/esm/lib/components/taxonomy-level-filter/index.js +2 -0
- package/dist/esm/lib/components/taxonomy-level-filter/messages.js +6 -0
- package/dist/esm/lib/components/taxonomy-level-filter/taxonomy-level-filter.js +2 -0
- package/dist/esm/lib/components/taxonomy-menu-item/index.js +2 -0
- package/dist/esm/lib/components/taxonomy-menu-item/messages.js +6 -0
- package/dist/esm/lib/components/taxonomy-menu-item/taxonomy-menu-item.js +2 -0
- package/dist/esm/lib/components/taxonomy-menu-item/use-taxonomy-menu-item-keyboard.js +100 -0
- package/dist/esm/lib/constants.js +2 -0
- package/dist/esm/lib/hooks/messages.js +16 -0
- package/dist/esm/lib/hooks/use-taxonomy-picker-controller.js +261 -0
- package/dist/esm/lib/metadata-taxonomy-picker.js +10 -0
- package/dist/esm/lib/state/reducer.js +147 -0
- package/dist/esm/lib/state/transitions.js +22 -0
- package/dist/i18n/bn-IN.js +24 -0
- package/dist/i18n/bn-IN.properties +44 -0
- package/dist/i18n/da-DK.js +24 -0
- package/dist/i18n/da-DK.properties +44 -0
- package/dist/i18n/de-DE.js +24 -0
- package/dist/i18n/de-DE.properties +44 -0
- package/dist/i18n/en-AU.js +24 -0
- package/dist/i18n/en-AU.properties +44 -0
- package/dist/i18n/en-CA.js +24 -0
- package/dist/i18n/en-CA.properties +44 -0
- package/dist/i18n/en-GB.js +24 -0
- package/dist/i18n/en-GB.properties +44 -0
- package/dist/i18n/en-US.js +24 -0
- package/dist/i18n/en-US.properties +44 -0
- package/dist/i18n/en-x-pseudo.js +24 -0
- package/dist/i18n/en-x-pseudo.properties +44 -0
- package/dist/i18n/es-419.js +24 -0
- package/dist/i18n/es-419.properties +44 -0
- package/dist/i18n/es-ES.js +24 -0
- package/dist/i18n/es-ES.properties +44 -0
- package/dist/i18n/fi-FI.js +24 -0
- package/dist/i18n/fi-FI.properties +44 -0
- package/dist/i18n/fr-CA.js +24 -0
- package/dist/i18n/fr-CA.properties +44 -0
- package/dist/i18n/fr-FR.js +24 -0
- package/dist/i18n/fr-FR.properties +44 -0
- package/dist/i18n/hi-IN.js +24 -0
- package/dist/i18n/hi-IN.properties +44 -0
- package/dist/i18n/it-IT.js +24 -0
- package/dist/i18n/it-IT.properties +44 -0
- package/dist/i18n/ja-JP.js +24 -0
- package/dist/i18n/ja-JP.properties +44 -0
- package/dist/i18n/json/src/lib/components/metadata-taxonomy-picker-shell/messages.json +1 -0
- package/dist/i18n/json/src/lib/components/taxonomy-items-list/load-more-feedback/messages.json +1 -0
- package/dist/i18n/json/src/lib/components/taxonomy-items-list/messages.json +1 -0
- package/dist/i18n/json/src/lib/components/taxonomy-level-filter/messages.json +1 -0
- package/dist/i18n/json/src/lib/components/taxonomy-menu-item/messages.json +1 -0
- package/dist/i18n/json/src/lib/hooks/messages.json +1 -0
- package/dist/i18n/ko-KR.js +24 -0
- package/dist/i18n/ko-KR.properties +44 -0
- package/dist/i18n/nb-NO.js +24 -0
- package/dist/i18n/nb-NO.properties +44 -0
- package/dist/i18n/nl-NL.js +24 -0
- package/dist/i18n/nl-NL.properties +44 -0
- package/dist/i18n/pl-PL.js +24 -0
- package/dist/i18n/pl-PL.properties +44 -0
- package/dist/i18n/pt-BR.js +24 -0
- package/dist/i18n/pt-BR.properties +44 -0
- package/dist/i18n/ru-RU.js +24 -0
- package/dist/i18n/ru-RU.properties +44 -0
- package/dist/i18n/sv-SE.js +24 -0
- package/dist/i18n/sv-SE.properties +44 -0
- package/dist/i18n/tr-TR.js +24 -0
- package/dist/i18n/tr-TR.properties +44 -0
- package/dist/i18n/zh-CN.js +24 -0
- package/dist/i18n/zh-CN.properties +44 -0
- package/dist/i18n/zh-TW.js +24 -0
- package/dist/i18n/zh-TW.properties +44 -0
- package/dist/styles/empty-state.css +1 -0
- package/dist/styles/error-state.css +1 -0
- package/dist/styles/load-more-error-row.css +1 -0
- package/dist/styles/load-more-loading-row.css +1 -0
- package/dist/styles/loading-state.css +1 -0
- package/dist/styles/metadata-taxonomy-picker-shell.css +1 -0
- package/dist/styles/taxonomy-ancestor-breadcrumb.css +1 -0
- package/dist/styles/taxonomy-items-list.css +1 -0
- package/dist/styles/taxonomy-level-filter.css +1 -0
- package/dist/styles/taxonomy-menu-item.css +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/lib/components/metadata-taxonomy-picker-shell/index.d.ts +1 -0
- package/dist/types/lib/components/metadata-taxonomy-picker-shell/messages.d.ts +27 -0
- package/dist/types/lib/components/metadata-taxonomy-picker-shell/metadata-taxonomy-picker-shell.d.ts +2 -0
- package/dist/types/lib/components/taxonomy-ancestor-breadcrumb/index.d.ts +1 -0
- package/dist/types/lib/components/taxonomy-ancestor-breadcrumb/taxonomy-ancestor-breadcrumb.d.ts +16 -0
- package/dist/types/lib/components/taxonomy-items-list/empty-state/empty-state.d.ts +10 -0
- package/dist/types/lib/components/taxonomy-items-list/empty-state/index.d.ts +1 -0
- package/dist/types/lib/components/taxonomy-items-list/error-state/error-state.d.ts +9 -0
- package/dist/types/lib/components/taxonomy-items-list/error-state/index.d.ts +1 -0
- package/dist/types/lib/components/taxonomy-items-list/index.d.ts +5 -0
- package/dist/types/lib/components/taxonomy-items-list/load-more-feedback/index.d.ts +2 -0
- package/dist/types/lib/components/taxonomy-items-list/load-more-feedback/load-more-error-row.d.ts +10 -0
- package/dist/types/lib/components/taxonomy-items-list/load-more-feedback/load-more-loading-row.d.ts +7 -0
- package/dist/types/lib/components/taxonomy-items-list/load-more-feedback/messages.d.ts +22 -0
- package/dist/types/lib/components/taxonomy-items-list/loading-state/index.d.ts +1 -0
- package/dist/types/lib/components/taxonomy-items-list/loading-state/loading-state.d.ts +6 -0
- package/dist/types/lib/components/taxonomy-items-list/messages.d.ts +42 -0
- package/dist/types/lib/components/taxonomy-items-list/taxonomy-items-list.d.ts +82 -0
- package/dist/types/lib/components/taxonomy-level-filter/index.d.ts +1 -0
- package/dist/types/lib/components/taxonomy-level-filter/messages.d.ts +7 -0
- package/dist/types/lib/components/taxonomy-level-filter/taxonomy-level-filter.d.ts +11 -0
- package/dist/types/lib/components/taxonomy-menu-item/index.d.ts +1 -0
- package/dist/types/lib/components/taxonomy-menu-item/messages.d.ts +7 -0
- package/dist/types/lib/components/taxonomy-menu-item/taxonomy-menu-item.d.ts +20 -0
- package/dist/types/lib/components/taxonomy-menu-item/use-taxonomy-menu-item-keyboard.d.ts +47 -0
- package/dist/types/lib/constants.d.ts +49 -0
- package/dist/types/lib/hooks/messages.d.ts +17 -0
- package/dist/types/lib/hooks/use-taxonomy-picker-controller.d.ts +22 -0
- package/dist/types/lib/metadata-taxonomy-picker.d.ts +8 -0
- package/dist/types/lib/state/reducer.d.ts +180 -0
- package/dist/types/lib/state/transitions.d.ts +4 -0
- package/dist/types/lib/stories/metadata-taxonomy-picker.stories.d.ts +136 -0
- package/dist/types/lib/stories/shared/build-taxonomy-items.d.ts +10 -0
- package/dist/types/lib/stories/shared/create-mock-items-service.d.ts +35 -0
- package/dist/types/lib/stories/shared/generate-deep-nodes.d.ts +39 -0
- package/dist/types/lib/stories/shared/generate-hierarchical-nodes.d.ts +3 -0
- package/dist/types/lib/stories/shared/generate-nodes.d.ts +2 -0
- package/dist/types/lib/stories/shared/generate-search-results.d.ts +10 -0
- package/dist/types/lib/stories/shared/story-container.d.ts +5 -0
- package/dist/types/lib/stories/shared/taxonomy-items-list-fixtures.d.ts +7 -0
- package/dist/types/lib/stories/taxonomy-ancestor-breadcrumb.stories.d.ts +28 -0
- package/dist/types/lib/stories/taxonomy-items-list.stories.d.ts +77 -0
- package/dist/types/lib/stories/taxonomy-menu-item.stories.d.ts +67 -0
- package/dist/types/lib/stories/tests/breadcrumb-navigation.interaction-tests.stories.d.ts +78 -0
- package/dist/types/lib/stories/tests/error-handling.interaction-tests.stories.d.ts +50 -0
- package/dist/types/lib/stories/tests/interaction-tests.stories.d.ts +47 -0
- package/dist/types/lib/stories/tests/level-filter-interaction-tests.stories.d.ts +99 -0
- package/dist/types/lib/stories/tests/level-transitions.interaction-tests.stories.d.ts +60 -0
- package/dist/types/lib/stories/tests/pagination.interaction-tests.stories.d.ts +90 -0
- package/dist/types/lib/stories/tests/portal-and-ref.interaction-tests.stories.d.ts +39 -0
- package/dist/types/lib/stories/tests/search-interaction-tests.stories.d.ts +124 -0
- package/dist/types/lib/stories/tests/shell-selection.interaction-tests.stories.d.ts +56 -0
- package/dist/types/lib/stories/tests/single-level-mode.interaction-tests.stories.d.ts +50 -0
- package/dist/types/lib/stories/tests/taxonomy-menu-item.interaction-tests.stories.d.ts +70 -0
- package/dist/types/lib/stories/tests/visual-regression-tests.stories.d.ts +38 -0
- package/dist/types/lib/types.d.ts +105 -0
- package/package.json +51 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { MetadataTaxonomyPicker } from '../../../index';
|
|
3
|
+
import { TaxonomyItemsService, TaxonomyPickerMode } from '../../types';
|
|
4
|
+
declare const _default: {
|
|
5
|
+
parameters: {
|
|
6
|
+
docs: {
|
|
7
|
+
page: () => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
};
|
|
9
|
+
controls: {
|
|
10
|
+
exclude: RegExp;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
title: string;
|
|
14
|
+
component: import('react').ForwardRefExoticComponent<import('../../types').MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
15
|
+
decorators: ((Story: import('storybook/internal/csf').PartialStoryFn<import('@storybook/react').ReactRenderer, {
|
|
16
|
+
mode: TaxonomyPickerMode;
|
|
17
|
+
multiSelect: boolean;
|
|
18
|
+
value: import('../../types').TaxonomyValue[];
|
|
19
|
+
onValueChange: (values: import('../../types').TaxonomyValue[]) => void;
|
|
20
|
+
itemsService: TaxonomyItemsService;
|
|
21
|
+
eventService?: import('../../types').TaxonomyPickerEventService | undefined;
|
|
22
|
+
levels?: import('../../types').TaxonomyLevel[] | undefined;
|
|
23
|
+
placeholder?: string | undefined;
|
|
24
|
+
disabled?: boolean | undefined;
|
|
25
|
+
label?: string | undefined;
|
|
26
|
+
containerClassName?: string | undefined;
|
|
27
|
+
portalElement?: (HTMLElement | (() => HTMLElement | null) | null) | undefined;
|
|
28
|
+
ref?: import('react').LegacyRef<HTMLInputElement> | undefined;
|
|
29
|
+
key?: import('react').Key | null | undefined;
|
|
30
|
+
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
31
|
+
};
|
|
32
|
+
export default _default;
|
|
33
|
+
type Story = StoryObj<typeof MetadataTaxonomyPicker>;
|
|
34
|
+
/**
|
|
35
|
+
* Acceptance: "When the user scrolls near the bottom of the list, the next
|
|
36
|
+
* page loads automatically — no Load More button needed."
|
|
37
|
+
*/
|
|
38
|
+
export declare const LoadsNextPageWhenScrolledNearBottom: Story;
|
|
39
|
+
/**
|
|
40
|
+
* Acceptance: "New items append below existing ones — the user's scroll
|
|
41
|
+
* position and already-loaded items are preserved."
|
|
42
|
+
*/
|
|
43
|
+
export declare const AppendsNewItemsBelowExistingItemsWithoutDroppingPriorPage: Story;
|
|
44
|
+
/**
|
|
45
|
+
* Acceptance: "Ghost rows appear at the bottom of the list while the next
|
|
46
|
+
* page is loading."
|
|
47
|
+
*/
|
|
48
|
+
export declare const ShowsGhostRowsWhileLoadingNextPage: Story;
|
|
49
|
+
/**
|
|
50
|
+
* Acceptance: "When all items have been loaded (no more pages available),
|
|
51
|
+
* no further requests are made."
|
|
52
|
+
*/
|
|
53
|
+
export declare const DoesNotRequestFurtherPagesWhenAllItemsLoaded: Story;
|
|
54
|
+
/**
|
|
55
|
+
* Acceptance: "When the user navigates back to a previously visited level,
|
|
56
|
+
* all pages they had loaded are restored from cache — they don't have to
|
|
57
|
+
* scroll and reload pages again."
|
|
58
|
+
*/
|
|
59
|
+
export declare const RestoresPaginatedSetAfterDrillDownAndBack: Story;
|
|
60
|
+
/**
|
|
61
|
+
* Acceptance: pagination must also work in search mode — scrolling near the
|
|
62
|
+
* bottom of the search-results list loads the next page of matches and appends
|
|
63
|
+
* them below the existing results.
|
|
64
|
+
*/
|
|
65
|
+
export declare const SearchLoadsNextPageWhenScrolledNearBottom: Story;
|
|
66
|
+
/**
|
|
67
|
+
* Acceptance: the same ghost-row feedback used in browse mode must appear in
|
|
68
|
+
* search mode while a "load more" page of results is being fetched.
|
|
69
|
+
*/
|
|
70
|
+
export declare const SearchShowsGhostRowsWhileLoadingNextPage: Story;
|
|
71
|
+
/**
|
|
72
|
+
* When the entire search result set fits in a single page, the response carries
|
|
73
|
+
* no `next_marker` and the scroll-near-bottom handler must stop firing further
|
|
74
|
+
* search requests no matter how many times the user scrolls.
|
|
75
|
+
*/
|
|
76
|
+
export declare const SearchDoesNotRequestFurtherPagesWhenAllResultsLoaded: Story;
|
|
77
|
+
/**
|
|
78
|
+
* If a search "load more" request rejects, the in-flight indicator must clear,
|
|
79
|
+
* the already-loaded results must stay visible, and an inline "Loading failed"
|
|
80
|
+
* row with a Reload button must appear at the bottom of the list. Clicking
|
|
81
|
+
* Reload must re-attempt from the same marker and succeed.
|
|
82
|
+
*/
|
|
83
|
+
export declare const SearchRecoversAfterLoadMoreFailure: Story;
|
|
84
|
+
/**
|
|
85
|
+
* Same recovery contract as the search case: when a browse "load more" page
|
|
86
|
+
* fails, the existing items remain visible, an inline "Loading failed" row
|
|
87
|
+
* appears at the bottom of the list, and clicking Reload re-attempts the load
|
|
88
|
+
* from the current marker.
|
|
89
|
+
*/
|
|
90
|
+
export declare const BrowseRecoversAfterLoadMoreFailure: Story;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { MetadataTaxonomyPicker } from '../../../index';
|
|
3
|
+
import { MetadataTaxonomyPickerProps } from '../../types';
|
|
4
|
+
declare const _default: {
|
|
5
|
+
parameters: {
|
|
6
|
+
docs: {
|
|
7
|
+
page: () => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
};
|
|
9
|
+
controls: {
|
|
10
|
+
exclude: RegExp;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
title: string;
|
|
14
|
+
component: import('react').ForwardRefExoticComponent<MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
15
|
+
};
|
|
16
|
+
export default _default;
|
|
17
|
+
type Story = StoryObj<typeof MetadataTaxonomyPicker>;
|
|
18
|
+
/**
|
|
19
|
+
* When `portalElement` is supplied, the popover content renders inside that
|
|
20
|
+
* element instead of `document.body`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const PortalElementRendersPopoverInsideContainer: Story;
|
|
23
|
+
/**
|
|
24
|
+
* When `portalElement` is provided as a getter function, the picker resolves
|
|
25
|
+
* the element on render and portals the popover into it.
|
|
26
|
+
*/
|
|
27
|
+
export declare const PortalElementAcceptsGetterFunction: Story;
|
|
28
|
+
/**
|
|
29
|
+
* When `portalElement` is omitted, the popover continues to portal into
|
|
30
|
+
* `document.body` (Radix's default behaviour) so existing call sites remain
|
|
31
|
+
* unaffected.
|
|
32
|
+
*/
|
|
33
|
+
export declare const NoPortalElementKeepsDefaultBodyPortal: Story;
|
|
34
|
+
/**
|
|
35
|
+
* The forwarded ref attaches to the picker's trigger input, so consumers can
|
|
36
|
+
* focus the picker imperatively (e.g. on form validation errors or when
|
|
37
|
+
* orchestrating focus across multiple fields).
|
|
38
|
+
*/
|
|
39
|
+
export declare const ForwardedRefFocusesTriggerInput: Story;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { MetadataTaxonomyPickerProps, TaxonomyPickerMode, TaxonomyValue } from '../../types';
|
|
3
|
+
interface ControlledPickerProps extends Omit<MetadataTaxonomyPickerProps, 'value' | 'onValueChange'> {
|
|
4
|
+
initialValue?: TaxonomyValue[];
|
|
5
|
+
}
|
|
6
|
+
declare function ControlledPicker({ initialValue, ...props }: ControlledPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
declare const _default: {
|
|
8
|
+
beforeEach(): Promise<void>;
|
|
9
|
+
parameters: {
|
|
10
|
+
docs: {
|
|
11
|
+
page: () => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
};
|
|
13
|
+
controls: {
|
|
14
|
+
exclude: RegExp;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
title: string;
|
|
18
|
+
component: import('react').ForwardRefExoticComponent<MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
19
|
+
render: (args: MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
args: {
|
|
21
|
+
itemsService: import('../../types').TaxonomyItemsService;
|
|
22
|
+
mode: TaxonomyPickerMode.MultiLevel;
|
|
23
|
+
multiSelect: false;
|
|
24
|
+
placeholder: string;
|
|
25
|
+
};
|
|
26
|
+
decorators: ((Story: import('storybook/internal/csf').PartialStoryFn<import('@storybook/react').ReactRenderer, {
|
|
27
|
+
mode: TaxonomyPickerMode;
|
|
28
|
+
multiSelect: boolean;
|
|
29
|
+
value: TaxonomyValue[];
|
|
30
|
+
onValueChange: (values: TaxonomyValue[]) => void;
|
|
31
|
+
itemsService: import('../../types').TaxonomyItemsService;
|
|
32
|
+
eventService?: import('../../types').TaxonomyPickerEventService | undefined;
|
|
33
|
+
levels?: import('../../types').TaxonomyLevel[] | undefined;
|
|
34
|
+
placeholder?: string | undefined;
|
|
35
|
+
disabled?: boolean | undefined;
|
|
36
|
+
label?: string | undefined;
|
|
37
|
+
containerClassName?: string | undefined;
|
|
38
|
+
portalElement?: (HTMLElement | (() => HTMLElement | null) | null) | undefined;
|
|
39
|
+
ref?: import('react').LegacyRef<HTMLInputElement> | undefined;
|
|
40
|
+
key?: import('react').Key | null | undefined;
|
|
41
|
+
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
42
|
+
};
|
|
43
|
+
export default _default;
|
|
44
|
+
type Story = StoryObj<typeof ControlledPicker>;
|
|
45
|
+
/**
|
|
46
|
+
* Typing into the trigger updates the displayed text immediately — the value
|
|
47
|
+
* is not debounced, only the service call is.
|
|
48
|
+
*/
|
|
49
|
+
export declare const TypingUpdatesInputImmediately: Story;
|
|
50
|
+
/**
|
|
51
|
+
* After 500 ms of inactivity the service receives a search request and the
|
|
52
|
+
* results replace the browse list.
|
|
53
|
+
*/
|
|
54
|
+
export declare const SearchRequestFiresAfterDebounce: Story;
|
|
55
|
+
/**
|
|
56
|
+
* While the search request is in flight a loading skeleton is shown so the
|
|
57
|
+
* user has immediate feedback that something is happening.
|
|
58
|
+
*/
|
|
59
|
+
export declare const SearchShowsLoadingIndicator: Story;
|
|
60
|
+
/**
|
|
61
|
+
* Search results replace the browse list and show the item's display name.
|
|
62
|
+
*/
|
|
63
|
+
export declare const SearchResultsReplaceBrowseItems: Story;
|
|
64
|
+
/**
|
|
65
|
+
* Each search result row renders its ancestor chain as a subtitle line
|
|
66
|
+
* (e.g. "Region" or "Region > Country") so users understand where the
|
|
67
|
+
* item sits in the taxonomy tree.
|
|
68
|
+
*/
|
|
69
|
+
export declare const SearchResultsShowAncestorBreadcrumb: Story;
|
|
70
|
+
/**
|
|
71
|
+
* "No results found" is displayed when the search query returns an empty list,
|
|
72
|
+
* giving users clear feedback instead of an unexplained blank list.
|
|
73
|
+
*/
|
|
74
|
+
export declare const SearchEmptyStateShowsNoResultsFound: Story;
|
|
75
|
+
/**
|
|
76
|
+
* Clearing the input dismisses search results and brings browse items back,
|
|
77
|
+
* so the user can continue navigating where they left off.
|
|
78
|
+
*/
|
|
79
|
+
export declare const ClearingSearchRestoresBrowseItems: Story;
|
|
80
|
+
/**
|
|
81
|
+
* Clearing the input before the debounce fires discards the pending request,
|
|
82
|
+
* so no search results ever appear — late-arriving responses are silently
|
|
83
|
+
* dropped and the browse list is shown straight away.
|
|
84
|
+
*/
|
|
85
|
+
export declare const ClearingBeforeDebounceFiresNeverShowsSearchResults: Story;
|
|
86
|
+
/**
|
|
87
|
+
* Single-selecting a search result emits the value with ancestor information
|
|
88
|
+
* included — callers receive a complete `TaxonomyValue` regardless of whether
|
|
89
|
+
* the item was found via browse or search.
|
|
90
|
+
*/
|
|
91
|
+
export declare const SingleSelectSearchResultEmitsValueWithAncestors: Story;
|
|
92
|
+
/**
|
|
93
|
+
* In multi-select mode, selecting a search result adds it to the value and
|
|
94
|
+
* keeps the popover open with search results still visible — the user stays
|
|
95
|
+
* in search mode to allow further selections.
|
|
96
|
+
*/
|
|
97
|
+
export declare const MultiSelectSearchResultTogglesWithoutExitingSearch: Story;
|
|
98
|
+
/**
|
|
99
|
+
* Selecting a search result in multi-select mode emits the full `TaxonomyValue`
|
|
100
|
+
* shape including ancestor information.
|
|
101
|
+
*/
|
|
102
|
+
export declare const MultiSelectSearchResultEmitsValueWithAncestors: Story;
|
|
103
|
+
/**
|
|
104
|
+
* A search result whose `hasChildren` flag is `true` shows a drill-down
|
|
105
|
+
* chevron, giving users a way to navigate into its children.
|
|
106
|
+
*/
|
|
107
|
+
export declare const SearchResultWithChildrenShowsDrillDownChevron: Story;
|
|
108
|
+
/**
|
|
109
|
+
* While the user is composing with an IME the controller receives no input —
|
|
110
|
+
* the debounce never fires and browse items remain visible throughout.
|
|
111
|
+
*/
|
|
112
|
+
export declare const SearchStaysFrozenDuringIMEComposition: Story;
|
|
113
|
+
/**
|
|
114
|
+
* When IME composition ends the committed text is forwarded to the controller
|
|
115
|
+
* in one shot, triggering a single debounced search that replaces browse items
|
|
116
|
+
* with results.
|
|
117
|
+
*/
|
|
118
|
+
export declare const SearchFiresWithCommittedTextOnCompositionEnd: Story;
|
|
119
|
+
/**
|
|
120
|
+
* Clicking the drill-down chevron on a search result exits search mode and
|
|
121
|
+
* navigates into that item's children in the browse tree — the full end-to-end
|
|
122
|
+
* flow through the real picker shell.
|
|
123
|
+
*/
|
|
124
|
+
export declare const ClickingDrillDownChevronExitsSearchAndShowsChildren: Story;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { TaxonomyPickerMode, MetadataTaxonomyPickerProps, TaxonomyValue } from '../../types';
|
|
3
|
+
interface ControlledPickerProps extends Omit<MetadataTaxonomyPickerProps, 'value' | 'onValueChange'> {
|
|
4
|
+
initialValue?: TaxonomyValue[];
|
|
5
|
+
}
|
|
6
|
+
declare function ControlledPicker({ initialValue, ...props }: ControlledPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
declare const _default: {
|
|
8
|
+
beforeEach(): Promise<void>;
|
|
9
|
+
parameters: {
|
|
10
|
+
docs: {
|
|
11
|
+
page: () => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
};
|
|
13
|
+
controls: {
|
|
14
|
+
exclude: RegExp;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
title: string;
|
|
18
|
+
component: import('react').ForwardRefExoticComponent<MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
19
|
+
render: (args: MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
args: {
|
|
21
|
+
itemsService: import('../../types').TaxonomyItemsService;
|
|
22
|
+
mode: TaxonomyPickerMode.MultiLevel;
|
|
23
|
+
multiSelect: false;
|
|
24
|
+
placeholder: string;
|
|
25
|
+
};
|
|
26
|
+
decorators: ((Story: import('storybook/internal/csf').PartialStoryFn<import('@storybook/react').ReactRenderer, {
|
|
27
|
+
mode: TaxonomyPickerMode;
|
|
28
|
+
multiSelect: boolean;
|
|
29
|
+
value: TaxonomyValue[];
|
|
30
|
+
onValueChange: (values: TaxonomyValue[]) => void;
|
|
31
|
+
itemsService: import('../../types').TaxonomyItemsService;
|
|
32
|
+
eventService?: import('../../types').TaxonomyPickerEventService | undefined;
|
|
33
|
+
levels?: import('../../types').TaxonomyLevel[] | undefined;
|
|
34
|
+
placeholder?: string | undefined;
|
|
35
|
+
disabled?: boolean | undefined;
|
|
36
|
+
label?: string | undefined;
|
|
37
|
+
containerClassName?: string | undefined;
|
|
38
|
+
portalElement?: (HTMLElement | (() => HTMLElement | null) | null) | undefined;
|
|
39
|
+
ref?: import('react').LegacyRef<HTMLInputElement> | undefined;
|
|
40
|
+
key?: import('react').Key | null | undefined;
|
|
41
|
+
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
42
|
+
};
|
|
43
|
+
export default _default;
|
|
44
|
+
type Story = StoryObj<typeof ControlledPicker>;
|
|
45
|
+
export declare const SingleSelectClickEmitsValueWithFullNodeShape: Story;
|
|
46
|
+
export declare const SingleSelectRadioClickEmitsValue: Story;
|
|
47
|
+
export declare const SingleSelectReplacesPreviousValue: Story;
|
|
48
|
+
export declare const MultiSelectAppendsValuesAcrossClicks: Story;
|
|
49
|
+
export declare const MultiSelectTogglesOffWhenAlreadySelected: Story;
|
|
50
|
+
export declare const SingleSelectShowsChipForSelectedValue: Story;
|
|
51
|
+
export declare const SingleSelectShowsClearButtonForSelectedValue: Story;
|
|
52
|
+
export declare const SingleSelectClearButtonClearsValue: Story;
|
|
53
|
+
export declare const SingleSelectClearButtonDoesNothingWhenDisabled: Story;
|
|
54
|
+
export declare const SingleSelectChipHasNoDeleteButton: Story;
|
|
55
|
+
export declare const MultiSelectDoesNotShowSingleClearButton: Story;
|
|
56
|
+
export declare const TypingInTriggerUpdatesControlledValue: Story;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { MetadataTaxonomyPickerProps, TaxonomyLevel, TaxonomyPickerMode, TaxonomyValue } from '../../types';
|
|
3
|
+
interface ControlledPickerProps extends Omit<MetadataTaxonomyPickerProps, 'value' | 'onValueChange'> {
|
|
4
|
+
initialValue?: TaxonomyValue[];
|
|
5
|
+
}
|
|
6
|
+
declare function ControlledPicker({ initialValue, ...props }: ControlledPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
declare const _default: {
|
|
8
|
+
beforeEach(): Promise<void>;
|
|
9
|
+
parameters: {
|
|
10
|
+
docs: {
|
|
11
|
+
page: () => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
};
|
|
13
|
+
controls: {
|
|
14
|
+
exclude: RegExp;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
title: string;
|
|
18
|
+
component: import('react').ForwardRefExoticComponent<MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
19
|
+
render: (args: MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
args: {
|
|
21
|
+
mode: TaxonomyPickerMode.SingleLevel;
|
|
22
|
+
multiSelect: false;
|
|
23
|
+
itemsService: import('../../types').TaxonomyItemsService;
|
|
24
|
+
levels: TaxonomyLevel[];
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export default _default;
|
|
28
|
+
type Story = StoryObj<typeof ControlledPicker>;
|
|
29
|
+
/** No drill-down chevrons render in a flat single-level taxonomy. */
|
|
30
|
+
export declare const FlatTaxonomyShowsNoChevrons: Story;
|
|
31
|
+
/** Single-level × single-select with a flat list: clicking a row selects it and closes the popover. */
|
|
32
|
+
export declare const FlatSingleSelectClosesOnPick: Story;
|
|
33
|
+
/** Single-level × multi-select with a flat list: clicking checkboxes toggles values; popover stays open. */
|
|
34
|
+
export declare const FlatMultiSelectTogglesAndKeepsPopoverOpen: Story;
|
|
35
|
+
/** Clicking a non-selectable row drills down and emits no selection. */
|
|
36
|
+
export declare const NonSelectableRowClickDrillsDownInSingleLevelMode: Story;
|
|
37
|
+
/** Latest selectable level renders selection controls but no chevron. */
|
|
38
|
+
export declare const LatestSelectableLevelHasNoChevron: Story;
|
|
39
|
+
/** Drill through non-selectable parents, then select a leaf at the latest selectable level. */
|
|
40
|
+
export declare const DrillsThroughNonSelectableParentsAndSelectsLeaf: Story;
|
|
41
|
+
/** Search returns matches only at the latest selectable level. */
|
|
42
|
+
export declare const SearchReturnsOnlyLatestSelectableLevelResults: Story;
|
|
43
|
+
/** Search stays global (parentId=null) after drill-down — sibling subtrees still match. */
|
|
44
|
+
export declare const SearchStaysGlobalEvenAfterDrillDown: Story;
|
|
45
|
+
/** The level-filter dropdown never renders in single-level mode. */
|
|
46
|
+
export declare const LevelFilterHiddenInSingleLevelMode: Story;
|
|
47
|
+
/** Chevrons stay on intermediate selectable levels and only drop at the deepest one. */
|
|
48
|
+
export declare const ChevronsRemainOnIntermediateSelectableLevels: Story;
|
|
49
|
+
/** Regression guard: multi-level mode still shows the level filter during search. */
|
|
50
|
+
export declare const MultiLevelModeStillShowsLevelFilter: Story;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { TaxonomyMenuItem, TaxonomyMenuItemProps } from '../../components/taxonomy-menu-item';
|
|
3
|
+
declare const _default: {
|
|
4
|
+
parameters: {
|
|
5
|
+
docs: {
|
|
6
|
+
page: () => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
};
|
|
8
|
+
controls: {
|
|
9
|
+
exclude: RegExp;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
title: string;
|
|
13
|
+
component: import('react').NamedExoticComponent<TaxonomyMenuItemProps>;
|
|
14
|
+
render: (props: TaxonomyMenuItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
args: {
|
|
16
|
+
id: string;
|
|
17
|
+
displayName: string;
|
|
18
|
+
selectable: true;
|
|
19
|
+
multiSelect: false;
|
|
20
|
+
isSelected: false;
|
|
21
|
+
showDrillDown: false;
|
|
22
|
+
onSelect: import('storybook/test').Mock<(...args: any[]) => any>;
|
|
23
|
+
onDrillDown: import('storybook/test').Mock<(...args: any[]) => any>;
|
|
24
|
+
};
|
|
25
|
+
decorators: ((Story: import('storybook/internal/csf').PartialStoryFn<import('@storybook/react').ReactRenderer, {
|
|
26
|
+
id: string;
|
|
27
|
+
displayName: string;
|
|
28
|
+
isSearchMode?: boolean | undefined;
|
|
29
|
+
selectable: boolean;
|
|
30
|
+
multiSelect: boolean;
|
|
31
|
+
isSelected: boolean;
|
|
32
|
+
showDrillDown: boolean;
|
|
33
|
+
ancestors?: import('../../types').TaxonomyAncestor[] | undefined;
|
|
34
|
+
onSelect: (id: string, closeAfterSelect?: boolean) => void;
|
|
35
|
+
onDrillDown?: ((id: string) => void) | undefined;
|
|
36
|
+
onFocusExit?: (() => void) | undefined;
|
|
37
|
+
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
38
|
+
};
|
|
39
|
+
export default _default;
|
|
40
|
+
type Story = StoryObj<typeof TaxonomyMenuItem>;
|
|
41
|
+
export declare const ClickRowCallsOnSelect: Story;
|
|
42
|
+
export declare const ClickRowDoesNotCallOnSelectWhenNonSelectable: Story;
|
|
43
|
+
/** Clicking a non-selectable row with drill-down triggers navigation, not selection. */
|
|
44
|
+
export declare const ClickNonSelectableRowWithDrillDownCallsOnDrillDown: Story;
|
|
45
|
+
/** A non-selectable, non-drillable row is inert — clicking it does nothing. */
|
|
46
|
+
export declare const ClickNonSelectableLeafRowIsInert: Story;
|
|
47
|
+
/** Keyboard activation (Enter/Space) on a non-selectable row also drills down. */
|
|
48
|
+
export declare const KeyboardActivationOnNonSelectableRowDrillsDown: Story;
|
|
49
|
+
export declare const ClickDrillDownCallsOnDrillDown: Story;
|
|
50
|
+
export declare const CheckboxClickCallsOnSelectOnce: Story;
|
|
51
|
+
export declare const ArrowRightFromRowFocusesDrillDownButton: Story;
|
|
52
|
+
export declare const ArrowRightNoOpWithoutDrillDown: Story;
|
|
53
|
+
export declare const ArrowLeftFromRowFocusesSelectionControl: Story;
|
|
54
|
+
export declare const ArrowRightFromRowFocusesDrillDownWhenNonSelectable: Story;
|
|
55
|
+
export declare const EnterOnDrillDownButtonCallsOnDrillDown: Story;
|
|
56
|
+
export declare const SpaceOnDrillDownButtonCallsOnDrillDown: Story;
|
|
57
|
+
export declare const ArrowLeftFromDrillDownFocusesSelectionControl: Story;
|
|
58
|
+
export declare const ArrowRightFromSelectionControlFocusesDrillDown: Story;
|
|
59
|
+
export declare const ArrowLeftFromSelectionControlFocusesRow: Story;
|
|
60
|
+
export declare const SubControlsAreNotInTabOrder: Story;
|
|
61
|
+
export declare const TabOnSelectionControlNavigatesToNextRow: Story;
|
|
62
|
+
export declare const TabOnDrillDownNavigatesToNextRow: Story;
|
|
63
|
+
export declare const TabOnRowMovesToNextRow: Story;
|
|
64
|
+
export declare const ShiftTabOnRowMovesToPrevRow: Story;
|
|
65
|
+
export declare const ArrowDownFromSelectionControlFocusesNextRow: Story;
|
|
66
|
+
export declare const ArrowDownFromDrillDownFocusesNextRow: Story;
|
|
67
|
+
export declare const ArrowUpFromSelectionControlFocusesPrevRow: Story;
|
|
68
|
+
export declare const ShiftTabOnFirstRowFocusesInput: Story;
|
|
69
|
+
export declare const ShiftTabOnFirstRowSelectionControlFocusesInput: Story;
|
|
70
|
+
export declare const ShiftTabOnFirstRowDrillDownFocusesInput: Story;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { MetadataTaxonomyPicker } from '../../../index';
|
|
3
|
+
import { MetadataTaxonomyPickerProps, TaxonomyPickerMode, TaxonomyValue } from '../../types';
|
|
4
|
+
declare const _default: {
|
|
5
|
+
parameters: {
|
|
6
|
+
chromatic: {
|
|
7
|
+
disableSnapshot: boolean;
|
|
8
|
+
};
|
|
9
|
+
docs: {
|
|
10
|
+
page: () => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
};
|
|
12
|
+
controls: {
|
|
13
|
+
exclude: RegExp;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
title: string;
|
|
17
|
+
component: import('react').ForwardRefExoticComponent<MetadataTaxonomyPickerProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
18
|
+
decorators: ((Story: import('storybook/internal/csf').PartialStoryFn<import('@storybook/react').ReactRenderer, {
|
|
19
|
+
mode: TaxonomyPickerMode;
|
|
20
|
+
multiSelect: boolean;
|
|
21
|
+
value: TaxonomyValue[];
|
|
22
|
+
onValueChange: (values: TaxonomyValue[]) => void;
|
|
23
|
+
itemsService: import('../../types').TaxonomyItemsService;
|
|
24
|
+
eventService?: import('../../types').TaxonomyPickerEventService | undefined;
|
|
25
|
+
levels?: import('../../types').TaxonomyLevel[] | undefined;
|
|
26
|
+
placeholder?: string | undefined;
|
|
27
|
+
disabled?: boolean | undefined;
|
|
28
|
+
label?: string | undefined;
|
|
29
|
+
containerClassName?: string | undefined;
|
|
30
|
+
portalElement?: (HTMLElement | (() => HTMLElement | null) | null) | undefined;
|
|
31
|
+
ref?: import('react').LegacyRef<HTMLInputElement> | undefined;
|
|
32
|
+
key?: import('react').Key | null | undefined;
|
|
33
|
+
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
34
|
+
};
|
|
35
|
+
export default _default;
|
|
36
|
+
type Story = StoryObj<typeof MetadataTaxonomyPicker>;
|
|
37
|
+
export declare const DefaultClosed: Story;
|
|
38
|
+
export declare const DisabledState: Story;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export interface TaxonomyNode {
|
|
2
|
+
id: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
selectable: boolean;
|
|
5
|
+
hasChildren: boolean;
|
|
6
|
+
level: number;
|
|
7
|
+
ancestors?: TaxonomyAncestor[];
|
|
8
|
+
}
|
|
9
|
+
export interface TaxonomySearchResult {
|
|
10
|
+
id: string;
|
|
11
|
+
displayName: string;
|
|
12
|
+
selectable: boolean;
|
|
13
|
+
hasChildren: boolean;
|
|
14
|
+
level: number;
|
|
15
|
+
ancestors: TaxonomyAncestor[];
|
|
16
|
+
}
|
|
17
|
+
/** When `ancestors` is set, the level stack is rebuilt from it; otherwise the target is appended. */
|
|
18
|
+
export interface DrillDownTarget {
|
|
19
|
+
id: string;
|
|
20
|
+
displayName: string;
|
|
21
|
+
ancestors?: TaxonomyAncestor[];
|
|
22
|
+
}
|
|
23
|
+
export interface TaxonomyAncestor {
|
|
24
|
+
id: string;
|
|
25
|
+
displayName: string;
|
|
26
|
+
level: number;
|
|
27
|
+
}
|
|
28
|
+
export interface TaxonomyValue {
|
|
29
|
+
id: string;
|
|
30
|
+
displayName: string;
|
|
31
|
+
level: number;
|
|
32
|
+
ancestors?: TaxonomyAncestor[];
|
|
33
|
+
}
|
|
34
|
+
export interface TaxonomyLevel {
|
|
35
|
+
level: number;
|
|
36
|
+
displayName: string;
|
|
37
|
+
selectable?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface BreadcrumbEntry {
|
|
40
|
+
id: string;
|
|
41
|
+
displayName: string;
|
|
42
|
+
}
|
|
43
|
+
export interface FetchParams {
|
|
44
|
+
limit: number;
|
|
45
|
+
marker?: string;
|
|
46
|
+
signal?: AbortSignal;
|
|
47
|
+
}
|
|
48
|
+
export interface FetchResponse<T> {
|
|
49
|
+
entries: T[];
|
|
50
|
+
next_marker?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface SearchParams extends FetchParams {
|
|
53
|
+
parentId?: string | null;
|
|
54
|
+
levelFilter?: number;
|
|
55
|
+
}
|
|
56
|
+
export interface TaxonomyItemsService {
|
|
57
|
+
getNodes(parentId: string | null, params: FetchParams): Promise<FetchResponse<TaxonomyNode>>;
|
|
58
|
+
searchNodes(query: string, params: SearchParams): Promise<FetchResponse<TaxonomySearchResult>>;
|
|
59
|
+
}
|
|
60
|
+
export interface TaxonomyPickerEventService {
|
|
61
|
+
onNavigate?: (parentId: string | null, path: BreadcrumbEntry[]) => void;
|
|
62
|
+
onSearch?: (query: string) => void;
|
|
63
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
64
|
+
}
|
|
65
|
+
export declare enum TaxonomyPickerMode {
|
|
66
|
+
SingleLevel = "single-level",
|
|
67
|
+
MultiLevel = "multi-level"
|
|
68
|
+
}
|
|
69
|
+
export interface MetadataTaxonomyPickerProps {
|
|
70
|
+
mode: TaxonomyPickerMode;
|
|
71
|
+
multiSelect: boolean;
|
|
72
|
+
value: TaxonomyValue[];
|
|
73
|
+
onValueChange: (values: TaxonomyValue[]) => void;
|
|
74
|
+
itemsService: TaxonomyItemsService;
|
|
75
|
+
eventService?: TaxonomyPickerEventService;
|
|
76
|
+
/**
|
|
77
|
+
* Taxonomy levels for the level-filter dropdown and search auto-scope.
|
|
78
|
+
* Pass `[]` (or omit) to hide the filter and skip auto-scoping.
|
|
79
|
+
*/
|
|
80
|
+
levels?: TaxonomyLevel[];
|
|
81
|
+
placeholder?: string;
|
|
82
|
+
disabled?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Visible field label rendered above the trigger and associated with the
|
|
85
|
+
* combobox input via `htmlFor` for accessibility. When omitted, no label
|
|
86
|
+
* element is rendered — the caller is then responsible for providing an
|
|
87
|
+
* accessible name via `aria-label` / `aria-labelledby` on the picker.
|
|
88
|
+
*/
|
|
89
|
+
label?: string;
|
|
90
|
+
/**
|
|
91
|
+
* CSS class applied to the outermost container element.
|
|
92
|
+
* Intended for layout adjustments (margin, width, grid placement) only —
|
|
93
|
+
* do NOT use to override internal Blueprint component styles.
|
|
94
|
+
*/
|
|
95
|
+
containerClassName?: string;
|
|
96
|
+
/**
|
|
97
|
+
* DOM element (or a getter returning one) that the popover should be
|
|
98
|
+
* portalled into. Use this when the field lives inside a Drawer, Modal,
|
|
99
|
+
* or Accordion so the popover positions and scrolls correctly relative
|
|
100
|
+
* to that container.
|
|
101
|
+
*
|
|
102
|
+
* When omitted, the popover portals into `document.body` (Radix default).
|
|
103
|
+
*/
|
|
104
|
+
portalElement?: HTMLElement | (() => HTMLElement | null) | null;
|
|
105
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@box/metadata-taxonomy-picker",
|
|
3
|
+
"version": "2.18.0",
|
|
4
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
5
|
+
"peerDependencies": {
|
|
6
|
+
"@ariakit/react": "^0.4.21",
|
|
7
|
+
"@box/blueprint-web": "^15.5.1",
|
|
8
|
+
"@box/blueprint-web-assets": "^4.122.0",
|
|
9
|
+
"@tanstack/react-virtual": "^3.10.8",
|
|
10
|
+
"react": "^18.0.0",
|
|
11
|
+
"react-dom": "^18.0.0",
|
|
12
|
+
"react-intl": "^6.4.2"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@ariakit/react": "^0.4.21",
|
|
16
|
+
"@box/blueprint-web": "^15.5.1",
|
|
17
|
+
"@box/blueprint-web-assets": "^4.122.0",
|
|
18
|
+
"@box/eslint-plugin-blueprint": "1.2.5",
|
|
19
|
+
"@box/storybook-utils": "0.20.9",
|
|
20
|
+
"@tanstack/react-virtual": "^3.10.8",
|
|
21
|
+
"react-intl": "^6.4.2"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"main": "./dist/esm/index.js",
|
|
30
|
+
"module": "./dist/esm/index.js",
|
|
31
|
+
"types": "./dist/types/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"require": "./dist/esm/index.js",
|
|
35
|
+
"import": "./dist/esm/index.js",
|
|
36
|
+
"types": "./dist/types/index.d.ts"
|
|
37
|
+
},
|
|
38
|
+
"./*": {
|
|
39
|
+
"require": "./dist/esm/*",
|
|
40
|
+
"import": "./dist/esm/*",
|
|
41
|
+
"types": "./dist/types/*"
|
|
42
|
+
},
|
|
43
|
+
"./i18n/*": {
|
|
44
|
+
"require": "./dist/i18n/*",
|
|
45
|
+
"import": "./dist/i18n/*"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"sideEffects": [
|
|
49
|
+
"**/*.css"
|
|
50
|
+
]
|
|
51
|
+
}
|