merge conflict

This commit is contained in:
2023-07-16 16:53:10 +03:30
22 changed files with 1053 additions and 216 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -6,6 +6,7 @@
"login": "ورود",
"login_expert": "ورود کارشناس",
"expert": "کارشناس",
"last_updated_at": "اخرین بروز رسانی",
"header": {
"open_profile": "پروفایل",
"edit_profile": "ویرایش پروفایل",
@@ -46,13 +47,11 @@
},
"Dashboard": {
"dashboard_page": "داشبورد",
<<<<<<< HEAD
"passenger_boss": "رئیس مسافر",
"change_password": "تغییر رمز عبور"
=======
"change_password": "تغییر رمز عبور",
"passenger_office_page": "اداره مسافر",
"machinary_office_page": "ماشین آلات",
"edit_profile": "ویرایش پروفایل"
>>>>>>> 135f6d1e2f3495abe68e3ca758870023dcd85d76
},
"MuiDatePicker": {
"date_picker_birthday": "تاریخ"
@@ -92,5 +91,41 @@
"warning_static_text": "خطا سرور",
"success_static_text": "عملیات شما با موفقیت انجام شد",
"pending": "در حال انجام..."
},
"PassengerOffice": {
"name": "نام",
"national_id": "کد ملی",
"phone_number": "موبایل",
"created_at": "تاریخ درخواست",
"updated_at": "تاریخ بروزرسانی",
"navgan_id": "کد ناوگان",
"vehicle_type": "نوع ماشین",
"state_name": "وضعیت درخواست"
},
"MachinaryOffice": {
"name": "نام",
"national_id": "کد ملی",
"phone_number": "موبایل",
"created_at": "تاریخ درخواست",
"updated_at": "تاریخ بروزرسانی",
"navgan_id": "کد ناوگان",
"vehicle_type": "نوع ماشین",
"state_name": "وضعیت درخواست",
"proposed_amount": "مقدار پیشنهادی"
},
"ConfirmDialog": {
"confirm": "تایید",
"context": "آیا از تایید این آیتم اطمینان دارید",
"button-confirm": "تایید",
"button-cancel": "بستن",
"amount_error": "وارد کردن مقدار پیشنهادی الزامیست"
},
"RejectDialog": {
"reject": "عدم تایید",
"context": "آیا از عدم تایید این آیتم اطمینان دارید",
"button-reject": "عدم تایید",
"button-cancel": "بستن",
"description": "توضیحات",
"description_error": "وارد کردن توضیحات الزامی است!"
}
}

View File

