feat: delete select article and disable double click row selection

This commit is contained in:
2026-04-26 03:21:03 +03:00
parent 7f8b90c15e
commit 248eea6f85
13 changed files with 15 additions and 133 deletions

View File

@@ -113,6 +113,7 @@ export const ArticleListPage = observer(() => {
columns={columns}
checkboxSelection={canWriteArticles}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -168,6 +168,7 @@ export const CarrierListPage = observer(() => {
columns={columns}
checkboxSelection={canWriteCarriers}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -162,6 +162,7 @@ export const CityListPage = observer(() => {
columns={columns}
checkboxSelection={canWriteCities}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -115,6 +115,7 @@ export const CountryListPage = observer(() => {
columns={columns}
checkboxSelection={canWriteCountries}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -129,6 +129,7 @@ export const MediaListPage = observer(() => {
columns={columns}
checkboxSelection={canWriteMedia}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -230,6 +230,7 @@ export const RouteListPage = observer(() => {
onRowDoubleClick={(params) => canWriteRoutes && navigate(`/route/${params.row.id}/edit`)}
checkboxSelection={canWriteRoutes}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -185,6 +185,7 @@ export const SightListPage = observer(() => {
onRowDoubleClick={(params) => canWriteSights && navigate(`/sight/${params.row.id}/edit`)}
checkboxSelection={canWriteSights}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -226,6 +226,7 @@ export const StationListPage = observer(() => {
onRowDoubleClick={(params) => canWriteStations && navigate(`/station/${params.row.id}/edit`)}
checkboxSelection={canWriteStations}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -153,6 +153,7 @@ export const UserListPage = observer(() => {
columns={columns}
checkboxSelection={canWriteUsers}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -188,6 +188,7 @@ export const VehicleListPage = observer(() => {
columns={columns}
checkboxSelection={canWriteVehicles}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -903,6 +903,7 @@ export const DevicesTable = observer(() => {
columns={columns}
checkboxSelection={canWriteDevices}
disableRowSelectionExcludeModel
disableRowSelectionOnClick
loading={isLoading}
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}

View File

@@ -3,8 +3,6 @@ import {
Button,
Paper,
Typography,
Menu,
MenuItem,
TextField,
} from "@mui/material";
import {
@@ -12,7 +10,6 @@ import {
createSightStore,
editSightStore,
languageStore,
SelectArticleModal,
TabPanel,
SelectMediaDialog,
UploadMediaDialog,
@@ -43,7 +40,6 @@ type MediaItemShared = {
export const CreateRightTab = observer(
({ value, index }: { value: number; index: number }) => {
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
const {
sight,
createNewRightArticle,
@@ -54,7 +50,6 @@ export const CreateRightTab = observer(
deleteRightArticleMedia,
unlinkRightAritcle,
deleteRightArticle,
linkExistingRightArticle,
createSight,
clearCreateSight,
updateRightArticles,
@@ -63,8 +58,6 @@ export const CreateRightTab = observer(
const { setFileToUpload, setUploadMediaOpen, uploadMediaOpen } =
editSightStore;
const [selectArticleDialogOpen, setSelectArticleDialogOpen] =
useState(false);
const [activeArticleIndex, setActiveArticleIndex] = useState<number | null>(
null
);
@@ -100,14 +93,6 @@ export const CreateRightTab = observer(
}
}, [language, sight[language].right, activeArticleIndex]);
const openMenu = Boolean(anchorEl);
const handleClickMenu = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
};
const handleCloseMenu = () => {
setAnchorEl(null);
};
const handleSave = async () => {
try {
await createSight(language);
@@ -127,7 +112,6 @@ export const CreateRightTab = observer(
};
const handleCreateNewLocalArticle = async () => {
handleCloseMenu();
try {
const newArticleId = await createNewRightArticle();
@@ -146,26 +130,6 @@ export const CreateRightTab = observer(
}
};
const handleSelectExistingArticleAndLink = async (
selectedArticleId: number
) => {
try {
const linkedArticleId = await linkExistingRightArticle(
selectedArticleId
);
setSelectArticleDialogOpen(false);
const newIndex = sight[language].right.findIndex(
(a) => a.id === linkedArticleId
);
if (newIndex > -1) {
setActiveArticleIndex(newIndex);
setType("article");
}
} catch (error) {
toast.error("Не удалось привязать существующую статью.");
}
};
const currentRightArticle =
activeArticleIndex !== null && sight[language].right[activeArticleIndex]
? sight[language].right[activeArticleIndex]
@@ -317,33 +281,10 @@ export const CreateRightTab = observer(
</Box>
<button
className="w-10 h-10 bg-blue-500 rounded-full absolute bottom-5 left-5 flex items-center justify-center hover:bg-blue-600"
onClick={handleClickMenu}
aria-controls={openMenu ? "add-article-menu" : undefined}
aria-haspopup="true"
aria-expanded={openMenu ? "true" : undefined}
onClick={handleCreateNewLocalArticle}
>
<Plus size={20} color="white" />
</button>
<Menu
id="add-article-menu"
anchorEl={anchorEl}
open={openMenu}
onClose={handleCloseMenu}
MenuListProps={{ "aria-labelledby": "basic-button" }}
sx={{ mt: 1 }}
>
<MenuItem onClick={handleCreateNewLocalArticle}>
<Typography>Создать новую</Typography>
</MenuItem>
<MenuItem
onClick={() => {
setSelectArticleDialogOpen(true);
handleCloseMenu();
}}
>
<Typography>Выбрать существующую статью</Typography>
</MenuItem>
</Menu>
</Box>
{type === "article" && currentRightArticle ? (
@@ -501,7 +442,7 @@ export const CreateRightTab = observer(
</Box>
<Box className="w-[25%] mr-10">
{type === "article" && activeArticleIndex !== null && (
{type === "article" && activeArticleIndex !== null && sight[language].right[activeArticleIndex] && (
<Paper
className="flex-1 flex flex-col max-w-[500px]"
sx={{
@@ -680,12 +621,6 @@ export const CreateRightTab = observer(
</Box>
</Box>
<SelectArticleModal
open={selectArticleDialogOpen}
onClose={() => setSelectArticleDialogOpen(false)}
onSelectArticle={handleSelectExistingArticleAndLink}
linkedArticleIds={sight[language].right.map((article) => article.id)}
/>
<UploadMediaDialog
open={uploadMediaOpen}
onClose={() => {
@@ -716,6 +651,7 @@ export const CreateRightTab = observer(
onDelete={async () => {
try {
await deleteRightArticle(currentRightArticle?.id || 0);
setIsDeleteModalOpen(false);
setActiveArticleIndex(null);
setType("media");
toast.success("Статья удалена");

View File

@@ -2,8 +2,6 @@ import {
Box,
Button,
Typography,
Menu,
MenuItem,
TextField,
Slider,
Stack,
@@ -13,7 +11,6 @@ import {
BackButton,
editSightStore,
languageStore,
SelectArticleModal,
SelectMediaDialog,
TabPanel,
UploadMediaDialog,
@@ -40,8 +37,6 @@ import { SightFramePreview } from "./SightFramePreview";
export const RightWidgetTab = observer(
({ value, index }: { value: number; index: number }) => {
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
const {
sight,
updateRightArticleInfo,
@@ -52,7 +47,6 @@ export const RightWidgetTab = observer(
linkPreviewMedia,
unlinkRightArticle,
deleteRightArticle,
linkArticle,
deleteRightArticleMedia,
createLinkWithRightArticle,
setFileToUpload,
@@ -94,24 +88,15 @@ export const RightWidgetTab = observer(
const [activeArticleIndex, setActiveArticleIndex] = useState<number | null>(
null
);
const [isSelectModalOpen, setIsSelectModalOpen] = useState(false);
const [isSelectMediaModalOpen, setIsSelectMediaModalOpen] = useState(false);
const [isDeleteArticleModalOpen, setIsDeleteArticleModalOpen] =
useState(false);
const open = Boolean(anchorEl);
const handleDeleteArticle = () => {
deleteRightArticle(sight[language].right[activeArticleIndex || 0].id);
setActiveArticleIndex(null);
};
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const handleSelectArticle = (index: number) => {
setActiveArticleIndex(index);
};
@@ -119,7 +104,6 @@ export const RightWidgetTab = observer(
const handleCreateNew = async () => {
try {
const newArticleId = await createNewRightArticle();
handleClose();
const newIndex = sight[language].right.findIndex(
(article) => article.id === newArticleId
@@ -133,32 +117,6 @@ export const RightWidgetTab = observer(
}
};
const handleSelectExisting = () => {
setIsSelectModalOpen(true);
handleClose();
};
const handleCloseSelectModal = () => {
setIsSelectModalOpen(false);
};
const handleArticleSelect = async (id: number) => {
try {
const linkedArticleId = await linkArticle(id);
handleCloseSelectModal();
const newIndex = sight[language].right.findIndex(
(article) => article.id === linkedArticleId
);
if (newIndex > -1) {
setActiveArticleIndex(newIndex);
setType("article");
}
} catch (error) {
console.error("Error linking article:", error);
}
};
const handleMediaSelected = async (media: {
id: string;
filename: string;
@@ -276,27 +234,10 @@ export const RightWidgetTab = observer(
</Box>
<button
className="w-10 h-10 bg-blue-500 rounded-full absolute bottom-5 left-5 flex items-center justify-center"
onClick={handleClick}
onClick={handleCreateNew}
>
<Plus size={20} color="white" />
</button>
<Menu
id="basic-menu"
anchorEl={anchorEl}
open={open}
onClose={handleClose}
MenuListProps={{
"aria-labelledby": "basic-button",
}}
sx={{ mt: 1 }}
>
<MenuItem onClick={handleCreateNew}>
<Typography>Создать новую</Typography>
</MenuItem>
<MenuItem onClick={handleSelectExisting}>
<Typography>Выбрать существующую статью</Typography>
</MenuItem>
</Menu>
</Box>
{type === "article" && (
@@ -557,12 +498,6 @@ export const RightWidgetTab = observer(
}}
/>
<SelectArticleModal
open={isSelectModalOpen}
onClose={handleCloseSelectModal}
onSelectArticle={handleArticleSelect}
linkedArticleIds={sight[language].right.map((article) => article.id)}
/>
<SelectMediaDialog
open={isSelectMediaModalOpen}
onClose={() => setIsSelectMediaModalOpen(false)}