feat: Initialize monorepo structure and comprehensive documentation

This commit establishes the new monorepo architecture for the KROW Workforce platform.

Key changes include:
- Reorganized project into `frontend-web`, `mobile-apps`, `firebase`, `scripts`, and `secrets` directories.
- Updated `Makefile` to support the new monorepo layout and automate Base44 export integration.
- Fixed `scripts/prepare-export.js` for ES module compatibility and global component import resolution.
- Created and updated `CONTRIBUTING.md` for developer onboarding.
- Restructured, renamed, and translated all `docs/` files for clarity and consistency.
- Implemented an interactive internal launchpad with diagram viewing capabilities.
- Configured base Firebase project files (`firebase.json`, security rules).
- Updated `README.md` to reflect the new project structure and documentation overview.
This commit is contained in:
bwnyasse
2025-11-12 12:50:55 -05:00
parent 92fd0118be
commit 554dc9f9e3
203 changed files with 1414 additions and 732 deletions

View File

@@ -0,0 +1,84 @@
import React from "react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Avatar, AvatarFallback } from "@/components/ui/avatar";
import { MapPin, Plus } from "lucide-react";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
export default function ShiftCard({ shift, onNotifyStaff }) {
return (
<Card className="border-slate-200">
<CardHeader className="bg-gradient-to-br from-slate-50 to-white border-b border-slate-100 pb-4">
<div className="flex items-center justify-between">
<CardTitle className="text-base font-semibold">{shift.shift_name || "Shift 1"}</CardTitle>
<Button onClick={onNotifyStaff} className="bg-blue-600 hover:bg-blue-700 text-white text-sm">
Notify Staff
</Button>
</div>
<div className="flex items-start gap-6 mt-4">
<div>
<p className="text-xs text-slate-500 mb-2">Managers:</p>
<div className="flex items-center gap-2">
{shift.assigned_staff?.slice(0, 3).map((staff, idx) => (
<div key={idx} className="flex items-center gap-2">
<Avatar className="w-8 h-8 bg-slate-300">
<AvatarFallback className="text-xs">{staff.staff_name?.charAt(0)}</AvatarFallback>
</Avatar>
<div className="text-xs">
<p className="font-medium">{staff.staff_name}</p>
<p className="text-slate-500">{staff.position || "john@email.com"}</p>
</div>
</div>
))}
</div>
</div>
<div className="flex items-start gap-2 text-xs">
<MapPin className="w-4 h-4 text-slate-400 mt-0.5" />
<div>
<p className="font-medium">Location:</p>
<p className="text-slate-600">{shift.location || "848 East Glen Road New York CA, USA"}</p>
</div>
</div>
</div>
</CardHeader>
<CardContent className="p-0">
<Table>
<TableHeader>
<TableRow className="bg-slate-50 hover:bg-slate-50">
<TableHead className="text-xs">Unpaid break</TableHead>
<TableHead className="text-xs">Count</TableHead>
<TableHead className="text-xs">Assigned</TableHead>
<TableHead className="text-xs">Uniform type</TableHead>
<TableHead className="text-xs">Price</TableHead>
<TableHead className="text-xs">Amount</TableHead>
<TableHead className="text-xs">Actions</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{(shift.assigned_staff || []).length > 0 ? (
shift.assigned_staff.map((staff, idx) => (
<TableRow key={idx}>
<TableCell className="text-xs">{shift.unpaid_break || 0}</TableCell>
<TableCell className="text-xs">1</TableCell>
<TableCell className="text-xs">0</TableCell>
<TableCell className="text-xs">{shift.uniform_type || "uniform type"}</TableCell>
<TableCell className="text-xs">${shift.price || 23}</TableCell>
<TableCell className="text-xs">{shift.amount || 120}</TableCell>
<TableCell>
<Button variant="ghost" size="sm" className="text-xs"></Button>
</TableCell>
</TableRow>
))
) : (
<TableRow>
<TableCell colSpan={7} className="text-center py-4 text-slate-500 text-xs">
No staff assigned yet
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</CardContent>
</Card>
);
}