From cb0960299df4930ec390a7d9d09903d00d01dad7 Mon Sep 17 00:00:00 2001 From: yznahmad Date: Thu, 4 Dec 2025 09:05:38 +0300 Subject: [PATCH] first after 100 --- app/routes/areas.tsx | 2 +- app/routes/dashboard.tsx | 4 ++-- app/routes/dredger-locations.tsx | 2 +- app/routes/employees.tsx | 2 +- app/routes/equipment.tsx | 2 +- app/routes/foreman.tsx | 2 +- app/routes/reclamation-locations.tsx | 2 +- app/routes/report-sheet.tsx | 2 +- app/routes/reports.tsx | 2 +- app/routes/reports_.$id.edit.tsx | 30 ++++++++++++++++++++------- app/routes/reports_.new.tsx | 23 ++++++++++++++++---- app/routes/signin.tsx | 2 +- app/routes/signup.tsx | 2 +- app/routes/stoppages.tsx | 2 +- app/routes/workers.tsx | 2 +- prisma/dev.db | Bin 118784 -> 118784 bytes 16 files changed, 56 insertions(+), 25 deletions(-) diff --git a/app/routes/areas.tsx b/app/routes/areas.tsx index d0798a4..02958ba 100644 --- a/app/routes/areas.tsx +++ b/app/routes/areas.tsx @@ -8,7 +8,7 @@ import Toast from "~/components/Toast"; import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Areas Management - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Areas Management - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); diff --git a/app/routes/dashboard.tsx b/app/routes/dashboard.tsx index 8434c9c..82b9ad7 100644 --- a/app/routes/dashboard.tsx +++ b/app/routes/dashboard.tsx @@ -5,7 +5,7 @@ import { requireAuthLevel } from "~/utils/auth.server"; import DashboardLayout from "~/components/DashboardLayout"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Dashboard - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Dashboard - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 1); @@ -51,7 +51,7 @@ export default function Dashboard() { Welcome back, {user.name}!

- Here's what's happening with your phosphat operations today. + Here's what's happening with your allhaffer operations today.

diff --git a/app/routes/dredger-locations.tsx b/app/routes/dredger-locations.tsx index cf2413b..ffff8ef 100644 --- a/app/routes/dredger-locations.tsx +++ b/app/routes/dredger-locations.tsx @@ -8,7 +8,7 @@ import Toast from "~/components/Toast"; import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Dredger Locations Management - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Dredger Locations Management - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); diff --git a/app/routes/employees.tsx b/app/routes/employees.tsx index 13e18f8..396e123 100644 --- a/app/routes/employees.tsx +++ b/app/routes/employees.tsx @@ -9,7 +9,7 @@ import { useState, useEffect } from "react"; import bcrypt from "bcryptjs"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Employee Management - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Employee Management - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); diff --git a/app/routes/equipment.tsx b/app/routes/equipment.tsx index 6993fe6..60b62ab 100644 --- a/app/routes/equipment.tsx +++ b/app/routes/equipment.tsx @@ -8,7 +8,7 @@ import Toast from "~/components/Toast"; import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Equipment Management - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Equipment Management - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); diff --git a/app/routes/foreman.tsx b/app/routes/foreman.tsx index b3ea82f..1007b40 100644 --- a/app/routes/foreman.tsx +++ b/app/routes/foreman.tsx @@ -8,7 +8,7 @@ import Toast from "~/components/Toast"; import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Foreman Management - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Foreman Management - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); diff --git a/app/routes/reclamation-locations.tsx b/app/routes/reclamation-locations.tsx index af53497..74dff82 100644 --- a/app/routes/reclamation-locations.tsx +++ b/app/routes/reclamation-locations.tsx @@ -8,7 +8,7 @@ import Toast from "~/components/Toast"; import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Reclamation Locations Management - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Reclamation Locations Management - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); diff --git a/app/routes/report-sheet.tsx b/app/routes/report-sheet.tsx index 235ca0c..02e9fd2 100644 --- a/app/routes/report-sheet.tsx +++ b/app/routes/report-sheet.tsx @@ -7,7 +7,7 @@ import ReportSheetViewModal from "~/components/ReportSheetViewModal"; import { useState } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Report Sheets - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Report Sheets - Alhaffer Report System" }]; interface ReportSheet { id: string; diff --git a/app/routes/reports.tsx b/app/routes/reports.tsx index 793e15c..2fae2f7 100644 --- a/app/routes/reports.tsx +++ b/app/routes/reports.tsx @@ -10,7 +10,7 @@ import { useState, useEffect } from "react"; import { manageSheet, removeFromSheet } from "~/utils/sheet.server"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Reports Management - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Reports Management - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 1); // All employees can access reports diff --git a/app/routes/reports_.$id.edit.tsx b/app/routes/reports_.$id.edit.tsx index c0fc41c..94bc750 100644 --- a/app/routes/reports_.$id.edit.tsx +++ b/app/routes/reports_.$id.edit.tsx @@ -6,7 +6,7 @@ import DashboardLayout from "~/components/DashboardLayout"; import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Edit Report - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Edit Report - Alhaffer Report System" }]; export const loader = async ({ request, params }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 1); @@ -112,6 +112,7 @@ export const action = async ({ request, params }: ActionFunctionArgs) => { const statsExc = formData.get("statsExc"); const statsLoaders = formData.get("statsLoaders"); const statsForeman = formData.get("statsForeman"); + const statsLaborer = formData.get("statsLaborer"); const workersListData = formData.get("workersList"); const timeSheetData = formData.get("timeSheetData"); const stoppagesData = formData.get("stoppagesData"); @@ -149,7 +150,7 @@ export const action = async ({ request, params }: ActionFunctionArgs) => { let finalNotes = typeof notes === "string" ? notes : ''; if (automaticNotes.length > 0) { const automaticNotesText = automaticNotes.join(', '); - finalNotes = finalNotes.trim() ? `${automaticNotesText}. ${finalNotes}` : automaticNotesText; + finalNotes = finalNotes.trim() ? `${automaticNotesText}.\n${finalNotes}` : automaticNotesText; } await prisma.report.update({ @@ -172,7 +173,7 @@ export const action = async ({ request, params }: ActionFunctionArgs) => { Exc: parseInt(statsExc as string) || 0, Loaders: parseInt(statsLoaders as string) || 0, Foreman: statsForeman as string || "", - Laborer: workersList.length + Laborer: parseInt(statsLaborer as string) || 0 }, timeSheet, stoppages, @@ -222,6 +223,7 @@ export default function EditReport() { report.shiftWorkers?.map((sw: any) => sw.worker.id) || [] ); const [workerSearchTerm, setWorkerSearchTerm] = useState(''); + const [isLaborerManuallyEdited, setIsLaborerManuallyEdited] = useState(false); const [timeSheetEntries, setTimeSheetEntries] = useState { + if (!isLaborerManuallyEdited) { + setFormData(prev => ({ + ...prev, + statsLaborer: selectedWorkers.length.toString() + })); + } + }, [selectedWorkers, isLaborerManuallyEdited]); + // Worker selection functions const toggleWorker = (workerId: number) => { setSelectedWorkers(prev => @@ -762,10 +774,13 @@ export default function EditReport() { id="statsLaborer" name="statsLaborer" min="0" - value={selectedWorkers.length} - readOnly - className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-gray-100 text-gray-700 cursor-not-allowed" - title="Auto-calculated based on selected workers" + value={formData.statsLaborer} + onChange={(e) => { + updateFormData('statsLaborer', e.target.value); + setIsLaborerManuallyEdited(true); + }} + className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500" + title="Auto-calculated based on selected workers, but can be edited" /> @@ -1169,6 +1184,7 @@ export default function EditReport() { + )} {currentStep !== 3 && ( diff --git a/app/routes/reports_.new.tsx b/app/routes/reports_.new.tsx index 666baec..2e37179 100644 --- a/app/routes/reports_.new.tsx +++ b/app/routes/reports_.new.tsx @@ -7,7 +7,7 @@ import { useState, useEffect } from "react"; import { manageSheet } from "~/utils/sheet.server"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "New Report - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "New Report - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 1); // All employees can create reports @@ -144,7 +144,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { if (automaticNotes.length > 0) { const automaticNotesText = automaticNotes.join(', '); if (finalNotes.trim()) { - finalNotes = `${automaticNotesText}. ${finalNotes}`; + finalNotes = `${automaticNotesText}.\n${finalNotes}`; } else { finalNotes = automaticNotesText; } @@ -178,7 +178,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { Exc: parseInt(statsExc as string) || 0, Loaders: parseInt(statsLoaders as string) || 0, Foreman: statsForeman as string || "", - Laborer: workersList.length + Laborer: parseInt(statsLaborer as string) || 0 }, timeSheet, stoppages, @@ -241,6 +241,8 @@ export default function NewReport() { notes: '' }); + const [isLaborerManuallyEdited, setIsLaborerManuallyEdited] = useState(false); + const [validationError, setValidationError] = useState(null); const [selectedWorkers, setSelectedWorkers] = useState([]); const [workerSearchTerm, setWorkerSearchTerm] = useState(''); @@ -641,6 +643,16 @@ export default function NewReport() { } }; + // Auto-update laborer count when workers change (only if not manually edited) + useEffect(() => { + if (!isLaborerManuallyEdited) { + setFormData(prev => ({ + ...prev, + statsLaborer: selectedWorkers.length.toString() + })); + } + }, [selectedWorkers, isLaborerManuallyEdited]); + // Worker selection functions const toggleWorker = (workerId: number) => { setSelectedWorkers(prev => @@ -909,7 +921,10 @@ export default function NewReport() {
-
+
{ + updateFormData('statsLaborer', e.target.value); + setIsLaborerManuallyEdited(true); + }} className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500" title="Auto-calculated based on selected workers, but can be edited" />
diff --git a/app/routes/signin.tsx b/app/routes/signin.tsx index 2d40024..dfe9aad 100644 --- a/app/routes/signin.tsx +++ b/app/routes/signin.tsx @@ -3,7 +3,7 @@ import { json, redirect } from "@remix-run/node"; import { Form, Link, useActionData, useSearchParams } from "@remix-run/react"; import { createUserSession, getUserId, verifyLogin } from "~/utils/auth.server"; -export const meta: MetaFunction = () => [{ title: "Sign In - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Sign In - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const userId = await getUserId(request); diff --git a/app/routes/signup.tsx b/app/routes/signup.tsx index ab2d5cd..317754c 100644 --- a/app/routes/signup.tsx +++ b/app/routes/signup.tsx @@ -4,7 +4,7 @@ import { Form, Link, useActionData } from "@remix-run/react"; import { createUser, createUserSession, getUserId } from "~/utils/auth.server"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Sign Up - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Sign Up - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const userId = await getUserId(request); diff --git a/app/routes/stoppages.tsx b/app/routes/stoppages.tsx index 59c44b7..92e0401 100644 --- a/app/routes/stoppages.tsx +++ b/app/routes/stoppages.tsx @@ -6,7 +6,7 @@ import DashboardLayout from "~/components/DashboardLayout"; import { useState } from "react"; import { prisma } from "~/utils/db.server"; -export const meta: MetaFunction = () => [{ title: "Stoppages Analysis - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Stoppages Analysis - Alhaffer Report System" }]; interface StoppageEntry { id: string; diff --git a/app/routes/workers.tsx b/app/routes/workers.tsx index 2eb2a51..5da9223 100644 --- a/app/routes/workers.tsx +++ b/app/routes/workers.tsx @@ -7,7 +7,7 @@ import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; import Toast from "~/components/Toast"; -export const meta: MetaFunction = () => [{ title: "Workers - Phosphat Report" }]; +export const meta: MetaFunction = () => [{ title: "Workers - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); // Only supervisors and admins diff --git a/prisma/dev.db b/prisma/dev.db index 80d8202120b64a45a177fe19f6b9471b61747924..62e16556b96ecd939f8c371516b831e70d822853 100644 GIT binary patch delta 890 zcmZvZT}V@57{||ZwsX#oYkQ~rB0t!NC8kc_ooybcm_;E3g%S#t`7zxoH@7);34Vlb zdS^j;f)j&aK^H+6eH>|Y;qtD#h$0BO6zodKE`++Vvz-txd@kM}&-=Xp|HJdV%QCG7#G*6&C^bu{M zXJ}qF{TfH+3L03}1tf>LfXB;uu)k7%c$n(78utjsxIv(==sCKFx{U>7Gj7N(=c2Kx zp;Au(QB@RD6iy0>a3pc}m;+>g9uQ6HDHVpGMN1IGIca|g&f?|@MGFpKLDAONjZMar zF(D;{$^Uxn;aVZ<#L@4N9WI<%%y$n%!KAUFK8Z;}jR~!x6|{g-D2Br5HtLgIroWne za|-J8U35&Vcw-$sQ6f!8OVrYl5;fGgLKf5ZVp^}GZ6#`GYl&oDT!Ja5(yCu#a>Z5; z&?;I~hL0lw4WfRzyw`=g7%dcg#8lD~Dz#CSnh32`X2av9v|eXdsj;aftG$UkY8!VaW6Ex}5N19#zk8mh+4V#Y{3u$wD zraS`KOyKyvomUINBk{pgPH8Az-vW=s&w@c(+k&fNS-`;h+qgE)@AGovKCTrVT^-^f zZ=vGO%b~fvcN=a|b*mlqN5cT{V`=lsLdMENw&wF=WfJwc7tJFCURpJL9FOGER)tb-i=Uc^_!KvEP(?Afn^6n=0o$1NAyWNe0 t?HDU*YEntOSlkOb^zl$6krEQ2#F!wKx4RvqYPjzYPM;L{#x3|p{sSE#-tGVZ delta 291 zcmZozz}~QceS$P&*F+g-#;%PCtMwUWHuD&K;%Aao+2ml$&nPn4&R?5RXmXanC!_l2 zE&c%u1lag{8TjAwALrk~zmUI||JG)~fFgc&5n(n)Mq#$iz5h!Bg!!cy*!cD_@L%R% z!e7eo#a%DIaWhQ+7{{n;pkR=7gMooThmk>= zk&{!Al~tu6H7_MIFP+KAz{phB&_LJ7jB%EN&W;xla=TkR<30gqKK{wm*$WtDH!BKo zv252XVN~Ouo>0!HJ2}Cci^J5+!q~#d)O7pgdd5NppxP)c%Y%`yMEbn&hvy4}n*m;2t;bbt}&c1>1CqDq${!N+y