From 334bd5542b0d0f0c89495a87df5cd2eb29a51fd6 Mon Sep 17 00:00:00 2001 From: Yang Li Date: Fri, 9 May 2025 21:21:30 -0400 Subject: [PATCH] Routes module --- app/views/asset-manifest.json | 12 +- app/views/index.html | 2 +- client/build/asset-manifest.json | 16 - client/build/index.html | 1 - client/build/static/js/787.c4e7f8f9.chunk.js | 2 - .../build/static/js/787.c4e7f8f9.chunk.js.map | 1 - client/src/App.css | 64 ++- client/src/components/admin/Admin.js | 7 +- client/src/components/admin/CustomerReport.js | 371 ++++++++++++------ client/src/components/home/menu.js | 12 +- .../components/trans-routes/CreateRoute.js | 274 ++++++++----- .../trans-routes/PersonnelInfoTable.js | 231 ++++++----- .../trans-routes/RouteCustomerEditor.js | 191 ++++++--- .../src/components/trans-routes/RouteEdit.js | 294 ++++++++++---- .../src/components/trans-routes/RouteView.js | 168 +++++--- .../trans-routes/RoutesDashboard.js | 8 +- client/src/components/vehicles/ViewVehicle.js | 2 +- 17 files changed, 1110 insertions(+), 546 deletions(-) delete mode 100644 client/build/asset-manifest.json delete mode 100644 client/build/index.html delete mode 100644 client/build/static/js/787.c4e7f8f9.chunk.js delete mode 100644 client/build/static/js/787.c4e7f8f9.chunk.js.map diff --git a/app/views/asset-manifest.json b/app/views/asset-manifest.json index af610e7..25443bc 100644 --- a/app/views/asset-manifest.json +++ b/app/views/asset-manifest.json @@ -1,16 +1,16 @@ { "files": { - "main.css": "/static/css/main.bbcd4e86.css", - "main.js": "/static/js/main.8f60a967.js", + "main.css": "/static/css/main.2fa2d232.css", + "main.js": "/static/js/main.77186374.js", "static/js/787.c4e7f8f9.chunk.js": "/static/js/787.c4e7f8f9.chunk.js", "static/media/landing.png": "/static/media/landing.d4c6072db7a67dff6a78.png", "index.html": "/index.html", - "main.bbcd4e86.css.map": "/static/css/main.bbcd4e86.css.map", - "main.8f60a967.js.map": "/static/js/main.8f60a967.js.map", + "main.2fa2d232.css.map": "/static/css/main.2fa2d232.css.map", + "main.77186374.js.map": "/static/js/main.77186374.js.map", "787.c4e7f8f9.chunk.js.map": "/static/js/787.c4e7f8f9.chunk.js.map" }, "entrypoints": [ - "static/css/main.bbcd4e86.css", - "static/js/main.8f60a967.js" + "static/css/main.2fa2d232.css", + "static/js/main.77186374.js" ] } \ No newline at end of file diff --git a/app/views/index.html b/app/views/index.html index f0082b6..fb86098 100644 --- a/app/views/index.html +++ b/app/views/index.html @@ -1 +1 @@ -Worldshine Transportation
\ No newline at end of file +Worldshine Transportation
\ No newline at end of file diff --git a/client/build/asset-manifest.json b/client/build/asset-manifest.json deleted file mode 100644 index af610e7..0000000 --- a/client/build/asset-manifest.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "files": { - "main.css": "/static/css/main.bbcd4e86.css", - "main.js": "/static/js/main.8f60a967.js", - "static/js/787.c4e7f8f9.chunk.js": "/static/js/787.c4e7f8f9.chunk.js", - "static/media/landing.png": "/static/media/landing.d4c6072db7a67dff6a78.png", - "index.html": "/index.html", - "main.bbcd4e86.css.map": "/static/css/main.bbcd4e86.css.map", - "main.8f60a967.js.map": "/static/js/main.8f60a967.js.map", - "787.c4e7f8f9.chunk.js.map": "/static/js/787.c4e7f8f9.chunk.js.map" - }, - "entrypoints": [ - "static/css/main.bbcd4e86.css", - "static/js/main.8f60a967.js" - ] -} \ No newline at end of file diff --git a/client/build/index.html b/client/build/index.html deleted file mode 100644 index f0082b6..0000000 --- a/client/build/index.html +++ /dev/null @@ -1 +0,0 @@ -Worldshine Transportation
\ No newline at end of file diff --git a/client/build/static/js/787.c4e7f8f9.chunk.js b/client/build/static/js/787.c4e7f8f9.chunk.js deleted file mode 100644 index 7664e57..0000000 --- a/client/build/static/js/787.c4e7f8f9.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkclient=self.webpackChunkclient||[]).push([[787],{787:function(e,t,n){n.r(t),n.d(t,{getCLS:function(){return y},getFCP:function(){return g},getFID:function(){return C},getLCP:function(){return P},getTTFB:function(){return D}});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,p=function(){return"hidden"===document.visibilityState?0:1/0},d=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=p(),d(),s((function(){setTimeout((function(){v=p(),d()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},p=c("layout-shift",v);p&&(n=m(i,r,t),f((function(){p.takeRecords().map(v),n(!0)})),s((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,F(removeEventListener),S())},S=function(){if(r>=0&&r1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},F=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},C=function(e,t){var n,a=l(),v=u("FID"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]); -//# sourceMappingURL=787.c4e7f8f9.chunk.js.map \ No newline at end of file diff --git a/client/build/static/js/787.c4e7f8f9.chunk.js.map b/client/build/static/js/787.c4e7f8f9.chunk.js.map deleted file mode 100644 index 1b1c31a..0000000 --- a/client/build/static/js/787.c4e7f8f9.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/787.c4e7f8f9.chunk.js","mappings":"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","sources":["../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["var e,t,n,i,r=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:\"v2-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12)}},a=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if(\"first-input\"===e&&!(\"PerformanceEventTiming\"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},o=function(e,t){var n=function n(i){\"pagehide\"!==i.type&&\"hidden\"!==document.visibilityState||(e(i),t&&(removeEventListener(\"visibilitychange\",n,!0),removeEventListener(\"pagehide\",n,!0)))};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},u=function(e){addEventListener(\"pageshow\",(function(t){t.persisted&&e(t)}),!0)},c=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},f=-1,s=function(){return\"hidden\"===document.visibilityState?0:1/0},m=function(){o((function(e){var t=e.timeStamp;f=t}),!0)},v=function(){return f<0&&(f=s(),m(),u((function(){setTimeout((function(){f=s(),m()}),0)}))),{get firstHiddenTime(){return f}}},d=function(e,t){var n,i=v(),o=r(\"FCP\"),f=function(e){\"first-contentful-paint\"===e.name&&(m&&m.disconnect(),e.startTime-1&&e(t)},f=r(\"CLS\",0),s=0,m=[],v=function(e){if(!e.hadRecentInput){var t=m[0],i=m[m.length-1];s&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,m.push(e)):(s=e.value,m=[e]),s>f.value&&(f.value=s,f.entries=m,n())}},h=a(\"layout-shift\",v);h&&(n=c(i,f,t),o((function(){h.takeRecords().map(v),n(!0)})),u((function(){s=0,l=-1,f=r(\"CLS\",0),n=c(i,f,t)})))},T={passive:!0,capture:!0},y=new Date,g=function(i,r){e||(e=r,t=i,n=new Date,w(removeEventListener),E())},E=function(){if(t>=0&&t1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){g(e,t),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",n,T),removeEventListener(\"pointercancel\",i,T)};addEventListener(\"pointerup\",n,T),addEventListener(\"pointercancel\",i,T)}(t,e):g(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,S,T)}))},L=function(n,f){var s,m=v(),d=r(\"FID\"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},\"complete\"===document.readyState?setTimeout(t,0):addEventListener(\"load\",(function(){return setTimeout(t,0)}))};export{h as getCLS,d as getFCP,L as getFID,F as getLCP,P as getTTFB};\n"],"names":["e","t","n","i","r","name","value","delta","entries","id","concat","Date","now","Math","floor","random","a","PerformanceObserver","supportedEntryTypes","includes","self","getEntries","map","observe","type","buffered","o","document","visibilityState","removeEventListener","addEventListener","u","persisted","c","f","s","m","timeStamp","v","setTimeout","firstHiddenTime","d","disconnect","startTime","push","window","performance","getEntriesByName","requestAnimationFrame","p","l","h","hadRecentInput","length","takeRecords","T","passive","capture","y","g","w","E","entryType","target","cancelable","processingStart","forEach","S","L","b","F","once","P","getEntriesByType","timing","max","navigationStart","responseStart","readyState"],"sourceRoot":""} \ No newline at end of file diff --git a/client/src/App.css b/client/src/App.css index 22c3684..1e92817 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -452,22 +452,31 @@ table .group td { .multi-columns-container { display: flex; - background: #D0E1F8; - padding: 24px; + /* background: #D0E1F8; */ + padding: 24px 0; border-radius: 10px; } .column-container { - padding: 20px; + padding: 0 20px 0 0; } .column-card { background: white; padding:24px; border-radius: 10px; + border: 1px solid #ccc; + margin-bottom: 24px; } +.react-time-picker__wrapper { + border-radius: 10px; + border-color: #ccc!important; +} +.react-time-picker__wrapper input[type=number] { + border:none; +} .app-main-content-fields-section .field-value { font-size: 12px; @@ -485,6 +494,7 @@ table .group td { .app-main-content-fields-section.short { margin-bottom: 0; margin-top: 12px; + justify-content: space-between; } .app-main-content-fields-section.with-function .react-datepicker-wrapper { @@ -779,20 +789,54 @@ input[type="checkbox"] { } .customers-container { - background: #eee; padding: 20px; width: 100%; + position: relative; } .customers-dnd-item-container { - border: 1px dotted #777; - padding: 15px; - width: 100%; - margin-bottom: 15px; + border: none; + padding: 0 16px; + margin-bottom: 24px; display: flex; align-items: center; font-size: 13px; cursor: move; + background: #eee; + margin-left: 60px; +} + +.customers-dnd-item-container-absent { + border: none; + padding: 0 16px; + margin-bottom: 24px; + display: flex; + align-items: center; + font-size: 13px; + background: #eee; +} + +.new-customers-dnd-item-container { + border: none; + padding: 0 16px; + margin-bottom: 24px; + display: flex; + align-items: center; + font-size: 13px; + margin-left: 44px; +} + +.column-card.adjust { + padding-right: 60px; +} + +.stop-index { + position: absolute; + left: 0; +} + +.customer-dnd-item { + padding: 4px 0; } .customer-dnd-img { @@ -1081,6 +1125,10 @@ input[type="checkbox"] { background: transparent; } +.modal-dialog { + max-width: 1000px !important; +} + .modal-fullscreen-xxl-down { height: 100%; margin: 0; diff --git a/client/src/components/admin/Admin.js b/client/src/components/admin/Admin.js index d7f1494..c12c487 100644 --- a/client/src/components/admin/Admin.js +++ b/client/src/components/admin/Admin.js @@ -103,15 +103,14 @@ const Admin = () => { }, []) return ( <> -
-
+ {/*
*/} + {/*

Transportation Center

- {/* Customers Admin */} {(AuthService.canAddOrEditEmployees() || AuthService.canViewEmployees()) &&
-
+
*/}
diff --git a/client/src/components/admin/CustomerReport.js b/client/src/components/admin/CustomerReport.js index 5ab61fe..f014bc0 100644 --- a/client/src/components/admin/CustomerReport.js +++ b/client/src/components/admin/CustomerReport.js @@ -3,7 +3,8 @@ import { useNavigate } from 'react-router-dom'; import { CustomerService, TransRoutesService, AuthService, ReportService } from "../../services"; import DatePicker from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; -import { Modal, Button } from "react-bootstrap"; +import { CalendarWeek, ClockHistory, Copy, Download, Eraser, Plus, Clock, Send, Filter, CalendarCheck, Check } from "react-bootstrap-icons"; +import { Breadcrumb, Tabs, Tab, Dropdown, Spinner, Modal, Button } from "react-bootstrap"; import DateTimePicker from "react-datetime-picker"; import { CSVLink } from "react-csv"; import { CUSTOMER_TYPE, PERSONAL_ROUTE_STATUS, PERSONAL_ROUTE_STATUS_TEXT, REPORT_TYPE } from "../../shared"; @@ -29,6 +30,8 @@ const CustomerReport = () => { const [attendFilter, setAttendFilter] = useState(false); const [existedReports, setExistedReports] = useState([]); const [enableSave, setEnableSave] = useState(false); + const [showFilterReportDropdown, setShowFilterReportDropdown] = useState(false); + const [showDateDropdown, setShowDateDropdown] = useState(false); const [csvData, setCsvData] = useState([]); const csvInstance = useRef(null); @@ -474,6 +477,103 @@ const CustomerReport = () => { }) }; + const cleanFilterAndClose = () => { + setCallerFilter(''); + setNameFilter(''); + setAttendFilter(false); + setStatusFilter('') + setShowFilterReportDropdown(false); + } + + const cleanDate = () => { + setDatePicked(new Date()); + setShowDateDropdown(false); + } + + const FilterAndClose = () => { + setShowFilterReportDropdown(false); + } + + const customReportFilterMenu = React.forwardRef( + ({ children, style, className, 'aria-labelledby': labeledBy }, ref) => { + return ( +
+
Filter By
+
+
+
User Name
+ setNameFilter(e.currentTarget.value)}/> +
+
+
+
+
Caller
+ setCallerFilter(e.currentTarget.value)}/> +
+
+
+
+
Customer Route Status
+ +
+
+
+
+
Include All Customer Attending Today
+ setAttendFilter(!attendFilter)}/> +
+
+
+
+ + +
+
+
+ ); + }, + ); + + const customMenuDate = React.forwardRef( + ({ children, style, className, 'aria-labelledby': labeledBy }, ref) => { + return ( +
+
+
+
Select Date for Customer Report
+ setDatePicked(v)} /> +
+
+
+
+ + +
+
+
+ ); + }, + ); + useEffect(() => { CustomerService.getAllActiveCustomers().then((data) => setCustomers(data.data)); }, []); @@ -556,119 +656,119 @@ const CustomerReport = () => { { (AuthService.canAddOrEditAttendance() || AuthService.canViewAttendance() ) && ( <> -
-
- Select Date for Customer Report: -
-
- setDatePicked(v)} /> -
-
- +
+ + Transportation + + Customer Reports + + +
+

+ Customer Reports +

-
-
-
- Filter by User Name: setNameFilter(e.currentTarget.value)}/> -
-
- Filter by Caller: setCallerFilter(e.currentTarget.value)}/> -
-
- Filter by Customer Route Status: -
-
- Include All Customer Attending Today: setAttendFilter(!attendFilter)}/> -
-
- {/* - Generate Customer Reports - */} - - -
{ + +
+
+ + +
Report Details Table
+
+ + + -
-
- - - {csvData.length > 0 ? + }} className="btn btn-primary me-2">Generate Customer Reports + { csvData.length > 0 && - : undefined} - - -
Report Details Table
- - - - - - - - - - - - - - - - - - - { - Array.from(routeCustomerMap.entries()).filter( - (item) => item[1]?.customer_name?.toLowerCase()?.includes(nameFilter?.toLowerCase()) && ( - !attendFilter || - attendFilter && (item[1].customer_enter_center_time || item[1].customer_leave_center_time) - )) - .filter(item => item[1]?.customer_caller?.toLowerCase()?.includes(callerFilter?.toLowerCase())) - .filter(item => [CUSTOMER_TYPE.MEMBER, CUSTOMER_TYPE.SELF_PAY].includes(item[1].customer_type)) - .filter(item => statusFilter ? (statusFilter !== 'No Status' ? item[1].customer_route_report_status === statusFilter : (!item[1].customer_route_report_status || item[1].customer_route_report_status === statusFilter)):item) - .sort((a, b) => a[1].customer_name > b[1].customer_name ? 1 : -1) - .map(([key, {customer_name, customer_pickup_time, customer_dropoff_time, customer_enter_center_time, customer_leave_center_time, customer_type, customer_caller, customer_route_report_status, customer_vehicle, customer_seating}], index) => { - return ( openForceEditModal(key, customer_enter_center_time, customer_leave_center_time, customer_pickup_time, customer_dropoff_time, customer_route_report_status)}> - - - - - - - - - - - - - ) - }) } - -
No.NameCustomer Route StatusPick Up TimeEnter Center TimeLeave Center TimeDrop Off TimeHours StayedCutomer TypeCallerSeatingVehicle Number
{index+1}{customer_name}{(customer_route_report_status)}{customer_pickup_time && new Date(customer_pickup_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_enter_center_time && new Date(customer_enter_center_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_leave_center_time && new Date(customer_leave_center_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_dropoff_time && new Date(customer_dropoff_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_enter_center_time && customer_leave_center_time && diff_hours(new Date(customer_enter_center_time), new Date(customer_leave_center_time))}{customer_type}{customer_caller}{customer_seating}{customer_vehicle}
+ +
+ + + + + + + + + + + + + + + + + + + { + Array.from(routeCustomerMap.entries()).filter( + (item) => item[1]?.customer_name?.toLowerCase()?.includes(nameFilter?.toLowerCase()) && ( + !attendFilter || + attendFilter && (item[1].customer_enter_center_time || item[1].customer_leave_center_time) + )) + .filter(item => item[1]?.customer_caller?.toLowerCase()?.includes(callerFilter?.toLowerCase())) + .filter(item => [CUSTOMER_TYPE.MEMBER, CUSTOMER_TYPE.SELF_PAY].includes(item[1].customer_type)) + .filter(item => statusFilter ? (statusFilter !== 'No Status' ? item[1].customer_route_report_status === statusFilter : (!item[1].customer_route_report_status || item[1].customer_route_report_status === statusFilter)):item) + .sort((a, b) => a[1].customer_name > b[1].customer_name ? 1 : -1) + .map(([key, {customer_name, customer_pickup_time, customer_dropoff_time, customer_enter_center_time, customer_leave_center_time, customer_type, customer_caller, customer_route_report_status, customer_vehicle, customer_seating}], index) => { + return ( openForceEditModal(key, customer_enter_center_time, customer_leave_center_time, customer_pickup_time, customer_dropoff_time, customer_route_report_status)}> + + + + + + + + + + + + + ) + }) + } + +
No.NameCustomer Route StatusPick Up TimeEnter Center TimeLeave Center TimeDrop Off TimeHours StayedCutomer TypeCallerSeatingVehicle Number
{index+1}{customer_name}{(customer_route_report_status)}{customer_pickup_time && new Date(customer_pickup_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_enter_center_time && new Date(customer_enter_center_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_leave_center_time && new Date(customer_leave_center_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_dropoff_time && new Date(customer_dropoff_time).toLocaleTimeString('en-US', {hour12: false, hour: '2-digit', minute: '2-digit'})}{customer_enter_center_time && customer_leave_center_time && diff_hours(new Date(customer_enter_center_time), new Date(customer_leave_center_time))}{customer_type}{customer_caller}{customer_seating}{customer_vehicle}
+ + + +
+ setShowDateDropdown(!showDateDropdown)} + autoClose="outside" + > + + Select Date to View Report + + + + setShowFilterReportDropdown(!showFilterReportDropdown)} + autoClose="outside" + > + + Filter + + + +
closeModal()}> @@ -677,41 +777,52 @@ const CustomerReport = () => { <> -
- Special Checkin: {if (!customerCheckInTime || customerCheckInTime.length === 0) { setCustomerCheckInTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerCheckInTime} disableClock={true} onChange={setCustomerCheckInTime} /> +
+
+
Special Checkin +
+ {if (!customerCheckInTime || customerCheckInTime.length === 0) { setCustomerCheckInTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerCheckInTime} disableClock={true} onChange={setCustomerCheckInTime} /> +
+
+
Special Checkout +
+ {if (!customerCheckOutTime || customerCheckOutTime.length === 0) { setCustomerCheckOutTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerCheckOutTime} disableClock={true} onChange={setCustomerCheckOutTime} /> +
-
-
- Special Checkout: {if (!customerCheckOutTime || customerCheckOutTime.length === 0) { setCustomerCheckOutTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerCheckOutTime} disableClock={true} onChange={setCustomerCheckOutTime} /> +
+
+
Pickip Time +
+ {if (!customerPickupTime || customerPickupTime.length === 0) { setCustomerPickupTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerPickupTime} disableClock={true} onChange={setCustomerPickupTime} /> +
+
+
Dropoff Time +
+ {if (!customerDropoffTime || customerDropoffTime.length === 0) { setCustomerDropoffTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerDropoffTime} disableClock={true} onChange={setCustomerDropoffTime} /> +
-
-
- Pickup Time: {if (!customerPickupTime || customerPickupTime.length === 0) { setCustomerPickupTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerPickupTime} disableClock={true} onChange={setCustomerPickupTime} /> -
-
-
- Dropoff Time: {if (!customerDropoffTime || customerDropoffTime.length === 0) { setCustomerDropoffTime(new Date())}}} format={'MM/dd/y HH:mm'} value={customerDropoffTime} disableClock={true} onChange={setCustomerDropoffTime} /> -
-
-
- Special Change Customer Route status: - +
+
+
Special Change Customer Route status +
+ +
- - - diff --git a/client/src/components/home/menu.js b/client/src/components/home/menu.js index 4702a3f..b2ef140 100644 --- a/client/src/components/home/menu.js +++ b/client/src/components/home/menu.js @@ -120,10 +120,16 @@ const SideMenu = () => { roleFunc: AuthService.canViewRoutes }, { - name: 'Schedule Driver for Appointment', - link: '#', - roleFunc: AuthService.canViewRoutes + name: 'Customer Report', + link: '/admin/customer-report', + category: '/admin', + roleFunc: AuthService.canViewAttendance } + // { + // name: 'Schedule Driver for Appointment', + // link: '#', + // roleFunc: AuthService.canViewRoutes + // } ] }, { diff --git a/client/src/components/trans-routes/CreateRoute.js b/client/src/components/trans-routes/CreateRoute.js index 500dccb..63cf7ca 100644 --- a/client/src/components/trans-routes/CreateRoute.js +++ b/client/src/components/trans-routes/CreateRoute.js @@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react"; import { useSelector,useDispatch } from "react-redux"; import { useNavigate } from "react-router-dom"; import { selectAllRoutes, transRoutesSlice, vehicleSlice, selectTomorrowAllRoutes, selectAllActiveDrivers, selectAllActiveVehicles, transRouteTemplatesSlice, selectAllActiveRouteTemplates, selectInboundRouteTemplates, selectOutboundRouteTemplates } from "./../../store"; -import { Modal, Button } from "react-bootstrap"; +import { Modal, Button, Breadcrumb, Tabs, Tab } from "react-bootstrap"; import RouteCustomerEditor from "./RouteCustomerEditor"; import { AuthService } from "../../services"; import moment from 'moment'; @@ -71,7 +71,8 @@ const CreateRoute = () => { } const redirectToDashboard = () => { - navigate(`/trans-routes/dashboard`); + const date =params.get('date'); + navigate(`/trans-routes/dashboard?dateSchedule=${date}`); } const goToTemplateList = () => { @@ -173,99 +174,192 @@ const CreateRoute = () => { return ( <>
+ + Transportation + + Transportation Routes + +
-
Create New Route
+

+ Create New Route +

-
-
- - -
- {errorMessage &&
{errorMessage}
} - -
-
-
- Save As Template: setSaveAsTemplate(!saveAsTemplate)}/> + +
+
+ + +
+
+
+
Route Details
+ + {((params.get('type')==="inbound" && inboundTemplates?.length>0) ||(params.get('type')==="outbound" && outboundTemplates?.length>0)) &&
+
+ Use Existed Template +
+ + {/* */} +
} + +
+
+
Route Name + * +
+ setRouteName(e.target.value)}/> +
+
+
Vechile + * +
+ +
+
+
+
+
Driver + * +
+ +
+
+
Route Type + * +
+ +
+
+
+ Save As Template: setSaveAsTemplate(!saveAsTemplate)}/> +
+
+
+
+ +
+
+
+
+ + + +
+ {errorMessage &&
{errorMessage}
} + +
+
+
+ { newVehicle && newVehicle !== '' &&
+
Vehicle Information
+
+
+
Vehicle Number
+
{vehicles.find(item => item.id === newVehicle)?.vehicle_number}
+
+
+
Seating Capacity
+
{vehicles.find(item => item.id === newVehicle)?.capacity}
+
+
+
Mileage
+
{vehicles.find(item => item.id === newVehicle)?.mileage}
+
+
+
Make
+
{vehicles.find(item => item.id === newVehicle)?.make}
+
+
+
Model
+
{vehicles.find(item => item.id === newVehicle)?.model}
+
+
+
+
+
License Plate
+
{vehicles.find(item => item.id === newVehicle)?.tag}
+
+
+
Year
+
{vehicles.find(item => item.id === newVehicle)?.year}
+
+
+
GPS ID
+
{vehicles.find(item => item.id === newVehicle)?.gps_tag}
+
+
+
EZPass
+
{vehicles.find(item => item.id === newVehicle)?.ezpass}
+
+
+
Vin
+
{vehicles.find(item => item.id === newVehicle)?.vin || ''}
+
+
+
} + { + newDriver && newDriver !== '' &&
+
Driver Information
+
Personal Details
+
+
+
Driver Name
+
{drivers.find(item => item.id === newDriver)?.name}
+
+
+
Preferred Name
+
{drivers.find(item => item.id === newDriver)?.name_cn}
+
+
+
Job Title
+
{drivers.find(item => item.id === newDriver)?.title}
+
+
+
Job Status
+
{vehicles.find(item => item.id === newVehicle)?.employment_status}
+
+ +
+
+
+
Driver Capacity
+
{drivers.find(item => item.id === newDriver)?.driver_capacity}
+
+
+
Phone Number
+
{drivers.find(item => item.id === newDriver)?.phone}
+
+
+
Email
+
{vehicles.find(item => item.id === newVehicle)?.email}
+
+ +
+
+ } +
+
+
+
- {((params.get('type')==="inbound" && inboundTemplates?.length>0) ||(params.get('type')==="outbound" && outboundTemplates?.length>0)) &&
-
- Use Existed Template: - -
-
} -
-
- Name(*): setRouteName(e.target.value)}/> -
-
Vehicle(*): -
-
Driver(*): -
-
Type(*): -
-
-
-
- -
-
- { newVehicle && newVehicle !== '' && (
-
-
Vehicle Info
-
-
Vehicle Number: {vehicles.find(item => item.id === newVehicle)?.vehicle_number}
-
Tag: {vehicles.find(item => item.id === newVehicle)?.tag}
-
EzPass: {vehicles.find(item => item.id === newVehicle)?.ezpass}
-
GPS: {vehicles.find(item => item.id === newVehicle)?.gps_tag}
-
Capacity: {vehicles.find(item => item.id === newVehicle)?.capacity}
-
Status: {vehicles.find(item => item.id === newVehicle)?.status}
-
Mileage: {vehicles.find(item => item.id === newVehicle)?.mileage}
-
-
-
)} - { newDriver && newDriver !== '' && (
-
-
Driver Info
-
-
Name: {drivers.find(item => item.id === newDriver)?.name}
-
Preferred Name: {drivers.find(item => item.id === newDriver)?.name_cn}
-
Driver Capacity: {drivers.find(item => item.id === newDriver)?.driver_capacity}
-
Roles: {drivers.find(item => item.id === newDriver)?.roles}
-
Phone: {drivers.find(item => item.id === newDriver)?.phone}
-
Email: {drivers.find(item => item.id === newDriver)?.email}
-
Employment Status: {drivers.find(item => item.id === newDriver)?.employment_status}
-
-
-
)} - { newVehicle && newVehicle !== '' && (
-
-
Vehicle Checklist
- { currentVehicle?.checklist?.length > 0 && ( - - {currentVehicle.checklist.map((item, index) => ())} - -
{item}
) } -
-
-
- -
)} + closeAddCheckItemModal()}> Add New Checklist Item diff --git a/client/src/components/trans-routes/PersonnelInfoTable.js b/client/src/components/trans-routes/PersonnelInfoTable.js index 1288d00..31d9e39 100644 --- a/client/src/components/trans-routes/PersonnelInfoTable.js +++ b/client/src/components/trans-routes/PersonnelInfoTable.js @@ -482,7 +482,7 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo,
)} {showGroupInfo && (
- + Generate Route Reports {transRoutes[0].type === 'inbound' && } @@ -544,7 +544,7 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, - + {showCompletedInfo && ()} {showCompletedInfo && ()} @@ -604,7 +604,7 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, .sort((a, b) => a.customer_name.replace(' ', '') > b.customer_name.replace(' ', '') ? 1: -1 ) .map((customer, index) => { return ( - + @@ -656,7 +656,7 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, .map((customerItem, index) => { if (!customerItem.customer_group) { return ( - + @@ -666,8 +666,8 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, {showCompletedInfo && ()} - - + {allowForceEdit && { customerItem.customers?.map((customer) => ( openForceEditModal(customer)}> - + @@ -723,8 +723,8 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, {showCompletedInfo && ()} -
No.No. NameAddressTel
{index} {index} { customer.customer_name}
{customerItem.index}{customerItem.index + 1} { customerItem.customer_name} { customerItem.customer_phone } - { getTextAndClassName(customerItem).text } +
+ { getTextAndClassName(customerItem).text }
{ CUSTOMER_TYPE_TEXT[customerItem.customer_type]} @@ -704,7 +704,7 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, } else { return (
{customerItem.customer_group} {customerItem.customers[0]?.customer_group_address} @@ -713,7 +713,7 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo,
{customer.index}{customer.index + 1} { customer.customer_name} { customer.customer_phone } - { getTextAndClassName(customer).text } +
+ { getTextAndClassName(customerItem).text }
{ CUSTOMER_TYPE_TEXT[customer.customer_type]} @@ -772,72 +772,90 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, <> - {isInbound &&
- Estimated Pickup: -
} -
-
- Change Address Just For This Trip: - setCustomerAddressOverride((e.currentTarget.value))} /> - {/* */} -
-
-
- Special Checkin: {if (!customerCheckInTime || customerCheckInTime.length === 0) { setCustomerCheckInTime(new Date())}}} value={customerCheckInTime} onChange={setCustomerCheckInTime} /> -
-
-
- Special Checkout: {if (!customerCheckOutTime || customerCheckOutTime.length === 0) { setCustomerCheckOutTime(new Date())}}} value={customerCheckOutTime} onChange={setCustomerCheckOutTime} /> -
-
-
- Special Pickup: {if (!customerPickUpTime || customerPickUpTime.length === 0) { setCustomerPickUpTime(new Date())}}} value={customerPickUpTime} onChange={setCustomerPickUpTime} /> -
-
-
- Special Dropoff: {if (!customerDropOffTime || customerDropOffTime.length === 0) { setCustomerDropOffTime(new Date())}}} value={customerDropOffTime} onChange={setCustomerDropOffTime} /> -
-
-
- Special Set User Route Status: setCustomerAddressOverride((e.currentTarget.value))} /> +
+ +
+
+
Special Checkin +
+ {if (!customerCheckInTime || customerCheckInTime.length === 0) { setCustomerCheckInTime(new Date())}}} value={customerCheckInTime} onChange={setCustomerCheckInTime} /> +
+
+
Special Checkout +
+ {if (!customerCheckOutTime || customerCheckOutTime.length === 0) { setCustomerCheckOutTime(new Date())}}} value={customerCheckOutTime} onChange={setCustomerCheckOutTime} /> +
+
+
Special Pickup +
+ {if (!customerPickUpTime || customerPickUpTime.length === 0) { setCustomerPickUpTime(new Date())}}} value={customerPickUpTime} onChange={setCustomerPickUpTime} /> +
+
+
Special Dropoff +
+ {if (!customerDropOffTime || customerDropOffTime.length === 0) { setCustomerDropOffTime(new Date())}}} value={customerDropOffTime} onChange={setCustomerDropOffTime} /> +
+
- - -
-
- {/* Disable User in This Route: setDisableCustomerInRoute(!disableCustomerInRoute)} /> */} - Special Set User Pickup Status: -
-
- Note: -
-
-
- Transfer To Route: {setCustomerTransferToRoute(e.target.value)}}/> +
+
+
Special Set User Route Status +
+ +
+
+
Special Set User Pickup Status +
+ +
+ +
+
+
+
Transfer To Route +
+ {setCustomerTransferToRoute(e.target.value)}}/> +
+ +
+
+
Note +
+ +
+
- - @@ -848,44 +866,55 @@ const PersonnelInfoTable = ({transRoutes, showCompletedInfo, <> - {isInbound &&
- Estimated Pickup: -
} -
-
- Special Checkin: {if (!customerCheckInTime || customerCheckInTime.length === 0) { setCustomerCheckInTime(new Date())}}} value={customerCheckInTime} onChange={setCustomerCheckInTime} /> -
-
-
- Special Checkout: {if (!customerCheckOutTime || customerCheckOutTime.length === 0) { setCustomerCheckOutTime(new Date())}}} value={customerCheckOutTime} onChange={setCustomerCheckOutTime} /> -
-
-
- Special Pickup: {if (!customerPickUpTime || customerPickUpTime.length === 0) { setCustomerPickUpTime(new Date())}}} value={customerPickUpTime} onChange={setCustomerPickUpTime} /> -
-
-
- Special Dropoff: {if (!customerDropOffTime || customerDropOffTime.length === 0) { setCustomerDropOffTime(new Date())}}} value={customerDropOffTime} onChange={setCustomerDropOffTime} /> -
-
-
- Special Set Users Route Status: {setCustomerStatusInRoute(e.currentTarget.value)}}> + + { + Object.entries(PERSONAL_ROUTE_STATUS).map((item) => ) + } - -
+ +
+ +
+
+
Special Checkin +
+ {if (!customerCheckInTime || customerCheckInTime.length === 0) { setCustomerCheckInTime(new Date())}}} value={customerCheckInTime} onChange={setCustomerCheckInTime} /> +
+
+
Special Checkout +
+ {if (!customerCheckOutTime || customerCheckOutTime.length === 0) { setCustomerCheckOutTime(new Date())}}} value={customerCheckOutTime} onChange={setCustomerCheckOutTime} /> +
+
+
Special Pickup +
+ {if (!customerPickUpTime || customerPickUpTime.length === 0) { setCustomerPickUpTime(new Date())}}} value={customerPickUpTime} onChange={setCustomerPickUpTime} /> +
+
+
Special Dropoff +
+ {if (!customerDropOffTime || customerDropOffTime.length === 0) { setCustomerDropOffTime(new Date())}}} value={customerDropOffTime} onChange={setCustomerDropOffTime} /> +
+
- - diff --git a/client/src/components/trans-routes/RouteCustomerEditor.js b/client/src/components/trans-routes/RouteCustomerEditor.js index 31974df..e50ce9f 100644 --- a/client/src/components/trans-routes/RouteCustomerEditor.js +++ b/client/src/components/trans-routes/RouteCustomerEditor.js @@ -6,6 +6,7 @@ import { Modal, Button } from "react-bootstrap"; import { CustomerService } from '../../services'; import { PERSONAL_ROUTE_STATUS } from '../../shared'; import ReactPaginate from 'react-paginate'; +import { GripVertical, Pencil, RecordCircleFill, XSquare } from 'react-bootstrap-icons'; const ItemTypes = { @@ -78,7 +79,7 @@ const Card = ({ content, index, moveCard }) => { ) } -const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { +const RouteCustomerEditor = ({currentRoute, setNewCustomerList = (a) => {}, viewMode, editFun}) => { const [customers, setCustomers] = useState([]); const [showAddPersonnelModal, setShowAddPersonnelModal] = useState(false); const [showAddAptGroupModal, setShowAddAptGroupModal] = useState(false); @@ -409,6 +410,20 @@ const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { ) } + const getCurrentAssignedNumber = () => { + let count = 0; + for (const item of customers) { + if (item.customers) { + for (const customer of item.customers) { + count++; + } + } else { + count++; + } + } + return count; + } + useEffect(() => { const result = []; for (const item of customers) { @@ -427,59 +442,103 @@ const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { return ( -
Personnel List
-
-
- - -
-
-
- {customers.map((item, index) => { + { !viewMode &&
Customers Assigned ({getCurrentAssignedNumber()})
} + { viewMode &&
Route Assignment
} + {!viewMode &&
+ {customers.map((item, index) => { if (item?.customers) { return - +
{`Stop ${index+1}`}
+
openEditAptGroupModal(index, item)}> {item.customer_group} {item.customers[0]?.customer_group_address}
{item.customers.map(customer =>
- {customer.customer_name} - {customer.customer_address} - {customer.customer_pickup_status} + + {customer.customer_name} + {customer.customer_address} + {customer.customer_pickup_status}
)}
-
+
)}> } else { return - +
{`Stop ${index+1}`}
+
{item.customer_name} {item.customer_address} {item.customer_pickup_status}
-
+
}> } })} - +
+
{`Stop ${customers?.length+1}`}
+
+ + +
+ +
+ } + { + viewMode &&
+ {customers.map((item, index) => { + if (item?.customers) { + return
+
{`Stop ${index+1}`}
+
openEditAptGroupModal(index, item)}> + {item.customer_group} {item.customers[0]?.customer_group_address} +
{item.customers.map(customer => +
+ + {customer.customer_name} + {customer.customer_address} + {customer.customer_pickup_status} +
)} +
+
+
+ } else { + return
+
{`Stop ${index+1}`}
+
+ {item.customer_name} + {item.customer_address} + {item.customer_pickup_status} +
+
+ } + })} +
+ } closeAddPersonnelModal()}> Add Personnel <> -
Type in UserId OR Name OR Address to Search:
- setCustomerFilter(e.target.value)}/> -
- {['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'].map(item => { - return {setLastNameFilter(item?.toLowerCase())} }>{item} - })} +
+
+
Type in UserId OR Name OR Address to Search +
+ setCustomerFilter(e.target.value)}/> +
+
+
+ {['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'].map(item => { + return {setLastNameFilter(item?.toLowerCase())} }>{item} + })} +
+
setLastNameFilter(undefined)}>Clear All
@@ -507,10 +566,10 @@ const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { - - @@ -522,16 +581,36 @@ const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { <> -
Group Name(Required): setNewGroupNameAction(e.target.value)}/>
-
Group Address(Required): setNewGroupAddressAction(e.target.value)}/>
-
Type in user Id or Name to Search:
- setCustomerFilter(e.target.value)}/> -
- {['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'].map(item => { - return {setLastNameFilter(item?.toLowerCase())} }>{item} - })} +
+
+
Group Name + * +
+ setNewGroupNameAction(e.target.value)}/> +
+
+
Group Address + * +
+ setNewGroupAddressAction(e.target.value)}/> +
+
+
+
+
Type in user Id or Name to Search +
+ setCustomerFilter(e.target.value)}/> +
+
+
+ {['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'].map(item => { + return {setLastNameFilter(item?.toLowerCase())} }>{item} + })} + +
+
setLastNameFilter(undefined)}>Clear All
@@ -559,10 +638,10 @@ const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { - - @@ -574,16 +653,36 @@ const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { <> -
Group Name(Required): setNewGroupNameAction(e.target.value)}/>
-
Group Address(Required): setNewGroupAddressAction(e.target.value)}/>
-
Type in user Id or Name to Search:
- setCustomerFilter(e.target.value)}/> -
- {['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'].map(item => { - return {setLastNameFilter(item?.toLowerCase())} }>{item} - })} +
+
+
Group Name + * +
+ setNewGroupNameAction(e.target.value)}/> +
+
+
Group Address + * +
+ setNewGroupAddressAction(e.target.value)}/> +
+
+
+
+
Type in user Id or Name to Search +
+ setCustomerFilter(e.target.value)}/> +
+
+
+ {['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'].map(item => { + return {setLastNameFilter(item?.toLowerCase())} }>{item} + })} + +
+
setLastNameFilter(undefined)}>Clear All
@@ -611,10 +710,10 @@ const RouteCustomerEditor = ({currentRoute, setNewCustomerList}) => { - - diff --git a/client/src/components/trans-routes/RouteEdit.js b/client/src/components/trans-routes/RouteEdit.js index 972c3da..f0391b4 100644 --- a/client/src/components/trans-routes/RouteEdit.js +++ b/client/src/components/trans-routes/RouteEdit.js @@ -2,12 +2,14 @@ import React, {useEffect, useState} from "react"; import { useSelector,useDispatch } from "react-redux"; import { useParams, useNavigate } from "react-router-dom"; import { selectAllRoutes, transRoutesSlice, vehicleSlice, selectTomorrowAllRoutes, selectAllActiveDrivers, selectAllActiveVehicles, selectHistoryRoutes } from "./../../store"; -import { Modal, Button } from "react-bootstrap"; +import { Modal, Button, Breadcrumb, Tabs, Tab } from "react-bootstrap"; import RouteCustomerEditor from "./RouteCustomerEditor"; import { AuthService, TransRoutesService } from "../../services"; import TimePicker from 'react-time-picker'; import 'react-time-picker/dist/TimePicker.css'; import moment from 'moment'; +import { Archive, GripVertical } from "react-bootstrap-icons"; +import { PERSONAL_ROUTE_STATUS } from "../../shared"; const RouteEdit = () => { const params = useParams(); @@ -36,6 +38,7 @@ const RouteEdit = () => { const [currentRoute, setCurrentRoute] = useState(undefined); const paramsQuery = new URLSearchParams(window.location.search); const scheduleDate = paramsQuery.get('dateSchedule'); + const editSection = paramsQuery.get('editSection') const redirectToView = () => { if (scheduleDate) { navigate(`/trans-routes/${params.id}?dateSchedule=${scheduleDate}`); @@ -105,7 +108,7 @@ const RouteEdit = () => { } const showAddCheckItemModal = () => { - setNewChecklistItems(currentVehicle.checklist) + setNewChecklistItems(currentVehicle.checklist || []) setShowAddCheckItem(true); } @@ -162,94 +165,229 @@ const RouteEdit = () => { return ( <>
+ + Transportation + + Transportation Routes + +
-
{currentRoute?.name}
+

+ Edit Route Information +

-
-
- - - -
- {errorMessage &&
{errorMessage}
} -
-
-
- Name(*): setRouteName(e.target.value)}/> -
-
Vehicle(*): -
-
Driver(*): -
-
Type(*): -
- { - newRouteType === 'outbound' && (
- Estimated Start TIme: -
) - } -
-
-
- -
-
- { newVehicle && newVehicle !== '' && (
-
-
Vehicle Info
-
-
Vehicle Number: {vehicles.find(item => item.id === newVehicle)?.vehicle_number}
-
Tag: {vehicles.find(item => item.id === newVehicle)?.tag}
-
EzPass: {vehicles.find(item => item.id === newVehicle)?.ezpass}
-
GPS: {vehicles.find(item => item.id === newVehicle)?.gps_tag}
-
Capacity: {vehicles.find(item => item.id === newVehicle)?.capacity}
-
Status: {vehicles.find(item => item.id === newVehicle)?.status}
-
Mileage: {vehicles.find(item => item.id === newVehicle)?.mileage}
-
+ +
+
+ + + { editSection === 'info' &&
+
+
+
Route Details
+
+
+
Route Name + * +
+ setRouteName(e.target.value)}/> +
+
+
Vechile + * +
+ +
+
+
+
+
Driver + * +
+ +
+
+
Route Type + * +
+ +
+
+ { newRouteType === 'outbound' &&
+
+
Estimated Start Time +
+ +
+
} +
+
+
Vehicle Checklist +
+ { currentVehicle?.checklist?.length > 0 && ( + + {currentVehicle.checklist.map((item, index) => ())} + +
{item}
) } +
+
+
+
+
+
+ + +
+ {errorMessage &&
{errorMessage}
} +
+
+
+
+ { newVehicle && newVehicle !== '' &&
+
Vehicle Information
+
+
+
Vehicle Number
+
{vehicles.find(item => item.id === newVehicle)?.vehicle_number}
+
+
+
Seating Capacity
+
{vehicles.find(item => item.id === newVehicle)?.capacity}
+
+
+
Mileage
+
{vehicles.find(item => item.id === newVehicle)?.mileage}
+
+
+
Make
+
{vehicles.find(item => item.id === newVehicle)?.make}
+
+
+
Model
+
{vehicles.find(item => item.id === newVehicle)?.model}
+
+
+
+
+
License Plate
+
{vehicles.find(item => item.id === newVehicle)?.tag}
+
+
+
Year
+
{vehicles.find(item => item.id === newVehicle)?.year}
+
+
+
GPS ID
+
{vehicles.find(item => item.id === newVehicle)?.gps_tag}
+
+
+
EZPass
+
{vehicles.find(item => item.id === newVehicle)?.ezpass}
+
+
+
Vin
+
{vehicles.find(item => item.id === newVehicle)?.vin || ''}
+
+
+
} + { + newDriver && newDriver !== '' &&
+
Driver Information
+
Personal Details
+
+
+
Driver Name
+
{drivers.find(item => item.id === newDriver)?.name}
+
+
+
Preferred Name
+
{drivers.find(item => item.id === newDriver)?.name_cn}
+
+
+
Job Title
+
{drivers.find(item => item.id === newDriver)?.title}
+
+
+
Job Status
+
{vehicles.find(item => item.id === newVehicle)?.employment_status}
+
+ +
+
+
+
Driver Capacity
+
{drivers.find(item => item.id === newDriver)?.driver_capacity}
+
+
+
Phone Number
+
{drivers.find(item => item.id === newDriver)?.phone}
+
+
+
Email
+
{vehicles.find(item => item.id === newVehicle)?.email}
+
+ +
+
+ } +
+
} + + { + editSection === 'assignment' &&
+
+
+
+ +
+
+
+
+
+
Scheduled Absences ({currentRoute?.route_customer_list?.filter(item => item?.customer_route_status === PERSONAL_ROUTE_STATUS.SCHEDULED_ABSENT)?.length || 0})
+
+ { + currentRoute?.route_customer_list.filter(customer => customer?.customer_route_status === PERSONAL_ROUTE_STATUS.SCHEDULED_ABSENT)?.map((abItem) => { + return
+ +
+ {abItem.customer_name} + {abItem.customer_address} + {abItem.customer_pickup_status} +
+ +
+ }) + } +
+
+
+
+ } +
+
+
+
-
)} - { newDriver && newDriver !== '' && (
-
-
Driver Info
-
-
Name: {drivers.find(item => item.id === newDriver)?.name}
-
Preferred Name: {drivers.find(item => item.id === newDriver)?.name_cn}
-
Driver Capacity: {drivers.find(item => item.id === newDriver)?.driver_capacity}
-
Roles: {drivers.find(item => item.id === newDriver)?.roles}
-
Phone: {drivers.find(item => item.id === newDriver)?.phone}
-
Email: {drivers.find(item => item.id === newDriver)?.email}
-
Employment Status: {drivers.find(item => item.id === newDriver)?.employment_status}
-
-
-
)} -
-
-
Vehicle Checklist
- { currentVehicle?.checklist?.length > 0 && ( - - {currentVehicle.checklist.map((item, index) => ())} - -
{item}
) } -
-
-
+ + closeAddCheckItemModal()}> Add New Checklist Item <> - {newChecklistItems.map((item, index) => (
setNewChecklistItems([...newChecklistItems].map((a, index1) => {if (index1 === index) {return e.target.value;} return a;}))}/> + {newChecklistItems?.map((item, index) => (
setNewChecklistItems([...newChecklistItems].map((a, index1) => {if (index1 === index) {return e.target.value;} return a;}))}/>
))} diff --git a/client/src/components/trans-routes/RouteView.js b/client/src/components/trans-routes/RouteView.js index 6efec86..5bacc1f 100644 --- a/client/src/components/trans-routes/RouteView.js +++ b/client/src/components/trans-routes/RouteView.js @@ -3,9 +3,11 @@ import { useSelector } from "react-redux"; import { useParams, useNavigate } from "react-router-dom"; import { selectAllRoutes, selectTomorrowAllRoutes, selectAllActiveDrivers, selectAllActiveVehicles, selectHistoryRoutes } from "./../../store"; import PersonnelSection from "./PersonnelSection"; -import { Modal, Button } from "react-bootstrap"; import { AuthService, CustomerService, SignatureRequestService } from "../../services"; import moment from 'moment'; +import { Breadcrumb, Tabs, Tab, Dropdown, Spinner, Modal, Button } from "react-bootstrap"; +import { Download, Pencil } from "react-bootstrap-icons"; +import RouteCustomerEditor from "./RouteCustomerEditor"; const RouteView = () => { const params = useParams(); @@ -42,21 +44,13 @@ const RouteView = () => { } } const directToDashboad = () => { - if (tomorrowRoutes.find(item => item.id === params.id)) { - navigate(`/trans-routes/schedule?dateSchedule=${moment(tomorrowRoutes.find(item => item.id === params.id).schedule_date).format('YYYY-MM-DD')}`); - } else { - if (historyRoutes.find(item => item.id === params.id)) { - navigate(`/trans-routes/history`); - } else { - navigate(`/trans-routes/dashboard`); - } - } + navigate(`/trans-routes/dashboard?dateSchedule=${moment(currentRoute?.schedule_date).format('YYYY-MM-DD')}`); } - const edit = () => { + const edit = (editSection) => { if (scheduleDate) { - navigate(`/trans-routes/edit/${currentRoute?.id}?dateSchedule=${scheduleDate}`) + navigate(`/trans-routes/edit/${currentRoute?.id}?dateSchedule=${scheduleDate}&editSection=${editSection}`) } else { - navigate(`/trans-routes/edit/${currentRoute?.id}`) + navigate(`/trans-routes/edit/${currentRoute?.id}?editSection=${editSection}`) } } const deleteFile = () => { @@ -93,51 +87,114 @@ const RouteView = () => { }, [currentRoute]); return ( <> -
-
-
{currentRoute?.name} {AuthService.canAddOrEditRoutes() && }
-
-
-
-
Vehicle Number: {currentVehicle?.vehicle_number}
-
Total Customers: {currentRoute?.route_customer_list?.length || 0}
-
Driver Name: {currentDriver?.name}
-
Route Type: { currentRoute?.type }
- {signature &&
Driver Signature: {signature && }
} - {!signature && !signatureRequest &&
} -
-
-
Route Start Time: {currentRoute?.start_time && (new Date(currentRoute?.start_time))?.toLocaleTimeString()}
-
Route End Time: {currentRoute?.end_time && (new Date(currentRoute?.end_time))?.toLocaleTimeString()}
- {currentRoute?.type === 'inbound' &&
Arrive Center Time: {currentRoute?.end_time && (new Date(currentRoute?.end_time))?.toLocaleTimeString()}
} - {currentRoute?.type === 'outbound' &&
Leave Center Time: {currentRoute?.start_time && (new Date(currentRoute?.start_time))?.toLocaleTimeString()}
} - {currentRoute?.type === 'outbound' &&
Estimated Start Time: {currentRoute?.estimated_start_time && (new Date(currentRoute?.estimated_start_time))?.toLocaleTimeString()}
} -
-
-
Start Mileage: { currentRoute?.start_mileage}
-
End Mileage: { currentRoute?.end_mileage}
- -
-
{!signature && signatureRequest &&
-
Please send this to the driver to get signature:
-
{`${window.location.origin}/signature/${signatureRequest?.id}`}
-
}
-
-
-
- {currentRoute && } + + Transportation + + Transportation Routes + + +
+

+ View Route Information +

-

-
-
Checklist:
- {currentRoute && currentRoute?.checklist_result?.map(item =>
{`${item?.item}: ${item?.result ? 'Yes': "No"}`}
)} - {currentRoute && currentRoute?.checklist_result.length === 0 && <>No Checklist found} +
+
+ + +
Route Details
+
+
+
Route Name
+
{currentRoute?.name}
+
+
+
Vehicle
+
{currentVehicle?.vehicle_number}
+
+
+
Driver
+
{currentDriver?.name}
+
+
+
Route Type
+
{currentRoute?.type}
+
+
+
+
+
Route Start Time
+
{currentRoute?.start_time && (new Date(currentRoute?.start_time))?.toLocaleTimeString()}
+
+
+
Route End Time
+
{currentRoute?.end_time && (new Date(currentRoute?.end_time))?.toLocaleTimeString()}
+
+ {currentRoute?.type === 'inbound' &&
+
Arrive Center Time
+
{currentRoute?.end_time && (new Date(currentRoute?.end_time))?.toLocaleTimeString()}
+
} + {currentRoute?.type === 'outbound' &&
+
Leave Center Time
+
{currentRoute?.start_time && (new Date(currentRoute?.start_time))?.toLocaleTimeString()}
+
} + {currentRoute?.type === 'outbound' &&
+
Estimated Start Time
+
{currentRoute?.estimated_start_time && (new Date(currentRoute?.estimated_start_time))?.toLocaleTimeString()}
+
} +
+
+
+
Start Mileage
+
{ currentRoute?.start_mileage}
+
+
+
End Mileage
+
{ currentRoute?.end_mileage}
+
+
+
+ {signature &&
+
Driver Signature
+
+ {signature && } + +
+
} + {!signature && !signatureRequest &&
+
Signature Request
+
+
} + {!signature && signatureRequest &&
+
Please send this to the driver to get signature:
+
{`${window.location.origin}/signature/${signatureRequest?.id}`}
+
} +
+
+
+
Checklist
+
+ {currentRoute && currentRoute?.checklist_result?.map(item =>
{`${item?.item}: ${item?.result ? 'Yes': "No"}`}
)} + {currentRoute && currentRoute?.checklist_result.length === 0 && <>No Checklist found}
+
+
+ +
+ +
+
+ {currentRoute && } +
+
+
+
+
+ +
-
- - closeModal()}> + closeModal()}> Vehicle Info @@ -158,6 +215,9 @@ const RouteView = () => { +
+ + ); diff --git a/client/src/components/trans-routes/RoutesDashboard.js b/client/src/components/trans-routes/RoutesDashboard.js index b47676c..b158f0f 100644 --- a/client/src/components/trans-routes/RoutesDashboard.js +++ b/client/src/components/trans-routes/RoutesDashboard.js @@ -1105,7 +1105,7 @@ const RoutesDashboard = () => { show={showOriginDateDropdown} disabled onToggle={() => setShowOriginDateDropdown(!showOriginDateDropdown)} - autoClose="outside" + autoClose={false} > Select Date to View & Copy From @@ -1118,7 +1118,7 @@ const RoutesDashboard = () => { className="me-2" show={showTargetDateDropdown} onToggle={() => setShowTargetDateDropdown(!showTargetDateDropdown)} - autoClose="outside" + autoClose={false} > Select Date to Copy To @@ -1166,8 +1166,8 @@ const RoutesDashboard = () => { { currentTab === 'allRoutesStatus' && <> {/* setKeyword(e.currentTarget.value)} /> */} setShowDateDropdown(!showDateDropdown)} diff --git a/client/src/components/vehicles/ViewVehicle.js b/client/src/components/vehicles/ViewVehicle.js index 91347d0..588c88c 100644 --- a/client/src/components/vehicles/ViewVehicle.js +++ b/client/src/components/vehicles/ViewVehicle.js @@ -121,7 +121,7 @@ const ViewVehicle = () => {
- +