@@ -1,92 +1,92 @@
export const FA_DATATABLE_LOCALIZATION = {
actions: "Actions",
and: "and",
cancel: "Cancel",
changeFilterMode: "Change filter mode",
changeSearchMode: "Change search mode",
clearFilter: "Clear filter",
clearSearch: "Clear search",
clearSort: "Clear sort",
clickToCopy: "Click to copy",
collapse: "Collapse",
collapseAll: "Collapse all",
columnActions: "Column Actions",
copiedToClipboard: "Copied to clipboard",
dropToGroupBy: "Drop to group by {column}",
edit: "Edit",
expand: "Expand",
expandAll: "Expand all",
filterArrIncludes: "Includes",
filterArrIncludesAll: "Includes all",
filterArrIncludesSome: "Includes",
filterBetween: "Between",
filterBetweenInclusive: "Between Inclusive",
filterByColumn: "Filter by {column}",
filterContains: "Contains",
filterEmpty: "Empty",
filterEndsWith: "Ends With",
filterEquals: "Equals",
filterEqualsString: "Equals",
filterFuzzy: "Fuzzy",
filterGreaterThan: "Greater Than",
filterGreaterThanOrEqualTo: "Greater Than Or Equal To",
filterInNumberRange: "Between",
filterIncludesString: "Contains",
filterIncludesStringSensitive: "Contains",
filterLessThan: "Less Than",
filterLessThanOrEqualTo: "Less Than Or Equal To",
filterMode: "Filter Mode: {filterType}",
filterNotEmpty: "Not Empty",
filterNotEquals: "Not Equals",
filterStartsWith: "Starts With",
filterWeakEquals: "Equals",
filteringByColumn: "Filtering by {column} - {filterType} {filterValue}",
goToFirstPage: "Go to first page",
goToLastPage: "Go to last page",
goToNextPage: "Go to next page",
goToPreviousPage: "Go to previous page",
grab: "Grab",
groupByColumn: "Group by {column}",
groupedBy: "Grouped by ",
hideAll: "Hide all",
hideColumn: "Hide {column} column",
max: "Max",
min: "Min",
move: "Move",
noRecordsToDisplay: "No records to display",
noResultsFound: "No results found",
of: "of",
or: "or",
pinToLeft: "Pin to left",
pinToRight: "Pin to right",
resetColumnSize: "Reset column size",
resetOrder: "Reset order",
rowActions: "Row Actions",
actions: "عملیات",
and: "و",
cancel: "لغو",
changeFilterMode: "تغییر حالت فیلتر",
changeSearchMode: "تغییر حالت جستجو",
clearFilter: "پاک کردن فیلتر",
clearSearch: "پاک کردن جستجو",
clearSort: "پاک کردن مرتب سازی",
clickToCopy: "کلیک برای کپی",
collapse: "جمع شدن",
collapseAll: "جمع شدن همه",
columnActions: "عملیات ستون",
copiedToClipboard: "کپی شد",
dropToGroupBy: "رها کردن برای گروه بندی بر اساس {column}",
edit: "ویرایش",
expand: "باز شدن",
expandAll: "باز شدن همه",
filterArrIncludes: "شامل",
filterArrIncludesAll: "شامل همه",
filterArrIncludesSome: "شامل",
filterBetween: "میان",
filterBetweenInclusive: "میان با احتساب هر دو",
filterByColumn: "فیلتر بر اساس {column}",
filterContains: "شامل",
filterEmpty: "خالی",
filterEndsWith: "به پایان می‌رسد با",
filterEquals: "برابر",
filterEqualsString: "برابر",
filterFuzzy: "نزدیک",
filterGreaterThan: "بزرگتر از",
filterGreaterThanOrEqualTo: "بزرگتر یا مساوی",
filterInNumberRange: "میان",
filterIncludesString: "شامل",
filterIncludesStringSensitive: "شامل",
filterLessThan: "کوچکتر از",
filterLessThanOrEqualTo: "کوچکتر یا مساوی",
filterMode: "حالت فیلتر: {filterType}",
filterNotEmpty: "غیر خالی",
filterNotEquals: "نا برابر",
filterStartsWith: "شروع می‌شود با",
filterWeakEquals: "برابر",
filteringByColumn: "فیلتر بر اساس {column} - {filterType} {filterValue}",
goToFirstPage: "رفتن به صفحه اول",
goToLastPage: "رفتن به صفحه آخر",
goToNextPage: "رفتن به صفحه بعدی",
goToPreviousPage: "رفتن به صفحه قبلی",
grab: "گرفتن",
groupByColumn: "گروه بندی بر اساس {column}",
groupedBy: "گروه بندی شده بر اساس",
hideAll: "پنهان کردن همه",
hideColumn: "پنهان کردن ستون {column}",
max: "حداکثر",
min: "حداقل",
move: "انتقال",
noRecordsToDisplay: "هیچ رکوردی برای نمایش وجود ندارد",
noResultsFound: "نتیجه‌ای یافت نشد",
of: "از",
or: "یا",
pinToLeft: "چسباندن به سمت چپ",
pinToRight: "چسباندن به سمت راست",
resetColumnSize: "بازنشانی اندازه ستون",
resetOrder: "بازنشانی ترتیب",
rowActions: "عملیات ردیف",
rowNumber: "#",
rowNumbers: "Row Numbers",
rowsPerPage: "Rows per page",
save: "Save",
search: "Search",
rowNumbers: "شماره ردیف",
rowsPerPage: "ردیف در هر صفحه",
save: "ذخیره",
search: "جستجو",
selectedCountOfRowCountRowsSelected:
"{selectedCount} of {rowCount} row(s) selected",
select: "Select",
showAll: "Show all",
showAllColumns: "Show all columns",
showHideColumns: "Show/Hide columns",
showHideFilters: "Show/Hide filters",
showHideSearch: "Show/Hide search",
sortByColumnAsc: "Sort by {column} ascending",
sortByColumnDesc: "Sort by {column} descending",
sortedByColumnAsc: "Sorted by {column} ascending",
sortedByColumnDesc: "Sorted by {column} descending",
thenBy: ", then by ",
toggleDensity: "Toggle density",
toggleFullScreen: "Toggle full screen",
toggleSelectAll: "Toggle select all",
toggleSelectRow: "Toggle select row",
toggleVisibility: "Toggle visibility",
ungroupByColumn: "Ungroup by {column}",
unpin: "Unpin",
unpinAll: "Unpin all",
unsorted: "Unsorted",
"{selectedCount} از {rowCount} ردیف انتخاب شده",
select: "انتخاب",
showAll: "نمایش همه",
showAllColumns: "نمایش همه ستون‌ها",
showHideColumns: "نمایش/مخفی کردن ستون‌ها",
showHideFilters: "نمایش/مخفی کردن فیلترها",
showHideSearch: "نمایش/مخفی کردن جستجو",
sortByColumnAsc: "مرتب سازی بر اساس {column} صعودی",
sortByColumnDesc: "مرتب سازی بر اساس {column} نزولی",
sortedByColumnAsc: "مرتب شده بر اساس {column} صعودی",
sortedByColumnDesc: "مرتب شده بر اساس {column} نزولی",
thenBy: "، سپس بر اساس ",
toggleDensity: "تغییر تراکم",
toggleFullScreen: "تغییر حالت تمام صفحه",
toggleSelectAll: "انتخاب/عدم انتخاب همه",
toggleSelectRow: "انتخاب/عدم انتخاب ردیف",
toggleVisibility: "تغییر پیدا/پنهان",
ungroupByColumn: "لغو گروه بندی بر اساس {column}",
unpin: "رها کردن",
unpinAll: "رها کردن همه",
unsorted: "بدون مرتب سازی",
};

