Skip to content

Commit 2243da6

Browse files
committed
fix: taxonomy alignment and error message
1 parent 4980c7a commit 2243da6

14 files changed

Lines changed: 311 additions & 231 deletions

src/messages.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ const messages = defineMessages({
1010
id: 'authoring.alert.support.text',
1111
defaultMessage: 'Support Page',
1212
},
13+
unknownError: {
14+
id: 'authoring.alert.error.unknown',
15+
defaultMessage: 'Unknown error',
16+
},
1317
});
1418

1519
export default messages;

src/taxonomy/data/apiHooks.ts

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -214,18 +214,13 @@ export const useSubTags = (taxonomyId: number, parentTagValue: string) => useQue
214214

215215
export const useCreateTag = (taxonomyId: number) => {
216216
const queryClient = useQueryClient();
217-
const intl = useIntl();
218217

219218
return useMutation({
220219
mutationFn: async ({ value, parentTagValue }: { value: string, parentTagValue?: string }) => {
221-
try {
222-
await getAuthenticatedHttpClient().post(
223-
apiUrls.createTag(taxonomyId),
224-
{ tag: value, parent_tag_value: parentTagValue },
225-
);
226-
} catch (err) {
227-
throw new Error(getApiErrorMessage(err, intl));
228-
}
220+
await getAuthenticatedHttpClient().post(
221+
apiUrls.createTag(taxonomyId),
222+
{ tag: value, parent_tag_value: parentTagValue },
223+
);
229224
},
230225
onSuccess: () => {
231226
queryClient.invalidateQueries({
@@ -246,14 +241,10 @@ export const useUpdateTag = (taxonomyId: number) => {
246241

247242
return useMutation({
248243
mutationFn: async ({ value, originalValue }: { value: string, originalValue: string }) => {
249-
try {
250-
await getAuthenticatedHttpClient().patch(
251-
apiUrls.updateTag(taxonomyId),
252-
{ tag: originalValue, updated_tag_value: value },
253-
);
254-
} catch (err) {
255-
throw new Error(getApiErrorMessage(err));
256-
}
244+
await getAuthenticatedHttpClient().patch(
245+
apiUrls.updateTag(taxonomyId),
246+
{ tag: originalValue, updated_tag_value: value },
247+
);
257248
},
258249
onSuccess: () => {
259250
queryClient.invalidateQueries({
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {
2+
Bubble,
3+
} from '@openedx/paragon';
4+
import type { Row } from '@tanstack/react-table';
5+
import type {
6+
TreeRowData,
7+
} from '@src/taxonomy/tree-table/types';
8+
import { TagListRowData } from './types';
9+
10+
const asTagListRowData = (row: Row<TreeRowData>): TagListRowData => (
11+
row.original as unknown as TagListRowData
12+
);
13+
14+
const UsageCountDisplay = ({ row }: { row: Row<TreeRowData> }) => {
15+
const count = asTagListRowData(row).usageCount ?? 0;
16+
return (
17+
count > 0 && (
18+
<Bubble expandable>
19+
{count}
20+
</Bubble>
21+
)
22+
);
23+
};
24+
25+
export default UsageCountDisplay;

src/taxonomy/tag-list/hooks.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,26 @@ const useEditActions = ({
163163
return true;
164164
};
165165

166+
const getErrorMessage = (error: any): string => {
167+
let errorMessage: string = '';
168+
if (error.name === 'AxiosError') {
169+
const responseData = error.response?.data;
170+
const tagError = Object.entries(responseData)?.find((errItem: [string, unknown]) => (
171+
['tag', 'value', 'updated_tag_value'].includes(errItem[0].toLowerCase())
172+
));
173+
174+
const errorMessages = tagError ? tagError[1] : (
175+
(error as Error).message || intl.formatMessage(globalMessages.unknownError)
176+
);
177+
errorMessage = Array.isArray(errorMessages) ? errorMessages.join('; ') : String(errorMessages);
178+
} else {
179+
errorMessage = (error as Error).message || intl.formatMessage(globalMessages.unknownError);
180+
}
181+
182+
errorMessage = errorMessage.replace(/\.$/, ''); // Remove trailing period for better message formatting
183+
return errorMessage;
184+
};
185+
166186
const handleCreateTag = async (value: string, parentTagValue?: string) => {
167187
const trimmed = value.trim();
168188

@@ -182,9 +202,9 @@ const useEditActions = ({
182202
setIsCreatingTopTag(false);
183203
setCreatingParentId(null);
184204
} catch (error) {
185-
const message = intl.formatMessage(messages.tagCreationErrorMessage, { errorMessage: (error as Error)?.message });
186-
setDraftError((error as Error)?.message || intl.formatMessage(messages.tagCreationErrorMessage, { errorMessage: '' }));
187-
setToast({ show: true, message });
205+
const errorMessage = getErrorMessage(error);
206+
setDraftError(errorMessage);
207+
setToast({ show: true, message: intl.formatMessage(messages.tagCreationErrorMessage, { errorMessage }) });
188208
}
189209
};
190210

@@ -211,9 +231,9 @@ const useEditActions = ({
211231
message: intl.formatMessage(messages.tagUpdateSuccessMessage, { name: trimmed }),
212232
});
213233
} catch (error) {
214-
const message = intl.formatMessage(messages.tagUpdateErrorMessage, { errorMessage: (error as Error)?.message });
215-
setDraftError((error as Error)?.message || intl.formatMessage(messages.tagUpdateErrorMessage, { errorMessage: '' }));
216-
setToast({ show: true, message });
234+
const errorMessage = getErrorMessage(error);
235+
setDraftError(errorMessage);
236+
setToast({ show: true, message: intl.formatMessage(messages.tagUpdateErrorMessage, { errorMessage }) });
217237
}
218238
};
219239

src/taxonomy/tag-list/tagColumns.tsx

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
Bubble,
32
Icon,
43
IconButton,
54
IconButtonWithTooltip,
@@ -12,24 +11,18 @@ import {
1211
import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';
1312
import type { Row } from '@tanstack/react-table';
1413

15-
import messages from './messages';
1614
import type {
1715
RowId,
1816
TreeColumnDef,
1917
TreeRowData,
20-
} from '../tree-table/types';
18+
} from '@src/taxonomy/tree-table/types';
19+
import { TagListRowData } from './types';
20+
import messages from './messages';
2121
import OptionalExpandLink from './OptionalExpandLink';
22+
import UsageCountDisplay from './UsageCountDisplay';
2223

2324
const EDITABLE_COLUMNS = ['value'];
2425

25-
interface TagListRowData extends TreeRowData {
26-
depth: number;
27-
childCount: number;
28-
usageCount?: number;
29-
isNew?: boolean;
30-
isEditing?: boolean;
31-
}
32-
3326
const asTagListRowData = (row: Row<TreeRowData>): TagListRowData => (
3427
row.original as unknown as TagListRowData
3528
);
@@ -49,17 +42,6 @@ interface GetColumnsArgs {
4942
maxDepth: number;
5043
}
5144

52-
const UsageCountDisplay = ({ row }: { row: Row<TreeRowData> }) => {
53-
const count = asTagListRowData(row).usageCount ?? 0;
54-
return (
55-
count > 0 && (
56-
<Bubble expandable>
57-
{count}
58-
</Bubble>
59-
)
60-
);
61-
};
62-
6345
interface ActionsHeaderProps {
6446
onStartDraft: () => void;
6547
setDraftError: (error: string) => void;

src/taxonomy/tag-list/types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { TreeRowData } from '@src/taxonomy/tree-table/types';
2+
3+
export interface TagListRowData extends TreeRowData {
4+
depth: number;
5+
childCount: number;
6+
usageCount?: number;
7+
isNew?: boolean;
8+
isEditing?: boolean;
9+
}

src/taxonomy/tree-table/CreateRow.test.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import { IntlProvider } from '@edx/frontend-platform/i18n';
33
import { fireEvent, render, screen } from '@testing-library/react';
44

5-
import { CreateRow } from './CreateRow';
5+
import CreateRow from './CreateRow';
66

77
const wrapper = ({ children }: { children: React.ReactNode }) => (
88
<IntlProvider locale="en" messages={{}}>{children}</IntlProvider>
@@ -15,7 +15,6 @@ const baseProps = () => ({
1515
setIsCreatingTopRow: jest.fn(),
1616
exitDraftWithoutSave: jest.fn(),
1717
createRowMutation: { isPending: false },
18-
columns: [{ id: 'value' }],
1918
validate: jest.fn((value: string) => value.trim().length > 0),
2019
});
2120

0 commit comments

Comments
 (0)