import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid"; import { ruRU } from "@mui/x-data-grid/locales"; import { authStore, articlesStore, languageStore, SearchInput, selectedCityStore } from "@shared"; import { useEffect, useState, useMemo } from "react"; import { observer } from "mobx-react-lite"; import { Trash2, Eye, Minus } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { DeleteModal, LanguageSwitcher } from "@widgets"; import { Box, CircularProgress } from "@mui/material"; export const ArticleListPage = observer(() => { const { articleList, getArticleList, deleteArticles } = articlesStore; const navigate = useNavigate(); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isBulkDeleteModalOpen, setIsBulkDeleteModalOpen] = useState(false); const [rowId, setRowId] = useState(null); const { language } = languageStore; const [ids, setIds] = useState([]); const [isLoading, setIsLoading] = useState(false); const [paginationModel, setPaginationModel] = useState({ page: 0, pageSize: 50, }); const canWriteArticles = authStore.canWrite("sights"); const [searchQuery, setSearchQuery] = useState(""); useEffect(() => { const fetchArticles = async () => { setIsLoading(true); await getArticleList(); setIsLoading(false); }; fetchArticles(); }, [language, selectedCityStore.cityVersion]); const columns: GridColDef[] = [ { field: "heading", headerName: "Название", flex: 1, renderCell: (params: GridRenderCellParams) => { return params.value ? ( params.value ) : (
); }, }, { field: "actions", headerName: "Действия", sortable: false, renderCell: (params: GridRenderCellParams) => (
{canWriteArticles && ( )}
), }, ]; const rows = useMemo(() => { const query = searchQuery.trim().toLowerCase(); const cityId = selectedCityStore.selectedCityId; return articleList[language].data .filter((article) => !query || (article.heading ?? "").toLowerCase().includes(query)) .filter((article) => !cityId || article.city_id === cityId) .map((article) => ({ id: article.id, heading: article.heading, body: article.body, })); }, [articleList[language].data, searchQuery, selectedCityStore.selectedCityId]); return ( <>

Статьи

{canWriteArticles && ids.length > 0 && (
)} {(rows.length > 0 || searchQuery) && ( )}
{ if (Array.isArray(newSelection)) { const selectedIds = newSelection.map( (id: string | number) => Number(id) ); setIds(selectedIds); } else if ( newSelection && typeof newSelection === "object" && "ids" in newSelection ) { const idsSet = newSelection.ids as Set; const selectedIds = Array.from(idsSet).map( (id: string | number) => Number(id) ); setIds(selectedIds); } else { setIds([]); } } : undefined } slots={{ noRowsOverlay: () => ( {isLoading ? : "Нет статей"} ), }} />
{ if (rowId) { await deleteArticles([parseInt(rowId)]); getArticleList(); } setIsDeleteModalOpen(false); setRowId(null); }} onCancel={() => { setIsDeleteModalOpen(false); setRowId(null); }} /> { await deleteArticles(ids); getArticleList(); setIsBulkDeleteModalOpen(false); setIds([]); }} onCancel={() => { setIsBulkDeleteModalOpen(false); }} /> ); });