View File

@@ -0,0 +1,94 @@
import { CONFIRM_MACHINARY_OFFICE } from "@/core/data/apiRoutes";
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText,
DialogActions,
Button,
TextField,
} from "@mui/material";
import { useTranslations } from "next-intl";
import { useState } from "react";
import { useFormik } from "formik";
import * as Yup from "yup";
const ConfirmForm = ({ open, handleClose, rowId, confirmData }) => {
const t = useTranslations();
const [proposedAmount, setProposedAmount] = useState("");
const [description, setDescription] = useState("");
//formik
const validationSchema = Yup.object().shape({
proposed_amount: Yup.string().required(t("ConfirmDialog.amount_error")),
});
const formik = useFormik({
initialValues: {
proposed_amount: "",
description: "",
},
validationSchema,
onSubmit: () => {
const formData = new FormData();
formData.append("proposed_amount", proposedAmount);
if (description != "") formData.append("expert_description", description);
handleClose();
confirmData(CONFIRM_MACHINARY_OFFICE, rowId, formData);
},
});
const handleDescriptionChange = (event) => {
setDescription(event.target.value);
};
const handleAmountChange = (event) => {
setProposedAmount(event.target.value);
formik.handleChange(event);
};
return (
<Dialog open={open} onClose={handleClose}>
<DialogTitle>{t("ConfirmDialog.confirm")}</DialogTitle>
<DialogContent>
<DialogContentText>{t("ConfirmDialog.context")}</DialogContentText>
<TextField
name="description"
multiline
rows={8}
placeholder={t("RejectDialog.description")}
value={description}
onChange={handleDescriptionChange}
fullWidth
variant="outlined"
sx={{ mt: 1 }}
/>
<TextField
name="proposed_amount"
label={t("MachinaryOffice.proposed_amount")}
type="number"
variant="outlined"
value={proposedAmount}
onChange={handleAmountChange}
onBlur={formik.handleBlur("proposed_amount")}
error={
formik.touched.proposed_amount &&
Boolean(formik.errors.proposed_amount)
}
helperText={
formik.touched.proposed_amount && formik.errors.proposed_amount
}
sx={{ mt: 1 }}
fullWidth
/>
</DialogContent>
<DialogActions>
<Button onClick={formik.handleSubmit} color="primary">
{t("ConfirmDialog.button-confirm")}
</Button>
<Button onClick={handleClose} color="secondary" autoFocus>
{t("ConfirmDialog.button-cancel")}
</Button>
</DialogActions>
</Dialog>
);
};
export default ConfirmForm;

View File

