Skip to content

Commit 4851c37

Browse files
authored
feat(metadata): enable multilevel taxonomy field filter in preview (#4354)
* fix(metadata): restore taxonomy field filter in preview * fix(metadata): add await for loading indicator in taxonomy stories * fix(metadata): Stabilize taxonomy stories: await loading, expand by label, scope queries * feat(metadata): Add missing API mocks to taxonomy tests to fix failures after package upgrades * feat(metadata): Update multilevel taxonomy test after rebase * feat(metadata): Remove obsolete comment * feat(metadata): Bump peer dep version
1 parent 76e94f1 commit 4851c37

File tree

6 files changed

+74
-45
lines changed

6 files changed

+74
-45
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
"@box/box-ai-content-answers": "^0.139.0",
131131
"@box/box-item-type-selector": "^0.73.1",
132132
"@box/cldr-data": "^34.2.0",
133-
"@box/combobox-with-api": "^0.34.9",
133+
"@box/combobox-with-api": "^1.3.11",
134134
"@box/copy-input": "^1.5.3",
135135
"@box/frontend": "^11.0.1",
136136
"@box/item-icon": "^0.27.1",
@@ -302,7 +302,7 @@
302302
"@box/box-ai-content-answers": "^0.139.0",
303303
"@box/box-item-type-selector": "^0.73.1",
304304
"@box/cldr-data": ">=34.2.0",
305-
"@box/combobox-with-api": "^0.34.9",
305+
"@box/combobox-with-api": "^1.3.11",
306306
"@box/copy-input": "^1.5.3",
307307
"@box/item-icon": "^0.27.1",
308308
"@box/metadata-editor": "^1.5.3",

src/api/Metadata.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,19 +1348,19 @@ class Metadata extends File {
13481348
13491349
const {
13501350
marker,
1351-
searchInput: query_text,
1351+
searchInput: query,
13521352
onlySelectableOptions,
1353-
ancestorId: ancestor_id,
1353+
ancestorId: ancestor,
13541354
level: optionsLevel,
13551355
signal,
13561356
} = options;
13571357
13581358
const params: {} = {
13591359
...(marker ? { marker } : {}),
1360-
...(query_text ? { query_text } : {}),
1360+
...(query ? { query } : {}),
13611361
...(optionsLevel ? { level: optionsLevel } : {}),
1362-
...(ancestor_id ? { ancestor_id } : {}),
1363-
...(onlySelectableOptions !== undefined ? { only_selectable_options: !!onlySelectableOptions } : {}),
1362+
...(ancestor ? { ancestor } : {}),
1363+
...(onlySelectableOptions !== undefined ? { 'only-selectable-options': !!onlySelectableOptions } : {}),
13641364
limit: 100,
13651365
};
13661366

src/api/__tests__/Metadata.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3184,12 +3184,12 @@ describe('api/Metadata', () => {
31843184
url: 'options_url',
31853185
id: 'file_id',
31863186
params: {
3187-
ancestor_id: '123',
3187+
ancestor: '123',
31883188
level: 1,
31893189
limit: 100,
31903190
marker: 'current_marker',
3191-
only_selectable_options: false,
3192-
query_text: 'search_term',
3191+
'only-selectable-options': false,
3192+
query: 'search_term',
31933193
},
31943194
});
31953195
});

src/elements/content-sidebar/stories/__mocks__/TaxonomyMocks.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { http, HttpResponse } from 'msw';
22
import type { HttpHandler } from 'msw';
33

44
import { DEFAULT_HOSTNAME_API } from '../../../../constants';
5-
import { fileIdWithMetadata, mockFileRequest } from './MetadataSidebarRedesignedMocks';
5+
import { fileIdWithMetadata, mockFileRequest, mockGlobalMetadataTemplates } from './MetadataSidebarRedesignedMocks';
6+
import { mockUserRequest } from '../../../common/__mocks__/mockRequests';
67

78
const apiV2Path = `${DEFAULT_HOSTNAME_API}/2.0`;
89

@@ -397,9 +398,15 @@ export const mockSinglelevelTaxonomyNodes = {
397398
};
398399

