diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 576727e..e5a6462 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -46,8 +46,12 @@ }, "Dashboard": { "dashboard_page": "داشبورد", +<<<<<<< HEAD + "passenger_office_page": "اداره مسافر" +======= "change_password": "تغییر رمز عبور", "edit_profile": "ویرایش پروفایل" +>>>>>>> 135f6d1e2f3495abe68e3ca758870023dcd85d76 }, "MuiDatePicker": { "date_picker_birthday": "تاریخ" diff --git a/src/components/dashboard/passenger-office/TableRowActions.jsx b/src/components/dashboard/passenger-office/TableRowActions.jsx new file mode 100644 index 0000000..0290214 --- /dev/null +++ b/src/components/dashboard/passenger-office/TableRowActions.jsx @@ -0,0 +1,50 @@ +import DeleteIcon from "@mui/icons-material/Delete"; +import EditIcon from "@mui/icons-material/Edit"; +import { Box, IconButton } from "@mui/material"; +// import EditForm from "./Form/EditForm"; +import { useContext } from "react"; +import { DataTableContext } from "@/lib/app/contexts/DataTableContext"; +// import DeleteForm from "./Form/DeleteForm"; + +const TableRowActions = ({ row }) => { + const { + toggleDrawer, + setDrawerContent, + openDeleteDialog, + handleOpenDeleteDialog, + handleCloseDeleteDialog, + handleDeleteDialog, + rowId, + deleteData, + } = useContext(DataTableContext); + return ( + + { + toggleDrawer(true); + // setDrawerContent(); + }} + > + + + handleOpenDeleteDialog(row)} + > + + + {/* */} + + ); +}; + +export default TableRowActions; diff --git a/src/components/dashboard/passenger-office/TableTollbar.jsx b/src/components/dashboard/passenger-office/TableTollbar.jsx new file mode 100644 index 0000000..0b29ba8 --- /dev/null +++ b/src/components/dashboard/passenger-office/TableTollbar.jsx @@ -0,0 +1,32 @@ +import { DataTableContext } from "@/lib/app/contexts/DataTableContext"; +import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; +import { Button, Stack, Tooltip } from "@mui/material"; +import { useTranslations } from "next-intl"; +import { useContext } from "react"; +// import AddForm from "./Form/AddForm"; + +function TableToolbar() { + const t = useTranslations(); + const { toggleDrawer, setDrawerContent } = useContext(DataTableContext); + return ( + + + + + + ); +} + +export default TableToolbar; diff --git a/src/components/dashboard/passenger-office/index.jsx b/src/components/dashboard/passenger-office/index.jsx new file mode 100644 index 0000000..2d52dd3 --- /dev/null +++ b/src/components/dashboard/passenger-office/index.jsx @@ -0,0 +1,192 @@ +import DataTableStructure from "@/core/components/DatatableStructure"; +import DashboardLayouts from "@/layouts/dashboardLayouts"; +import { ContentCopy } from "@mui/icons-material"; +import { Box, Typography } from "@mui/material"; +import { DateTimePicker, LocalizationProvider } from "@mui/x-date-pickers"; +import { format } from "date-fns-jalali"; +import { useMemo } from "react"; +import TableToolbar from "./TableTollbar"; +import TableRowActions from "./TableRowActions"; + +function DashboardPassengerOfficeComponent() { + const columns = useMemo( + () => [ + { + accessorFn: (row) => row.id, + id: "id", + header: "Id", + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({ renderedCellValue }) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.username, + id: "username", + header: "Username", + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({ renderedCellValue }) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.name, + id: "name", + header: "Name", + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + muiTableBodyCellCopyButtonProps: { + fullWidth: true, + endIcon: , + sx: { justifyContent: "space-between" }, + }, + Cell: ({ renderedCellValue }) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.phone_number, + id: "phone_number", + header: "Phone Number", + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["equals", "notEquals", "contains"], + muiTableBodyCellCopyButtonProps: { + fullWidth: true, + endIcon: , + sx: { justifyContent: "space-between" }, + }, + Cell: ({ renderedCellValue }) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.status, + id: "status", + header: "Status", + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + filterSelectOptions: [ + { text: "Active", value: "0" }, + { text: "Deactive", value: "1" }, + ], + filterVariant: "select", + Cell: ({ renderedCellValue }) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.gender, + id: "gender", + header: "Gender", + enableColumnFilter: true, + datatype: "text", + filterFn: "equals", + filterSelectOptions: [ + { text: "Male", value: "male" }, + { text: "Female", value: "female" }, + ], + filterVariant: "select", + Cell: ({ renderedCellValue }) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.national_id_code, + id: "national_id_code", + header: "National Id Code", + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["equals", "notEquals", "contains"], + muiTableBodyCellCopyButtonProps: { + fullWidth: true, + endIcon: , + sx: { justifyContent: "space-between" }, + }, + Cell: ({ renderedCellValue }) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => new Date(row.updated_at), + id: "updated_at", + header: "Update Date", + enableColumnFilter: true, + datatype: "date", + filterFn: "lessThan", + columnFilterModeOptions: ["lessThan", "greaterThan"], + Cell: ({ renderedCellValue }) => { + const date = new Date(renderedCellValue); + const formattedDate = format(date, "MM/dd/yyyy HH:mm"); + return {formattedDate}; + }, + Header: ({ column }) => {column.columnDef.header}, + Filter: ({ column }) => { + return ( + + { + const date = new Date(newValue); + const formattedDate = format(date, "yyyy-MM-dd HH:mm"); + column.setFilterValue(formattedDate); + }} + slotProps={{ + textField: { + helperText: `Filter Mode: ${column.columnDef._filterFn}`, + sx: { minWidth: "120px" }, + variant: "standard", + }, + }} + value={column.getFilterValue()} + /> + + ); + }, + }, + ], + [] + ); + return ( + + + } + enableLastUpdate={true} + enablePinning={true} + enableDensityToggle={true} + enableColumnFilters={true} + enableHiding={true} + enableFullScreenToggle={false} + enableGlobalFilter={false} + enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions + enableRowActions={true} + renderRowActions={({ row }) => } + /> + + + ); +} + +export default DashboardPassengerOfficeComponent; diff --git a/src/core/components/ImageConvertor.jsx b/src/core/components/ImageConvertor.jsx index e69de29..667182e 100644 --- a/src/core/components/ImageConvertor.jsx +++ b/src/core/components/ImageConvertor.jsx @@ -0,0 +1,22 @@ +import ImageResize from "image-resize"; + +const ImageResizer = async (image) => { + const imageResize = new ImageResize({ + quality: 1, + format: "jpg", + outputType: "base64", + width: 400, + }); + + const get = await imageResize.get(image); + const resize = await imageResize.resize(get).then(); + const output = await imageResize.output(resize).then(); + + const avatar = await (await import("image-to-file-converter")) + .base64ToFile(output) + .then(); + + return avatar; +}; + +export default ImageResizer; diff --git a/src/pages/dashboard/passenger-office/index.jsx b/src/pages/dashboard/passenger-office/index.jsx new file mode 100644 index 0000000..78ec016 --- /dev/null +++ b/src/pages/dashboard/passenger-office/index.jsx @@ -0,0 +1,23 @@ +import DashboardPassengerOfficeComponent from "@/components/dashboard/passenger-office"; +import TitlePage from "@/core/components/TitlePage"; +import WithAuthMiddleware from "@/middlewares/WithoutAuth"; +import { parse } from "next-useragent"; + +export default function PassengerOffice() { + return ( + + + + + ); +} + +export async function getServerSideProps({ req, locale }) { + const { isBot } = parse(req.headers["user-agent"]); + return { + props: { + messages: (await import(`&/locales/${locale}/app.json`)).default, + isBot, + }, + }; +}