@@ -0,0 +1,76 @@
import { REJECT_MACHINARY_OFFICE } from "@/core/data/apiRoutes";
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText,
DialogActions,
Button,
TextField,
} from "@mui/material";
import { useTranslations } from "next-intl";
import { useFormik } from "formik";
import * as Yup from "yup";
import { useState } from "react";
const RejectForm = ({ open, handleClose, rowId, rejectData }) => {
const t = useTranslations();
const [description, setDescription] = useState("");
const validationSchema = Yup.object().shape({
description: Yup.string().required(t("RejectDialog.description_error")),
});
const formik = useFormik({
initialValues: {
description: "",
},
validationSchema,
onSubmit: () => {
const formData = new FormData();
formData.append("expert_description", description);
handleClose();
rejectData(REJECT_MACHINARY_OFFICE, rowId, formData);
},
});
const handleDescriptionChange = (event) => {
setDescription(event.target.value);
formik.handleChange(event);
};
return (
<Dialog open={open} onClose={handleClose}>
<DialogTitle>{t("RejectDialog.reject")}</DialogTitle>
<DialogContent>
<DialogContentText>{t("RejectDialog.context")}</DialogContentText>
<TextField
name="description"
multiline
rows={8}
placeholder={t("RejectDialog.description")}
value={description}
onChange={handleDescriptionChange}
onBlur={formik.handleBlur("description")}
error={
formik.touched.description && Boolean(formik.errors.description)
}
helperText={formik.touched.description && formik.errors.description}
fullWidth
variant="outlined"
sx={{ mt: 1 }}
/>
</DialogContent>
<DialogActions>
<Button onClick={formik.handleSubmit} color="primary">
{t("RejectDialog.button-reject")}
</Button>
<Button onClick={handleClose} color="secondary" autoFocus>
{t("RejectDialog.button-cancel")}
</Button>
</DialogActions>
</Dialog>
);
};
export default RejectForm;

View File

@@ -0,0 +1,54 @@
import ThumbUpAltIcon from "@mui/icons-material/ThumbUpAlt";
import ThumbDownIcon from "@mui/icons-material/ThumbDown";
import { Box, IconButton } from "@mui/material";
import { useContext } from "react";
import { DataTableContext } from "@/lib/app/contexts/DataTableContext";
import ConfirmForm from "./Form/ConfirmForm";
import RejectForm from "./Form/RejectForm";
const TableRowActions = ({ row }) => {
const {
openConfirmDialog,
openRejectDialog,
handleOpenConfirmDialog,
handleOpenRejectDialog,
handleCloseConfirmDialog,
handleCloseRejectDialog,
rowId,
confirmData,
rejectData,
} = useContext(DataTableContext);
return (
<Box sx={{ display: "flex", flexWrap: "nowrap", gap: "8px" }}>
<IconButton
color="primary"
onClick={() => {
handleOpenConfirmDialog(row);
}}
>
<ThumbUpAltIcon />
</IconButton>
{openConfirmDialog && (
<ConfirmForm
rowId={rowId}
open={openConfirmDialog}
handleClose={handleCloseConfirmDialog}
confirmData={confirmData}
/>
)}
<IconButton color="primary" onClick={() => handleOpenRejectDialog(row)}>
<ThumbDownIcon />
</IconButton>
{openRejectDialog && (
<RejectForm
rowId={rowId}
open={openRejectDialog}
handleClose={handleCloseRejectDialog}
rejectData={rejectData}
/>
)}
</Box>
);
};
export default TableRowActions;

View File

@@ -0,0 +1,13 @@
import { Stack, Tooltip } from "@mui/material";
import { useTranslations } from "next-intl";
function TableToolbar() {
const t = useTranslations();
return (
<Stack direction={"row"} spacing={2}>
<Tooltip title={t("add")} arrow placement="right"></Tooltip>
</Stack>
);
}
export default TableToolbar;

View File

