-
-
-
View Resource Details
-
-
-
-
-
Name:
{currentResource?.name}
-
-
-
Specialty:
- {currentResource?.specialty}
-
-
-
type:
- {currentResource?.type}
-
- {/*
-
Category:
- {currentResource?.category}
-
*/}
-
-
Description:
- {currentResource?.description}
-
-
-
Color:
- {currentResource?.color}
-
-
-
Address:
- {currentResource?.address}
-
-
-
Contact:
- {currentResource?.contact}
-
-
-
Phone:
- {currentResource?.phone}
-
-
-
Fax:
- {currentResource?.fax}
-
-
-
Note:
- {currentResource?.note}
-
-
-
Status:
- {currentResource?.status}
-
-
-
+
+
+ Medical
+
+ Provider Information
+
+
+ View Provider Details
+
+
+
+
View Provider Information
+
+
+
+
+
+
+
+
+
+
-
>
);
};
diff --git a/client/src/components/vehicles/CreateVehicle.js b/client/src/components/vehicles/CreateVehicle.js
index b41792e..57f65cf 100644
--- a/client/src/components/vehicles/CreateVehicle.js
+++ b/client/src/components/vehicles/CreateVehicle.js
@@ -3,6 +3,7 @@ import { useSelector,useDispatch } from "react-redux";
import { useNavigate } from "react-router-dom";
import { vehicleSlice, selectVehicleError } from "./../../store";
import { AuthService } from "../../services";
+import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab } from "react-bootstrap";
const CreateVehicle = () => {
const navigate = useNavigate();
@@ -33,10 +34,15 @@ const CreateVehicle = () => {
if (redirect === 'schedule') {
navigate(`/trans-routes/schedule`);
} else {
- navigate(`/trans-routes/dashboard`);
+ // navigate(`/trans-routes/dashboard`);
+ redirectToList();
}
}
+ const redirectToList = () => {
+ navigate('/vehicles/list')
+ }
+
const addItemToArray = () => {
const arr = [...checklist, ''];
setChecklist(arr);
@@ -63,55 +69,70 @@ const CreateVehicle = () => {
return (
<>
-
-
Create New Vehicle
+
+ Transportation
+
+ Vehicles Information
+
+
+ Create New Vehicle
+
+
+
+
Create New Vechile
-
-
-
Vehicle Number(*):
setVehicleNumber(e.target.value)}/>
-
-
-
Tag(*):
setTag(e.target.value)}/>
-
-
-
EZ Pass:
setEzpass(e.target.value)}/>
-
-
-
GPS:
setGps(e.target.value)}/>
-
-
-
Make:
setMake(e.target.value)}/>
-
-
-
Model:
setVehicleModel(e.target.value)}/>
-
-
-
Year:
setYear(e.target.value)}/>
-
-
-
Mileage(*):
setMileage(e.target.value)}/>
-
-
-
Capacity(*):
setCapacity(e.target.value)}/>
-
-
-
Checklist(*):
- {checklist.map((item, index) => (
setChecklist([...checklist].map((a, index1) => {if (index1 === index) {return e.target.value;} return a;}))}/>
-
-
))}
-
+
+
+
+
+ Vehicle Information
+
+
+
Vehicle Number
+ *
+
+
setVehicleNumber(e.target.value)}/>
+
+
+
+
+
+
+
+
+
+
+
+ {/* Lift Equipped & VIN Number would be added later */}
+
+ {/* Vehicle Maintenance & Compliance would be added later */}
+ Check List
+
+ {checklist.map((item, index) => (
setChecklist([...checklist].map((a, index1) => {if (index1 === index) {return e.target.value;} return a;}))}/>
+
+
))}
+
+ {/* Note would be added later */}
+
+ {error &&
+ {error}
+
}
+
+
+
+
+
+
+
+ Coming soon...
+
+
+ Coming soon...
+
+
-
-
- {error &&
- {error}
-
}
-
-
-
-
-
+
>
);
};
diff --git a/client/src/components/vehicles/UpdateVehicle.js b/client/src/components/vehicles/UpdateVehicle.js
index f28c6a5..55f97d9 100644
--- a/client/src/components/vehicles/UpdateVehicle.js
+++ b/client/src/components/vehicles/UpdateVehicle.js
@@ -3,6 +3,8 @@ import { useSelector,useDispatch } from "react-redux";
import { useNavigate, useParams } from "react-router-dom";
import { vehicleSlice, selectVehicleError } from "./../../store";
import { AuthService } from "../../services";
+import { Archive } from "react-bootstrap-icons";
+import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab } from "react-bootstrap";
const UpdateVehicle = () => {
const navigate = useNavigate();
@@ -108,6 +110,74 @@ const UpdateVehicle = () => {
return (
<>
+
+ Transportation
+
+ Vehicles Information
+
+
+ Update Vehicle Information
+
+
+
+
Update Vehicle Information
+
+
+
+
+
+
+ Vehicle Information
+
+
+
Vehicle Number
+ *
+
+
setVehicleNumber(e.target.value)}/>
+
+
+
+
+
+
+
+
+
+
+
+ {/* Lift Equipped & VIN Number would be added later */}
+
+ {/* Vehicle Maintenance & Compliance would be added later */}
+ Check List
+
+ {checklist.map((item, index) => (
setChecklist([...checklist].map((a, index1) => {if (index1 === index) {return e.target.value;} return a;}))}/>
+
+
))}
+
+ {/* Note would be added later */}
+
+ {error &&
+ {error}
+
}
+
+
+
+
+
+
+
+ Coming soon...
+
+
+ Coming soon...
+
+
+
+
+
+
+
+ {/*
Update Vehicle
@@ -157,7 +227,7 @@ const UpdateVehicle = () => {
-
+
*/}
>
);
};
diff --git a/client/src/components/vehicles/VehicleList.js b/client/src/components/vehicles/VehicleList.js
index 2cac248..0007097 100644
--- a/client/src/components/vehicles/VehicleList.js
+++ b/client/src/components/vehicles/VehicleList.js
@@ -2,12 +2,19 @@ import React, {useState, useEffect} from "react";
import { useDispatch } from "react-redux";
import { useNavigate } from "react-router-dom";
import { AuthService, VehicleService } from "../../services";
+import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab } from "react-bootstrap";
+import { Columns, Download, Filter, PencilSquare, PersonSquare, Plus } from "react-bootstrap-icons";
const VehicleList = () => {
const navigate = useNavigate();
const dispatch = useDispatch();
+ const [keyword, setKeyword] = useState('');
const [vehicles, setVehicles] = useState([]);
const [tag, setTag] = useState('');
+ const [sorting, setSorting] = useState({key: '', order: ''});
+ const [selectedItems, setSelectedItems] = useState([]);
+ const [filteredVehicles, setFilteredVehicles] = useState(vehicles);
+ const [showInactive, setShowInactive] = useState(false);
useEffect(() => {
if (!AuthService.canAddOrEditVechiles()) {
@@ -20,10 +27,42 @@ const VehicleList = () => {
);
}, []);
- const redirectToAdmin = () => {
- navigate(`/admin/customer-report`)
- }
+ useEffect(() => {
+ if (showInactive) {
+ setFilteredVehicles(vehicles && vehicles.filter(item =>
+ (item?.vehicle_number?.toString()?.includes(keyword.toLowerCase()) ||
+ item?.tag?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.ezpass?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.gps_tag?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.make?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.vehicle_model?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.year?.toLowerCase()?.includes(keyword.toLowerCase())) &&
+ item?.status?.toLowerCase() !== 'active'
+ ))
+ } else {
+ setFilteredVehicles(vehicles && vehicles.filter(item =>
+ (item?.vehicle_number?.toString()?.includes(keyword.toLowerCase()) ||
+ item?.tag?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.ezpass?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.gps_tag?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.make?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.vehicle_model?.toLowerCase()?.includes(keyword.toLowerCase()) ||
+ item?.year?.toLowerCase()?.includes(keyword.toLowerCase())) &&
+ item?.status?.toLowerCase() === 'active'
+ ))
+ }
+ }, [keyword, vehicles]);
+ useEffect(() => {
+ const newVehicles = [...vehicles];
+ const sortedVehicles = sorting.key === '' ? newVehicles : newVehicles.sort((a, b) => {
+ return a[sorting.key]?.localeCompare(b[sorting.key]);
+ });
+ setVehicles(
+ sorting.order === 'asc' ? sortedVehicles : sortedVehicles.reverse()
+ )
+ }, [sorting]);
+
const goToEdit = (id) => {
navigate(`/vehicles/edit/${id}?redirect=list`)
}
@@ -33,15 +72,161 @@ const VehicleList = () => {
navigate(`/vehicles/${id}`)
}
+ const goToCreateNew = () => {
+ navigate(`/vehicles`)
+ }
+
+ const columns = [
+ {
+ key: 'vehicle_number',
+ label: 'Vehicle Number'
+ },
+ {
+ key: 'tag',
+ label: 'License Plate'
+ },
+ {
+ key: 'capacity',
+ label: 'Seating Capacity'
+ },
+ {
+ key: 'mileage',
+ label: 'Mileage'
+ },
+ {
+ key: 'make',
+ label: 'Make'
+ },
+ {
+ key: 'model',
+ label: 'Model'
+ },
+ {
+ key: 'year',
+ label: 'Year'
+ }
+ ];
+
+ const getSortingImg = (key) => {
+ return sorting.key === key ? (sorting.order === 'asc' ? 'up_arrow' : 'down_arrow') : 'default';
+ }
+
+ const sortTableWithField = (key) => {
+ let newSorting = {
+ key,
+ order: 'asc',
+ }
+
+ if (sorting.key === key && sorting.order === 'asc') {
+ newSorting = {...newSorting, order: 'desc'};
+ }
+ setSorting(newSorting);
+ }
+
+ const toggleSelectedAllItems = () => {
+ if (selectedItems.length !== filteredVehicles.length || selectedItems.length === 0) {
+ const newSelectedItems = [...filteredVehicles].map((vehicle) => vehicle.id);
+ setSelectedItems(newSelectedItems);
+ } else {
+ setSelectedItems([]);
+ }
+ }
+
+ const toggleItem = (id) => {
+ if (selectedItems.includes(id)) {
+ const newSelectedItems = [...selectedItems].filter((item) => item !== id);
+ setSelectedItems(newSelectedItems);
+ } else {
+ const newSelectedItems = [...selectedItems, id];
+ setSelectedItems(newSelectedItems);
+ }
+ }
+
+ const showArchive = (value) => {
+ setShowInactive(value === 'archivedVehicles');
+ // Recover all filters
+ setKeyword('');
+ setTag('');
+ setSorting({key: '', order: ''});
+ setSelectedItems([]);
+ }
+
+ const checkSelectAll = () => {
+ return selectedItems.length === filteredVehicles.length && selectedItems.length > 0;
+ }
+
+
+ const table =
;
+
+
return (
<>
+
+ Transportation
+
+ Vehicle Information
+
+
-
All Vehicles
+
+ All Vehicles
+
-
+
+
+
showArchive(k)}>
+
+ {table}
+
+
+ {table}
+
+
+
+
setKeyword(e.currentTarget.value)} />
+
+
+
+
+
+
+
+ {/*
+
*/}
>
)
};
diff --git a/client/src/components/vehicles/ViewVehicle.js b/client/src/components/vehicles/ViewVehicle.js
index f116509..91347d0 100644
--- a/client/src/components/vehicles/ViewVehicle.js
+++ b/client/src/components/vehicles/ViewVehicle.js
@@ -1,17 +1,35 @@
import React, {useState, useEffect} from "react";
import { useNavigate, useParams } from "react-router-dom";
+import { useSelector,useDispatch } from "react-redux";
import { AuthService, VehicleService } from "../../services";
+import { vehicleSlice, selectVehicleError } from "./../../store";
+import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab } from "react-bootstrap";
+import { Download, Pencil, Archive } from "react-bootstrap-icons";
const ViewVehicle = () => {
const navigate = useNavigate();
-
+ const dispatch = useDispatch();
const urlParams = useParams();
const [currentVehicle, setCurrentVehicle] = useState(undefined);
+
+ const { updateVehicle, deleteVehicle, fetchAllVehicles } = vehicleSlice.actions;
const redirectTo = () => {
navigate(`/vehicles/list`)
}
+ const goToEdit = (id) => {
+ navigate(`/vehicles/edit/${id}?redirect=list`)
+ }
+
+ const deactivateVehicle = () => {
+ const data = {
+ status: 'inactive'
+ };
+ dispatch(deleteVehicle({id: urlParams.id, data}));
+ redirectTo();
+ }
+
useEffect(() => {
if (!AuthService.canViewVechiles()) {
window.alert('You haven\'t login yet OR this user does not have access to this page. Please change an admin account to login.')
@@ -28,40 +46,83 @@ const ViewVehicle = () => {
return (
<>
-
-
View Vechile {currentVehicle?.vehicle_number}
-
+
+ Transportation
+
+ Vehicles Information
+
+
+ View Vehicle Information
+
+
-
-
-
Vehicle Number: {currentVehicle?.vehicle_number}
-
-
-
Tag: {currentVehicle?.tag}
-
-
-
GPS: {currentVehicle?.gps_tag}
-
-
-
EZPass: {currentVehicle?.ezpass}
-
-
-
Capacity: {currentVehicle?.capacity}
-
-
-
Mileage: {currentVehicle?.mileage}
-
-
-
Make: {currentVehicle?.make}
-
-
-
Model: {currentVehicle?.vehicle_model}
-
-
-
Year: {currentVehicle?.year}
-
-
-
Checklist: {currentVehicle?.checklist?.join(', ')}
+
+
View Vechile Information
+
+
+
+
+
+ Vehicle Information
+
+
+
Vehicle Number
+
{currentVehicle?.vehicle_number}
+
+
+
Seating Capacity
+
{currentVehicle?.capacity}
+
+
+
Mileage
+
{currentVehicle?.mileage}
+
+
+
Make
+
{currentVehicle?.make}
+
+
+
Model
+
{currentVehicle?.vehicle_model}
+
+
+
+
+
Year
+
{currentVehicle?.year}
+
+
+
Licence Plate
+
{currentVehicle?.tag}
+
+
+
GPS ID
+
{currentVehicle?.gps}
+
+
+
EZPass
+
{currentVehicle?.ezpass}
+
+
+ Check List
+
+
+ {currentVehicle?.checklist?.map((item) => - {item}
)}
+
+
+
+
+ Coming soon...
+
+
+ Coming soon...
+
+
+
+
+
+
+
>