This commit is contained in:
@@ -54,6 +54,7 @@ const ALL_PERMISSIONS = [
|
|||||||
'Create&Edit_Route Template',
|
'Create&Edit_Route Template',
|
||||||
'View_Driver Assignment for Appointment',
|
'View_Driver Assignment for Appointment',
|
||||||
'Edit_Driver Assignment for Appointment',
|
'Edit_Driver Assignment for Appointment',
|
||||||
|
'isDriver',
|
||||||
'View_Provider Info',
|
'View_Provider Info',
|
||||||
'Create & Edit _Provider Info',
|
'Create & Edit _Provider Info',
|
||||||
'View_Appointment Request',
|
'View_Appointment Request',
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import React, {useEffect, useState, useRef} from "react";
|
import React, {useEffect, useState, useRef} from "react";
|
||||||
import { useSelector,useDispatch } from "react-redux";
|
import { useSelector,useDispatch } from "react-redux";
|
||||||
import { useParams, useNavigate } from "react-router-dom";
|
import { useParams, useNavigate } from "react-router-dom";
|
||||||
import { selectAllRoutes, transRoutesSlice, selectTomorrowAllRoutes, selectAllActiveDrivers, selectAllActiveVehicles, selectHistoryRoutes } from "./../../store";
|
import { selectAllRoutes, transRoutesSlice, selectTomorrowAllRoutes, selectAllActiveVehicles, selectHistoryRoutes } from "./../../store";
|
||||||
import { Breadcrumb, Tabs, Tab } from "react-bootstrap";
|
import { Breadcrumb, Tabs, Tab } from "react-bootstrap";
|
||||||
import RouteCustomerEditor from "./RouteCustomerEditor";
|
import RouteCustomerEditor from "./RouteCustomerEditor";
|
||||||
import { AuthService, TransRoutesService, CustomerService, EventsService } from "../../services";
|
import { AuthService, TransRoutesService, CustomerService, EventsService, EmployeeService } from "../../services";
|
||||||
import TimePicker from 'react-time-picker';
|
import TimePicker from 'react-time-picker';
|
||||||
import 'react-time-picker/dist/TimePicker.css';
|
import 'react-time-picker/dist/TimePicker.css';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
@@ -19,7 +19,6 @@ const RouteEdit = () => {
|
|||||||
const allRoutes = useSelector(selectAllRoutes);
|
const allRoutes = useSelector(selectAllRoutes);
|
||||||
const tomorrowRoutes = useSelector(selectTomorrowAllRoutes);
|
const tomorrowRoutes = useSelector(selectTomorrowAllRoutes);
|
||||||
const historyRoutes = useSelector(selectHistoryRoutes);
|
const historyRoutes = useSelector(selectHistoryRoutes);
|
||||||
const drivers = useSelector(selectAllActiveDrivers);
|
|
||||||
const vehicles = useSelector(selectAllActiveVehicles);
|
const vehicles = useSelector(selectAllActiveVehicles);
|
||||||
// const currentRoute = (allRoutes.find(item => item.id === params.id)) || (tomorrowRoutes.find(item => item.id === params.id)) || (historyRoutes.find(item => item.id === params.id)) || {};
|
// const currentRoute = (allRoutes.find(item => item.id === params.id)) || (tomorrowRoutes.find(item => item.id === params.id)) || (historyRoutes.find(item => item.id === params.id)) || {};
|
||||||
const currentVehicle = vehicles.find(item => item.id === currentRoute?.vehicle ) || [];
|
const currentVehicle = vehicles.find(item => item.id === currentRoute?.vehicle ) || [];
|
||||||
@@ -35,11 +34,19 @@ const RouteEdit = () => {
|
|||||||
const [estimatedStartTime, setEstimatedStartTime] = useState(undefined);
|
const [estimatedStartTime, setEstimatedStartTime] = useState(undefined);
|
||||||
const [currentRoute, setCurrentRoute] = useState(undefined);
|
const [currentRoute, setCurrentRoute] = useState(undefined);
|
||||||
const [allCustomers, setAllCustomers] = useState([]);
|
const [allCustomers, setAllCustomers] = useState([]);
|
||||||
|
const [driverOptions, setDriverOptions] = useState([]);
|
||||||
const [unassignedCustomers, setUnassignedCustomers] = useState([]);
|
const [unassignedCustomers, setUnassignedCustomers] = useState([]);
|
||||||
const [addCustomerToRoute, setAddCustomerToRoute] = useState(null);
|
const [addCustomerToRoute, setAddCustomerToRoute] = useState(null);
|
||||||
const [attendanceAbsentCustomers, setAttendanceAbsentCustomers] = useState([]); // customers with attendance notes on route date
|
const [attendanceAbsentCustomers, setAttendanceAbsentCustomers] = useState([]); // customers with attendance notes on route date
|
||||||
const initialCustomerListRef = useRef(null);
|
const initialCustomerListRef = useRef(null);
|
||||||
const paramsQuery = new URLSearchParams(window.location.search);
|
const paramsQuery = new URLSearchParams(window.location.search);
|
||||||
|
const isDriverEligibleEmployee = (employee) => {
|
||||||
|
if (!employee || employee.status !== 'active') return false;
|
||||||
|
const roles = Array.isArray(employee.roles) ? employee.roles.map((item) => `${item || ''}`.toLowerCase()) : [];
|
||||||
|
const permissions = Array.isArray(employee.permissions) ? employee.permissions : [];
|
||||||
|
return roles.includes('driver') || permissions.includes('isDriver');
|
||||||
|
};
|
||||||
|
|
||||||
const scheduleDate = paramsQuery.get('dateSchedule');
|
const scheduleDate = paramsQuery.get('dateSchedule');
|
||||||
const editSection = paramsQuery.get('editSection')
|
const editSection = paramsQuery.get('editSection')
|
||||||
const hasUnsavedCustomerChanges = () => {
|
const hasUnsavedCustomerChanges = () => {
|
||||||
@@ -302,6 +309,10 @@ const RouteEdit = () => {
|
|||||||
CustomerService.getAllCustomers().then(data => {
|
CustomerService.getAllCustomers().then(data => {
|
||||||
setAllCustomers(data?.data || []);
|
setAllCustomers(data?.data || []);
|
||||||
});
|
});
|
||||||
|
EmployeeService.getAllEmployees().then((data) => {
|
||||||
|
const employees = data?.data || [];
|
||||||
|
setDriverOptions(employees.filter(isDriverEligibleEmployee));
|
||||||
|
});
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// Calculate unassigned customers when allCustomers or routes change
|
// Calculate unassigned customers when allCustomers or routes change
|
||||||
@@ -489,7 +500,7 @@ const RouteEdit = () => {
|
|||||||
<span className="required">*</span>
|
<span className="required">*</span>
|
||||||
</div>
|
</div>
|
||||||
<select value={newDriver} onChange={e => setNewDriver(e.target.value)}>
|
<select value={newDriver} onChange={e => setNewDriver(e.target.value)}>
|
||||||
{drivers.map((driver) => <option key={driver.id} value={driver.id}>{driver.name}</option>)}
|
{driverOptions.map((driver) => <option key={driver.id} value={driver.id}>{driver.name}</option>)}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div className="me-4">
|
<div className="me-4">
|
||||||
@@ -584,33 +595,33 @@ const RouteEdit = () => {
|
|||||||
<div className="app-main-content-fields-section short">
|
<div className="app-main-content-fields-section short">
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">Driver Name</div>
|
<div className="field-label">Driver Name</div>
|
||||||
<div className="field-value">{drivers.find(item => item.id === newDriver)?.name}</div>
|
<div className="field-value">{driverOptions.find(item => item.id === newDriver)?.name}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">Preferred Name</div>
|
<div className="field-label">Preferred Name</div>
|
||||||
<div className="field-value">{drivers.find(item => item.id === newDriver)?.name_cn}</div>
|
<div className="field-value">{driverOptions.find(item => item.id === newDriver)?.name_cn}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">Job Title</div>
|
<div className="field-label">Job Title</div>
|
||||||
<div className="field-value">{drivers.find(item => item.id === newDriver)?.title}</div>
|
<div className="field-value">{driverOptions.find(item => item.id === newDriver)?.title}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">Job Type</div>
|
<div className="field-label">Job Type</div>
|
||||||
<div className="field-value">{drivers.find(item => item.id === newDriver)?.employment_status}</div>
|
<div className="field-value">{driverOptions.find(item => item.id === newDriver)?.employment_status}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">License Type</div>
|
<div className="field-label">License Type</div>
|
||||||
<div className="field-value">{drivers.find(item => item.id === newDriver)?.license_type}</div>
|
<div className="field-value">{driverOptions.find(item => item.id === newDriver)?.license_type}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="app-main-content-fields-section short">
|
<div className="app-main-content-fields-section short">
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">Phone Number</div>
|
<div className="field-label">Phone Number</div>
|
||||||
<div className="field-value">{drivers.find(item => item.id === newDriver)?.phone}</div>
|
<div className="field-value">{driverOptions.find(item => item.id === newDriver)?.phone}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">Email</div>
|
<div className="field-label">Email</div>
|
||||||
<div className="field-value">{drivers.find(item => item.id === newDriver)?.email}</div>
|
<div className="field-value">{driverOptions.find(item => item.id === newDriver)?.email}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="field-body"></div>
|
<div className="field-body"></div>
|
||||||
<div className="field-body"></div>
|
<div className="field-body"></div>
|
||||||
|
|||||||
@@ -187,7 +187,8 @@ export const EMPLOYEE_PERMISSION_GROUPS = {
|
|||||||
'View_Route Template',
|
'View_Route Template',
|
||||||
'Create&Edit_Route Template',
|
'Create&Edit_Route Template',
|
||||||
'View_Driver Assignment for Appointment',
|
'View_Driver Assignment for Appointment',
|
||||||
'Edit_Driver Assignment for Appointment'
|
'Edit_Driver Assignment for Appointment',
|
||||||
|
'isDriver'
|
||||||
],
|
],
|
||||||
Medical: [
|
Medical: [
|
||||||
'View_Provider Info',
|
'View_Provider Info',
|
||||||
|
|||||||
Reference in New Issue
Block a user