2024-05-27 20:42:34 +03:00
|
|
|
|
'use client';
|
|
|
|
|
|
|
|
|
|
import clsx from 'clsx';
|
2024-12-13 21:31:09 +03:00
|
|
|
|
import { useState } from 'react';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
|
2025-01-27 15:03:48 +03:00
|
|
|
|
import { useUsers } from '@/backend/users/useUsers';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
import { IconRemove } from '@/components/Icons';
|
|
|
|
|
import SelectUser from '@/components/select/SelectUser';
|
2025-02-07 10:54:47 +03:00
|
|
|
|
import { MiniButton } from '@/components/ui/Control';
|
|
|
|
|
import { Label } from '@/components/ui/Input';
|
2025-02-06 20:28:23 +03:00
|
|
|
|
import { ModalForm } from '@/components/ui/Modal';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
import { UserID } from '@/models/user';
|
2025-01-16 16:31:32 +03:00
|
|
|
|
import { useDialogsStore } from '@/stores/dialogs';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
|
2024-06-26 19:47:31 +03:00
|
|
|
|
import TableUsers from './TableUsers';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
|
2025-01-16 16:31:32 +03:00
|
|
|
|
export interface DlgEditEditorsProps {
|
2024-05-27 20:42:34 +03:00
|
|
|
|
editors: UserID[];
|
2025-01-28 19:47:24 +03:00
|
|
|
|
onChangeEditors: (newValue: UserID[]) => void;
|
2024-05-27 20:42:34 +03:00
|
|
|
|
}
|
|
|
|
|
|
2025-01-16 16:31:32 +03:00
|
|
|
|
function DlgEditEditors() {
|
2025-01-28 19:47:24 +03:00
|
|
|
|
const { editors, onChangeEditors } = useDialogsStore(state => state.props as DlgEditEditorsProps);
|
2024-05-27 20:42:34 +03:00
|
|
|
|
const [selected, setSelected] = useState<UserID[]>(editors);
|
|
|
|
|
const { users } = useUsers();
|
|
|
|
|
|
|
|
|
|
function handleSubmit() {
|
2025-01-28 19:47:24 +03:00
|
|
|
|
onChangeEditors(selected);
|
2025-02-06 14:10:18 +03:00
|
|
|
|
return true;
|
2024-05-27 20:42:34 +03:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-13 21:31:09 +03:00
|
|
|
|
function onDeleteEditor(target: UserID) {
|
|
|
|
|
setSelected(prev => prev.filter(id => id !== target));
|
|
|
|
|
}
|
2024-05-27 20:42:34 +03:00
|
|
|
|
|
2024-12-13 21:31:09 +03:00
|
|
|
|
function onAddEditor(target: UserID) {
|
|
|
|
|
setSelected(prev => [...prev, target]);
|
|
|
|
|
}
|
2024-05-27 20:42:34 +03:00
|
|
|
|
|
|
|
|
|
return (
|
2025-02-06 20:28:23 +03:00
|
|
|
|
<ModalForm
|
2024-05-27 20:42:34 +03:00
|
|
|
|
canSubmit
|
|
|
|
|
header='Список редакторов'
|
|
|
|
|
submitText='Сохранить список'
|
|
|
|
|
className='flex flex-col w-[35rem] px-6 gap-3 pb-6'
|
|
|
|
|
onSubmit={handleSubmit}
|
|
|
|
|
>
|
|
|
|
|
<div className={clsx('flex self-center items-center', 'text-sm font-semibold')}>
|
|
|
|
|
<span>Всего редакторов [{selected.length}]</span>
|
|
|
|
|
<MiniButton
|
|
|
|
|
noHover
|
|
|
|
|
title='Очистить список'
|
|
|
|
|
className='py-0'
|
|
|
|
|
icon={<IconRemove size='1.5rem' className='icon-red' />}
|
|
|
|
|
disabled={selected.length === 0}
|
|
|
|
|
onClick={() => setSelected([])}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
2024-12-13 21:31:09 +03:00
|
|
|
|
<TableUsers items={users.filter(user => selected.includes(user.id))} onDelete={onDeleteEditor} />
|
2024-05-27 20:42:34 +03:00
|
|
|
|
|
|
|
|
|
<div className='flex items-center gap-3'>
|
|
|
|
|
<Label text='Добавить' />
|
2025-01-27 15:03:48 +03:00
|
|
|
|
<SelectUser
|
|
|
|
|
filter={id => !selected.includes(id)}
|
|
|
|
|
value={undefined}
|
2025-02-04 20:35:55 +03:00
|
|
|
|
onChange={onAddEditor}
|
2025-01-27 15:03:48 +03:00
|
|
|
|
className='w-[25rem]'
|
|
|
|
|
/>
|
2024-05-27 20:42:34 +03:00
|
|
|
|
</div>
|
2025-02-06 20:28:23 +03:00
|
|
|
|
</ModalForm>
|
2024-05-27 20:42:34 +03:00
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default DlgEditEditors;
|