add city and area pages
This commit is contained in:
parent
3bf0308631
commit
eb86869d89
36
src/Pages/Admin/Area/Model/AddModel.tsx
Normal file
36
src/Pages/Admin/Area/Model/AddModel.tsx
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
import React from "react";
|
||||||
|
import { getInitialValues, getValidationSchema } from "./formUtil";
|
||||||
|
import { ModalEnum } from "../../../../enums/Model";
|
||||||
|
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
|
||||||
|
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
||||||
|
import ModelForm from "./ModelForm";
|
||||||
|
import { useAddArea } from "../../../../api/Area";
|
||||||
|
import { useParams } from "react-router-dom";
|
||||||
|
import { ParamsEnum } from "../../../../enums/params";
|
||||||
|
|
||||||
|
const AddModel: React.FC = () => {
|
||||||
|
const { mutate, status } = useAddArea();
|
||||||
|
const {city_id} = useParams<ParamsEnum>()
|
||||||
|
const handleSubmit = (values: any) => {
|
||||||
|
mutate({
|
||||||
|
...values,
|
||||||
|
city_id
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<LayoutModel
|
||||||
|
status={status as QueryStatusEnum}
|
||||||
|
ModelEnum={ModalEnum.AREA_ADD}
|
||||||
|
modelTitle="Area"
|
||||||
|
handleSubmit={handleSubmit}
|
||||||
|
getInitialValues={getInitialValues({})}
|
||||||
|
getValidationSchema={getValidationSchema}
|
||||||
|
>
|
||||||
|
<ModelForm />
|
||||||
|
</LayoutModel>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AddModel;
|
||||||
38
src/Pages/Admin/Area/Model/EditModel.tsx
Normal file
38
src/Pages/Admin/Area/Model/EditModel.tsx
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
import React from "react";
|
||||||
|
import { getInitialValues, getValidationSchema } from "./formUtil";
|
||||||
|
import { ModalEnum } from "../../../../enums/Model";
|
||||||
|
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
|
||||||
|
import ModelForm from "./ModelForm";
|
||||||
|
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
||||||
|
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
|
||||||
|
import { useUpdateArea } from "../../../../api/Area";
|
||||||
|
import { useParams } from "react-router-dom";
|
||||||
|
import { ParamsEnum } from "../../../../enums/params";
|
||||||
|
|
||||||
|
const EditModel: React.FC = () => {
|
||||||
|
const { mutate, status } = useUpdateArea();
|
||||||
|
const { objectToEdit } = useObjectToEdit((state) => state);
|
||||||
|
const {city_id} = useParams<ParamsEnum>()
|
||||||
|
const handleSubmit = (values: any) => {
|
||||||
|
const Data_to_send = { ...values,city_id };
|
||||||
|
mutate(Data_to_send);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<LayoutModel
|
||||||
|
status={status as QueryStatusEnum}
|
||||||
|
ModelEnum={ModalEnum.AREA_EDIT}
|
||||||
|
modelTitle="Area"
|
||||||
|
handleSubmit={handleSubmit}
|
||||||
|
getInitialValues={getInitialValues(objectToEdit)}
|
||||||
|
getValidationSchema={getValidationSchema}
|
||||||
|
isAddModal={false}
|
||||||
|
>
|
||||||
|
<ModelForm />
|
||||||
|
</LayoutModel>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EditModel;
|
||||||
20
src/Pages/Admin/Area/Model/FilterForm.tsx
Normal file
20
src/Pages/Admin/Area/Model/FilterForm.tsx
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
import React from "react";
|
||||||
|
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
||||||
|
import { Col, Row } from "reactstrap";
|
||||||
|
import { useFormikContext } from "formik";
|
||||||
|
|
||||||
|
const FilterForm = () => {
|
||||||
|
const formik = useFormikContext();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Row>
|
||||||
|
<Col>
|
||||||
|
<ValidationField placeholder="name" label="name" name="name" />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FilterForm;
|
||||||
15
src/Pages/Admin/Area/Model/ModelForm.tsx
Normal file
15
src/Pages/Admin/Area/Model/ModelForm.tsx
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { Col, Row } from "reactstrap";
|
||||||
|
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
||||||
|
|
||||||
|
const Form = () => {
|
||||||
|
return (
|
||||||
|
<Row className="w-100">
|
||||||
|
<Col>
|
||||||
|
<ValidationField name="name" placeholder="name" label="name" />
|
||||||
|
</Col>
|
||||||
|
|
||||||
|
</Row>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Form;
|
||||||
18
src/Pages/Admin/Area/Model/formUtil.ts
Normal file
18
src/Pages/Admin/Area/Model/formUtil.ts
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
import * as Yup from "yup";
|
||||||
|
import { Area, AreaInitialValues } from "../../../../types/Area";
|
||||||
|
|
||||||
|
export const getInitialValues = (
|
||||||
|
objectToEdit: Partial<Area>,
|
||||||
|
): AreaInitialValues => {
|
||||||
|
return {
|
||||||
|
id: objectToEdit?.id,
|
||||||
|
name: objectToEdit?.name ?? "",
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getValidationSchema = () => {
|
||||||
|
// validate input
|
||||||
|
return Yup.object().shape({
|
||||||
|
name: Yup.string().required("validation.required"),
|
||||||
|
});
|
||||||
|
};
|
||||||
51
src/Pages/Admin/Area/Page.tsx
Normal file
51
src/Pages/Admin/Area/Page.tsx
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { lazy, Suspense } from "react";
|
||||||
|
import { Spin } from "antd";
|
||||||
|
import useSetPageTitle from "../../../Hooks/useSetPageTitle";
|
||||||
|
import { ModalEnum } from "../../../enums/Model";
|
||||||
|
import { useDeleteArea } from "../../../api/Area";
|
||||||
|
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
||||||
|
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
||||||
|
import FilterForm from "./Model/FilterForm";
|
||||||
|
import { canAddArea } from "../../../utils/hasAbilityFn";
|
||||||
|
import { ParamsEnum } from "../../../enums/params";
|
||||||
|
import { useParams } from "react-router-dom";
|
||||||
|
|
||||||
|
const Table = lazy(() => import("./Table"));
|
||||||
|
const AddModalForm = lazy(() => import("./Model/AddModel"));
|
||||||
|
const EditModalForm = lazy(() => import("./Model/EditModel"));
|
||||||
|
const DeleteModalForm = lazy(
|
||||||
|
() => import("../../../Layout/Dashboard/DeleteModels"),
|
||||||
|
);
|
||||||
|
|
||||||
|
const TableHeader = () => {
|
||||||
|
const [t] = useTranslation();
|
||||||
|
const deleteMutation = useDeleteArea();
|
||||||
|
const {city_id} = useParams<ParamsEnum>()
|
||||||
|
useSetPageTitle([
|
||||||
|
{name:`${t(`page_header.home`)}`, path:"/"},
|
||||||
|
{name:`${t(`page_header.Area`)}`, path:`city/${city_id}`},
|
||||||
|
]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="TableWithHeader">
|
||||||
|
<Suspense fallback={<Spin />}>
|
||||||
|
<PageHeader
|
||||||
|
pageTitle="Area"
|
||||||
|
ModelAbility={ModalEnum?.AREA_ADD}
|
||||||
|
canAdd={canAddArea}
|
||||||
|
/>
|
||||||
|
<FilterLayout sub_children={<FilterForm />} filterTitle="table.Area" haveFilter={false} />
|
||||||
|
<Table />
|
||||||
|
<AddModalForm />
|
||||||
|
<EditModalForm />
|
||||||
|
<DeleteModalForm
|
||||||
|
deleteMutation={deleteMutation}
|
||||||
|
ModelEnum={ModalEnum?.AREA_DELETE}
|
||||||
|
/>
|
||||||
|
</Suspense>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default TableHeader;
|
||||||
28
src/Pages/Admin/Area/Table.tsx
Normal file
28
src/Pages/Admin/Area/Table.tsx
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
import { useColumns } from "./useTableColumns";
|
||||||
|
import React from "react";
|
||||||
|
import DataTable from "../../../Layout/Dashboard/Table/DataTable";
|
||||||
|
import { useGetAllArea } from "../../../api/Area";
|
||||||
|
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
|
||||||
|
import { useFilterStateState } from "../../../zustand/Filter";
|
||||||
|
import { useParams } from "react-router-dom";
|
||||||
|
import { ParamsEnum } from "../../../enums/params";
|
||||||
|
|
||||||
|
const App: React.FC = () => {
|
||||||
|
const { filterState } = useFilterState();
|
||||||
|
const { Filter } = useFilterStateState();
|
||||||
|
const {city_id} = useParams<ParamsEnum>()
|
||||||
|
const name = Filter?.name ;
|
||||||
|
const sort_by = Filter?.sort_by ;
|
||||||
|
const response = useGetAllArea({
|
||||||
|
pagination: true,
|
||||||
|
...filterState,
|
||||||
|
city_id,
|
||||||
|
name,
|
||||||
|
|
||||||
|
sort_by
|
||||||
|
});
|
||||||
|
|
||||||
|
return <DataTable response={response} useColumns={useColumns} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default App;
|
||||||
80
src/Pages/Admin/Area/useTableColumns.tsx
Normal file
80
src/Pages/Admin/Area/useTableColumns.tsx
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
import { TableColumnsType } from "antd";
|
||||||
|
import useModalHandler from "../../../utils/useModalHandler";
|
||||||
|
import { ModalEnum } from "../../../enums/Model";
|
||||||
|
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import {
|
||||||
|
canDeleteArea,
|
||||||
|
canEditArea,
|
||||||
|
canShowArea,
|
||||||
|
} from "../../../utils/hasAbilityFn";
|
||||||
|
import ActionButtons from "../../../Components/Table/ActionButtons";
|
||||||
|
import ColumnsImage from "../../../Components/Columns/ColumnsImage";
|
||||||
|
import { Area } from "../../../types/Area";
|
||||||
|
import { useFilterStateState } from "../../../zustand/Filter";
|
||||||
|
|
||||||
|
export const useColumns = () => {
|
||||||
|
const { handel_open_model } = useModalHandler();
|
||||||
|
|
||||||
|
const { setObjectToEdit } = useObjectToEdit((state) => state);
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const { setFilter } = useFilterStateState();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const handelShow = (record: Area) => {
|
||||||
|
setFilter({})
|
||||||
|
navigate(`${record?.id}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handelDelete = (data: Area) => {
|
||||||
|
setObjectToEdit(data);
|
||||||
|
handel_open_model(ModalEnum?.AREA_DELETE);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleEdit = (record: Area) => {
|
||||||
|
setObjectToEdit(record);
|
||||||
|
handel_open_model(ModalEnum?.AREA_EDIT);
|
||||||
|
};
|
||||||
|
const [t] = useTranslation();
|
||||||
|
|
||||||
|
const columns: TableColumnsType<Area> = [
|
||||||
|
{
|
||||||
|
title: t("columns.id"),
|
||||||
|
dataIndex: "id",
|
||||||
|
key: "id",
|
||||||
|
align: "center",
|
||||||
|
render: (_text, record) => record?.id,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: `${t("columns.name")}`,
|
||||||
|
dataIndex: "name",
|
||||||
|
key: "name",
|
||||||
|
align: "center",
|
||||||
|
render: (_text, record) => record?.name,
|
||||||
|
ellipsis:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
|
||||||
|
title: t("columns.procedure"),
|
||||||
|
key: "actions",
|
||||||
|
align: "center",
|
||||||
|
width: "25vw",
|
||||||
|
render: (_text, record, index) => {
|
||||||
|
return (
|
||||||
|
<ActionButtons
|
||||||
|
canDelete={canDeleteArea}
|
||||||
|
canEdit={canEditArea}
|
||||||
|
canShow={false}
|
||||||
|
index={index}
|
||||||
|
onDelete={() => handelDelete(record)}
|
||||||
|
onEdit={() => handleEdit(record)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return columns;
|
||||||
|
};
|
||||||
33
src/Pages/Admin/City/Model/AddModel.tsx
Normal file
33
src/Pages/Admin/City/Model/AddModel.tsx
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
import React from "react";
|
||||||
|
import { getInitialValues, getValidationSchema } from "./formUtil";
|
||||||
|
import { ModalEnum } from "../../../../enums/Model";
|
||||||
|
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
|
||||||
|
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
||||||
|
import ModelForm from "./ModelForm";
|
||||||
|
import { useAddCity } from "../../../../api/City";
|
||||||
|
|
||||||
|
const AddModel: React.FC = () => {
|
||||||
|
const { mutate, status } = useAddCity();
|
||||||
|
|
||||||
|
const handleSubmit = (values: any) => {
|
||||||
|
mutate({
|
||||||
|
...values,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<LayoutModel
|
||||||
|
status={status as QueryStatusEnum}
|
||||||
|
ModelEnum={ModalEnum.CITY_ADD}
|
||||||
|
modelTitle="City"
|
||||||
|
handleSubmit={handleSubmit}
|
||||||
|
getInitialValues={getInitialValues({})}
|
||||||
|
getValidationSchema={getValidationSchema}
|
||||||
|
>
|
||||||
|
<ModelForm />
|
||||||
|
</LayoutModel>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AddModel;
|
||||||
37
src/Pages/Admin/City/Model/EditModel.tsx
Normal file
37
src/Pages/Admin/City/Model/EditModel.tsx
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
import React from "react";
|
||||||
|
import { getInitialValues, getValidationSchema } from "./formUtil";
|
||||||
|
import { ModalEnum } from "../../../../enums/Model";
|
||||||
|
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
|
||||||
|
import ModelForm from "./ModelForm";
|
||||||
|
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
||||||
|
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
|
||||||
|
import { useUpdateCity } from "../../../../api/City";
|
||||||
|
import { handelImageState } from "../../../../utils/DataToSendImageState";
|
||||||
|
|
||||||
|
const EditModel: React.FC = () => {
|
||||||
|
const { mutate, status } = useUpdateCity();
|
||||||
|
const { objectToEdit } = useObjectToEdit((state) => state);
|
||||||
|
|
||||||
|
const handleSubmit = (values: any) => {
|
||||||
|
const Data_to_send = { ...values };
|
||||||
|
mutate(Data_to_send);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<LayoutModel
|
||||||
|
status={status as QueryStatusEnum}
|
||||||
|
ModelEnum={ModalEnum.CITY_EDIT}
|
||||||
|
modelTitle="City"
|
||||||
|
handleSubmit={handleSubmit}
|
||||||
|
getInitialValues={getInitialValues(objectToEdit)}
|
||||||
|
getValidationSchema={getValidationSchema}
|
||||||
|
isAddModal={false}
|
||||||
|
>
|
||||||
|
<ModelForm />
|
||||||
|
</LayoutModel>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EditModel;
|
||||||
20
src/Pages/Admin/City/Model/FilterForm.tsx
Normal file
20
src/Pages/Admin/City/Model/FilterForm.tsx
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
import React from "react";
|
||||||
|
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
||||||
|
import { Col, Row } from "reactstrap";
|
||||||
|
import { useFormikContext } from "formik";
|
||||||
|
|
||||||
|
const FilterForm = () => {
|
||||||
|
const formik = useFormikContext();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Row>
|
||||||
|
<Col>
|
||||||
|
<ValidationField placeholder="name" label="name" name="name" />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FilterForm;
|
||||||
15
src/Pages/Admin/City/Model/ModelForm.tsx
Normal file
15
src/Pages/Admin/City/Model/ModelForm.tsx
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { Col, Row } from "reactstrap";
|
||||||
|
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
||||||
|
|
||||||
|
const Form = () => {
|
||||||
|
return (
|
||||||
|
<Row className="w-100">
|
||||||
|
<Col>
|
||||||
|
<ValidationField name="name" placeholder="name" label="name" />
|
||||||
|
</Col>
|
||||||
|
|
||||||
|
</Row>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Form;
|
||||||
18
src/Pages/Admin/City/Model/formUtil.ts
Normal file
18
src/Pages/Admin/City/Model/formUtil.ts
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
import * as Yup from "yup";
|
||||||
|
import { City, CityInitialValues } from "../../../../types/City";
|
||||||
|
|
||||||
|
export const getInitialValues = (
|
||||||
|
objectToEdit: Partial<City>,
|
||||||
|
): CityInitialValues => {
|
||||||
|
return {
|
||||||
|
id: objectToEdit?.id,
|
||||||
|
name: objectToEdit?.name ?? "",
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getValidationSchema = () => {
|
||||||
|
// validate input
|
||||||
|
return Yup.object().shape({
|
||||||
|
name: Yup.string().required("validation.required"),
|
||||||
|
});
|
||||||
|
};
|
||||||
49
src/Pages/Admin/City/Page.tsx
Normal file
49
src/Pages/Admin/City/Page.tsx
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { lazy, Suspense } from "react";
|
||||||
|
import { Spin } from "antd";
|
||||||
|
import useSetPageTitle from "../../../Hooks/useSetPageTitle";
|
||||||
|
import { ModalEnum } from "../../../enums/Model";
|
||||||
|
import { useDeleteCity } from "../../../api/City";
|
||||||
|
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
||||||
|
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
||||||
|
import FilterForm from "./Model/FilterForm";
|
||||||
|
import { canAddCity } from "../../../utils/hasAbilityFn";
|
||||||
|
|
||||||
|
const Table = lazy(() => import("./Table"));
|
||||||
|
const AddModalForm = lazy(() => import("./Model/AddModel"));
|
||||||
|
const EditModalForm = lazy(() => import("./Model/EditModel"));
|
||||||
|
const DeleteModalForm = lazy(
|
||||||
|
() => import("../../../Layout/Dashboard/DeleteModels"),
|
||||||
|
);
|
||||||
|
|
||||||
|
const TableHeader = () => {
|
||||||
|
const [t] = useTranslation();
|
||||||
|
const deleteMutation = useDeleteCity();
|
||||||
|
|
||||||
|
useSetPageTitle([
|
||||||
|
{name:`${t(`page_header.home`)}`, path:"/"},
|
||||||
|
{name:`${t(`page_header.City`)}`, path:"City"}
|
||||||
|
]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="TableWithHeader">
|
||||||
|
<Suspense fallback={<Spin />}>
|
||||||
|
<PageHeader
|
||||||
|
pageTitle="City"
|
||||||
|
ModelAbility={ModalEnum?.CITY_ADD}
|
||||||
|
canAdd={canAddCity}
|
||||||
|
/>
|
||||||
|
<FilterLayout sub_children={<FilterForm />} filterTitle="table.City" />
|
||||||
|
<Table />
|
||||||
|
<AddModalForm />
|
||||||
|
<EditModalForm />
|
||||||
|
<DeleteModalForm
|
||||||
|
deleteMutation={deleteMutation}
|
||||||
|
ModelEnum={ModalEnum?.CITY_DELETE}
|
||||||
|
/>
|
||||||
|
</Suspense>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default TableHeader;
|
||||||
23
src/Pages/Admin/City/Table.tsx
Normal file
23
src/Pages/Admin/City/Table.tsx
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
import { useColumns } from "./useTableColumns";
|
||||||
|
import React from "react";
|
||||||
|
import DataTable from "../../../Layout/Dashboard/Table/DataTable";
|
||||||
|
import { useGetAllCity } from "../../../api/City";
|
||||||
|
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
|
||||||
|
import { useFilterStateState } from "../../../zustand/Filter";
|
||||||
|
|
||||||
|
const App: React.FC = () => {
|
||||||
|
const { filterState } = useFilterState();
|
||||||
|
const { Filter } = useFilterStateState();
|
||||||
|
const name = Filter?.name ;
|
||||||
|
const sort_by = Filter?.sort_by ;
|
||||||
|
const response = useGetAllCity({
|
||||||
|
pagination: true,
|
||||||
|
...filterState,
|
||||||
|
name,
|
||||||
|
sort_by
|
||||||
|
});
|
||||||
|
|
||||||
|
return <DataTable response={response} useColumns={useColumns} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default App;
|
||||||
81
src/Pages/Admin/City/useTableColumns.tsx
Normal file
81
src/Pages/Admin/City/useTableColumns.tsx
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
import { TableColumnsType } from "antd";
|
||||||
|
import useModalHandler from "../../../utils/useModalHandler";
|
||||||
|
import { ModalEnum } from "../../../enums/Model";
|
||||||
|
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import {
|
||||||
|
canDeleteCity,
|
||||||
|
canEditCity,
|
||||||
|
canShowCity,
|
||||||
|
} from "../../../utils/hasAbilityFn";
|
||||||
|
import ActionButtons from "../../../Components/Table/ActionButtons";
|
||||||
|
import ColumnsImage from "../../../Components/Columns/ColumnsImage";
|
||||||
|
import { City } from "../../../types/City";
|
||||||
|
import { useFilterStateState } from "../../../zustand/Filter";
|
||||||
|
|
||||||
|
export const useColumns = () => {
|
||||||
|
const { handel_open_model } = useModalHandler();
|
||||||
|
|
||||||
|
const { setObjectToEdit } = useObjectToEdit((state) => state);
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const { setFilter } = useFilterStateState();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const handelShow = (record: City) => {
|
||||||
|
setFilter({})
|
||||||
|
navigate(`${record?.id}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handelDelete = (data: City) => {
|
||||||
|
setObjectToEdit(data);
|
||||||
|
handel_open_model(ModalEnum?.CITY_DELETE);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleEdit = (record: City) => {
|
||||||
|
setObjectToEdit(record);
|
||||||
|
handel_open_model(ModalEnum?.CITY_EDIT);
|
||||||
|
};
|
||||||
|
const [t] = useTranslation();
|
||||||
|
|
||||||
|
const columns: TableColumnsType<City> = [
|
||||||
|
{
|
||||||
|
title: t("columns.id"),
|
||||||
|
dataIndex: "id",
|
||||||
|
key: "id",
|
||||||
|
align: "center",
|
||||||
|
render: (_text, record) => record?.id,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: `${t("columns.name")}`,
|
||||||
|
dataIndex: "name",
|
||||||
|
key: "name",
|
||||||
|
align: "center",
|
||||||
|
render: (_text, record) => record?.name,
|
||||||
|
ellipsis:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
|
||||||
|
title: t("columns.procedure"),
|
||||||
|
key: "actions",
|
||||||
|
align: "center",
|
||||||
|
width: "25vw",
|
||||||
|
render: (_text, record, index) => {
|
||||||
|
return (
|
||||||
|
<ActionButtons
|
||||||
|
canDelete={canDeleteCity}
|
||||||
|
canEdit={canEditCity}
|
||||||
|
canShow={canShowCity}
|
||||||
|
index={index}
|
||||||
|
onDelete={() => handelDelete(record)}
|
||||||
|
onEdit={() => handleEdit(record)}
|
||||||
|
onShow={() => handelShow(record)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return columns;
|
||||||
|
};
|
||||||
|
|
@ -44,12 +44,6 @@ export const useColumns = () => {
|
||||||
key: "name",
|
key: "name",
|
||||||
align: "center",
|
align: "center",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: t("columns.created_at"),
|
|
||||||
dataIndex: "created_at",
|
|
||||||
key: "created_at",
|
|
||||||
align: "center",
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
{
|
||||||
title: t("columns.procedure"),
|
title: t("columns.procedure"),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { TCrudRoute, TMenuItem } from "./types/App";
|
import { TCrudRoute, TMenuItem } from "./types/App";
|
||||||
import { FaCashRegister, FaHome, FaMoneyBill, FaPaperclip, FaSellcast, FaTag, FaUser, FaUserShield } from "react-icons/fa";
|
import { FaCashRegister, FaCity, FaHome, FaMoneyBill, FaPaperclip, FaSellcast, FaTag, FaUser, FaUserShield } from "react-icons/fa";
|
||||||
import { GoDotFill } from "react-icons/go";
|
import { GoDotFill } from "react-icons/go";
|
||||||
import { GrGroup } from "react-icons/gr";
|
import { GrGroup } from "react-icons/gr";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
@ -7,7 +7,9 @@ import React from "react";
|
||||||
const Dummy = React.lazy(() => import("./Pages/Home/Dummy"));
|
const Dummy = React.lazy(() => import("./Pages/Home/Dummy"));
|
||||||
|
|
||||||
const Grade = React.lazy(() => import("./Pages/Admin/Grade/Page"));
|
const Grade = React.lazy(() => import("./Pages/Admin/Grade/Page"));
|
||||||
const Curriculum = React.lazy(() => import("./Pages/Admin/Curriculum/Page"));
|
const City = React.lazy(() => import("./Pages/Admin/City/Page"));
|
||||||
|
const Area = React.lazy(() => import("./Pages/Admin/Area/Page"));
|
||||||
|
|
||||||
const Subject = React.lazy(() => import("./Pages/Admin/subject/Table/Page"));
|
const Subject = React.lazy(() => import("./Pages/Admin/subject/Table/Page"));
|
||||||
const Tags = React.lazy(() => import("./Pages/Admin/Tags/Page"));
|
const Tags = React.lazy(() => import("./Pages/Admin/Tags/Page"));
|
||||||
const Unit = React.lazy(() => import("./Pages/Admin/Unit/Page"));
|
const Unit = React.lazy(() => import("./Pages/Admin/Unit/Page"));
|
||||||
|
|
@ -133,7 +135,19 @@ export const menuItems: TMenuItem[] = [
|
||||||
abilities: ABILITIES_ENUM?.RE_SELLER,
|
abilities: ABILITIES_ENUM?.RE_SELLER,
|
||||||
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
||||||
prevPath: 0,
|
prevPath: 0,
|
||||||
|
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: "page_header.city",
|
||||||
|
element: <City />,
|
||||||
|
icon: <FaCity />,
|
||||||
|
text: "sidebar.city",
|
||||||
|
path: `/${ABILITIES_ENUM?.CITY}`,
|
||||||
|
abilities: ABILITIES_ENUM?.CITY,
|
||||||
|
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
||||||
|
prevPath: 0,
|
||||||
|
},
|
||||||
|
|
||||||
// {
|
// {
|
||||||
// header: "page_header.report",
|
// header: "page_header.report",
|
||||||
// element: <Report />,
|
// element: <Report />,
|
||||||
|
|
@ -357,6 +371,15 @@ export const CrudRoute: TCrudRoute[] = [
|
||||||
prevPath: 0,
|
prevPath: 0,
|
||||||
type: UserTypeEnum.RE_SELLER,
|
type: UserTypeEnum.RE_SELLER,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: "page_header.Area",
|
||||||
|
element: <Area />,
|
||||||
|
path: `/${ABILITIES_ENUM?.CITY}/:${ParamsEnum?.CITY_ID}`,
|
||||||
|
abilities: ABILITIES_ENUM?.AREA,
|
||||||
|
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
||||||
|
prevPath: 1,
|
||||||
|
},
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
export const AppRoutes: Record<string, string> = Object.fromEntries(
|
export const AppRoutes: Record<string, string> = Object.fromEntries(
|
||||||
|
|
|
||||||
20
src/api/Area.ts
Normal file
20
src/api/Area.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
import useAddMutation from "./helper/useAddMutation";
|
||||||
|
import useDeleteMutation from "./helper/useDeleteMutation";
|
||||||
|
import useGetQuery from "./helper/useGetQuery";
|
||||||
|
import useUpdateMutation from "./helper/useUpdateMutation";
|
||||||
|
|
||||||
|
const API = {
|
||||||
|
GET: "/area",
|
||||||
|
ADD: "/area",
|
||||||
|
DELETE: "/area",
|
||||||
|
UPDATE: "/area",
|
||||||
|
};
|
||||||
|
|
||||||
|
const KEY = "Area";
|
||||||
|
|
||||||
|
export const useGetAllArea = (params?: any, options?: any) =>
|
||||||
|
useGetQuery(KEY, API.GET, params, options);
|
||||||
|
export const useAddArea = () => useAddMutation(KEY, API.ADD);
|
||||||
|
export const useUpdateArea = (params?: any) => useUpdateMutation(KEY, API.GET);
|
||||||
|
export const useDeleteArea = (params?: any) =>
|
||||||
|
useDeleteMutation(KEY, API.DELETE);
|
||||||
20
src/api/City.ts
Normal file
20
src/api/City.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
import useAddMutation from "./helper/useAddMutation";
|
||||||
|
import useDeleteMutation from "./helper/useDeleteMutation";
|
||||||
|
import useGetQuery from "./helper/useGetQuery";
|
||||||
|
import useUpdateMutation from "./helper/useUpdateMutation";
|
||||||
|
|
||||||
|
const API = {
|
||||||
|
GET: "/city",
|
||||||
|
ADD: "/city",
|
||||||
|
DELETE: "/city",
|
||||||
|
UPDATE: "/city",
|
||||||
|
};
|
||||||
|
|
||||||
|
const KEY = "city";
|
||||||
|
|
||||||
|
export const useGetAllCity = (params?: any, options?: any) =>
|
||||||
|
useGetQuery(KEY, API.GET, params, options);
|
||||||
|
export const useAddCity = () => useAddMutation(KEY, API.ADD);
|
||||||
|
export const useUpdateCity = (params?: any) => useUpdateMutation(KEY, API.GET);
|
||||||
|
export const useDeleteCity = (params?: any) =>
|
||||||
|
useDeleteMutation(KEY, API.DELETE);
|
||||||
|
|
@ -211,6 +211,20 @@ export enum ModalEnum {
|
||||||
PERMISSION_ADD = "PERMISSION.add",
|
PERMISSION_ADD = "PERMISSION.add",
|
||||||
PERMISSION_DELETE = "PERMISSION.delete",
|
PERMISSION_DELETE = "PERMISSION.delete",
|
||||||
|
|
||||||
|
/// CITY
|
||||||
|
|
||||||
|
CITY_EDIT = "CITY.edit",
|
||||||
|
CITY_ADD = "CITY.add",
|
||||||
|
CITY_DELETE = "CITY.delete",
|
||||||
|
|
||||||
|
|
||||||
|
/// AREA
|
||||||
|
|
||||||
|
AREA_EDIT = "AREA.edit",
|
||||||
|
AREA_ADD = "AREA.add",
|
||||||
|
AREA_DELETE = "AREA.delete",
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// sales
|
/// sales
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,9 @@ export enum ABILITIES_ENUM {
|
||||||
Collections = "collections",
|
Collections = "collections",
|
||||||
SETTING = "setting",
|
SETTING = "setting",
|
||||||
Email = "email",
|
Email = "email",
|
||||||
Phone = "phone"
|
Phone = "phone",
|
||||||
|
CITY = "city",
|
||||||
|
AREA = "area"
|
||||||
////
|
////
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,4 +13,5 @@ export enum ParamsEnum {
|
||||||
CHILDREN_QUESTION_ID = "children_question_id",
|
CHILDREN_QUESTION_ID = "children_question_id",
|
||||||
RE_SELLER_ID = "re_seller_id",
|
RE_SELLER_ID = "re_seller_id",
|
||||||
ROLE_ID = "role_id",
|
ROLE_ID = "role_id",
|
||||||
|
CITY_ID = "city_id",
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -393,10 +393,11 @@
|
||||||
"ability": "القدرات",
|
"ability": "القدرات",
|
||||||
"answer": "إجابة",
|
"answer": "إجابة",
|
||||||
"area": "منطقة",
|
"area": "منطقة",
|
||||||
"city": "مدينة",
|
|
||||||
"coupon": "قسيمة",
|
"coupon": "قسيمة",
|
||||||
"package": "حزمة",
|
"package": "حزمة",
|
||||||
"packageItem": "عنصر الحزمة"
|
"packageItem": "عنصر الحزمة",
|
||||||
|
"Area":"المنطقة",
|
||||||
|
"City":"مدينة"
|
||||||
},
|
},
|
||||||
"education_class_actions": {
|
"education_class_actions": {
|
||||||
"Student_Records": "سجلات الطلاب",
|
"Student_Records": "سجلات الطلاب",
|
||||||
|
|
@ -860,7 +861,9 @@
|
||||||
"users":"المستخدمون",
|
"users":"المستخدمون",
|
||||||
"managers":"مدراء",
|
"managers":"مدراء",
|
||||||
"sales":"المبيعات",
|
"sales":"المبيعات",
|
||||||
"collections": "التحصيلات"
|
"collections": "التحصيلات",
|
||||||
|
"Area":"المنطقة",
|
||||||
|
"city":"مدينة"
|
||||||
},
|
},
|
||||||
"message": {
|
"message": {
|
||||||
"some_thing_went_wrong": "حدث خطأ ما",
|
"some_thing_went_wrong": "حدث خطأ ما",
|
||||||
|
|
@ -906,6 +909,8 @@
|
||||||
"collections": "التحصيلات",
|
"collections": "التحصيلات",
|
||||||
"sales":"المبيعات",
|
"sales":"المبيعات",
|
||||||
"edit_manager":"تعديل مدير",
|
"edit_manager":"تعديل مدير",
|
||||||
|
"City":"مدينة",
|
||||||
|
"Area":"المنطقة",
|
||||||
"setting":"الإعدادات"
|
"setting":"الإعدادات"
|
||||||
},
|
},
|
||||||
"page_header": {
|
"page_header": {
|
||||||
|
|
@ -953,7 +958,9 @@
|
||||||
"managers":"مدراء",
|
"managers":"مدراء",
|
||||||
"collections": "التحصيلات",
|
"collections": "التحصيلات",
|
||||||
"sales":"المبيعات",
|
"sales":"المبيعات",
|
||||||
"setting":"الإعدادات"
|
"setting":"الإعدادات",
|
||||||
|
"City":"مدينة",
|
||||||
|
"Area":"المنطقة"
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"student": "قائمة الطلاب",
|
"student": "قائمة الطلاب",
|
||||||
|
|
@ -968,6 +975,8 @@
|
||||||
"setting":"الإعدادات",
|
"setting":"الإعدادات",
|
||||||
"file_setting":"إعدادات الملف",
|
"file_setting":"إعدادات الملف",
|
||||||
"security_setting":"إعدادات الأمان",
|
"security_setting":"إعدادات الأمان",
|
||||||
|
"Area":"المنطقة",
|
||||||
|
"City":"مدينة",
|
||||||
"notification":"الاشعارات",
|
"notification":"الاشعارات",
|
||||||
"upload_your_photo_and_personal_data_here":"قم بتحميل صورتك وبياناتك الشخصية هنا",
|
"upload_your_photo_and_personal_data_here":"قم بتحميل صورتك وبياناتك الشخصية هنا",
|
||||||
"get_notified_of_whats_happening_now_you_can_turn_it_off_at_any_time":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت"
|
"get_notified_of_whats_happening_now_you_can_turn_it_off_at_any_time":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت"
|
||||||
|
|
|
||||||
17
src/types/Area.ts
Normal file
17
src/types/Area.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
import { Nullable } from "./App";
|
||||||
|
|
||||||
|
// Define the Teacher interface
|
||||||
|
|
||||||
|
export interface Area {
|
||||||
|
id: number; // Unique identifier for the user
|
||||||
|
name: string; // Name of the user
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InitialValues {
|
||||||
|
id: number; // Unique identifier for the user
|
||||||
|
name: string; // Name of the user
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AreaInitialValues = Partial<Nullable<InitialValues>>;
|
||||||
17
src/types/City.ts
Normal file
17
src/types/City.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
import { Nullable } from "./App";
|
||||||
|
|
||||||
|
// Define the Teacher interface
|
||||||
|
|
||||||
|
export interface City {
|
||||||
|
id: number; // Unique identifier for the user
|
||||||
|
name: string; // Name of the user
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InitialValues {
|
||||||
|
id: number; // Unique identifier for the user
|
||||||
|
name: string; // Name of the user
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CityInitialValues = Partial<Nullable<InitialValues>>;
|
||||||
|
|
@ -24,6 +24,57 @@ export const canIndexEduClass = hasAbility(
|
||||||
ABILITIES_VALUES_ENUM.INDEX,
|
ABILITIES_VALUES_ENUM.INDEX,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
///// City
|
||||||
|
|
||||||
|
export const canAddCity = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.STORE,
|
||||||
|
);
|
||||||
|
export const canEditCity = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.UPDATE,
|
||||||
|
);
|
||||||
|
export const canDeleteCity = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.DELETE,
|
||||||
|
);
|
||||||
|
export const canShowCity = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.SHOW,
|
||||||
|
);
|
||||||
|
export const canIndexCity = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.INDEX,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
///// Area
|
||||||
|
|
||||||
|
export const canAddArea = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.STORE,
|
||||||
|
);
|
||||||
|
export const canEditArea = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.UPDATE,
|
||||||
|
);
|
||||||
|
export const canDeleteArea = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.DELETE,
|
||||||
|
);
|
||||||
|
export const canShowArea = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.SHOW,
|
||||||
|
);
|
||||||
|
export const canIndexArea = hasAbility(
|
||||||
|
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||||
|
ABILITIES_VALUES_ENUM.INDEX,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///// Course
|
///// Course
|
||||||
|
|
||||||
export const canAddCourse = hasAbility(
|
export const canAddCourse = hasAbility(
|
||||||
|
|
@ -273,15 +324,6 @@ export const canShowStudent = hasAbility(
|
||||||
ABILITIES_VALUES_ENUM.SHOW,
|
ABILITIES_VALUES_ENUM.SHOW,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const canImportStudent = hasAbility(
|
|
||||||
ABILITIES_ENUM.STUDENT,
|
|
||||||
ABILITIES_VALUES_ENUM.IMPORT_STUDENTS,
|
|
||||||
);
|
|
||||||
export const canMoveStudent = hasAbility(
|
|
||||||
ABILITIES_ENUM.STUDENT,
|
|
||||||
ABILITIES_VALUES_ENUM.MOVE_STUDENTS,
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/// Manager
|
/// Manager
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user