diff --git a/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/AccessModelForm.tsx b/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/AccessModelForm.tsx index 4d589563..e553bfe2 100644 --- a/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/AccessModelForm.tsx +++ b/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/AccessModelForm.tsx @@ -17,7 +17,9 @@ import { } from 'opub-ui'; import { GraphQL } from '@/lib/api'; +import { cn } from '@/lib/utils'; import { Icons } from '@/components/icons'; +import styles from '../edit.module.scss'; import ResourceSelector from './ResourceSelector'; interface AccessModelProps { @@ -131,6 +133,9 @@ const AccessModelForm: React.FC = ({ resources: [], accessModelId: '', }); + const [previousAccessModelData, setPreviousAccessModelData] = + useState(accessModelData); + const [selectedResources, setSelectedResources] = useState([]); const [showSelectAll, setShowSelectAll] = useState(false); @@ -161,7 +166,7 @@ const AccessModelForm: React.FC = ({ accessModelDetailsRefetch(); // Update accessModelData with the received data - setAccessModelData({ + const newData = { dataset: params.id, name: name, description: description, @@ -171,7 +176,10 @@ const AccessModelForm: React.FC = ({ resource: resource.resource.id, fields: resource.fields.map((field: any) => +field.id), })), - }); + }; + + setAccessModelData(newData); + setPreviousAccessModelData(newData); // Update selectedResources and selectedFields based on modelResources const selectedResourcesIds = modelResources.map((resource: any) => ({ @@ -203,13 +211,14 @@ const AccessModelForm: React.FC = ({ setSelectedFields(resourceDetails); const newResources = resourceDetails.map((resource: any) => ({ resource: resource.value, - fields: resource.schema.map((field: any) => field.id), + fields: resource.schema.map((field: any) => +field.id), })); setAccessModelData((prevData: any) => ({ ...prevData, resources: newResources, })); + if (resourceDetails.length === 0) { setAccessModelData((prevData: any) => ({ ...prevData, @@ -221,6 +230,8 @@ const AccessModelForm: React.FC = ({ resources: [...prevData.resources], })); } + + handleSave({ ...accessModelData, resources: newResources }); }; const handleRemoveResource = (resourceId: any) => { @@ -235,12 +246,16 @@ const AccessModelForm: React.FC = ({ ); // Remove the corresponding resource from accessModelData.resources + const updatedResources = accessModelData.resources.filter( + (resource: any) => resource.resource !== resourceId + ); + setAccessModelData((prevData: any) => ({ ...prevData, - resources: prevData.resources.filter( - (resource: any) => resource.resource !== resourceId - ), + resources: updatedResources, })); + + handleSave({ ...accessModelData, resources: updatedResources }); }; const handleSelectAll = () => { @@ -255,13 +270,17 @@ const AccessModelForm: React.FC = ({ setSelectedResources(allResources); setShowSelectAll(false); + const updatedResources = allResources.map((resource: any) => ({ + resource: resource.value, + fields: resource.schema.map((option: any) => option.value), + })); + setAccessModelData((prevData) => ({ ...prevData, - resources: allResources.map((resource: any) => ({ - resource: resource.value, - fields: resource.schema.map((option: any) => option.value), - })), + resources: updatedResources, })); + + handleSave({ ...accessModelData, resources: updatedResources }); }; const { mutate, isLoading: editMutationLoading } = useMutation( @@ -269,12 +288,11 @@ const AccessModelForm: React.FC = ({ GraphQL(editaccessModel, data), { onSuccess: (res: any) => { - toast('Access Model Saved'); + // toast('Access Model Saved'); accessModelDetailsRefetch(); accessModelListRefetch(); setAccessModelId(res?.editAccessModel?.id); - - // setList(true); + setPreviousAccessModelData(accessModelData); }, onError: (err: any) => { toast(`Received ${err} during access model saving`); @@ -284,6 +302,28 @@ const AccessModelForm: React.FC = ({ const [isSheetOpen, setIsSheetOpen] = useState(false); + const handleSave = (updatedData: any) => { + if ( + JSON.stringify(updatedData) !== JSON.stringify(previousAccessModelData) + ) { + mutate({ + accessModelInput: { + name: updatedData.name, + dataset: params.id, + description: updatedData.description, + type: updatedData.type as AccessTypes, + resources: updatedData.resources, + accessModelId: accessModelId || null, + }, + }); + } + }; + + const handleChange = (field: string, value: any) => { + const updatedData = { ...accessModelData, [field]: value }; + setAccessModelData(updatedData); + }; + return (
@@ -343,11 +383,12 @@ const AccessModelForm: React.FC = ({ (item: any, index: any) => (
- {isLoading || - editMutationLoading || - accessModelDetailsLoading || - accessModelListLoading ? ( + {isLoading ? (
) : (
-
- +
+ Auto Save + {editMutationLoading ? ( + + ) : ( + + )}
- setAccessModelData({ ...accessModelData, name: e }) - } + onChange={(e) => handleChange('name', e)} + onBlur={() => handleSave(accessModelData)} label="Access Type Name" name="name" required @@ -416,19 +443,14 @@ const AccessModelForm: React.FC = ({ defaultValue={'PUBLIC'} value={accessModelData.type} placeholder="Select" - onChange={(e) => - setAccessModelData({ ...accessModelData, type: e }) - } + onChange={(e) => handleChange('type', e)} + onBlur={() => handleSave(accessModelData)} />
- setAccessModelData({ - ...accessModelData, - description: e, - }) - } + onChange={(e) => handleChange('description', e)} + onBlur={() => handleSave(accessModelData)} label="Description" name="description" multiline={4} @@ -436,7 +458,7 @@ const AccessModelForm: React.FC = ({
-
+
= ({ handleRemoveResource={handleRemoveResource} accessModelData={accessModelData} setAccessModelData={setAccessModelData} + handleSave={handleSave} /> ); })} diff --git a/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/ResourceSelector.tsx b/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/ResourceSelector.tsx index e1fa9233..45420448 100644 --- a/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/ResourceSelector.tsx +++ b/app/[locale]/dashboard/organization/[organizationId]/dataset/[id]/edit/components/ResourceSelector.tsx @@ -10,6 +10,7 @@ interface ResourceSelectorProps { handleRemoveResource: (resourceId: string) => void; accessModelData: any; setAccessModelData: (data: any) => void; + handleSave: (updatedData: any) => void; } const ResourceSelector: React.FC = ({ @@ -17,6 +18,7 @@ const ResourceSelector: React.FC = ({ handleRemoveResource, accessModelData, setAccessModelData, + handleSave, }) => { const [selectAllFields, setSelectAllFields] = useState(true); const [options, setOptions] = useState<{ label: string; value: string }[]>( @@ -57,10 +59,10 @@ const ResourceSelector: React.FC = ({ ); } else if (selectAllFields) { setSelectedFields(initialOptions); - setAccessModelData((prevData: any) => ({ - ...prevData, + const updatedData = { + ...accessModelData, resources: [ - ...prevData.resources.filter( + ...accessModelData.resources.filter( (resource: any) => resource.resource !== selectedResource.id ), { @@ -70,9 +72,17 @@ const ResourceSelector: React.FC = ({ ), // Convert to integer }, ], - })); + }; + setAccessModelData(updatedData); + handleSave(updatedData); } - }, [selectedResource, accessModelData, selectAllFields]); + }, [ + selectedResource, + accessModelData, + selectAllFields, + setAccessModelData, + handleSave, + ]); const handleFieldSelection = (selectedOptions: any) => { const updatedFields = selectedOptions.map((option: any) => ({ @@ -82,10 +92,10 @@ const ResourceSelector: React.FC = ({ setSelectedFields(updatedFields); - setAccessModelData((prevData: any) => ({ - ...prevData, + const updatedData = { + ...accessModelData, resources: [ - ...prevData.resources.filter( + ...accessModelData.resources.filter( (resource: any) => resource.resource !== selectedResource.id ), { @@ -93,7 +103,10 @@ const ResourceSelector: React.FC = ({ fields: updatedFields.map((field: any) => parseInt(field.value, 10)), // Convert to integer }, ], - })); + }; + + setAccessModelData(updatedData); + handleSave(updatedData); setSelectAllFields(updatedFields.length === options.length); }; @@ -103,10 +116,10 @@ const ResourceSelector: React.FC = ({ setSelectAllFields(!selectAllFields); setSelectedFields(updatedFields); - setAccessModelData((prevData: any) => ({ - ...prevData, + const updatedData = { + ...accessModelData, resources: [ - ...prevData.resources.filter( + ...accessModelData.resources.filter( (resource: any) => resource.resource !== selectedResource.id ), { @@ -114,7 +127,10 @@ const ResourceSelector: React.FC = ({ fields: updatedFields.map((field: any) => parseInt(field.value, 10)), // Convert to integer }, ], - })); + }; + + setAccessModelData(updatedData); + handleSave(updatedData); }; return ( @@ -132,9 +148,9 @@ const ResourceSelector: React.FC = ({
-
+
-
+
= ({ onChange={(e: any) => handleFieldSelection(e)} />
-
+