@@ -0,0 +1,177 @@
import DataTableStructure from "@/core/components/DatatableStructure";
import DashboardLayouts from "@/layouts/dashboardLayouts";
import { Box, Typography } from "@mui/material";
import { useMemo } from "react";
// import TableToolbar from "./TableTollbar";
import { GET_MACHINARY_OFFICE } from "@/core/data/apiRoutes";
import { useTranslations } from "next-intl";
import TableRowActions from "./TableRowActions";
function DashboardMachinaryOfficeComponent() {
const t = useTranslations();
const columns = useMemo(
() => [
{
accessorFn: (row) => row.name,
id: "name",
header: t("MachinaryOffice.name"),
enableColumnFilter: true,
datatype: "text",
filterFn: "contains",
columnFilterModeOptions: ["contains", "equals", "notEquals"],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.national_id,
id: "national_id",
header: t("MachinaryOffice.national_id"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.phone_number,
id: "phone_number",
header: t("MachinaryOffice.phone_number"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.created_at,
id: "created_at",
header: t("MachinaryOffice.created_at"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.updated_at,
id: "updated_at",
header: t("MachinaryOffice.updated_at"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.navgan_id,
id: "navgan_id",
header: t("MachinaryOffice.navgan_id"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.vehicle_type,
id: "vehicle_type",
header: t("MachinaryOffice.vehicle_type"),
enableColumnFilter: true,
datatype: "text",
filterFn: "contains",
columnFilterModeOptions: ["contains", "equals", "notEquals"],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.state_name,
id: "state_id",
header: t("MachinaryOffice.state_name"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
filterSelectOptions: [
{ text: "Active", value: "0" },
{ text: "Deactive", value: "1" },
],
filterVariant: "select",
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
],
[]
);
return (
<DashboardLayouts>
<Box sx={{ px: 3 }}>
<DataTableStructure
tableUrl={GET_MACHINARY_OFFICE}
columns={columns}
selectableRow={false}
enableCustomToolbar={true}
// CustomToolbar={<TableToolbar />}
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 }) => <TableRowActions row={row} />}
/>
</Box>
</DashboardLayouts>
);
}
export default DashboardMachinaryOfficeComponent;

View File

@@ -0,0 +1,35 @@
import { CONFIRM_PASSENGER_OFFICE } from "@/core/data/apiRoutes";
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText,
DialogActions,
Button,
} from "@mui/material";
import { useTranslations } from "next-intl";
const ConfirmForm = ({ open, handleClose, rowId, confirmData }) => {
const t = useTranslations();
const handleConfirm = () => {
handleClose();
confirmData(CONFIRM_PASSENGER_OFFICE, rowId);
};
return (
<Dialog open={open} onClose={handleClose}>
<DialogTitle>{t("ConfirmDialog.confirm")}</DialogTitle>
<DialogContent>
<DialogContentText>{t("ConfirmDialog.context")}</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={handleConfirm} color="primary">
{t("ConfirmDialog.button-confirm")}
</Button>
<Button onClick={handleClose} color="secondary" autoFocus>
{t("ConfirmDialog.button-cancel")}
</Button>
</DialogActions>
</Dialog>
);
};
export default ConfirmForm;

View File

@@ -0,0 +1,76 @@
import { REJECT_PASSENGER_OFFICE } from "@/core/data/apiRoutes";
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText,
DialogActions,
Button,
TextField,
} from "@mui/material";
import { useTranslations } from "next-intl";
import { useFormik } from "formik";
import * as Yup from "yup";
import { useState } from "react";
const RejectForm = ({ open, handleClose, rowId, rejectData }) => {
const t = useTranslations();
const [description, setDescription] = useState("");
const validationSchema = Yup.object().shape({
description: Yup.string().required(t("RejectDialog.description_error")),
});
const formik = useFormik({
initialValues: {
description: "",
},
validationSchema,
onSubmit: () => {
const formData = new FormData();
formData.append("expert_description", description);
handleClose();
rejectData(REJECT_PASSENGER_OFFICE, rowId, formData);
},
});
const handleDescriptionChange = (event) => {
setDescription(event.target.value);
formik.handleChange(event);
};
return (
<Dialog open={open} onClose={handleClose}>
<DialogTitle>{t("RejectDialog.reject")}</DialogTitle>
<DialogContent>
<DialogContentText>{t("RejectDialog.context")}</DialogContentText>
<TextField
name="description"
multiline
rows={8}
placeholder={t("RejectDialog.description")}
value={description}
onChange={handleDescriptionChange}
onBlur={formik.handleBlur("description")}
error={
formik.touched.description && Boolean(formik.errors.description)
}
helperText={formik.touched.description && formik.errors.description}
fullWidth
variant="outlined"
sx={{ mt: 1 }}
/>
</DialogContent>
<DialogActions>
<Button onClick={formik.handleSubmit} color="primary">
{t("RejectDialog.button-reject")}
</Button>
<Button onClick={handleClose} color="secondary" autoFocus>
{t("RejectDialog.button-cancel")}
</Button>
</DialogActions>
</Dialog>
);
};
export default RejectForm;

View File

@@ -0,0 +1,54 @@
import ThumbUpAltIcon from "@mui/icons-material/ThumbUpAlt";
import ThumbDownIcon from "@mui/icons-material/ThumbDown";
import { Box, IconButton } from "@mui/material";
import { useContext } from "react";
import { DataTableContext } from "@/lib/app/contexts/DataTableContext";
import ConfirmForm from "./Form/ConfirmForm";
import RejectForm from "./Form/RejectForm";
const TableRowActions = ({ row }) => {
const {
openConfirmDialog,
openRejectDialog,
handleOpenConfirmDialog,
handleOpenRejectDialog,
handleCloseConfirmDialog,
handleCloseRejectDialog,
rowId,
confirmData,
rejectData,
} = useContext(DataTableContext);
return (
<Box sx={{ display: "flex", flexWrap: "nowrap", gap: "8px" }}>
<IconButton
color="primary"
onClick={() => {
handleOpenConfirmDialog(row);
}}
>
<ThumbUpAltIcon />
</IconButton>
{openConfirmDialog && (
<ConfirmForm
rowId={rowId}
open={openConfirmDialog}
handleClose={handleCloseConfirmDialog}
confirmData={confirmData}
/>
)}
<IconButton color="primary" onClick={() => handleOpenRejectDialog(row)}>
<ThumbDownIcon />
</IconButton>
{openRejectDialog && (
<RejectForm
rowId={rowId}
open={openRejectDialog}
handleClose={handleCloseRejectDialog}
rejectData={rejectData}
/>
)}
</Box>
);
};
export default TableRowActions;

View File

@@ -0,0 +1,13 @@
import { Stack, Tooltip } from "@mui/material";
import { useTranslations } from "next-intl";
function TableToolbar() {
const t = useTranslations();
return (
<Stack direction={"row"} spacing={2}>
<Tooltip title={t("add")} arrow placement="right"></Tooltip>
</Stack>
);
}
export default TableToolbar;

View File

@@ -0,0 +1,177 @@
import DataTableStructure from "@/core/components/DatatableStructure";
import DashboardLayouts from "@/layouts/dashboardLayouts";
import { Box, Typography } from "@mui/material";
import { useMemo } from "react";
// import TableToolbar from "./TableTollbar";
import { GET_PASSENGER_OFFICE } from "@/core/data/apiRoutes";
import { useTranslations } from "next-intl";
import TableRowActions from "./TableRowActions";
function DashboardPassengerOfficeComponent() {
const t = useTranslations();
const columns = useMemo(
() => [
{
accessorFn: (row) => row.name,
id: "name",
header: t("PassengerOffice.name"),
enableColumnFilter: true,
datatype: "text",
filterFn: "contains",
columnFilterModeOptions: ["contains", "equals", "notEquals"],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.national_id,
id: "national_id",
header: t("PassengerOffice.national_id"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.phone_number,
id: "phone_number",
header: t("PassengerOffice.phone_number"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.created_at,
id: "created_at",
header: t("PassengerOffice.created_at"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.updated_at,
id: "updated_at",
header: t("PassengerOffice.updated_at"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.navgan_id,
id: "navgan_id",
header: t("PassengerOffice.navgan_id"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
columnFilterModeOptions: [
"equals",
"notEquals",
"contains",
"lessThan",
"greaterThan",
"between",
],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.vehicle_type,
id: "vehicle_type",
header: t("PassengerOffice.vehicle_type"),
enableColumnFilter: true,
datatype: "text",
filterFn: "contains",
columnFilterModeOptions: ["contains", "equals", "notEquals"],
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
{
accessorFn: (row) => row.state_name,
id: "state_id",
header: t("PassengerOffice.state_name"),
enableColumnFilter: true,
datatype: "numeric",
filterFn: "equals",
filterSelectOptions: [
{ text: "Active", value: "0" },
{ text: "Deactive", value: "1" },
],
filterVariant: "select",
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">{renderedCellValue}</Typography>
),
},
],
[]
);
return (
<DashboardLayouts>
<Box sx={{ px: 3 }}>
<DataTableStructure
tableUrl={GET_PASSENGER_OFFICE}
columns={columns}
selectableRow={false}
enableCustomToolbar={true}
// CustomToolbar={<TableToolbar />}
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 }) => <TableRowActions row={row} />}
/>
</Box>
</DashboardLayouts>
);
}
export default DashboardPassengerOfficeComponent;

View File

@@ -41,12 +41,10 @@ const LoginComponent = () => {
password: values.password,
})
.then(function (response) {
console.log(response);
setToken(response.data.token);
})
.catch(function (error) {
// Notifications(directionApp, error.response, t);
console.log(error);
props.setSubmitting(false);
});
};

View File

@@ -1,4 +1,4 @@
import { DataTableProvider } from "@/lib/app/contexts/DatatableContext";
import { DataTableProvider } from "@/lib/app/contexts/DataTableContext";
import DataTable from "./Datatable";
import { ReloadDataTableProvider } from "@/lib/app/contexts/ReloadDatatableContext";

View File

@@ -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;

View File

@@ -28,7 +28,7 @@ const LoadingHardPage = ({ children, loading }) => {
>
<Fade in={true}>
<LoadingImage
src={"/images/logo.svg"}
src={"/images/loading_logo.svg"}
alt="loading marhaba"
priority
width={100}

View File

@@ -7,7 +7,7 @@ const Message = ({ text, actions }) => {
<FullPageLayout sx={{ p: 1 }}>
<CenterLayout spacing={3}>
<StyledImage
src={"/images/logo.svg"}
src={"/images/loading_logo.svg"}
alt="loading loan facilities"
width={100}
height={100}

View File

@@ -8,6 +8,28 @@ export const GET_USER_TOKEN = BASE_URL + "/dashboard/login";
export const CHANGE_PASSWORD = BASE_URL + "/dashboard/profile/change_password";
//end change password
//user data
//user data
export const GET_USER_ROUTE = BASE_URL + "/dashboard/profile/info";
//user data
//user data
//passenger office
export const GET_PASSENGER_OFFICE =
BASE_URL + "/dashboard/passenger_office_chief/show";
export const CONFIRM_PASSENGER_OFFICE =
BASE_URL + "/dashboard/passenger_office_chief/confirm";
export const REJECT_PASSENGER_OFFICE =
BASE_URL + "/dashboard/passenger_office_chief/reject";
//passenger office
//machinary office
export const GET_MACHINARY_OFFICE =
BASE_URL + "/dashboard/machinery_expert/show";
export const CONFIRM_MACHINARY_OFFICE =
BASE_URL + "/dashboard/machinery_expert/confirm";
export const REJECT_MACHINARY_OFFICE =
BASE_URL + "/dashboard/machinery_expert/reject";
//passenger office

View File

@@ -1,46 +1,31 @@
import { useMediaQuery } from "@mui/material";
import { useTheme } from "@mui/material/styles";
import { useState, useReducer, useCallback, useContext } from "react";
import axios from "axios";
import ImageResizer from "@/core/components/ImageConvertor";
import useUser from "./useUser";
import { useCallback, useContext, useReducer, useState } from "react";
import { ReloadDataTableContext } from "../contexts/ReloadDatatableContext";
import useUser from "./useUser";
import Notifications from "@/core/components/notifications";
import useDirection from "./useDirection";
import { useTranslations } from "next-intl";
const initialValues = {
url: "",
rowID: "",
values: {},
image: {
key: "",
value: {},
},
};
const reducer = (state, action) => {
switch (action.type) {
case "ADD_DATA":
case "CONFIRM_DATA":
return {
...state,
url: action.url,
values: action.values,
image: action.image,
rowID: "",
};
case "EDIT_DATA":
return {
...state,
url: action.url,
values: action.values,
rowID: action.rowID,
image: action.image,
};
case "DELETE_DATA":
case "REJECT_DATA":
return {
...state,
url: action.url,
rowID: action.rowID,
values: {},
image: {},
};
default:
return state;
@@ -50,118 +35,77 @@ const reducer = (state, action) => {
const useDataTable = () => {
const { setReloadDataTable } = useContext(ReloadDataTableContext);
const [state, dispatch] = useReducer(reducer, initialValues);
const [drawerContent, setDrawerContent] = useState(null);
const [openDeleteDialog, setOpenDeleteDialog] = useState(false);
const [openConfirmDialog, setOpenConfirmDialog] = useState(false);
const [openRejectDialog, setOpenRejectDialog] = useState(false);
const [rowId, setRowId] = useState(null);
const theme = useTheme();
const { directionApp } = useDirection();
const t = useTranslations();
const { token } = useUser();
const drawerDirection = useMediaQuery(theme.breakpoints.up("sm"))
? "right"
: "bottom";
const [sweepableDrawer, setSweepableDrawer] = useState({
bottom: false,
right: false,
});
const addData = useCallback(async (url, values, image) => {
dispatch({ type: "ADD_DATA", url: url, values: values, image: image });
if (image != null) {
var resizedAvatar = await ImageResizer(image.value);
formData.append(image.key, resizedAvatar);
axios.post(url, formData, {
headers: {
authorization: `Bearer ${token}`,
"Content-Type": "multipart/form-data",
},
});
}
axios
.post(url, values, {
headers: {
authorization: `Bearer ${token}`,
},
})
.then(() => {})
.catch(() => {});
}, []);
const deleteData = useCallback(async (url, rowID) => {
dispatch({ type: "DELETE_DATA", url: url, rowID: rowID });
axios
.delete(`${url}/${rowID}`, {
headers: {
authorization: `Bearer ${token}`,
},
})
.then(() => {
setReloadDataTable(true);
})
.catch(() => {});
}, []);
const editData = useCallback(async (url, values, rowID, image) => {
dispatch({
type: "EDIT_DATA",
url: url,
values: values,
rowID: rowID,
image: image,
});
if (image != null) {
var resizedAvatar = await ImageResizer(image.value);
formData.append(image.key, resizedAvatar);
axios.post(`${url}/${rowID}`, formData, {
headers: {
authorization: `Bearer ${token}`,
"Content-Type": "multipart/form-data",
},
});
}
const confirmData = useCallback(async (url, rowID, values) => {
dispatch({ type: "CONFIRM_DATA", url: url, rowID: rowID, values: values });
axios
.post(`${url}/${rowID}`, values, {
headers: {
authorization: `Bearer ${token}`,
},
headers: { authorization: `Bearer ${token}` },
})
.then(() => {})
.catch(() => {});
.then((response) => {
setReloadDataTable(true);
Notifications(directionApp, response, t);
})
.catch((error) => {
Notifications(directionApp, error.response, t);
});
}, []);
const toggleDrawer = (open) => {
open == false &&
setTimeout(() => {
setDrawerContent(null);
}, theme.transitions.duration.leavingScreen);
setSweepableDrawer({ ...sweepableDrawer, [drawerDirection]: open });
};
const handleOpenDeleteDialog = (row) => {
const rejectData = useCallback(async (url, rowID, values) => {
dispatch({ type: "REJECT_DATA", url: url, rowID: rowID, values: values });
axios
.post(`${url}/${rowID}`, values, {
headers: { authorization: `Bearer ${token}` },
})
.then((response) => {
setReloadDataTable(true);
Notifications(directionApp, response, t);
})
.catch((error) => {
console.log(error);
Notifications(directionApp, error.response, t);
});
}, []);
//Confirm Data
const handleOpenConfirmDialog = (row) => {
setRowId(row.getValue("id"));
setOpenDeleteDialog(true);
setOpenConfirmDialog(true);
};
const handleCloseDeleteDialog = () => {
setOpenDeleteDialog(false);
const handleCloseConfirmDialog = () => {
setOpenConfirmDialog(false);
};
//End Confirm Data
// Reject Data
const handleOpenRejectDialog = (row) => {
setRowId(row.getValue("id"));
setOpenRejectDialog(true);
};
const handleDeleteDialog = () => {
setOpenDeleteDialog(false);
const handleCloseRejectDialog = () => {
setOpenRejectDialog(false);
};
// End Reject Data
const contextValue = {
toggleDrawer,
drawerDirection,
sweepableDrawer,
setSweepableDrawer,
setDrawerContent,
drawerContent,
openDeleteDialog,
handleOpenDeleteDialog,
handleCloseDeleteDialog,
handleDeleteDialog,
handleOpenConfirmDialog,
handleCloseConfirmDialog,
handleOpenRejectDialog,
handleCloseRejectDialog,
rowId,
deleteData,
addData,
openConfirmDialog,
openRejectDialog,
rejectData,
confirmData,
};
return contextValue;
};

View File

@@ -0,0 +1,23 @@
import DashboardMachinaryOfficeComponent from "@/components/dashboard/machinary-office";
import TitlePage from "@/core/components/TitlePage";
import WithAuthMiddleware from "@/middlewares/WithAuth";
import { parse } from "next-useragent";
export default function PassengerOffice() {
return (
<WithAuthMiddleware>
<TitlePage text="Dashboard.machinary_office_page" />
<DashboardMachinaryOfficeComponent />
</WithAuthMiddleware>
);
}
export async function getServerSideProps({ req, locale }) {
const { isBot } = parse(req.headers["user-agent"]);
return {
props: {
messages: (await import(`&/locales/${locale}/app.json`)).default,
isBot,
},
};
}

View File

@@ -0,0 +1,23 @@
import DashboardPassengerOfficeComponent from "@/components/dashboard/passenger-office";
import TitlePage from "@/core/components/TitlePage";
import WithAuthMiddleware from "@/middlewares/WithAuth";
import { parse } from "next-useragent";
export default function PassengerOffice() {
return (
<WithAuthMiddleware>
<TitlePage text="Dashboard.passenger_office_page" />
<DashboardPassengerOfficeComponent />
</WithAuthMiddleware>
);
}
export async function getServerSideProps({ req, locale }) {
const { isBot } = parse(req.headers["user-agent"]);
return {
props: {
messages: (await import(`&/locales/${locale}/app.json`)).default,
isBot,
},
};
}