Skip to content

Commit ebb26ff

Browse files
authored
fix(metadata-editor): dont show filter dropdown for one visible instance (#3802)
* fix(metadata-editor): dont show filter dropdown for one visible instance * fix(metadata-editor): dont show filter dropdown for one visible instance * fix(metadata-sidebar): dont show filter dropdown for one visible instanc
1 parent 72a5d88 commit ebb26ff

5 files changed

+93
-5
lines changed

src/elements/content-sidebar/MetadataSidebarRedesign.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,9 @@ function MetadataSidebarRedesign({
197197
const { handleSetFilteredTemplates, filteredTemplates, templateInstancesList } =
198198
useMetadataSidebarFilteredTemplates(history, filteredTemplateIds, templateInstances);
199199
const filterDropdown =
200-
isSuccess && isViewMode && appliedTemplateInstances.length > 1 ? (
200+
isSuccess && isViewMode && visibleTemplateInstances.length > 1 ? (
201201
<FilterInstancesDropdown
202-
appliedTemplates={appliedTemplateInstances as MetadataTemplate[]}
202+
appliedTemplates={visibleTemplateInstances as MetadataTemplate[]}
203203
selectedTemplates={filteredTemplates}
204204
setSelectedTemplates={handleSetFilteredTemplates}
205205
/>

src/elements/content-sidebar/__tests__/MetadataSidebarRedesign.test.tsx

+45
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,51 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
299299
expect(screen.getByRole('heading', { level: 4, name: 'Visible Template' })).toBeInTheDocument();
300300
});
301301

302+
test('should render filter dropdown when more than one templates are present', () => {
303+
mockUseSidebarMetadataFetcher.mockReturnValue({
304+
extractSuggestions: jest.fn(),
305+
handleCreateMetadataInstance: jest.fn(),
306+
handleDeleteMetadataInstance: jest.fn(),
307+
handleUpdateMetadataInstance: jest.fn(),
308+
templateInstances: [mockCustomTemplateInstance, mockVisibleTemplateInstance],
309+
templates: mockTemplates,
310+
errorMessage: null,
311+
status: STATUS.SUCCESS,
312+
file: mockFile,
313+
});
314+
315+
renderComponent();
316+
317+
const filterDropdown = screen.getByRole('combobox');
318+
expect(filterDropdown.textContent).toContain('All Templates');
319+
});
320+
321+
test.each([
322+
[[mockVisibleTemplateInstance, mockHiddenTemplateInstance]], // One visible and one hidden template
323+
[[mockVisibleTemplateInstance]], // One visible template
324+
[[]], // No templates
325+
[[mockHiddenTemplateInstance]], // One hidden template
326+
])(
327+
'should not render filter dropdown when only one or none visible template is present',
328+
(templateInstances: MetadataTemplateInstance[]) => {
329+
mockUseSidebarMetadataFetcher.mockReturnValue({
330+
extractSuggestions: jest.fn(),
331+
handleCreateMetadataInstance: jest.fn(),
332+
handleDeleteMetadataInstance: jest.fn(),
333+
handleUpdateMetadataInstance: jest.fn(),
334+
templateInstances,
335+
templates: mockTemplates,
336+
errorMessage: null,
337+
status: STATUS.SUCCESS,
338+
file: mockFile,
339+
});
340+
341+
renderComponent();
342+
343+
expect(screen.queryByRole('combobox')).not.toBeInTheDocument();
344+
},
345+
);
346+
302347
test('should render metadata filterd instance list when fileterd templates are present and matching', () => {
303348
mockUseSidebarMetadataFetcher.mockReturnValue({
304349
extractSuggestions: jest.fn(),

src/elements/content-sidebar/__tests__/useMetadataSidebarFilteredTemplates.test.tsx

+31
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ const templateInstances = [
2626
},
2727
];
2828

29+
const hiddenTemplateInstances = {
30+
id: 'template3',
31+
canEdit: true,
32+
fields: [],
33+
hidden: true,
34+
scope: 'enterprise_123',
35+
templateKey: 'temlpate_1',
36+
type: 'metadata_template',
37+
};
38+
2939
describe('useMetadataSidebarFilteredTemplates', () => {
3040
beforeEach(() => {
3141
jest.clearAllMocks();
@@ -96,4 +106,25 @@ describe('useMetadataSidebarFilteredTemplates', () => {
96106

97107
expect(result.current.templateInstancesList).toEqual(templateInstances);
98108
});
109+
110+
test('should filter out hidden template instances', () => {
111+
const filteredTemplateIds = ['template1'];
112+
const templateInstancesWithHidden = [...templateInstances, hiddenTemplateInstances];
113+
const { result } = renderHook(() =>
114+
useMetadataSidebarFilteredTemplates(history, filteredTemplateIds, templateInstancesWithHidden),
115+
);
116+
117+
expect(result.current.filteredTemplates).toEqual(['template1']);
118+
expect(result.current.templateInstancesList).toEqual([templateInstances[0]]);
119+
});
120+
121+
test('should filter out non existing template instances', () => {
122+
const filteredTemplateIds = ['template1', 'template4'];
123+
const { result } = renderHook(() =>
124+
useMetadataSidebarFilteredTemplates(history, filteredTemplateIds, templateInstances),
125+
);
126+
127+
expect(result.current.filteredTemplates).toEqual(['template1']);
128+
expect(result.current.templateInstancesList).toEqual([templateInstances[0]]);
129+
});
99130
});

src/elements/content-sidebar/hooks/useMetadataSidebarFilteredTemplates.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function useMetadataSidebarFilteredTemplates(
2020

2121
React.useEffect(() => {
2222
const matchingFilteredTemplateIds = templateInstances
23-
.filter(instance => filteredTemplateIds.includes(instance.id))
23+
.filter(instance => filteredTemplateIds.includes(instance.id) && !instance.hidden)
2424
.map(instance => instance.id);
2525

2626
setFilteredTemplates(matchingFilteredTemplateIds);
@@ -37,7 +37,7 @@ export function useMetadataSidebarFilteredTemplates(
3737

3838
const templateInstancesList = React.useMemo(() => {
3939
const filteredTemplateInstances = templateInstances.filter((instance: MetadataTemplateInstance) =>
40-
filteredTemplates.some((template: string) => template === instance.id),
40+
filteredTemplates.some((template: string) => template === instance.id && !instance.hidden),
4141
);
4242
return filteredTemplates.length === 0 ? templateInstances : filteredTemplateInstances;
4343
}, [templateInstances, filteredTemplates]);

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,19 @@ export const mockGlobalMetadataTemplates = {
6868
export const mockEmptyMetadataInstances = {
6969
url: `${apiV2Path}/files/${fileIdWithoutMetadata}/metadata`,
7070
response: {
71-
entries: [],
71+
entries: [
72+
{
73+
id: '2cb618ed-f31e-4172-b354-534524246653',
74+
$version: 1,
75+
$type: 'Secrets-453ffc2f-bf5a-464c-a004-432342',
76+
$parent: 'file_415542803939',
77+
$typeVersion: 1,
78+
$template: 'secrets',
79+
$scope: 'enterprise_173733877',
80+
myAttribute: 'Secrets',
81+
$canEdit: true,
82+
},
83+
],
7284
},
7385
};
7486

0 commit comments

Comments
 (0)