This commit is contained in:
@@ -54,6 +54,7 @@ const ALL_PERMISSIONS = [
|
||||
'Create&Edit_Route Template',
|
||||
'View_Driver Assignment for Appointment',
|
||||
'Edit_Driver Assignment for Appointment',
|
||||
'isDriver',
|
||||
'View_Provider Info',
|
||||
'Create & Edit _Provider Info',
|
||||
'View_Appointment Request',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import React, {useEffect, useState, useRef} from "react";
|
||||
import { useSelector,useDispatch } from "react-redux";
|
||||
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 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 'react-time-picker/dist/TimePicker.css';
|
||||
import moment from 'moment';
|
||||
@@ -19,7 +19,6 @@ const RouteEdit = () => {
|
||||
const allRoutes = useSelector(selectAllRoutes);
|
||||
const tomorrowRoutes = useSelector(selectTomorrowAllRoutes);
|
||||
const historyRoutes = useSelector(selectHistoryRoutes);
|
||||
const drivers = useSelector(selectAllActiveDrivers);
|
||||
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 currentVehicle = vehicles.find(item => item.id === currentRoute?.vehicle ) || [];
|
||||
@@ -35,11 +34,19 @@ const RouteEdit = () => {
|
||||
const [estimatedStartTime, setEstimatedStartTime] = useState(undefined);
|
||||
const [currentRoute, setCurrentRoute] = useState(undefined);
|
||||
const [allCustomers, setAllCustomers] = useState([]);
|
||||
const [driverOptions, setDriverOptions] = useState([]);
|
||||
const [unassignedCustomers, setUnassignedCustomers] = useState([]);
|
||||
const [addCustomerToRoute, setAddCustomerToRoute] = useState(null);
|
||||
const [attendanceAbsentCustomers, setAttendanceAbsentCustomers] = useState([]); // customers with attendance notes on route date
|
||||
const initialCustomerListRef = useRef(null);
|
||||
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 editSection = paramsQuery.get('editSection')
|
||||
const hasUnsavedCustomerChanges = () => {
|
||||
@@ -302,6 +309,10 @@ const RouteEdit = () => {
|
||||
CustomerService.getAllCustomers().then(data => {
|
||||
setAllCustomers(data?.data || []);
|
||||
});
|
||||
EmployeeService.getAllEmployees().then((data) => {
|
||||
const employees = data?.data || [];
|
||||
setDriverOptions(employees.filter(isDriverEligibleEmployee));
|
||||
});
|
||||
}, []);
|
||||
|
||||
// Calculate unassigned customers when allCustomers or routes change
|
||||
@@ -489,7 +500,7 @@ const RouteEdit = () => {
|
||||
<span className="required">*</span>
|
||||
</div>
|
||||
<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>
|
||||
</div>
|
||||
<div className="me-4">
|
||||
@@ -584,33 +595,33 @@ const RouteEdit = () => {
|
||||
<div className="app-main-content-fields-section short">
|
||||
<div className="field-body">
|
||||
<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 className="field-body">
|
||||
<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 className="field-body">
|
||||
<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 className="field-body">
|
||||
<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 className="field-body">
|
||||
<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 className="app-main-content-fields-section short">
|
||||
<div className="field-body">
|
||||
<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 className="field-body">
|
||||
<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 className="field-body"></div>
|
||||
<div className="field-body"></div>
|
||||
|
||||
@@ -187,7 +187,8 @@ export const EMPLOYEE_PERMISSION_GROUPS = {
|
||||
'View_Route Template',
|
||||
'Create&Edit_Route Template',
|
||||
'View_Driver Assignment for Appointment',
|
||||
'Edit_Driver Assignment for Appointment'
|
||||
'Edit_Driver Assignment for Appointment',
|
||||
'isDriver'
|
||||
],
|
||||
Medical: [
|
||||
'View_Provider Info',
|
||||
|
||||
Reference in New Issue
Block a user