diff --git a/rsconcept/frontend/src/components/Common/Modal.tsx b/rsconcept/frontend/src/components/Common/Modal.tsx index 2eaef2aa..af612b09 100644 --- a/rsconcept/frontend/src/components/Common/Modal.tsx +++ b/rsconcept/frontend/src/components/Common/Modal.tsx @@ -38,7 +38,7 @@ function Modal({ title, show, hideWindow, onSubmit, onCancel, canSubmit, childre <>
-
+
{ title &&

{title}

}
{children} @@ -46,7 +46,7 @@ function Modal({ title, show, hideWindow, onSubmit, onCancel, canSubmit, childre
diff --git a/rsconcept/frontend/src/context/RSFormContext.tsx b/rsconcept/frontend/src/context/RSFormContext.tsx index 58fcee70..64db7728 100644 --- a/rsconcept/frontend/src/context/RSFormContext.tsx +++ b/rsconcept/frontend/src/context/RSFormContext.tsx @@ -7,10 +7,10 @@ import { type DataCallback, deleteRSForm, getTRSFile, patchConstituenta, patchDeleteConstituenta, patchMoveConstituenta, patchResetAliases, patchRSForm, -patchUploadTRS, postClaimRSForm, postNewConstituenta} from '../utils/backendAPI' +patchUploadTRS, postClaimRSForm, postCloneRSForm,postNewConstituenta} from '../utils/backendAPI' import { IConstituenta, IConstituentaList, IConstituentaMeta, ICstCreateData, - ICstMovetoData, ICstUpdateData, IRSForm, IRSFormMeta, IRSFormUpdateData, IRSFormUploadData + ICstMovetoData, ICstUpdateData, IRSForm, IRSFormCreateData, IRSFormData, IRSFormMeta, IRSFormUpdateData, IRSFormUploadData } from '../utils/models' import { useAuth } from './AuthContext' @@ -34,12 +34,13 @@ interface IRSFormContext { toggleForceAdmin: () => void toggleReadonly: () => void toggleTracking: () => void - + update: (data: IRSFormUpdateData, callback?: DataCallback) => void destroy: (callback?: () => void) => void claim: (callback?: DataCallback) => void download: (callback: DataCallback) => void upload: (data: IRSFormUploadData, callback: () => void) => void + clone: (data: IRSFormCreateData, callback: DataCallback) => void resetAliases: (callback: () => void) => void cstCreate: (data: ICstCreateData, callback?: DataCallback) => void @@ -165,6 +166,21 @@ export const RSFormState = ({ schemaID, children }: RSFormStateProps) => { }); }, [schemaID, setError, schema, user, setSchema]) + const clone = useCallback( + (data: IRSFormCreateData, callback: DataCallback) => { + if (!schema || !user) { + return; + } + setError(undefined) + postCloneRSForm(schemaID, { + data: data, + showError: true, + setLoading: setProcessing, + onError: error => { setError(error) }, + onSuccess: callback + }); + }, [schemaID, setError, schema, user]) + const resetAliases = useCallback( (callback?: () => void) => { if (!schema || !user) { @@ -262,7 +278,7 @@ export const RSFormState = ({ schemaID, children }: RSFormStateProps) => { toggleForceAdmin: () => { setIsForceAdmin(prev => !prev) }, toggleReadonly: () => { setIsReadonly(prev => !prev) }, toggleTracking, - update, download, upload, destroy, claim, resetAliases, + update, download, upload, destroy, claim, resetAliases, clone, cstUpdate, cstCreate, cstDelete, cstMoveTo }}> { children } diff --git a/rsconcept/frontend/src/pages/RSFormPage/DlgCloneRSForm.tsx b/rsconcept/frontend/src/pages/RSFormPage/DlgCloneRSForm.tsx new file mode 100644 index 00000000..aa80f1a6 --- /dev/null +++ b/rsconcept/frontend/src/pages/RSFormPage/DlgCloneRSForm.tsx @@ -0,0 +1,82 @@ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { toast } from 'react-toastify'; + +import Checkbox from '../../components/Common/Checkbox'; +import Modal from '../../components/Common/Modal'; +import TextArea from '../../components/Common/TextArea'; +import TextInput from '../../components/Common/TextInput'; +import { useRSForm } from '../../context/RSFormContext'; +import { IRSFormCreateData } from '../../utils/models'; +import { getCloneTitle } from '../../utils/staticUI'; + +interface DlgCloneRSFormProps { + show: boolean + hideWindow: () => void +} + +function DlgCloneRSForm({ show, hideWindow }: DlgCloneRSFormProps) { + const navigate = useNavigate(); + const [title, setTitle] = useState(''); + const [alias, setAlias] = useState(''); + const [comment, setComment] = useState(''); + const [common, setCommon] = useState(false); + + const { schema, clone } = useRSForm(); + + useEffect(() => { + if (schema) { + setTitle(getCloneTitle(schema)) + setAlias(schema.alias) + setComment(schema.comment) + setCommon(schema.is_common) + } + }, [schema, schema?.title, schema?.alias, schema?.comment, schema?.is_common]); + + const handleSubmit = () => { + hideWindow(); + const data: IRSFormCreateData = { + title: title, + alias: alias, + comment: comment, + is_common: common + }; + clone(data, newSchema => { + toast.success(`Схема создана: ${newSchema.alias}`); + navigate(`/rsforms/${newSchema.id}`); + }); + }; + + return ( + + { setTitle(event.target.value); }} + /> + { setAlias(event.target.value); }} + /> +