// Careers Admin — HR portal to post and manage job openings // Access at: /careers-admin | Password protected const { useState: useAdminState, useEffect: useAdminEffect, useRef: useAdminRef } = React; const ADMIN_PASSWORD = 'amg-hr-2024'; // Change this password as needed // ── Paste your Google Apps Script Web App URL here const CAREERS_WEBHOOK_URL = 'https://script.google.com/macros/s/AKfycbxnqVfYpcNNFlXw-40W8Z7skRuOMkn81rQlqwD3fNwFUp1H8VJu6FTdycBGGww8hpYl2g/exec'; function genId() { return Date.now().toString(36) + Math.random().toString(36).slice(2, 7); } // ── Login screen function AdminLogin({ onLogin }) { const [pw, setPw] = useAdminState(''); const [err, setErr] = useAdminState(''); const submit = (e) => { e.preventDefault(); if (pw === ADMIN_PASSWORD) { onLogin(); } else { setErr('Incorrect password. Please try again.'); setPw(''); } }; return (

HR Admin Portal

Ashok Malhotra Group · Careers

); } // ── Empty job template const EMPTY_JOB = { title: '', department: '', location: 'Ludhiana, Punjab', type: 'Full-time', description: '', responsibilities: [''], requirements: [''], active: true, }; // ── List editor for responsibilities / requirements function ListEditor({ label, items, onChange }) { const add = () => onChange([...items, '']); const remove = (i) => onChange(items.filter((_, idx) => idx !== i)); const update = (i, val) => onChange(items.map((it, idx) => idx === i ? val : it)); return (
{label}
{items.map((item, i) => (
update(i, e.target.value)} />
))}
); } // ── Job form (create + edit) function JobForm({ initial, onSave, onCancel }) { const [job, setJob] = useAdminState(initial || EMPTY_JOB); const [errors, setErrors] = useAdminState({}); const set = (key, val) => setJob(p => ({ ...p, [key]: val })); const validate = () => { const e = {}; if (!job.title.trim()) e.title = 'Job title is required'; if (!job.department.trim()) e.department = 'Department is required'; if (!job.description.trim()) e.description = 'Job description is required'; return e; }; const handleSave = () => { const e = validate(); if (Object.keys(e).length) { setErrors(e); return; } onSave({ ...job, title: job.title.trim(), department: job.department.trim(), description: job.description.trim(), responsibilities: job.responsibilities.filter(r => r.trim()), requirements: job.requirements.filter(r => r.trim()), }); }; return (