2024-03-08 18:39:08 +03:00
|
|
|
'use client';
|
|
|
|
|
|
|
|
import { useLayoutEffect, useMemo, useState } from 'react';
|
|
|
|
|
2024-04-03 21:05:53 +03:00
|
|
|
import { IconReset, IconSave } from '@/components/Icons';
|
2024-03-08 18:39:08 +03:00
|
|
|
import MiniButton from '@/components/ui/MiniButton';
|
|
|
|
import Modal from '@/components/ui/Modal';
|
|
|
|
import TextArea from '@/components/ui/TextArea';
|
|
|
|
import TextInput from '@/components/ui/TextInput';
|
|
|
|
import { useRSForm } from '@/context/RSFormContext';
|
|
|
|
import { IVersionData, IVersionInfo } from '@/models/library';
|
|
|
|
|
|
|
|
import VersionsTable from './VersionsTable';
|
|
|
|
|
|
|
|
interface DlgEditVersionsProps {
|
|
|
|
hideWindow: () => void;
|
|
|
|
versions: IVersionInfo[];
|
|
|
|
onDelete: (versionID: number) => void;
|
|
|
|
onUpdate: (versionID: number, data: IVersionData) => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
function DlgEditVersions({ hideWindow, versions, onDelete, onUpdate }: DlgEditVersionsProps) {
|
|
|
|
const { processing } = useRSForm();
|
|
|
|
const [selected, setSelected] = useState<IVersionInfo | undefined>(undefined);
|
|
|
|
|
|
|
|
const [version, setVersion] = useState('');
|
|
|
|
const [description, setDescription] = useState('');
|
|
|
|
|
|
|
|
const isValid = useMemo(() => {
|
|
|
|
if (!selected) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return versions.every(ver => ver.id === selected.id || ver.version != version);
|
|
|
|
}, [selected, version, versions]);
|
|
|
|
|
|
|
|
const isModified = useMemo(() => {
|
|
|
|
if (!selected) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return selected.version != version || selected.description != description;
|
|
|
|
}, [version, description, selected]);
|
|
|
|
|
|
|
|
function handleUpdate() {
|
|
|
|
if (!isModified || !selected || processing || !isValid) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const data: IVersionData = {
|
|
|
|
version: version,
|
|
|
|
description: description
|
|
|
|
};
|
|
|
|
onUpdate(selected.id, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleReset() {
|
|
|
|
if (!selected) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
setVersion(selected?.version ?? '');
|
|
|
|
setDescription(selected?.description ?? '');
|
|
|
|
}
|
|
|
|
|
|
|
|
useLayoutEffect(() => {
|
|
|
|
setVersion(selected?.version ?? '');
|
|
|
|
setDescription(selected?.description ?? '');
|
|
|
|
}, [selected]);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Modal
|
|
|
|
readonly
|
|
|
|
header='Редактирование версий'
|
|
|
|
hideWindow={hideWindow}
|
|
|
|
className='flex flex-col w-[40rem] px-6 gap-3 pb-6'
|
|
|
|
>
|
|
|
|
<VersionsTable
|
|
|
|
processing={processing}
|
|
|
|
items={versions}
|
|
|
|
onDelete={onDelete}
|
|
|
|
onSelect={versionID => setSelected(versions.find(ver => ver.id === versionID))}
|
|
|
|
selected={selected?.id}
|
|
|
|
/>
|
|
|
|
<div className='flex'>
|
|
|
|
<TextInput
|
2024-03-18 16:21:39 +03:00
|
|
|
id='dlg_version'
|
2024-03-08 18:39:08 +03:00
|
|
|
dense
|
|
|
|
label='Версия'
|
|
|
|
className='w-[16rem] mr-3'
|
|
|
|
value={version}
|
|
|
|
onChange={event => setVersion(event.target.value)}
|
|
|
|
/>
|
2024-04-03 18:48:56 +03:00
|
|
|
<div className='cc-icons'>
|
|
|
|
<MiniButton
|
|
|
|
title='Сохранить изменения'
|
|
|
|
disabled={!isModified || !isValid || processing}
|
2024-04-03 21:05:53 +03:00
|
|
|
icon={<IconSave size='1.25rem' className='icon-primary' />}
|
2024-04-03 18:48:56 +03:00
|
|
|
onClick={handleUpdate}
|
|
|
|
/>
|
|
|
|
<MiniButton
|
|
|
|
title='Сбросить несохраненные изменения'
|
|
|
|
disabled={!isModified}
|
|
|
|
onClick={handleReset}
|
2024-04-03 21:05:53 +03:00
|
|
|
icon={<IconReset size='1.25rem' className='icon-primary' />}
|
2024-04-03 18:48:56 +03:00
|
|
|
/>
|
|
|
|
</div>
|
2024-03-08 18:39:08 +03:00
|
|
|
</div>
|
|
|
|
<TextArea
|
2024-03-18 16:21:39 +03:00
|
|
|
id='dlg_description'
|
2024-03-08 18:39:08 +03:00
|
|
|
spellCheck
|
|
|
|
label='Описание'
|
|
|
|
rows={3}
|
|
|
|
value={description}
|
|
|
|
onChange={event => setDescription(event.target.value)}
|
|
|
|
/>
|
|
|
|
</Modal>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default DlgEditVersions;
|