ConceptPortal-public/rsconcept/frontend/src/dialogs/DlgCloneLibraryItem.tsx

89 lines
3.0 KiB
TypeScript
Raw Normal View History

'use client';
import clsx from 'clsx';
import { useMemo, useState } from 'react';
2023-12-04 14:19:54 +03:00
import { toast } from 'react-toastify';
import { urls } from '@/app/urls';
import Checkbox from '@/components/ui/Checkbox';
import Modal, { ModalProps } from '@/components/ui/Modal';
import TextArea from '@/components/ui/TextArea';
import TextInput from '@/components/ui/TextInput';
import { useLibrary } from '@/context/LibraryContext';
2023-12-26 14:23:51 +03:00
import { useConceptNavigation } from '@/context/NavigationContext';
import { ILibraryItem } from '@/models/library';
2024-01-04 14:35:46 +03:00
import { cloneTitle } from '@/models/libraryAPI';
import { ConstituentaID, IRSFormCloneData } from '@/models/rsform';
2023-12-04 14:19:54 +03:00
2023-12-28 14:04:44 +03:00
interface DlgCloneLibraryItemProps extends Pick<ModalProps, 'hideWindow'> {
base: ILibraryItem;
selected: ConstituentaID[];
totalCount: number;
2023-12-04 14:19:54 +03:00
}
function DlgCloneLibraryItem({ hideWindow, base, selected, totalCount }: DlgCloneLibraryItemProps) {
const router = useConceptNavigation();
const [title, setTitle] = useState(cloneTitle(base));
const [alias, setAlias] = useState(base.alias);
const [comment, setComment] = useState(base.comment);
const [common, setCommon] = useState(base.is_common);
const [onlySelected, setOnlySelected] = useState(false);
2023-12-04 14:19:54 +03:00
const { cloneItem } = useLibrary();
2023-12-28 14:04:44 +03:00
const canSubmit = useMemo(() => title !== '' && alias !== '', [title, alias]);
2023-12-04 14:19:54 +03:00
function handleSubmit() {
const data: IRSFormCloneData = {
2023-12-04 14:19:54 +03:00
item_type: base.item_type,
title: title,
alias: alias,
comment: comment,
is_common: common,
is_canonical: false
2023-12-04 14:19:54 +03:00
};
if (onlySelected) {
data.items = selected;
}
2023-12-04 14:19:54 +03:00
cloneItem(base.id, data, newSchema => {
toast.success(`Копия создана: ${newSchema.alias}`);
router.push(urls.schema(newSchema.id));
2023-12-04 14:19:54 +03:00
});
}
return (
2023-12-28 14:04:44 +03:00
<Modal
header='Создание копии концептуальной схемы'
hideWindow={hideWindow}
canSubmit={canSubmit}
submitText='Создать'
onSubmit={handleSubmit}
className={clsx('px-6 py-2', 'cc-column')}
2023-12-28 14:04:44 +03:00
>
<TextInput
id='dlg_full_name'
label='Полное название'
value={title}
onChange={event => setTitle(event.target.value)}
/>
<TextInput
id='dlg_alias'
2023-12-28 14:04:44 +03:00
label='Сокращение'
value={alias}
className='max-w-sm'
onChange={event => setAlias(event.target.value)}
/>
<TextArea id='dlg_comment' label='Описание' value={comment} onChange={event => setComment(event.target.value)} />
<Checkbox
id='dlg_only_selected'
label={`Только выбранные конституенты [${selected.length} из ${totalCount}]`}
value={onlySelected}
setValue={value => setOnlySelected(value)}
/>
<Checkbox id='dlg_is_common' label='Общедоступная схема' value={common} setValue={value => setCommon(value)} />
2023-12-28 14:04:44 +03:00
</Modal>
);
2023-12-04 14:19:54 +03:00
}
2023-12-28 14:04:44 +03:00
export default DlgCloneLibraryItem;