399400
export const taxonomyMockHandlers: HttpHandler[] = [
401+
http.get(mockUserRequest.url, () => {
402+
return HttpResponse.json(mockUserRequest.response);
403+
}),
400404
http.get(mockFileRequest.url, () => {
401405
return HttpResponse.json(mockFileRequest.response);
402406
}),
407+
http.get(mockGlobalMetadataTemplates.url, () => {
408+
return HttpResponse.json(mockGlobalMetadataTemplates.response);
409+
}),
403410
http.get(mockMetadataInstancesWithTaxonomy.url, () => {
404411
return HttpResponse.json(mockMetadataInstancesWithTaxonomy.response);
405412
}),
@@ -417,7 +424,7 @@ export const taxonomyMockHandlers: HttpHandler[] = [
417424
}),
418425
http.get(mockMultilevelTaxonomyOptions.url, ({ request }) => {
419426
const url = new URL(request.url);
420-
const ancestorId = url.searchParams.get('ancestor_id');
427+
const ancestorId = url.searchParams.get('ancestor');
421428

422429
if (!ancestorId) {
423430
return HttpResponse.json(mockMultilevelTaxonomyOptions.response.firstLevel);

src/elements/content-sidebar/stories/tests/MetadataSidebarRedesign-visual.stories.tsx

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,17 @@ const mockLogger = {
4848
},
4949
};
5050

51+
const waitForLoadingToComplete = async (canvas: ReturnType<typeof within>) => {
52+
const loadingIndicator = await canvas.findByRole('status', { name: 'Loading' });
53+
expect(loadingIndicator).toBeInTheDocument();
54+
await waitFor(
55+
async () => {
56+
expect(loadingIndicator).not.toBeInTheDocument();
57+
},
58+
{ timeout: 10000 },
59+
);
60+
};
61+
5162
export const AddTemplateDropdownMenuOn = {
5263
play: async ({ canvasElement }) => {
5364
const canvas = within(canvasElement);
@@ -76,6 +87,7 @@ export const AddTemplateDropdownMenuOnEmpty = {
7687
},
7788
play: async ({ canvasElement }) => {
7889
const canvas = within(canvasElement);
90+
7991
const addTemplateButton = await canvas.findByRole('button', { name: 'Add template' }, { timeout: 2000 });
8092

8193
expect(addTemplateButton).toBeInTheDocument();
@@ -616,6 +628,8 @@ export const ViewMultilevelTaxonomy: StoryObj<typeof MetadataSidebarRedesign> =
616628
play: async ({ canvasElement }) => {
617629
const canvas = within(canvasElement);
618630

631+
await waitForLoadingToComplete(canvas);
632+
619633
await waitFor(async () => {
620634
const multilevelOptionButton = canvas.getByRole('button', { name: 'London' });
621635

@@ -644,6 +658,8 @@ export const ViewSinglelevelTaxonomy: StoryObj<typeof MetadataSidebarRedesign> =
644658
play: async ({ canvasElement }) => {
645659
const canvas = within(canvasElement);
646660

661+
await waitForLoadingToComplete(canvas);
662+
647663
await waitFor(async () => {
648664
const singlelevelOptionButton = canvas.getByRole('button', { name: 'Blue' });
649665

@@ -663,41 +679,45 @@ export const EditMultilevelTaxonomy: StoryObj<typeof MetadataSidebarRedesign> =
663679
play: async ({ canvasElement }) => {
664680
const canvas = within(canvasElement);
665681

666-
const editButton = await waitFor(() => canvas.getByRole('button', { name: 'Edit My Taxonomy' }));
682+
await waitForLoadingToComplete(canvas);
667683

684+
const editButton = await canvas.findByRole('button', { name: 'Edit My Taxonomy' });
668685
await userEvent.click(editButton);
669686

670-
const multilevelInput = canvas.getByRole('combobox');
671-
const optionChip = canvas.getByRole('button', { name: 'London' });
687+
const navigateToSapporoTreeItem = async () => {
688+
const multilevelInput = await canvas.findByRole('combobox');
689+
await userEvent.click(multilevelInput);
672690

673-
expect(multilevelInput).toBeInTheDocument();
674-
expect(optionChip).toBeInTheDocument();
691+
const listbox = await canvas.findByRole('listbox');
692+
const listboxCanvas = within(listbox);
675693

676-
await userEvent.click(multilevelInput);
694+
const japanLabel = await listboxCanvas.findByText('Japan');
695+
const japanTreeitem = japanLabel.closest('[role="treeitem"]') as HTMLElement | null;
696+
expect(japanTreeitem).not.toBeNull();
697+
const expander = within(japanTreeitem as HTMLElement).getByRole('button', { name: 'Expand branch' });
698+
await userEvent.click(expander);
677699

678-
const listbox = await waitFor(() => canvas.getByRole('listbox'));
679-
expect(listbox).toBeInTheDocument();
700+
const hokkaidoLabel = await listboxCanvas.findByText('Hokkaido');
701+
const hokkaidoTreeitem = hokkaidoLabel.closest('[role="treeitem"]') as HTMLElement | null;
702+
expect(hokkaidoTreeitem).not.toBeNull();
703+
const hokkaidoExpander = within(hokkaidoTreeitem as HTMLElement).getByRole('button', {
704+
name: 'Expand branch',
705+
});
706+
await userEvent.click(hokkaidoExpander);
680707

681-
const expandButtons = await waitFor(() => canvas.getAllByRole('button', { name: 'Expand branch' }));
708+
const sapporoTreeitem = await listboxCanvas.findByRole('treeitem', { name: 'Sapporo' });
709+
return sapporoTreeitem;
710+
};
682711

683-
await userEvent.click(expandButtons[1]);
684-
685-
const hokkaidoOption = await waitFor(() => canvas.getByText('Hokkaido'));
686-
expect(hokkaidoOption).toBeInTheDocument();
687-
688-
const nestedExpandButtons = await waitFor(() => screen.getAllByRole('button', { name: 'Expand branch' }));
689-
690-
await userEvent.click(nestedExpandButtons[2]);
691-
692-
const sapporoOption = await waitFor(() => canvas.getByRole('treeitem', { name: 'Sapporo' }));
693-
694-
expect(sapporoOption).toBeInTheDocument();
695-
expect(sapporoOption).toHaveAttribute('aria-selected', 'false');
696-
697-
await userEvent.click(sapporoOption);
712+
const unselectedSapporoTreeitem = await navigateToSapporoTreeItem();
713+
expect(unselectedSapporoTreeitem).toHaveAttribute('aria-selected', 'false');
714+
await userEvent.click(unselectedSapporoTreeitem);
698715

699716
const sapporoSelection = await waitFor(() => canvas.getByRole('gridcell', { name: 'Sapporo' }));
700717
expect(sapporoSelection).toBeInTheDocument();
718+
719+
const selectedSapporoTreeitem = await navigateToSapporoTreeItem();
720+
expect(selectedSapporoTreeitem).toHaveAttribute('aria-selected', 'true');
701721
},
702722
};
703723

@@ -706,6 +726,8 @@ export const EditSinglelevelTaxonomy: StoryObj<typeof MetadataSidebarRedesign> =
706726
play: async ({ canvasElement }) => {
707727
const canvas = within(canvasElement);
708728

729+
await waitForLoadingToComplete(canvas);
730+
709731
const editButton = await waitFor(() => canvas.getByRole('button', { name: 'Edit My Taxonomy' }));
710732

711733
await userEvent.click(editButton);

yarn.lock

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,12 +1480,12 @@
14801480
resolved "https://registry.yarnpkg.com/@box/cldr-data/-/cldr-data-34.8.0.tgz#36e6ddcea8e20653326aba2e0d13e07f34b7704f"
14811481
integrity sha512-jsTnhhpFy/eMossMr3cP9+1VFqOxOzO1GX/csw0LzasPl0Dg2Jhn8ypeNTBnFwlOB2Dp6XoxdvQHkBG4eVQe/Q==
14821482

1483-
"@box/combobox-with-api@^0.34.9":
1484-
version "0.34.9"
1485-
resolved "https://registry.yarnpkg.com/@box/combobox-with-api/-/combobox-with-api-0.34.9.tgz#0620ac1ef80719a3c6d95f27f731ec92e03bb05c"
1486-
integrity sha512-jE257A/6rlN5GydNWh+T+K4w8xmoaDaPb+J6MOh8pz4AkTJuZXOSp9jhfHP7KRwrQs849moBDpWowF0xOnQ2+g==
1483+
"@box/combobox-with-api@^1.3.11":
1484+
version "1.3.13"
1485+
resolved "https://registry.yarnpkg.com/@box/combobox-with-api/-/combobox-with-api-1.3.13.tgz#bfe008b1fac3ac59a2459a98b1e7d9f8783799b0"
1486+
integrity sha512-PN+unnjkbiJf55JTKhz2lYIxCI28IX7b+ds+YUsStcrER9IrQuX7sbdA7UwJ+yW/uJBXF5zpyd4tnDIAloaSIQ==
14871487
dependencies:
1488-
"@box/tree" "^0.45.4"
1488+
"@box/tree" "^1.2.6"
14891489
react-accessible-treeview "2.9.0"
14901490

14911491
"@box/copy-input@^1.5.3":
@@ -1539,10 +1539,10 @@
15391539
prop-types "^15.7.2"
15401540
react-lifecycles-compat "^3.0.4"
15411541

1542-
"@box/tree@^0.45.4":
1543-
version "0.45.4"
1544-
resolved "https://registry.yarnpkg.com/@box/tree/-/tree-0.45.4.tgz#605051e77e64ebb3c03ceefc9ee99f0a0d2ed4ae"
1545-
integrity sha512-gJLYz4bF+xci7o0e8oM2qAtc0lSRQYGrlOYMtZO5QvoLY0JjtAHtNaI9axmL7leJsy7VuCCxFoSFUoSXMHVRMA==
1542+
"@box/tree@^1.2.6":
1543+
version "1.2.6"
1544+
resolved "https://registry.yarnpkg.com/@box/tree/-/tree-1.2.6.tgz#998611a8e23f94959a20e9aa37ee89ab6d7d556b"
1545+
integrity sha512-BWJhvfnwbKTqEKS3mXWY8jfSI5zteSNEVfA06vA7+JPpiGrRWMIvolRiSQ4aeDAPXLoHqulzAm9PHmkSEnNsVw==
15461546

15471547
"@box/types@^0.2.1":
15481548
version "0.2.1"

0 commit comments

Comments
 (0)