add change privilege price modal
This commit is contained in:
parent
286a670b27
commit
b856b21aa7
@ -0,0 +1,42 @@
|
|||||||
|
import { Box, Button, Dialog, useTheme } from "@mui/material";
|
||||||
|
import { CustomTextField } from "@root/kitUI/CustomTextField";
|
||||||
|
import { changeModalPriceField, changePrivilegePrice, closePrivilegePriceModal, usePrivilegeStore } from "@root/stores/privileges";
|
||||||
|
import { enqueueSnackbar } from "notistack";
|
||||||
|
|
||||||
|
|
||||||
|
export default function ChangePriceModal() {
|
||||||
|
const theme = useTheme();
|
||||||
|
const isModalOpen = usePrivilegeStore(state => state.isModalOpen);
|
||||||
|
const modalPriceField = usePrivilegeStore(state => state.modalPriceField);
|
||||||
|
|
||||||
|
function handleSaveChange() {
|
||||||
|
const errorMessage = changePrivilegePrice();
|
||||||
|
if (errorMessage) enqueueSnackbar(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Dialog
|
||||||
|
open={isModalOpen}
|
||||||
|
onClose={closePrivilegePriceModal}
|
||||||
|
>
|
||||||
|
<Box sx={{
|
||||||
|
p: "20px",
|
||||||
|
backgroundColor: theme.palette.grayLight.main,
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
gap: "8px",
|
||||||
|
}}>
|
||||||
|
<CustomTextField
|
||||||
|
id="privilege-custom-price"
|
||||||
|
label="Цена"
|
||||||
|
value={modalPriceField}
|
||||||
|
setValue={e => changeModalPriceField(e.target.value)}
|
||||||
|
type="number"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
onClick={handleSaveChange}
|
||||||
|
>Сохранить</Button>
|
||||||
|
</Box>
|
||||||
|
</Dialog>
|
||||||
|
);
|
||||||
|
}
|
@ -1,7 +1,9 @@
|
|||||||
import * as React from "react";
|
|
||||||
import { GridColDef } from "@mui/x-data-grid";
|
import { GridColDef } from "@mui/x-data-grid";
|
||||||
import DataGrid from "@kitUI/datagrid";
|
import DataGrid from "@kitUI/datagrid";
|
||||||
import { usePrivilegeStore } from "@stores/privileges";
|
import { openPrivilegePriceModal, usePrivilegeStore } from "@stores/privileges";
|
||||||
|
import { IconButton } from "@mui/material";
|
||||||
|
import { MouseEventHandler } from "react";
|
||||||
|
import EditIcon from '@mui/icons-material/Edit';
|
||||||
|
|
||||||
|
|
||||||
const columns: GridColDef[] = [
|
const columns: GridColDef[] = [
|
||||||
@ -9,10 +11,26 @@ const columns: GridColDef[] = [
|
|||||||
{ field: 'name', headerName: 'Привелегия', width: 150 },
|
{ field: 'name', headerName: 'Привелегия', width: 150 },
|
||||||
{ field: 'description', headerName: 'Описание', width: 550 },//инфо из гитлаба.
|
{ field: 'description', headerName: 'Описание', width: 550 },//инфо из гитлаба.
|
||||||
{ field: 'type', headerName: 'Тип', width: 150 },
|
{ field: 'type', headerName: 'Тип', width: 150 },
|
||||||
{ field: 'price', headerName: 'Стоимость', width: 50 }
|
{ field: 'price', headerName: 'Стоимость', width: 50 },
|
||||||
|
{
|
||||||
|
field: "changeValue",
|
||||||
|
headerName: "Изменить",
|
||||||
|
sortable: false,
|
||||||
|
renderCell: (params) => {
|
||||||
|
const onClick: MouseEventHandler<HTMLButtonElement> = () => {
|
||||||
|
openPrivilegePriceModal(params.row.id, params.row.price);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<IconButton onClick={onClick}>
|
||||||
|
<EditIcon />
|
||||||
|
</IconButton>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function PrivilegesDG() {
|
export default function Privileges() {
|
||||||
const privileges = usePrivilegeStore(state => state.privileges);
|
const privileges = usePrivilegeStore(state => state.privileges);
|
||||||
|
|
||||||
const privilegesGridData = privileges.map(privilege => ({
|
const privilegesGridData = privileges.map(privilege => ({
|
@ -4,9 +4,10 @@ import { GridSelectionModel } from "@mui/x-data-grid";
|
|||||||
|
|
||||||
import Cart from "@root/kitUI/Cart/Cart";
|
import Cart from "@root/kitUI/Cart/Cart";
|
||||||
|
|
||||||
import PrivilegesDG from "./privilegesDG";
|
import Privileges from "./Privileges/Privileges";
|
||||||
import TariffsDG from "./tariffsDG";
|
import TariffsDG from "./tariffsDG";
|
||||||
import CreateTariff from "./CreateTariff";
|
import CreateTariff from "./CreateTariff";
|
||||||
|
import ChangePriceModal from "./Privileges/ChangePriceModal";
|
||||||
|
|
||||||
export default function Tariffs() {
|
export default function Tariffs() {
|
||||||
const [selectedTariffs, setSelectedTariffs] = useState<GridSelectionModel>([]);
|
const [selectedTariffs, setSelectedTariffs] = useState<GridSelectionModel>([]);
|
||||||
@ -22,7 +23,8 @@ export default function Tariffs() {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Typography variant="h6">Список привелегий</Typography>
|
<Typography variant="h6">Список привелегий</Typography>
|
||||||
<PrivilegesDG />
|
<Privileges />
|
||||||
|
<ChangePriceModal />
|
||||||
<CreateTariff />
|
<CreateTariff />
|
||||||
<Typography variant="h6" mt="20px">
|
<Typography variant="h6" mt="20px">
|
||||||
Список тарифов
|
Список тарифов
|
||||||
|
@ -1,30 +1,68 @@
|
|||||||
import { Privilege } from "@root/model/tariff";
|
import { Privilege } from "@root/model/tariff";
|
||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import { devtools, persist } from "zustand/middleware";
|
import { devtools } from "zustand/middleware";
|
||||||
import { exampleCartValues } from "./mocks/exampleCartValues";
|
import { exampleCartValues } from "./mocks/exampleCartValues";
|
||||||
|
|
||||||
|
|
||||||
interface PrivilegeStore {
|
interface PrivilegeStore {
|
||||||
privileges: Privilege[];
|
privileges: Privilege[];
|
||||||
|
isModalOpen: boolean;
|
||||||
|
modalPrivilegeId: string | null;
|
||||||
|
modalPriceField: string;
|
||||||
addPrivileges: (newPrivileges: Privilege[]) => void;
|
addPrivileges: (newPrivileges: Privilege[]) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const usePrivilegeStore = create<PrivilegeStore>()(
|
export const usePrivilegeStore = create<PrivilegeStore>()(
|
||||||
devtools(
|
devtools(
|
||||||
// persist(
|
|
||||||
(set, get) => ({
|
(set, get) => ({
|
||||||
privileges: exampleCartValues.privileges,
|
privileges: exampleCartValues.privileges,
|
||||||
|
isModalOpen: false,
|
||||||
|
modalPrivilegeId: null,
|
||||||
|
modalPriceField: "",
|
||||||
addPrivileges: newPrivileges => set(state => (
|
addPrivileges: newPrivileges => set(state => (
|
||||||
{ privileges: [...state.privileges, ...newPrivileges] }
|
{ privileges: [...state.privileges, ...newPrivileges] }
|
||||||
)),
|
)),
|
||||||
}),
|
}),
|
||||||
// {
|
|
||||||
// name: "privileges",
|
|
||||||
// getStorage: () => localStorage,
|
|
||||||
// }
|
|
||||||
// ),
|
|
||||||
{
|
{
|
||||||
name: "Privilege store"
|
name: "Privilege store"
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const closePrivilegePriceModal = () => usePrivilegeStore.setState({ isModalOpen: false });
|
||||||
|
export const openPrivilegePriceModal = (modalPrivilegeId: string | null, defaultPrice: number) => usePrivilegeStore.setState(
|
||||||
|
{
|
||||||
|
isModalOpen: true,
|
||||||
|
modalPriceField: defaultPrice.toString(),
|
||||||
|
modalPrivilegeId,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
export const changeModalPriceField = (modalPriceField: string) => usePrivilegeStore.setState({ modalPriceField });
|
||||||
|
|
||||||
|
export const changePrivilegePrice = () => {
|
||||||
|
const { privileges, modalPrivilegeId, modalPriceField } = usePrivilegeStore.getState();
|
||||||
|
|
||||||
|
const privilegeIndex = privileges.findIndex(privilege => privilege.privilegeId === modalPrivilegeId);
|
||||||
|
if (privilegeIndex === -1) throw new Error("Privilege not found by id");
|
||||||
|
|
||||||
|
const price = parseFloat(modalPriceField.replace(",", "."));
|
||||||
|
if (!isFinite(price)) return "Error parsing price";
|
||||||
|
|
||||||
|
const newPrivilege: Privilege = {
|
||||||
|
...privileges[privilegeIndex],
|
||||||
|
pricePerUnit: price,
|
||||||
|
};
|
||||||
|
|
||||||
|
const newPrivileges = [...privileges];
|
||||||
|
newPrivileges.splice(privilegeIndex, 1, newPrivilege);
|
||||||
|
|
||||||
|
usePrivilegeStore.setState({
|
||||||
|
privileges: newPrivileges,
|
||||||
|
isModalOpen: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const findPrivilegeById = (privilegeId: string) => {
|
||||||
|
return usePrivilegeStore.getState().privileges.find(privilege => privilege.privilegeId === privilegeId) ?? null;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user