Skip to content

Commit 588b7be

Browse files
committed
fix: taxonomy alignment and error message
1 parent a0d5290 commit 588b7be

14 files changed

Lines changed: 368 additions & 303 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: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -229,18 +229,13 @@ export const useSubTags = (taxonomyId: number, parentTagValue: string) =>
229229

230230
export const useCreateTag = (taxonomyId: number) => {
231231
const queryClient = useQueryClient();
232-
const intl = useIntl();
233232

234233
return useMutation({
235-
mutationFn: async ({ value, parentTagValue }: { value: string; parentTagValue?: string; }) => {
236-
try {
237-
await getAuthenticatedHttpClient().post(
238-
apiUrls.createTag(taxonomyId),
239-
{ tag: value, parent_tag_value: parentTagValue },
240-
);
241-
} catch (err) {
242-
throw new Error(getApiErrorMessage(err, intl));
243-
}
234+
mutationFn: async ({ value, parentTagValue }: { value: string, parentTagValue?: string }) => {
235+
await getAuthenticatedHttpClient().post(
236+
apiUrls.createTag(taxonomyId),
237+
{ tag: value, parent_tag_value: parentTagValue },
238+
);
244239
},
245240
onSuccess: () => {
246241
queryClient.invalidateQueries({
@@ -260,15 +255,11 @@ export const useUpdateTag = (taxonomyId: number) => {
260255
const queryClient = useQueryClient();
261256

262257
return useMutation({
263-
mutationFn: async ({ value, originalValue }: { value: string; originalValue: string; }) => {
264-
try {
265-
await getAuthenticatedHttpClient().patch(
266-
apiUrls.updateTag(taxonomyId),
267-
{ tag: originalValue, updated_tag_value: value },
268-
);
269-
} catch (err) {
270-
throw new Error(getApiErrorMessage(err));
271-
}
258+
mutationFn: async ({ value, originalValue }: { value: string, originalValue: string }) => {
259+
await getAuthenticatedHttpClient().patch(
260+
apiUrls.updateTag(taxonomyId),
261+
{ tag: originalValue, updated_tag_value: value },
262+
);
272263
},
273264
onSuccess: () => {
274265
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 & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,26 @@ const useEditActions = ({
167167
return true;
168168
};
169169

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

@@ -186,11 +206,9 @@ const useEditActions = ({
186206
setIsCreatingTopTag(false);
187207
setCreatingParentId(null);
188208
} catch (error) {
189-
const message = intl.formatMessage(messages.tagCreationErrorMessage, { errorMessage: (error as Error)?.message });
190-
setDraftError(
191-
(error as Error)?.message || intl.formatMessage(messages.tagCreationErrorMessage, { errorMessage: '' }),
192-
);
193-
setToast({ show: true, message });
209+
const errorMessage = getErrorMessage(error);
210+
setDraftError(errorMessage);
211+
setToast({ show: true, message: intl.formatMessage(messages.tagCreationErrorMessage, { errorMessage }) });
194212
}
195213
};
196214

@@ -217,11 +235,9 @@ const useEditActions = ({
217235
message: intl.formatMessage(messages.tagUpdateSuccessMessage, { name: trimmed }),
218236
});
219237
} catch (error) {
220-
const message = intl.formatMessage(messages.tagUpdateErrorMessage, { errorMessage: (error as Error)?.message });
221-
setDraftError(
222-
(error as Error)?.message || intl.formatMessage(messages.tagUpdateErrorMessage, { errorMessage: '' }),
223-
);
224-
setToast({ show: true, message });
238+
const errorMessage = getErrorMessage(error);
239+
setDraftError(errorMessage);
240+
setToast({ show: true, message: intl.formatMessage(messages.tagUpdateErrorMessage, { errorMessage }) });
225241
}
226242
};
227243

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)