Skip to content

Commit a42e2e8

Browse files
authored
feat(frontend): port DeleteModelRegistry modal (#855)
Signed-off-by: Jenny <[email protected]> revert ModelRegistriesTableRow
1 parent 640cabe commit a42e2e8

File tree

3 files changed

+158
-32
lines changed

3 files changed

+158
-32
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import React from 'react';
2+
import { Content, TextInput, Stack, StackItem } from '@patternfly/react-core';
3+
import { Modal } from '@patternfly/react-core/deprecated';
4+
import { ModelRegistry } from '~/app/types';
5+
import DashboardModalFooter from '~/shared/components/DashboardModalFooter';
6+
7+
type DeleteModelRegistryModalProps = {
8+
modelRegistry: ModelRegistry;
9+
onClose: () => void;
10+
refresh: () => void;
11+
};
12+
13+
const DeleteModelRegistryModal: React.FC<DeleteModelRegistryModalProps> = ({
14+
modelRegistry: mr,
15+
onClose,
16+
refresh,
17+
}) => {
18+
const [isSubmitting, setIsSubmitting] = React.useState(false);
19+
const [error, setError] = React.useState<Error>();
20+
const [confirmInputValue, setConfirmInputValue] = React.useState('');
21+
const isDisabled = confirmInputValue.trim() !== mr.name || isSubmitting;
22+
23+
const onBeforeClose = () => {
24+
setConfirmInputValue('');
25+
setIsSubmitting(false);
26+
setError(undefined);
27+
onClose();
28+
};
29+
30+
const onConfirm = async () => {
31+
setIsSubmitting(true);
32+
setError(undefined);
33+
try {
34+
// TODO: implement when CRD endpoint is ready
35+
// await deleteModelRegistryBackend(mr.name);
36+
await refresh();
37+
onBeforeClose();
38+
} catch (e) {
39+
if (e instanceof Error) {
40+
setError(e);
41+
}
42+
setIsSubmitting(false);
43+
}
44+
};
45+
46+
return (
47+
<Modal
48+
data-testid="delete-mr-modal"
49+
titleIconVariant="warning"
50+
title="Delete model registry?"
51+
isOpen
52+
onClose={onClose}
53+
variant="medium"
54+
footer={
55+
<DashboardModalFooter
56+
submitLabel="Delete model registry"
57+
submitButtonVariant="danger"
58+
onSubmit={onConfirm}
59+
onCancel={onBeforeClose}
60+
isSubmitLoading={isSubmitting}
61+
isSubmitDisabled={isDisabled}
62+
error={error}
63+
alertTitle="Error deleting model registry"
64+
/>
65+
}
66+
>
67+
<Stack hasGutter>
68+
<StackItem>
69+
<Content>
70+
<Content component="p">
71+
The <strong>{mr.name}</strong> model registry, its default group, and any permissions
72+
associated with it will be deleted. Data located in the database connected to the
73+
registry will be unaffected.
74+
</Content>
75+
<Content component="p">
76+
Type <strong>{mr.name}</strong> to confirm deletion:
77+
</Content>
78+
</Content>
79+
</StackItem>
80+
<StackItem>
81+
<TextInput
82+
id="confirm-delete-input"
83+
data-testid="confirm-delete-input"
84+
aria-label="Confirm delete input"
85+
value={confirmInputValue}
86+
onChange={(_e, newValue) => setConfirmInputValue(newValue)}
87+
onKeyDown={(event) => {
88+
if (event.key === 'Enter' && !isDisabled) {
89+
onConfirm();
90+
}
91+
}}
92+
/>
93+
</StackItem>
94+
</Stack>
95+
</Modal>
96+
);
97+
};
98+
99+
export default DeleteModelRegistryModal;

clients/ui/frontend/src/app/pages/settings/ModelRegistriesTable.tsx

+56-32
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,72 @@ import { ModelRegistry } from '~/app/types';
44
import { Table } from '~/shared/components/table';
55
import { modelRegistryColumns } from './columns';
66
import ModelRegistriesTableRow from './ModelRegistriesTableRow';
7+
import DeleteModelRegistryModal from './DeleteModelRegistryModal';
78

89
type ModelRegistriesTableProps = {
910
modelRegistries: ModelRegistry[];
1011
onCreateModelRegistryClick: () => void;
12+
refresh: () => void;
1113
};
1214

1315
const ModelRegistriesTable: React.FC<ModelRegistriesTableProps> = ({
1416
modelRegistries,
1517
onCreateModelRegistryClick,
16-
}) => (
18+
refresh,
19+
}) => {
1720
// TODO: [Midstream] Complete once we have permissions
18-
<Table
19-
data-testid="model-registries-table"
20-
data={modelRegistries}
21-
columns={modelRegistryColumns}
22-
toolbarContent={
23-
<Toolbar>
24-
<ToolbarContent>
25-
<ToolbarItem>
26-
<Button
27-
data-testid="create-model-registry-button"
28-
variant="primary"
29-
onClick={onCreateModelRegistryClick}
30-
>
31-
Create model registry
32-
</Button>
33-
</ToolbarItem>
34-
</ToolbarContent>
35-
</Toolbar>
36-
}
37-
rowRenderer={(mr) => (
38-
<ModelRegistriesTableRow
39-
key={mr.name}
40-
modelRegistry={mr}
41-
// eslint-disable-next-line @typescript-eslint/no-empty-function
42-
onDeleteRegistry={() => {}}
43-
// eslint-disable-next-line @typescript-eslint/no-empty-function
44-
onEditRegistry={() => {}}
21+
22+
const [deleteRegistry, setDeleteRegistry] = React.useState<ModelRegistry>();
23+
24+
return (
25+
<>
26+
<Table
27+
data-testid="model-registries-table"
28+
data={modelRegistries}
29+
columns={modelRegistryColumns}
30+
toolbarContent={
31+
<Toolbar>
32+
<ToolbarContent>
33+
<ToolbarItem>
34+
<Button
35+
data-testid="create-model-registry-button"
36+
variant="primary"
37+
onClick={onCreateModelRegistryClick}
38+
>
39+
Create model registry
40+
</Button>
41+
</ToolbarItem>
42+
</ToolbarContent>
43+
</Toolbar>
44+
}
45+
rowRenderer={(mr) => (
46+
<ModelRegistriesTableRow
47+
key={mr.name}
48+
modelRegistry={mr}
49+
onDeleteRegistry={(i) => setDeleteRegistry(i)}
50+
// eslint-disable-next-line @typescript-eslint/no-empty-function
51+
onEditRegistry={() => {}}
52+
/>
53+
)}
54+
variant="compact"
4555
/>
46-
)}
47-
variant="compact"
48-
/>
49-
);
56+
{/* TODO: implement when CRD endpoint is ready */}
57+
{/* {editRegistry ? (
58+
<CreateModal
59+
modelRegistry={editRegistry}
60+
onClose={() => setEditRegistry(undefined)}
61+
refresh={refresh}
62+
/>
63+
) : null} */}
64+
{deleteRegistry ? (
65+
<DeleteModelRegistryModal
66+
modelRegistry={deleteRegistry}
67+
onClose={() => setDeleteRegistry(undefined)}
68+
refresh={refresh}
69+
/>
70+
) : null}
71+
</>
72+
);
73+
};
5074

5175
export default ModelRegistriesTable;

clients/ui/frontend/src/app/pages/settings/ModelRegistrySettings.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const ModelRegistrySettings: React.FC = () => {
2525

2626
const loaded = mrloaded; //&& roleBindings.loaded;
2727

28+
// TODO: implement when refreshModelRegistries() and refreshRulesReview() are added
2829
// const refreshAll = React.useCallback(
2930
// () => Promise.all([refreshModelRegistries(), refreshRulesReview()]),
3031
// [refreshModelRegistries, refreshRulesReview],
@@ -74,6 +75,8 @@ const ModelRegistrySettings: React.FC = () => {
7475
onCreateModelRegistryClick={() => {
7576
setCreateModalOpen(true);
7677
}}
78+
// eslint-disable-next-line @typescript-eslint/no-empty-function
79+
refresh={() => {}}
7780
/>
7881
</ApplicationsPage>
7982
{createModalOpen ? (

0 commit comments

Comments
 (0)