// Tools.jsx — Admin-managed list of site tools / equipment. // Lives under Administration → Tools. The list feeds the multi-select // dropdown in Create Booking ("Tools to bring on site"). function ToolsPage({ role }) { const isAdmin = role === 'Admin'; const [tools, setTools] = React.useState(TOOLS); const [showAdd, setShowAdd] = React.useState(false); const [draft, setDraft] = React.useState({ name: '', category: 'Rigging', default: false }); const [editing, setEditing] = React.useState(null); // id of row being edited const [editDraft, setEditDraft] = React.useState(null); const grouped = {}; tools.forEach(t => { (grouped[t.category] = grouped[t.category] || []).push(t); }); const addTool = () => { if (!draft.name.trim()) return; const id = 'T-' + String(tools.length + 1).padStart(2, '0'); const next = [...tools, { id, ...draft, name: draft.name.trim() }]; setTools(next); TOOLS.length = 0; next.forEach(x => TOOLS.push(x)); // mutate global so Create Booking picks it up setDraft({ name: '', category: 'Rigging', default: false }); setShowAdd(false); }; const startEdit = (t) => { setEditing(t.id); setEditDraft({...t}); }; const saveEdit = () => { window.askAdminPassword('Edit tool · ' + editDraft.name, () => { const next = tools.map(t => t.id === editDraft.id ? editDraft : t); setTools(next); TOOLS.length = 0; next.forEach(x => TOOLS.push(x)); setEditing(null); setEditDraft(null); }); }; const deleteTool = (t) => { window.askAdminPassword('Delete tool · ' + t.name, () => { const next = tools.filter(x => x.id !== t.id); setTools(next); TOOLS.length = 0; next.forEach(x => TOOLS.push(x)); }); }; const toggleDefault = (t) => { window.askAdminPassword('Toggle default · ' + t.name, () => { const next = tools.map(x => x.id === t.id ? {...x, default: !x.default} : x); setTools(next); TOOLS.length = 0; next.forEach(x => TOOLS.push(x)); }); }; return (
Site Tools & Equipment — items that operators may need to bring to a job site. Admin manages this list; it appears as a multi-select dropdown in Create Booking. Tools marked default are pre-checked on every new booking.
{tools.length} tool{tools.length === 1 ? '' : 's'} · grouped by category · {tools.filter(t => t.default).length} marked default
{isAdmin ? ( ) : Admin only}
{/* Tools grouped by category */} {Object.entries(grouped).map(([cat, items]) => (

{cat}

{items.length} item{items.length === 1 ? '' : 's'}
{items.map(t => ( ))}
IDTool NameDefaultActions
{t.id} {editing === t.id ? ( setEditDraft({...editDraft, name: e.target.value})}/> ) : ( {t.name} )} {editing === t.id ? ( ) : ( {t.default ? 'Default' : 'Optional'} )} {isAdmin ? ( editing === t.id ? (
) : (
) ) : null}
))} {/* Add tool modal */} {showAdd ? (
setShowAdd(false)}>
e.stopPropagation()} style={{maxWidth: 480}}>
Add Tool
setDraft({...draft, name: e.target.value})} placeholder="e.g. Spreader Bar — 10t" autoFocus/>
) : null}
); } Object.assign(window, { ToolsPage });