= ({
+ draftError,
+ setDraftError,
+ initialValue,
+ handleUpdateRow,
+ cancelEditRow,
+ updateRowMutation,
+ indent = 0,
+ validate,
+ row,
+}) => {
+ const handleCancel = () => {
+ setDraftError('');
+ cancelEditRow();
+ };
+
+ return (
+
+ );
+};
+
+export default EditRow;
diff --git a/src/taxonomy/tree-table/EditableCell.tsx b/src/taxonomy/tree-table/EditableCell.tsx
index 8cdc10aabc..d4de95fa74 100644
--- a/src/taxonomy/tree-table/EditableCell.tsx
+++ b/src/taxonomy/tree-table/EditableCell.tsx
@@ -7,8 +7,9 @@ import React, {
import { Form } from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
+
+import OptionalExpandLink from '@src/taxonomy/tag-list/OptionalExpandLink';
import messages from './messages';
-import OptionalExpandLink from '../tag-list/OptionalExpandLink';
/**
* Props for the EditableCell component.
diff --git a/src/taxonomy/tree-table/NestedRows.tsx b/src/taxonomy/tree-table/NestedRows.tsx
index b3735e00c3..c2647f9f98 100644
--- a/src/taxonomy/tree-table/NestedRows.tsx
+++ b/src/taxonomy/tree-table/NestedRows.tsx
@@ -7,7 +7,8 @@ import type {
TreeColumnDef,
CreateRowMutationState,
} from './types';
-import { CreateRow, EditRow } from './CreateRow';
+import CreateRow from './CreateRow';
+import EditRow from './EditRow';
interface NestedRowsProps {
/** The parent row object from TanStack React Table */
@@ -103,7 +104,6 @@ const NestedRows = ({
setIsCreatingTopRow={setIsCreatingTopRow}
exitDraftWithoutSave={onCancelCreation}
createRowMutation={createRowMutation}
- columns={[]}
indent={indent}
validate={validate}
/>
@@ -124,9 +124,9 @@ const NestedRows = ({
exitDraftWithoutSave();
}}
updateRowMutation={updateRowMutation}
- columns={columns}
indent={indent}
validate={validate}
+ row={row}
/>
) :
(
@@ -139,9 +139,7 @@ const NestedRows = ({
return (
|
{isFirstColumn ?
{content} :
diff --git a/src/taxonomy/tree-table/SaveErrorAlert.tsx b/src/taxonomy/tree-table/SaveErrorAlert.tsx
new file mode 100644
index 0000000000..ef0788140f
--- /dev/null
+++ b/src/taxonomy/tree-table/SaveErrorAlert.tsx
@@ -0,0 +1,44 @@
+import React, { useEffect } from 'react';
+import {
+ Alert,
+} from '@openedx/paragon';
+
+import { Info } from '@openedx/paragon/icons';
+import { useIntl } from '@edx/frontend-platform/i18n';
+import './TableView.scss';
+import messages from './messages';
+
+interface SaveErrorAlertProps {
+ draftError: string | undefined;
+ isError: boolean | undefined;
+ isUpdateError: boolean | undefined;
+}
+const SaveErrorAlert = ({ draftError, isError, isUpdateError }: SaveErrorAlertProps) => {
+ const intl = useIntl();
+ const hasError: boolean = Boolean((isError || isUpdateError) && !!draftError);
+ const [alertOpen, setAlertOpen] = React.useState(hasError);
+
+ useEffect(() => {
+ setAlertOpen(hasError);
+ }, [hasError, isError, isUpdateError, draftError]);
+
+ if (!alertOpen) { return null; }
+
+ return (
+ {
+ setAlertOpen(false);
+ }}
+ >
+
+ {intl.formatMessage(messages.errorSavingTitle)}
+
+ {intl.formatMessage(messages.errorSavingMessage, { errorMessage: draftError })}
+
+ );
+};
+
+export default SaveErrorAlert;
diff --git a/src/taxonomy/tree-table/TableBody.tsx b/src/taxonomy/tree-table/TableBody.tsx
index e7b42c3114..0962c4c6c7 100644
--- a/src/taxonomy/tree-table/TableBody.tsx
+++ b/src/taxonomy/tree-table/TableBody.tsx
@@ -13,7 +13,8 @@ import type {
TreeColumnDef,
TreeTable,
} from './types';
-import { CreateRow, EditRow } from './CreateRow';
+import CreateRow from './CreateRow';
+import EditRow from './EditRow';
interface TableBodyProps {
columns: TreeColumnDef[];
@@ -86,7 +87,6 @@ const TableBody = ({
setIsCreatingTopRow={setIsCreatingTopRow}
exitDraftWithoutSave={exitDraftWithoutSave}
createRowMutation={createRowMutation}
- columns={columns}
validate={validate}
/>
)}
@@ -105,15 +105,15 @@ const TableBody = ({
exitDraftWithoutSave();
}}
updateRowMutation={updateRowMutation}
- columns={columns}
validate={validate}
+ row={row}
/>
) :
(
|
{row.getVisibleCells()
- .map((cell, index) => (
- |
+ .map((cell) => (
+ |
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
))}
diff --git a/src/taxonomy/tree-table/TableView.scss b/src/taxonomy/tree-table/TableView.scss
index 19647fadf2..706a0eb5f8 100644
--- a/src/taxonomy/tree-table/TableView.scss
+++ b/src/taxonomy/tree-table/TableView.scss
@@ -10,11 +10,7 @@
overflow-wrap: anywhere;
}
-.tree-table-indent {
- padding-inline-start: var(--pgn-spacing-spacer-base);
-}
-
-@for $depth from 2 through 10 {
+@for $depth from 0 through 10 {
.tree-table-indent-#{$depth} {
padding-inline-start: calc(var(--pgn-spacing-spacer-base) * #{$depth});
}
diff --git a/src/taxonomy/tree-table/TableView.test.tsx b/src/taxonomy/tree-table/TableView.test.tsx
index ff7b50cd88..eca55131b7 100644
--- a/src/taxonomy/tree-table/TableView.test.tsx
+++ b/src/taxonomy/tree-table/TableView.test.tsx
@@ -48,6 +48,7 @@ describe('TableView', () => {
it('shows and dismisses save error banner', () => {
const props = baseProps();
props.createRowMutation = { isPending: false, isError: true };
+ props.draftError = 'Request failed with status code 500';
render(, { wrapper });
diff --git a/src/taxonomy/tree-table/TableView.tsx b/src/taxonomy/tree-table/TableView.tsx
index a1c4dc7ae5..707792f452 100644
--- a/src/taxonomy/tree-table/TableView.tsx
+++ b/src/taxonomy/tree-table/TableView.tsx
@@ -5,7 +5,6 @@ import {
Card,
ActionRow,
Pagination,
- Alert,
Icon,
} from '@openedx/paragon';
@@ -18,7 +17,7 @@ import {
type PaginationState,
} from '@tanstack/react-table';
-import { ArrowDropUpDown, Info } from '@openedx/paragon/icons';
+import { ArrowDropUpDown } from '@openedx/paragon/icons';
import { useIntl } from '@edx/frontend-platform/i18n';
import TableBody from './TableBody';
import './TableView.scss';
@@ -30,6 +29,7 @@ import type {
TreeRowData,
} from './types';
import messages from './messages';
+import SaveErrorAlert from './SaveErrorAlert';
interface TableViewProps {
treeData: TreeRowData[];
@@ -102,25 +102,10 @@ const TableView = ({
const { isError } = createRowMutation;
const { isError: isUpdateError } = updateRowMutation;
- const [showError, setShowError] = React.useState(true);
return (
<>
- {(isError || isUpdateError) && showError && (
- setShowError(false)}
- >
-
- {intl.formatMessage(messages.errorSavingTitle)}
-
- {intl.formatMessage(messages.errorSavingMessage, {
- errorMessage: draftError || intl.formatMessage(messages.errorSavingMessage, { errorMessage: '' }),
- })}
-
- )}
+
@@ -147,7 +132,7 @@ const TableView = ({
{headerGroup.headers.map((header, index) => (
{header.isPlaceholder
? null
|