CoolFace
Apppublic

Nagadder/field-force-tracker-pro

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
script.js176 linesDownload Raw Back to root
1document.addEventListener('DOMContentLoaded', function() {2    // Employee data3    const employees = [4        { name: "Jacek Michalowski", id: "Yes", passport: "", passportExp: "2025-10-15", license: "", licenseExp: "", medical: "Yes", medicalExp: "2025-10-31" },5        { name: "Sarel O'Neil", id: "Yes", passport: "", passportExp: "2025-10-15", license: "", licenseExp: "", medical: "Yes", medicalExp: "2026-07-03" },6        { name: "Werner Swart", id: "Yes", passport: "Yes", passportExp: "2032-12-04", license: "Yes", licenseExp: "2026-03-03", medical: "Yes", medicalExp: "2025-10-30" },7        { name: "Byron Nienaber", id: "Yes", passport: "No", passportExp: "2025-10-15", license: "Yes", licenseExp: "2028-12-05", medical: "Yes", medicalExp: "2026-02-18" },8        { name: "Morne Heyneke", id: "Yes", passport: "No", passportExp: "2025-10-15", license: "Yes", licenseExp: "2028-11-23", medical: "Yes", medicalExp: "2025-10-30" },9        { name: "Willem Steyn", id: "Yes", passport: "", passportExp: "2025-10-15", license: "", licenseExp: "", medical: "Yes", medicalExp: "2026-02-18" },10        { name: "Nathan O'Neil", id: "Yes", passport: "", passportExp: "2025-10-15", license: "", licenseExp: "", medical: "Yes", medicalExp: "2026-02-17" },11        { name: "Ruan Ferreira", id: "Yes", passport: "No", passportExp: "2025-10-15", license: "Yes", licenseExp: "2029-11-20", medical: "No", medicalExp: "2025-10-13" },12        { name: "Teo Van Der Merwe", id: "Yes", passport: "Yes", passportExp: "TBC", license: "Yes", licenseExp: "2026-04-06", medical: "Yes", medicalExp: "2026-02-18" },13        { name: "Ruben Truter", id: "Yes", passport: "Yes", passportExp: "TBC", license: "Yes", licenseExp: "2028-08-23", medical: "No", medicalExp: "2025-10-13" }14    ];15 16    // Vehicle data17    const vehicles = [18        { reg: "HY 48VW GP", make: "Havaal H2", driver: "Jenette Ungerer", disk: "Yes", diskExp: "2026-08-31", km: 0, nextService: "30 000" },19        { reg: "CL 74TS GP", make: "Pajero 3.2 DI-D GLS A/T", driver: "Steven Malinsky", disk: "Yes", diskExp: "2026-08-31", km: 0, nextService: "30 000" },20        { reg: "TST 967 GP", make: "Hyundai H100 2.6i", driver: "Delivery Vehicle", disk: "Yes", diskExp: "", km: 196979, nextService: "13 021" },21        { reg: "LS 15 GM GP", make: "JAC N56 2.8 TD F/C D/S Truck", driver: "Pool Vehicle", disk: "Yes", diskExp: "2026-04-30", km: 6224, nextService: "8 776" },22        { reg: "HY 52PW GP", make: "Havaal H1 1.5VVT", driver: "Kevin McLoghry", disk: "Yes", diskExp: "2026-08-31", km: 165000, nextService: "15 000" },23        { reg: "JW 60RP GP", make: "Havaal H1 1.5VVT", driver: "Arie Claassens", disk: "Yes", diskExp: "2026-01-31", km: 91642, nextService: "13 358" },24        { reg: "DM 44JT GP", make: "Ranger 2.2 TDCi XL D/CAB", driver: "Ruan Ferreira", disk: "Yes", diskExp: "2026-08-31", km: 240000, nextService: "15 000" },25        { reg: "JL 19YW GP", make: "Ranger 2.2 TDCi XL D/CAB", driver: "Mark Isaacs", disk: "Yes", diskExp: "", km: 315000, nextService: "15 000" },26        { reg: "CH 25RS GP", make: "Chev Utility 1.4 S/C P/U", driver: "Pool Vehicle", disk: "Yes", diskExp: "", km: 272630, nextService: "2 370" },27        { reg: "CR 05MS GP", make: "Chev Utility 1.4 S/C P/U", driver: "Byron Nienaber", disk: "Yes", diskExp: "2026-07-31", km: 263027, nextService: "6 973" },28        { reg: "CW 72ZR GP", make: "Chev Utility 1.4 S/C P/U", driver: "Pool Vehicle", disk: "Yes", diskExp: "2026-01-31", km: 203003, nextService: "6 997" },29        { reg: "LL 05 DB GP", make: "Isuzu D-Max 1.9 Ddi HR LS A/T E-CAB", driver: "Jacek Michalowski", disk: "Yes", diskExp: "2025-10-31", km: 75319, nextService: "14 681" },30        { reg: "LT 78YY GP", make: "Isuzu D-Max 1.9 Ddi HR LS A/T E-CAB", driver: "Sarel O'Neil", disk: "Yes", diskExp: "", km: 45000, nextService: "15 000" },31        { reg: "LT 78YW GP", make: "Isuzu D-Max 1.9 Ddi HR LS A/T E-CAB", driver: "Gene Luckhoff", disk: "Yes", diskExp: "", km: 30000, nextService: "15 000" },32        { reg: "LZ 18WD GP", make: "Isuzu D-Max 1.9 Ddi HR LS A/T E-CAB", driver: "Phillip Jacobs", disk: "Yes", diskExp: "", km: 11028, nextService: "3 972" },33        { reg: "LZ 18VR GP", make: "Isuzu D-Max 1.9 Ddi HR LS A/T E-CAB", driver: "Anton Koen", disk: "Yes", diskExp: "2026-09-30", km: 30080, nextService: "14 920" }34    ];35 36    // Populate employee table37    const employeeTable = document.getElementById('employeeTable');38    employees.forEach(emp => {39        const row = document.createElement('tr');40        41        // Function to create status cell42        const createStatusCell = (status, exp) => {43            const cell = document.createElement('td');44            cell.className = 'px-6 py-4 whitespace-nowrap';45            46            const div = document.createElement('div');47            div.className = 'flex items-center';48            49            const statusDiv = document.createElement('div');50            statusDiv.className = `h-3 w-3 rounded-full mr-2 ${status ? 'bg-green-500' : 'bg-red-500'}`;51            52            const textDiv = document.createElement('div');53            textDiv.className = 'text-sm text-gray-900';54            textDiv.textContent = status ? 'Valid' : 'Invalid';55            56            if (status && exp) {57                const expDiv = document.createElement('div');58                expDiv.className = 'text-xs text-gray-500';59                expDiv.textContent = `Exp: ${exp}`;60                textDiv.appendChild(expDiv);61            }62            63            div.appendChild(statusDiv);64            div.appendChild(textDiv);65            cell.appendChild(div);66            return cell;67        };68        69        // Name cell70        const nameCell = document.createElement('td');71        nameCell.className = 'px-6 py-4 whitespace-nowrap';72        const nameDiv = document.createElement('div');73        nameDiv.className = 'text-sm font-medium text-gray-900';74        nameDiv.textContent = emp.name;75        nameCell.appendChild(nameDiv);76        77        // Append all cells78        row.appendChild(nameCell);79        row.appendChild(createStatusCell(emp.id === "Yes"));80        row.appendChild(createStatusCell(emp.passport === "Yes", emp.passportExp));81        row.appendChild(createStatusCell(emp.license === "Yes", emp.licenseExp));82        row.appendChild(createStatusCell(emp.medical === "Yes", emp.medicalExp));83        84        employeeTable.appendChild(row);85    });86 87    // Populate vehicle table88    const vehicleTable = document.getElementById('vehicleTable');89    vehicles.forEach(vehicle => {90        const row = document.createElement('tr');91        92        // Reg Nr93        const regCell = document.createElement('td');94        regCell.className = 'px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900';95        regCell.textContent = vehicle.reg;96        97        // Make98        const makeCell = document.createElement('td');99        makeCell.className = 'px-6 py-4 whitespace-nowrap text-sm text-gray-500';100        makeCell.textContent = vehicle.make;101        102        // Driver103        const driverCell = document.createElement('td');104        driverCell.className = 'px-6 py-4 whitespace-nowrap text-sm text-gray-500';105        driverCell.textContent = vehicle.driver;106        107        // Disk status108        const diskCell = document.createElement('td');109        diskCell.className = 'px-6 py-4 whitespace-nowrap';110        const diskDiv = document.createElement('div');111        diskDiv.className = 'flex items-center';112        113        const diskStatusDiv = document.createElement('div');114        diskStatusDiv.className = `h-3 w-3 rounded-full mr-2 ${vehicle.disk === "Yes" ? 'bg-green-500' : 'bg-red-500'}`;115        116        const diskTextDiv = document.createElement('div');117        diskTextDiv.className = 'text-sm text-gray-900';118        diskTextDiv.textContent = vehicle.disk === "Yes" ? 'Valid' : 'Invalid';119        120        if (vehicle.diskExp) {121            const diskExpDiv = document.createElement('div');122            diskExpDiv.className = 'text-xs text-gray-500';123            diskExpDiv.textContent = `Exp: ${vehicle.diskExp}`;124            diskTextDiv.appendChild(diskExpDiv);125        }126        127        diskDiv.appendChild(diskStatusDiv);128        diskDiv.appendChild(diskTextDiv);129        diskCell.appendChild(diskDiv);130        131        // Next service132        const serviceCell = document.createElement('td');133        serviceCell.className = 'px-6 py-4 whitespace-nowrap text-sm text-gray-500';134        135        const progressDiv = document.createElement('div');136        progressDiv.className = 'flex items-center';137        138        const progressBarDiv = document.createElement('div');139        progressBarDiv.className = 'w-full bg-gray-200 rounded-full h-2.5 mr-2';140        141        const progressFillDiv = document.createElement('div');142        progressFillDiv.className = 'bg-blue-600 h-2.5 rounded-full';143        144        // Simple progress calculation for demo purposes145        const nextService = parseInt(vehicle.nextService.replace(/\s/g, ''));146        const currentKm = parseInt(vehicle.km);147        const progress = Math.min(100, (currentKm / (currentKm + nextService)) * 100);148        149        progressFillDiv.style.width = `${progress}%`;150        progressBarDiv.appendChild(progressFillDiv);151        152        progressDiv.appendChild(progressBarDiv);153        progressDiv.innerHTML += `<span class="text-xs">${vehicle.nextService} km</span>`;154        serviceCell.appendChild(progressDiv);155        156        // Append all cells157        row.appendChild(regCell);158        row.appendChild(makeCell);159        row.appendChild(driverCell);160        row.appendChild(diskCell);161        row.appendChild(serviceCell);162        163        vehicleTable.appendChild(row);164    });165 166    // Add hover effect to table rows167    const tableRows = document.querySelectorAll('tbody tr');168    tableRows.forEach(row => {169        row.addEventListener('mouseenter', () => {170            row.classList.add('bg-gray-50');171        });172        row.addEventListener('mouseleave', () => {173            row.classList.remove('bg-gray-50');174        });175    });176});