diff --git a/src/pages/WellCase/HistoryTable.jsx b/src/pages/WellCase/HistoryTable.jsx index b37969a..e1fd685 100644 --- a/src/pages/WellCase/HistoryTable.jsx +++ b/src/pages/WellCase/HistoryTable.jsx @@ -3,25 +3,14 @@ import { Empty, Timeline } from 'antd' import moment from 'moment' import { useWell } from '@asb/context' +import { UserView } from '@components/views' import DownloadLink from '@components/DownloadLink' import LoaderPortal from '@components/LoaderPortal' import { invokeWebApiWrapperAsync } from '@components/factory' -// import { makeColumn, makeDateColumn, Table } from '@components/Table' +import { WellFinalDocumentsService } from '@api' import { formatDate } from '@utils' -import { UserView } from '@asb/components/views' -// const columns = [ -// makeColumn('Файл', 'file', { -// render: (file) => ( -// -// ), -// }), -// makeDateColumn('Дата загрузки', 'date', undefined, undefined, { -// defaultSortOrder: 'descend', -// }), -// ] - -export const HistoryTable = memo(({ users, category }) => { +export const HistoryTable = memo(({ category }) => { const [isLoading, setIsLoading] = useState(false) const [files, setFiles] = useState([]) @@ -30,26 +19,29 @@ export const HistoryTable = memo(({ users, category }) => { useEffect(() => { invokeWebApiWrapperAsync( async () => { - const files = [{ uploadDate: moment().format(), id: 0, idWell: 0 }] + const result = await WellFinalDocumentsService.getFilesHistoryByIdCategory(well.id, category.idCategory) + if (!result) return + const files = result.file files.sort((a, b) => moment(a.uploadDate) - moment(b.uploadDate)) const fileSource = files.map((file) => ({ file, date: file.uploadDate, - user: users.find(({ id }) => id === file.idAuthor) ?? null, + user: file.author, })) - setFiles(fileSource) // Получаем список файлов и записываем в state + setFiles(fileSource) }, setIsLoading, - `Не удалось загрузить историю файлов категории "${category.caption}"`, + `Не удалось загрузить историю файлов категории "${category.nameCategory}"`, + { actionName: `Загрузка истории файлов категории "${category.nameCategory}"`, well } ) }, [well, category]) return ( {files.length > 0 ? ( - + {files.map(({ date, user, file }) => ( - + {formatDate(date)} @@ -57,17 +49,10 @@ export const HistoryTable = memo(({ users, category }) => { ))} ) : ( - + )} - {/* */} ) }) export default HistoryTable - diff --git a/src/pages/WellCase/WellCaseEditor.jsx b/src/pages/WellCase/WellCaseEditor.jsx index b9fb51e..3497f5a 100644 --- a/src/pages/WellCase/WellCaseEditor.jsx +++ b/src/pages/WellCase/WellCaseEditor.jsx @@ -1,20 +1,161 @@ -import { memo, useCallback, useState } from 'react' -import { Modal, Transfer } from 'antd' +import { memo, useCallback, useEffect, useMemo, useState } from 'react' +import { AutoComplete, List, Modal, Tooltip, Transfer } from 'antd' import { useWell } from '@asb/context' +import { UserView } from '@components/views' +import LoaderPortal from '@components/LoaderPortal' +import { invokeWebApiWrapperAsync } from '@components/factory' +import { WellFinalDocumentsService } from '@api' +import { arrayOrDefault } from '@utils' -export const WellCaseEditor = memo(({ show, onClose }) => { - const [users, setUsers] = useState([]) +import '@styles/well_case.less' + +const filterCategoriesByText = (text) => (cat) => + !text || !!cat?.nameCategory?.toLowerCase().includes(text.toLowerCase()) + +const filterUserByText = (text, user) => + !text || (user && `${user.login} ${user.email} ${user.surname} ${user.name} ${user.patronymic}`.toLowerCase().includes(text.toLowerCase())) + +export const WellCaseEditor = memo(({ categories: currentCategories, show, onClose }) => { + const [users, setUsersDataSource] = useState([]) + const [isLoading, setIsLoading] = useState(false) + const [categories, setCategories] = useState([]) + const [availableCategories, setAvailableCategories] = useState([]) + const [catSearchText, setCatSearchText] = useState(null) + const [selectedCatId, setSelectedCatId] = useState(null) const [well] = useWell() + const unusedCategories = useMemo(() => availableCategories.filter(({ id }) => !categories.find((cat) => cat.idCategory === id)), [categories, availableCategories]) + + const catOptions = useMemo(() => { + return unusedCategories + .filter(filterCategoriesByText(catSearchText)) + .map((cat) => ({ label: cat.name, value: cat.name, id: cat.id })) + }, [catSearchText, unusedCategories]) + const onModalOk = useCallback(() => { - onClose(true) + invokeWebApiWrapperAsync( + async () => { + await WellFinalDocumentsService.updateRange(well.id, categories) + onClose?.(true) + }, + setIsLoading, + 'Не удалось изменить ответственных', + { actionName: 'Изменение ответственных', well } + ) + }, [onClose, well, categories]) + + const onModalCancel = useCallback(() => onClose?.(false), [onClose]) + + const onAddCategory = useCallback((name, cat) => { + setCategories((prev) => [...prev, { idCategory: cat.id, nameCategory: name, publishers: [] }]) + }, []) + + const categoryRender = useCallback((item) => { + const hasPublishers = item.idsPublishers?.length > 0 + const selected = selectedCatId === item.idCategory + + return ( + setSelectedCatId(item.idCategory)} + > + {hasPublishers ? (item.nameCategory) : ( + + {item.nameCategory} + + )} + + ) + }, [selectedCatId]) + + const onPublishersChange = useCallback((selectedPublishers) => { + setCategories((prev) => { + const cats = [...prev] + const idx = cats.findIndex((cat) => cat.idCategory === selectedCatId) + cats[idx].idsPublishers = selectedPublishers + return cats + }) + }, [selectedCatId]) + + useEffect(() => { + const cats = currentCategories?.map((cat) => ({ + idCategory: cat.idCategory, + nameCategory: cat.nameCategory, + idsPublishers: cat.publishers.map((user) => user.id), + })) + setCategories(cats ?? []) + }, [currentCategories]) + + useEffect(() => { + invokeWebApiWrapperAsync( + async () => { + const users = arrayOrDefault(await WellFinalDocumentsService.getAvailableUsers(well.id)) + const usersDataSource = users.map((user) => ({ key: user.id, ...user })) + setUsersDataSource(usersDataSource) + }, + setIsLoading, + 'Не удалось загрузить список доступных публикаторов', + { actionName: 'Загрузка списка доступных публикаторов', well } + ) + }, [well]) + + useEffect(() => { + invokeWebApiWrapperAsync( + async () => { + const categories = arrayOrDefault(await WellFinalDocumentsService.getWellCaseCategories()) + setAvailableCategories(categories) + }, + setIsLoading, + 'Не удалось загрузить список доступных категорий', + { actionName: 'Загрузка списка доступных категорий' } + ) }, []) return ( - onClose(false)} onOk={onModalOk}> - + + +
+
+ setCatSearchText(searchText)} + onSelect={onAddCategory} + placeholder={'Впишите категорию для добавления'} + /> + +
+ cat.idCategory === selectedCatId)?.idsPublishers ?? []} + render={(item) => ( + + )} + /> +
+
) }) diff --git a/src/pages/WellCase/index.jsx b/src/pages/WellCase/index.jsx index 0fcbed3..e55653e 100644 --- a/src/pages/WellCase/index.jsx +++ b/src/pages/WellCase/index.jsx @@ -7,64 +7,77 @@ import DownloadLink from '@components/DownloadLink' import LoaderPortal from '@components/LoaderPortal' import { invokeWebApiWrapperAsync } from '@components/factory' import { makeColumn, makeDateColumn, makeTextColumn, Table } from '@components/Table' -import { delay, wrapPrivateComponent } from '@utils' +import { WellFinalDocumentsService } from '@api' +import { MimeTypes, wrapPrivateComponent } from '@utils' import WellCaseEditor from './WellCaseEditor' import { HistoryTable } from './HistoryTable' +import UploadForm from '@asb/components/UploadForm' -const columns = [ - makeTextColumn('Категория', 'caption'), - makeColumn('Файл', 'file', { - render: (file) => file ? ( - - ) : ( - Файл не загружен - ), - }), - makeDateColumn('Дата загрузки', 'uploadDate'), - makeColumn('Ответственные', 'responsible', { - render: (responsible) => responsible.map((user) => ( - - )), - }), -] +const expandable = { + expandedRowRender: (category) => ( + + ) +} const WellCase = memo(() => { const [isLoading, setIsLoading] = useState(false) const [categories, setCategories] = useState([]) const [canEdit, setCanEdit] = useState(false) const [showEdit, setShowEdit] = useState(false) - const [users, setUsers] = useState([]) const [well] = useWell() const updateTable = useCallback(() => { invokeWebApiWrapperAsync( async () => { - await delay(1000) - const categories = [{ responsible: [{}] }] + const { permissionToSetPubliher, wellFinalDocuments } = await WellFinalDocumentsService.get(well.id) - setCanEdit(true) - const showingCategories = categories.filter((cat) => cat.responsible && cat.responsible?.length > 0) - setCategories(showingCategories) + setCategories(wellFinalDocuments.map((cat) => ({ ...cat, uploadDate: cat.file?.uploadDate }))) + setCanEdit(permissionToSetPubliher) }, setIsLoading, 'Не удалось загрузить список категорий', + { actionName: 'Загрузка списка категорий', well } ) }, [well]) + const columns = useMemo(() => [ + makeTextColumn('Категория', 'nameCategory'), + makeColumn('Файл', 'file', { + render: (file, category) => ( +
+ {file ? ( + + ) : ( + Файл не загружен + )} + + {category.permissionToUpload && ( + setIsLoading(true)} + onUploadComplete={updateTable} + onUploadError={() => setIsLoading(false)} + /> + )} +
+ ), + }), + makeDateColumn('Дата загрузки', 'uploadDate'), + makeColumn('Ответственные', 'publishers', { + render: (publishers) => publishers?.map((user) => ( + + )), + }), + ], [well, updateTable]) + const onEditClose = useCallback((changed = false) => { setShowEdit(false) if (changed) updateTable() }, [updateTable]) - const expandable = useMemo(() => ({ - expandedRowRender: (category) => ( - - ) - }), [users]) - - useEffect(() => updateTable(), [updateTable]) + useEffect(updateTable, [updateTable]) return ( <> @@ -80,7 +93,7 @@ const WellCase = memo(() => { expandable={expandable} /> - + ) }) @@ -89,4 +102,5 @@ export default wrapPrivateComponent(WellCase, { title: 'Дело скважины', route: 'well_case', requirements: [], + // requirements: ['WellFinalDocuments.get'], })