@realtek/core-theme 0.0.368 → 0.0.370
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/{FacebookCourseMappingsSection-C7qyexlU.cjs → FacebookCourseMappingsSection-AYu5JiEt.cjs} +3 -3
- package/dist-lib/FacebookCourseMappingsSection-AYu5JiEt.cjs.map +1 -0
- package/dist-lib/{FacebookCourseMappingsSection-C49voxq7.js → FacebookCourseMappingsSection-kmMbflwV.js} +347 -256
- package/dist-lib/FacebookCourseMappingsSection-kmMbflwV.js.map +1 -0
- package/dist-lib/index.cjs +19 -19
- package/dist-lib/index.cjs.map +1 -1
- package/dist-lib/index.js +5067 -4406
- package/dist-lib/index.js.map +1 -1
- package/package.json +1 -1
- package/dist-lib/FacebookCourseMappingsSection-C49voxq7.js.map +0 -1
- package/dist-lib/FacebookCourseMappingsSection-C7qyexlU.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FacebookCourseMappingsSection-C7qyexlU.cjs","names":[],"sources":["../src/components/AppAlert.jsx","../src/components/COMBAINED_COMPONENTS/helpers/list/StatStrip.jsx","../src/services/facebookCourseMappingApi.js","../src/services/facebookDistributionApi.js","../src/pages/Modules/Admin/FacebookReassignUI.jsx","../src/pages/Modules/Admin/FacebookDistributionUI.jsx","../src/pages/Modules/Admin/LeadDistributionPanels.jsx","../src/pages/Modules/Admin/FacebookCourseMappingsSection.jsx"],"sourcesContent":["import { Alert } from 'antd';\nimport '../styles/AppAlert.css';\n\nexport default function AppAlert({\n className = '',\n variant = 'default',\n showIcon = true,\n ...rest\n}) {\n return (\n <Alert\n className={`app-alert app-alert--${variant} ${className}`.trim()}\n showIcon={showIcon}\n {...rest}\n />\n );\n}\n","import { Skeleton } from 'antd';\nimport '../styles/combined.css';\n\nconst NUMBER_FORMAT = new Intl.NumberFormat();\n\nfunction formatValue(value) {\n if (value === null || value === undefined || value === '') return '–';\n if (typeof value === 'number' && Number.isFinite(value)) return NUMBER_FORMAT.format(value);\n return String(value);\n}\n\n/**\n * StatStrip — a row of headline numbers (\"642 Total Sourced | 18 Shortlisted …\").\n *\n * items: [{ key, label, value, onClick?, active? }]\n *\n * `0` renders as \"0\" (a real count), and only null/undefined renders as \"–\"\n * (unknown). An item with `onClick` is a button, so it is keyboard reachable.\n */\nexport default function StatStrip({ items = [], loading = false, className = '', ariaLabel = 'Summary' }) {\n if (loading && items.length === 0) {\n return (\n <div className={`cc-stat-strip ${className}`.trim()} aria-busy=\"true\" aria-label={ariaLabel}>\n {[0, 1, 2, 3].map((i) => (\n <div key={i} className=\"cc-stat\"><Skeleton.Button active size=\"small\" style={{ width: 56 }} /></div>\n ))}\n </div>\n );\n }\n if (items.length === 0) return null;\n\n return (\n <div className={`cc-stat-strip ${className}`.trim()} role=\"group\" aria-label={ariaLabel} aria-busy={loading || undefined}>\n {items.map((item) => {\n const body = (\n <>\n <span className=\"cc-stat__value\">{formatValue(item.value)}</span>\n <span className=\"cc-stat__label\">{item.label}</span>\n </>\n );\n return typeof item.onClick === 'function' ? (\n <button\n key={item.key}\n type=\"button\"\n className={`cc-stat cc-stat--button${item.active ? ' is-active' : ''}`}\n onClick={item.onClick}\n aria-pressed={item.active ? true : undefined}\n >\n {body}\n </button>\n ) : (\n <div key={item.key} className=\"cc-stat\">{body}</div>\n );\n })}\n </div>\n );\n}\n","import { ADMIN_API_URL, ADMIN_APP_ID, withAdminAppId } from './apiConfig';\nimport { getStoredToken } from './authApi';\n\nconst base = `${ADMIN_API_URL}/admin/facebook`;\n\nasync function request(path, options = {}) {\n const token = getStoredToken();\n const response = await fetch(`${base}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...withAdminAppId({ 'X-App-Id': String(ADMIN_APP_ID) }),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(options.headers || {}),\n },\n });\n const json = await response.json().catch(() => ({}));\n if (!response.ok || json?.status === false) {\n const error = new Error(json?.error || json?.message || json?.reason || `HTTP ${response.status}`);\n error.status = response.status;\n throw error;\n }\n return json?.data ?? json;\n}\n\nexport const listFacebookForms = () => request('/forms');\nexport const listFacebookLmsCourses = () => request('/courses');\nexport const listFacebookCourseMappings = () => request('/course-mappings');\nexport const saveFacebookCourseMapping = (mapping, isEdit = false) => request(\n isEdit ? `/course-mappings/${encodeURIComponent(mapping.formId)}` : '/course-mappings',\n { method: isEdit ? 'PUT' : 'POST', body: JSON.stringify(mapping) },\n);\nexport const deleteFacebookCourseMapping = (formId) => request(\n `/course-mappings/${encodeURIComponent(formId)}`, { method: 'DELETE' },\n);\n","import { ADMIN_API_URL, ADMIN_APP_ID, withAdminAppId } from './apiConfig';\nimport { getStoredToken } from './authApi';\n\nconst base = `${ADMIN_API_URL}/admin/facebook`;\n\nconst NETWORK_MESSAGE = 'Could not connect. Check your internet connection and try again.';\nconst FORBIDDEN_MESSAGE = \"You don't have permission to do this. Ask your administrator for access.\";\nconst GENERIC_MESSAGE = 'Something went wrong. Please try again.';\n\n/**\n * The words an admin sees for a failed request. Permission, session and server\n * failures always use fixed plain text. Validation (4xx) and conflict (409)\n * keep the server's text, because that text says what to fix.\n */\nexport function plainMessageForStatus(status, serverMessage = '') {\n if (status === 401) return 'Your session has ended. Please sign in again.';\n if (status === 403) return FORBIDDEN_MESSAGE;\n if (status === 404) return 'This could not be found. Refresh the page and try again.';\n if (status === 409) return serverMessage || 'Someone else changed this. Refresh the page and try again.';\n if (status >= 500) return 'The server could not finish this. Please try again in a moment.';\n return serverMessage || GENERIC_MESSAGE;\n}\n\n/**\n * Plain text for any thrown error, including the forms, courses and mapping\n * calls in facebookCourseMappingApi.js, which throw `HTTP 403` with no status.\n * Those calls also throw the raw body of a 5xx, so use `hideServerText` where\n * the wording cannot help the admin, such as a failed load.\n */\nexport function toPlainError(err, fallback = GENERIC_MESSAGE, { hideServerText = false } = {}) {\n if (err?.plain) return err.message;\n const raw = String(err?.message || '');\n if (typeof err?.status === 'number') return plainMessageForStatus(err.status, raw);\n const http = /^HTTP (\\d{3})$/.exec(raw);\n if (http) return plainMessageForStatus(Number(http[1]));\n if (err instanceof TypeError || /failed to fetch|networkerror|load failed/i.test(raw)) return NETWORK_MESSAGE;\n if (/forbidden|permission|not allowed/i.test(raw)) return FORBIDDEN_MESSAGE;\n return hideServerText ? fallback : raw || fallback;\n}\n\nfunction requestError(status, serverMessage) {\n const error = new Error(status === 0 ? NETWORK_MESSAGE : plainMessageForStatus(status, serverMessage));\n error.status = status;\n error.plain = true;\n error.serverMessage = serverMessage;\n return error;\n}\n\nasync function distributionRequest(path, options = {}) {\n const token = getStoredToken();\n if (!token) throw requestError(401, '');\n let response;\n try {\n response = await fetch(`${base}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...withAdminAppId({ 'X-App-Id': String(ADMIN_APP_ID) }),\n Authorization: `Bearer ${token}`,\n ...(options.headers || {}),\n },\n });\n } catch {\n throw requestError(0, '');\n }\n const json = await response.json().catch(() => ({}));\n if (!response.ok || json.status === false) {\n throw requestError(response.status, json.error || json.message || '');\n }\n return json.data ?? json;\n}\n\nexport const listFacebookDistributions = () => distributionRequest('/distributions')\n .then(data => Array.isArray(data) ? data : data.distributions || []);\n\n// The Core Theme /get-all-users API is NOT suitable here: the distribution\n// handler requires scoped Mongo users._id and active counsellor profile data.\nexport async function listFacebookActiveCounsellors() {\n const result = [];\n for (let page = 1; page <= 1000; page++) {\n const data = await distributionRequest(`/counsellors?page=${page}&limit=100`);\n if (!Array.isArray(data.counsellors)) throw new Error('Could not read the list of counsellors. Please try again.');\n result.push(...data.counsellors);\n if (page >= Number(data.totalPages || 0) || !data.counsellors.length) return result;\n }\n throw new Error('The list of counsellors is too long to load. Please contact support.');\n}\n\n// `version` is the value read with the distribution. A mismatch returns 409.\n// It is optional, and 0 is a real version, so only null or undefined leave it out.\nexport const saveFacebookDistribution = ({ formId, counsellorIds, isActive, version }, isEdit) =>\n distributionRequest(isEdit ? `/distribution/${encodeURIComponent(formId)}` : '/distribution', {\n method: isEdit ? 'PUT' : 'POST',\n body: JSON.stringify({\n formId, counsellorIds, isActive,\n ...(version === undefined || version === null ? {} : { version }),\n }),\n });\n\nexport function listFacebookDistributionSkips({ page = 1, limit = 20, formId = '' } = {}) {\n const params = new URLSearchParams({ page: String(page), limit: String(limit) });\n if (formId) params.set('formId', formId);\n return distributionRequest(`/distribution-skips?${params}`);\n}\n\nexport function listFacebookUnassignedLeads({ status = 'unassigned', page = 1, limit = 20, formId = '' } = {}) {\n const params = new URLSearchParams({ status, page: String(page), limit: String(limit) });\n if (formId) params.set('formId', formId);\n return distributionRequest(`/unassigned-leads?${params}`);\n}\n\n// Removes only the form's saved counsellor list and rotation state.\n// Its course mapping and existing LMS lead assignments are untouched.\nexport const deleteFacebookDistribution = (formId) => distributionRequest(\n `/distribution/${encodeURIComponent(formId)}`, { method: 'DELETE' },\n);\n\n// ── Admin alert: leads waiting unassigned + forms with no active counsellor ──\nexport const getFacebookDistributionAlerts = () => distributionRequest('/distribution-alerts');\n\n// ── Manual reassignment of open Facebook leads (reason + audit trail) ────────\n// Counsellors that currently hold open Facebook leads, with their counts.\nexport const listFacebookReassignSummary = () => distributionRequest('/reassign/summary')\n .then(data => data.counsellors || []);\n\nexport function listFacebookReassignLeads({ fromUserId, formId = '', page = 1, limit = 20 } = {}) {\n const params = new URLSearchParams({ fromUserId, page: String(page), limit: String(limit) });\n if (formId) params.set('formId', formId);\n return distributionRequest(`/reassign/leads?${params}`);\n}\n\n// body: { fromUserId, toUserId, reasonType, reason, formId?, allOpen? | leadIds? }\nexport const reassignFacebookLeads = (body) => distributionRequest('/reassign', {\n method: 'POST',\n body: JSON.stringify(body),\n});\n\nexport function listFacebookReassignments({ page = 1, limit = 20, formId = '', leadId = '' } = {}) {\n const params = new URLSearchParams({ page: String(page), limit: String(limit) });\n if (formId) params.set('formId', formId);\n if (leadId) params.set('leadId', leadId);\n return distributionRequest(`/reassignments?${params}`);\n}\n\n// ── Permissions, limits and reason types for this admin ──────────────────────\n// { permissions: { canView, canAdd, canEdit, canDelete },\n// limits: { maxCounsellors, minReason, maxReason, maxPerRun },\n// reasonTypes: [{ value, label }] }\nexport const getFacebookDistributionMeta = () => distributionRequest('/meta');\n\n// ── Facebook leads that could not be imported ────────────────────────────────\nexport function listFacebookFailedLeads({ page = 1, limit = 20, formId = '' } = {}) {\n const params = new URLSearchParams({ page: String(page), limit: String(limit) });\n if (formId) params.set('formId', formId);\n return distributionRequest(`/failed-leads?${params}`);\n}\n\n// Returns 409 when the lead is no longer failed.\nexport const retryFacebookFailedLead = (leadId) => distributionRequest(\n `/failed-leads/${encodeURIComponent(leadId)}/retry`, { method: 'POST' },\n);\n\n// ── Setup change history ─────────────────────────────────────────────────────\nexport function listFacebookHistory({ page = 1, limit = 20, formId = '' } = {}) {\n const params = new URLSearchParams({ page: String(page), limit: String(limit) });\n if (formId) params.set('formId', formId);\n return distributionRequest(`/history?${params}`);\n}\n\n// ── Smart lead distribution (REQ-20261106-14) ────────────────────────────────\n// The server decides eligibility, counts, targets and assignments; these only read and save.\nconst query = (params) => {\n const p = new URLSearchParams();\n Object.entries(params || {}).forEach(([k, v]) => { if (v !== undefined && v !== null && v !== '') p.set(k, String(v)); });\n const s = p.toString();\n return s ? `?${s}` : '';\n};\nexport const getLeadDistributionOverview = (date) => distributionRequest(`/distribution/overview${query({ date })}`);\nexport const getLeadDistributionSettings = () => distributionRequest('/distribution/settings');\nexport const saveLeadDistributionSettings = (settings) => distributionRequest('/distribution/settings', { method: 'PUT', body: JSON.stringify(settings) });\nexport const setCounsellorDistributionEnabled = (legacyId, enabled, reason = '') => distributionRequest(\n `/distribution/counsellors/${encodeURIComponent(legacyId)}/enabled`, { method: 'PUT', body: JSON.stringify({ enabled, reason }) },\n);\nexport const listCounsellorLeaves = (from) => distributionRequest(`/distribution/leaves${query({ from })}`);\nexport const addCounsellorLeave = (leave) => distributionRequest('/distribution/leaves', { method: 'POST', body: JSON.stringify(leave) });\nexport const deleteCounsellorLeave = (id) => distributionRequest(`/distribution/leaves/${encodeURIComponent(id)}`, { method: 'DELETE' });\nexport const listLeadDistributionQueue = (params) => distributionRequest(`/distribution/queue${query(params)}`);\nexport const listLeadAssignments = (params) => distributionRequest(`/distribution/assignments${query(params)}`);\n","/* eslint-disable react-refresh/only-export-components -- plain-word maps and helpers are unit tested */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Alert, Button, Collapse, Input, Modal, Radio, Select, Table, Tag, Typography, message } from 'antd';\nimport { SwapOutlined } from '@ant-design/icons';\nimport AppAlert from '../../../components/AppAlert.jsx';\nimport {\n getFacebookDistributionAlerts, listFacebookFailedLeads, listFacebookReassignLeads,\n listFacebookReassignments, listFacebookReassignSummary, reassignFacebookLeads,\n} from '../../../services/facebookDistributionApi';\n\nconst { Text } = Typography;\nconst dateLabel = value => (value ? new Date(value).toLocaleString() : '—');\nconst plural = (count, word) => `${count} ${word}${count === 1 ? '' : 's'}`;\n\n// Used only when /meta has not answered. The server still enforces its own limits.\nexport const FALLBACK_REASON_TYPES = [\n { value: 'on_leave', label: 'On leave' },\n { value: 'left_company', label: 'Left the company' },\n { value: 'workload', label: 'Workload balancing' },\n { value: 'other', label: 'Other' },\n];\nexport const WAIT_REASON = {\n no_active_counsellor: 'no active counsellor',\n distribution_not_configured: 'no counsellors set up for the form',\n distribution_disabled: 'automatic turns are paused',\n default_owner_inactive_or_missing: 'default owner inactive',\n};\nconst SKIP_REASON = {\n not_open_or_not_assigned_to_counsellor: 'no longer open or no longer with this counsellor',\n changed_during_reassign: 'was updated by the counsellor while moving (run again)',\n update_failed: 'could not be saved',\n};\nexport const FALLBACK_MIN_REASON = 5;\nexport const FALLBACK_MAX_REASON = 500;\nexport const FALLBACK_MAX_PER_RUN = 500;\n\n/**\n * What is stopping the Reassign button, in plain words. Empty when it can run.\n */\nexport function reassignBlockers({ canEdit = true, fromId, toId, movingCount, reasonOk, minReason }) {\n if (!canEdit) return \"You don't have permission to move leads.\";\n const missing = [];\n if (!fromId) missing.push('choose who the leads are moving from');\n if (!movingCount) missing.push('choose at least one lead');\n if (!toId) missing.push('choose who gets the leads');\n if (!reasonOk) missing.push(`write a reason of at least ${minReason} characters`);\n return missing.length ? `To continue, ${missing.join(', ')}.` : '';\n}\n\n/** A searchable form picker. Empty string means all forms. */\nexport function FormFilterSelect({ id, rows = [], value, onChange, minWidth = 260 }) {\n const options = useMemo(() => rows.map(r => ({ value: r.formId, label: r.formName })), [rows]);\n return (\n <Select\n id={id} showSearch optionFilterProp=\"label\" allowClear style={{ minWidth, maxWidth: '100%' }}\n aria-label=\"Facebook form\" placeholder=\"All Facebook forms\" value={value || undefined}\n onChange={next => onChange(next || '')} options={options} popupMatchSelectWidth={false}\n notFoundContent=\"No matching forms\"\n />\n );\n}\n\n/**\n * Polls the admin alert and the failed-lead count every minute, and pauses\n * while the page is hidden. A failed poll never interrupts the page: the last\n * alert stays, and the `*Ok` flags let the page show \"—\" for that number.\n */\nexport function useDistributionAlerts({ refreshKey = 0, pollMs = 60000 } = {}) {\n const [state, setState] = useState({ alerts: null, alertsOk: false, failedCount: null });\n useEffect(() => {\n let active = true;\n const load = () => {\n if (typeof document !== 'undefined' && document.hidden) return;\n Promise.allSettled([getFacebookDistributionAlerts(), listFacebookFailedLeads({ page: 1, limit: 1 })])\n .then(([alertResult, failedResult]) => {\n if (!active) return;\n setState(prev => ({\n alerts: alertResult.status === 'fulfilled' ? alertResult.value : prev.alerts,\n alertsOk: alertResult.status === 'fulfilled',\n failedCount: failedResult.status === 'fulfilled'\n ? Number(failedResult.value?.failedCount ?? failedResult.value?.total ?? 0) : null,\n }));\n });\n };\n load();\n const timer = setInterval(load, pollMs);\n return () => { active = false; clearInterval(timer); };\n }, [refreshKey, pollMs]);\n return state;\n}\n\n/** Form ids an alert is talking about, without repeats. */\nexport function affectedFormIds(alerts) {\n const ids = [...(alerts?.formsWithoutActiveCounsellor || []), ...(alerts?.waitingForms || [])]\n .map(f => String(f.formId)).filter(Boolean);\n return [...new Set(ids)];\n}\n\n/**\n * One calm summary of what needs the admin. Renders nothing when all is well.\n */\nexport function AttentionBar({ alerts, failedCount = 0, onViewLeads, onShowForms }) {\n const waiting = Number(alerts?.unassignedCount || 0);\n const idle = alerts?.formsWithoutActiveCounsellor || [];\n const failed = Number(failedCount || 0);\n const formIds = affectedFormIds(alerts);\n if (!waiting && !idle.length && !failed) return null;\n\n const parts = [];\n if (waiting) parts.push(`${plural(waiting, 'lead')} waiting`);\n if (idle.length) parts.push(`${plural(idle.length, 'form')} with no active counsellor`);\n if (failed) parts.push(`${plural(failed, 'lead')} failed`);\n\n const names = [...new Set([...idle, ...(alerts?.waitingForms || [])].map(f => f.formName).filter(Boolean))];\n const shown = names.slice(0, 2).join(', ');\n const more = names.length > 2 ? ` and ${names.length - 2} more` : '';\n\n return (\n <AppAlert\n className=\"fb-attention\" type=\"warning\"\n title={parts.join(' · ')}\n description={shown ? `${shown}${more}` : undefined}\n action={(\n <div className=\"fb-attention-actions\">\n {(waiting > 0 || failed > 0) && onViewLeads && <Button size=\"small\" onClick={onViewLeads}>View leads</Button>}\n {formIds.length > 0 && onShowForms && <Button size=\"small\" onClick={() => onShowForms(formIds)}>Show these forms</Button>}\n </div>\n )}\n />\n );\n}\n\n/** Admin moves open Facebook leads from one counsellor (e.g. on leave) to another. */\nexport function ReassignLeadsPanel({ rows = [], eligibleCounsellors = [], onChanged, limits, reasonTypes, canEdit = true, refreshKey = 0 }) {\n const [summary, setSummary] = useState([]);\n const [summaryLoading, setSummaryLoading] = useState(false);\n const [fromId, setFromId] = useState('');\n const [formId, setFormId] = useState('');\n const [leads, setLeads] = useState({ leads: [], total: 0 });\n const [leadsLoading, setLeadsLoading] = useState(false);\n const [page, setPage] = useState(1);\n const [selected, setSelected] = useState([]);\n const [allOpen, setAllOpen] = useState(false);\n const [toId, setToId] = useState('');\n const [reasonType, setReasonType] = useState('on_leave');\n const [reason, setReason] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState('');\n const [history, setHistory] = useState({ reassignments: [], total: 0 });\n const [historyPage, setHistoryPage] = useState(1);\n const [historyLoading, setHistoryLoading] = useState(false);\n\n const MIN_REASON = Number(limits?.minReason) || FALLBACK_MIN_REASON;\n const MAX_REASON = Number(limits?.maxReason) || FALLBACK_MAX_REASON;\n const MAX_PER_RUN = Number(limits?.maxPerRun) || FALLBACK_MAX_PER_RUN;\n const REASON_TYPES = reasonTypes?.length ? reasonTypes : FALLBACK_REASON_TYPES;\n const REASON_LABEL = Object.fromEntries(REASON_TYPES.map(r => [r.value, r.label]));\n const reasonValue = REASON_LABEL[reasonType] ? reasonType : REASON_TYPES[0]?.value;\n\n const loadSummary = useCallback(async () => {\n setSummaryLoading(true);\n try { setSummary(await listFacebookReassignSummary()); setError(''); }\n catch (e) { setError(e.message); }\n finally { setSummaryLoading(false); }\n }, []);\n const loadLeads = useCallback(async () => {\n if (!fromId) { setLeads({ leads: [], total: 0 }); return; }\n setLeadsLoading(true);\n try { setLeads(await listFacebookReassignLeads({ fromUserId: fromId, formId, page, limit: 20 })); setError(''); }\n catch (e) { setError(e.message); setLeads({ leads: [], total: 0 }); }\n finally { setLeadsLoading(false); }\n }, [fromId, formId, page]);\n const loadHistory = useCallback(async () => {\n setHistoryLoading(true);\n try { setHistory(await listFacebookReassignments({ page: historyPage, limit: 10 })); }\n catch (e) { setError(e.message); }\n finally { setHistoryLoading(false); }\n }, [historyPage]);\n\n useEffect(() => { loadSummary(); }, [loadSummary, refreshKey]);\n useEffect(() => { loadLeads(); }, [loadLeads, refreshKey]);\n useEffect(() => { loadHistory(); }, [loadHistory, refreshKey]);\n\n const from = summary.find(s => s.userId === fromId);\n const total = Number(leads.total || 0);\n const movingCount = allOpen ? Math.min(total, MAX_PER_RUN) : selected.length;\n const toOptions = useMemo(() => eligibleCounsellors\n .filter(c => c.userId !== fromId && c.isActive !== false)\n .map(c => ({ value: c.userId, label: c.name || c.email || c.userId })), [eligibleCounsellors, fromId]);\n const toName = toOptions.find(o => o.value === toId)?.label || '';\n const reasonOk = reason.trim().length >= MIN_REASON;\n const blockedBecause = reassignBlockers({ canEdit, fromId, toId, movingCount, reasonOk, minReason: MIN_REASON });\n const canSubmit = !blockedBecause && !submitting;\n\n const pickFrom = (value) => { setFromId(value); setPage(1); setSelected([]); setAllOpen(false); setToId(''); };\n const pickForm = (value) => { setFormId(value); setPage(1); setSelected([]); setAllOpen(false); };\n\n const submit = async () => {\n setSubmitting(true);\n try {\n const result = await reassignFacebookLeads({\n fromUserId: fromId, toUserId: toId, reasonType: reasonValue, reason: reason.trim(),\n ...(formId ? { formId } : {}),\n ...(allOpen ? { allOpen: true } : { leadIds: selected }),\n });\n const skipped = result.skipped || [];\n message.success(`${result.moved} lead${result.moved === 1 ? '' : 's'} moved to ${result.to?.name || toName}`);\n if (skipped.length) {\n const counts = skipped.reduce((acc, s) => ({ ...acc, [s.reason]: (acc[s.reason] || 0) + 1 }), {});\n Modal.warning({\n title: `${skipped.length} lead${skipped.length === 1 ? ' was' : 's were'} not moved`,\n content: <ul style={{ paddingLeft: 18 }}>{Object.entries(counts).map(([k, n]) => <li key={k}>{n} — {SKIP_REASON[k] || k}</li>)}</ul>,\n });\n }\n if (result.auditSaved === false) message.warning('Leads were moved, but the history row could not be saved. Each lead still has its own activity entry.');\n if (result.remaining > 0) message.info(`${result.remaining} open lead${result.remaining === 1 ? '' : 's'} still with ${result.from?.name || 'this counsellor'}. Run again to move them.`);\n setSelected([]); setAllOpen(false); setReason('');\n await Promise.all([loadSummary(), loadLeads(), loadHistory()]);\n if (onChanged) onChanged();\n } catch (e) {\n message.error(e.message || 'Could not reassign leads');\n } finally {\n setSubmitting(false);\n }\n };\n const confirm = () => Modal.confirm({\n title: `Move ${movingCount} lead${movingCount === 1 ? '' : 's'} to ${toName}?`,\n okText: 'Reassign', width: 520,\n content: <div>\n <p style={{ marginBottom: 6 }}>From <strong>{from?.name || 'selected counsellor'}</strong> to <strong>{toName}</strong>.</p>\n <p style={{ marginBottom: 6 }}>Reason: <strong>{REASON_LABEL[reasonValue]}</strong> — {reason.trim()}</p>\n <Text type=\"secondary\">Each lead gets an activity entry and a history row. The previous counsellor stops seeing these leads. Pending follow-up reminders are not moved.</Text>\n </div>,\n onOk: submit,\n });\n\n const leadColumns = [\n { title: 'Lead', dataIndex: 'name', render: (v, r) => <div><Text strong>{v || r.leadCode || r.facebookLeadId}</Text><div><Text type=\"secondary\" className=\"fb-small\">{r.leadCode || r.facebookLeadId}</Text></div></div> },\n { title: 'Facebook form', dataIndex: 'formName', render: v => v || 'Unknown form' },\n { title: 'Status', dataIndex: 'status', render: v => <Tag>{v || 'New Lead'}</Tag> },\n { title: 'Received', dataIndex: 'createdAt', render: dateLabel },\n ];\n const historyColumns = [\n { title: 'When', dataIndex: 'reassignedAt', render: dateLabel },\n { title: 'Lead', dataIndex: 'leadCode', render: (v, r) => v || r.facebookLeadId || '—' },\n { title: 'From → To', render: (_, r) => <span>{r.fromName} <SwapOutlined /> {r.toName}</span> },\n { title: 'Reason', render: (_, r) => <div><Tag>{REASON_LABEL[r.reasonType] || 'Other'}</Tag><div style={{ fontSize: 12 }}>{r.reason}</div></div> },\n { title: 'By', dataIndex: 'performedByName' },\n ];\n\n return (\n <div className=\"fb-tab-body\">\n <Text type=\"secondary\" className=\"fb-tab-intro\">Automatic turns keep sending leads to a counsellor who is on leave. Move their open leads to someone else here.</Text>\n {error && <Alert type=\"error\" showIcon title=\"Could not load everything for this tab\" description={error} className=\"fb-block\" />}\n\n <div className=\"fb-field-row\">\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-reassign-from\">From</label>\n <Select id=\"fb-reassign-from\" showSearch optionFilterProp=\"label\" placeholder=\"Choose a counsellor\" value={fromId || undefined} onChange={pickFrom} loading={summaryLoading}\n notFoundContent=\"No counsellor has open Facebook leads\"\n options={summary.map(s => ({ value: s.userId, label: `${s.name} — ${s.openLeads} open${s.isActive ? '' : ' (inactive)'}` }))} />\n </div>\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-reassign-form\">Form</label>\n <FormFilterSelect id=\"fb-reassign-form\" rows={rows} value={formId} onChange={pickForm} minWidth={0} />\n </div>\n </div>\n\n {fromId && <>\n <div className=\"fb-block\">\n <Radio.Group value={allOpen ? 'all' : 'pick'} onChange={e => { setAllOpen(e.target.value === 'all'); if (e.target.value === 'all') setSelected([]); }}>\n <Radio.Button value=\"pick\">Choose leads</Radio.Button>\n <Radio.Button value=\"all\">All {total} open lead{total === 1 ? '' : 's'}</Radio.Button>\n </Radio.Group>\n {allOpen && total > MAX_PER_RUN && <Text type=\"secondary\" className=\"fb-hint-inline\">Moves {MAX_PER_RUN} per run. Run again for the rest.</Text>}\n </div>\n <Table size=\"small\" rowKey=\"id\" loading={leadsLoading} columns={leadColumns} dataSource={leads.leads}\n rowSelection={allOpen ? undefined : { selectedRowKeys: selected, preserveSelectedRowKeys: true, onChange: keys => setSelected(keys) }}\n pagination={{ current: page, pageSize: 20, total, showSizeChanger: false, onChange: setPage }}\n locale={{ emptyText: 'No open Facebook leads for this counsellor' }} scroll={{ x: 640 }} />\n\n <div className=\"fb-reassign-fields\">\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-reassign-to\">To</label>\n <Select id=\"fb-reassign-to\" showSearch optionFilterProp=\"label\" placeholder=\"Choose an active counsellor\" value={toId || undefined} onChange={setToId} options={toOptions}\n notFoundContent=\"No other active counsellor available\" />\n </div>\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-reassign-type\">Reason type</label>\n <Select id=\"fb-reassign-type\" value={reasonValue} onChange={setReasonType} options={REASON_TYPES} />\n </div>\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-reassign-reason\">Reason</label>\n <Input.TextArea id=\"fb-reassign-reason\" rows={2} maxLength={MAX_REASON} showCount value={reason} onChange={e => setReason(e.target.value)}\n placeholder=\"For example, on leave 3–7 Nov\" aria-describedby=\"fb-reassign-reason-hint\" status={reason && !reasonOk ? 'error' : undefined} />\n {!reasonOk && <div id=\"fb-reassign-reason-hint\" className=\"fb-hint\">At least {MIN_REASON} characters</div>}\n </div>\n <div>\n <Button type=\"primary\" icon={<SwapOutlined />} disabled={!canSubmit} loading={submitting} onClick={confirm}>\n {movingCount ? `Reassign ${movingCount} lead${movingCount === 1 ? '' : 's'}` : 'Reassign'}\n </Button>\n {blockedBecause && <div className=\"fb-hint\" role=\"status\">{blockedBecause}</div>}\n </div>\n </div>\n </>}\n\n <Collapse ghost className=\"fb-history-collapse\" items={[{\n key: 'history',\n label: 'Reassignment history',\n children: (\n <Table size=\"small\" rowKey=\"id\" loading={historyLoading} columns={historyColumns} dataSource={history.reassignments}\n pagination={{ current: historyPage, pageSize: 10, total: Number(history.total || 0), showSizeChanger: false, onChange: setHistoryPage }}\n locale={{ emptyText: 'No leads have been reassigned yet' }} scroll={{ x: 720 }} />\n ),\n }]} />\n </div>\n );\n}\n","/* eslint-disable react-refresh/only-export-components -- plain-word maps and helpers are unit tested */\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n Alert, Button, Checkbox, Drawer, Empty, Input, Modal, Select, Switch, Table, Tag, Tooltip,\n Typography, message,\n} from 'antd';\nimport {\n ArrowDownOutlined, ArrowUpOutlined, CheckCircleOutlined, DragOutlined, SearchOutlined,\n} from '@ant-design/icons';\nimport { saveFacebookCourseMapping } from '../../../services/facebookCourseMappingApi';\nimport {\n listFacebookDistributionSkips, listFacebookFailedLeads, listFacebookHistory,\n listFacebookUnassignedLeads, retryFacebookFailedLead, saveFacebookDistribution, toPlainError,\n} from '../../../services/facebookDistributionApi';\nimport { FormFilterSelect, WAIT_REASON } from './FacebookReassignUI';\nimport './FacebookDistributionUI.css';\n\nconst { Text } = Typography;\nconst userIdOf = user => String(user?.userId || '');\nconst FALLBACK_MAX_COUNSELLORS = 50;\n\nexport const dateLabel = (value) => {\n const date = value ? new Date(value) : null;\n return date && !Number.isNaN(date.getTime()) ? date.toLocaleString() : '—';\n};\n\nconst sentence = text => (text ? text.charAt(0).toUpperCase() + text.slice(1) : text);\n\n/* ── Plain words ─────────────────────────────────────────────────────────── */\n\nexport const FORM_STATUS = {\n ready: { label: 'Ready', tone: 'good' },\n needs_setup: { label: 'Needs setup', tone: 'warn' },\n paused: { label: 'Paused', tone: 'muted' },\n no_active: { label: 'No active counsellor', tone: 'bad' },\n unknown_form: { label: 'Unknown form', tone: 'muted' },\n};\n\nexport const SKIP_REASON_LABEL = {\n inactive: 'Inactive',\n locked: 'Account locked',\n deleted: 'Deleted',\n not_counsellor: 'No longer a counsellor',\n unavailable: 'Unavailable',\n};\nexport const skipReasonLabel = reason => SKIP_REASON_LABEL[reason] || 'Unavailable';\n\nexport const FAILED_REASON_LABEL = {\n meta_fetch: 'Could not read the lead from Facebook',\n lms_create: 'Could not create the lead',\n invalid_lead_fields: 'The lead had unreadable details',\n course_mapping: 'Could not read the course for this form',\n contact_lookup: 'Could not check for a duplicate',\n database_lookup: 'Could not check for a duplicate',\n distribution_lookup: 'Could not find the counsellor list',\n configuration_disabled: 'Facebook import was switched off',\n unassigned_audit: 'Could not add the lead to the waiting list',\n meta_forms: 'Could not read the forms from Facebook',\n mismatched_page_or_form: 'The lead came from a different Facebook page or form',\n mismatched_meta_form: 'The lead came from a different Facebook page or form',\n};\nexport const failedReasonLabel = reason => FAILED_REASON_LABEL[reason] || 'Failed';\n\nexport const waitReasonLabel = reason => sentence(WAIT_REASON[reason]) || 'Waiting for setup';\n\nconst counsellorIdsIn = (snapshot) => {\n if (!snapshot || typeof snapshot !== 'object') return null;\n const list = snapshot.counsellorIds || snapshot.counsellors;\n if (!Array.isArray(list)) return null;\n return list.map(item => String(item?.userId ?? item?.legacyUserId ?? item));\n};\n\n/** A plain sentence for one /history entry. Never shows a raw value or id. */\nexport function describeHistoryChange(entry) {\n const { area, action, before, after } = entry || {};\n const areaText = String(area || '').toLowerCase();\n const actionText = String(action || '').toLowerCase();\n const removed = /delete|remove/.test(actionText);\n const created = /create|add/.test(actionText) || !before;\n\n if (/retry/.test(actionText) || /failed/.test(areaText)) return 'Retried failed lead';\n\n if (/mapping|course/.test(areaText)) {\n if (removed) return 'Course removed';\n const name = after?.courseName;\n const courseChanged = (before?.courseId ?? before?.courseName) !== (after?.courseId ?? after?.courseName);\n if (name && (created || courseChanged)) return `Course ${created ? 'set to' : 'changed to'} ${name}`;\n if (typeof before?.isActive === 'boolean' && typeof after?.isActive === 'boolean' && before.isActive !== after.isActive) {\n return after.isActive ? 'Course turned on' : 'Course turned off';\n }\n return 'Course changed';\n }\n\n if (/distribution|counsellor/.test(areaText)) {\n if (removed) return 'Counsellors removed';\n if (created) return 'Counsellors set up';\n if (typeof before?.isActive === 'boolean' && typeof after?.isActive === 'boolean' && before.isActive !== after.isActive) {\n return after.isActive ? 'Resumed' : 'Paused';\n }\n const was = counsellorIdsIn(before);\n const now = counsellorIdsIn(after);\n if (was && now && was.length === now.length && [...was].sort().join() === [...now].sort().join()) return 'Order changed';\n return 'Counsellors changed';\n }\n\n return 'Setup changed';\n}\n\n/* ── Status and rotation ─────────────────────────────────────────────────── */\n\n/**\n * The status of one form. Returns null when mappings or distributions are not\n * known, so a failed load can never be shown as \"Needs setup\".\n *\n * An inactive course mapping counts as Needs setup, not Paused: leads keep\n * arriving and being assigned, they just arrive without a course.\n */\nexport function deriveFormStatus({ mapping, distribution, inFormsList = true }, known = {}) {\n const { forms = true, mappings = true, distributions = true } = known;\n if (!mappings || !distributions) return null;\n if (forms && !inFormsList) return 'unknown_form';\n const people = distribution?.counsellors || [];\n if (!mapping || !mapping.isActive || !distribution || !people.length) return 'needs_setup';\n if (distribution.isActive === false) return 'paused';\n if (!people.some(person => person.isActive !== false)) return 'no_active';\n return 'ready';\n}\n\n/** The next person who can really receive a lead, skipping inactive people. */\nexport function nextCounsellorName(distribution) {\n const people = distribution?.counsellors || [];\n if (!people.length) return '';\n const start = Math.max(people.findIndex(p => userIdOf(p) === String(distribution.nextUserId || '')), 0);\n const rotated = [...people.slice(start), ...people.slice(0, start)];\n return rotated.find(p => p.isActive !== false)?.name || '';\n}\n\nfunction orderedMove(list, a, b) {\n if (a === b || a < 0 || b < 0 || a >= list.length || b >= list.length) return list;\n const next = [...list];\n const [item] = next.splice(a, 1);\n next.splice(b, 0, item);\n return next;\n}\n\n/** Preview the same turn-continuation rule as the server. */\nexport function nextAfterDistributionEdit(current, updated) {\n if (!updated.length) return '';\n const previous = (current?.counsellors || []).map(userIdOf).filter(Boolean);\n const savedNext = String(current?.nextUserId || '');\n const unchanged = previous.length === updated.length && previous.every((id, i) => id === updated[i]);\n if (unchanged && updated.includes(savedNext)) return savedNext;\n let last = String(current?.lastAssignedUserId || '');\n if (!last && previous.includes(savedNext)) {\n last = previous[(previous.indexOf(savedNext) - 1 + previous.length) % previous.length];\n }\n if (updated.includes(last)) return updated[(updated.indexOf(last) + 1) % updated.length];\n if (previous.includes(last)) {\n const lastIndex = previous.indexOf(last);\n for (let i = 1; i <= previous.length; i++) {\n const candidate = previous[(lastIndex + i) % previous.length];\n if (updated.includes(candidate)) return candidate;\n }\n }\n if (updated.includes(savedNext)) return savedNext;\n return updated[0];\n}\n\n/**\n * One Save: the course first, then the counsellors. Stops at the first failure\n * so the result always says exactly which part reached the server.\n */\nexport async function runFormSetupSave({ mapping, distribution, saveMapping, saveDistribution }) {\n const result = { mappingSaved: false, distributionSaved: false, failedPart: '', error: null };\n if (mapping) {\n try {\n await saveMapping(mapping.input, mapping.isEdit);\n result.mappingSaved = true;\n } catch (error) {\n return { ...result, failedPart: 'mapping', error };\n }\n }\n if (distribution) {\n try {\n await saveDistribution(distribution.input, distribution.isEdit);\n result.distributionSaved = true;\n } catch (error) {\n return { ...result, failedPart: 'distribution', error };\n }\n }\n return result;\n}\n\nconst joinNames = (names) => {\n if (names.length < 2) return names[0] || '';\n return `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`;\n};\n\n/** Plain warning for inactive people who are kept in the list. */\nexport function inactiveWarning(names) {\n if (!names.length) return '';\n return names.length === 1\n ? `${names[0]} is inactive and will be skipped. Remove them or keep the place for when they return.`\n : `${joinNames(names)} are inactive and will be skipped. Remove them or keep their places for when they return.`;\n}\n\n/* ── Small shared pieces ─────────────────────────────────────────────────── */\n\nexport function StatusTag({ status }) {\n const info = FORM_STATUS[status];\n if (!info) return <Text type=\"secondary\">—</Text>;\n return <Tag className={`fb-status fb-status--${info.tone}`}><span className=\"fb-status-dot\" aria-hidden=\"true\" />{info.label}</Tag>;\n}\n\nfunction SectionHeading({ number, title, aside }) {\n return (\n <div className=\"fb-setup-heading\">\n <h3><span className=\"fb-setup-number\" aria-hidden=\"true\">{number}</span>{title}</h3>\n {aside && <span className=\"fb-setup-aside\">{aside}</span>}\n </div>\n );\n}\n\n/* ── Form setup panel ────────────────────────────────────────────────────── */\n\nconst seedFrom = (mapping, current) => ({\n base: { mapping: mapping || null, current: current || null },\n courseId: mapping?.courseId || undefined,\n mappingActive: mapping?.isActive ?? true,\n orderedIds: (current?.counsellors || []).map(userIdOf).filter(Boolean),\n enabled: current?.isActive !== false,\n});\n\n/**\n * The one place to set up a form: course, counsellors and order, on or paused.\n *\n * Mount it with a new `key` for each opening. It reads `mapping` and `current`\n * only then and works from that snapshot, so a background refresh can neither\n * replace the admin's edits nor swap the `version` the save is checked against.\n * Only a 409 reloads it on purpose, through `onReload`.\n *\n * The mapping and the distribution stay independent records. Either can be\n * saved without the other.\n */\nexport function FormSetupDrawer({\n open, row, mapping, current, courses = [], counsellors = [], limits, permissions = {}, section = 'course',\n onClose, onSaved, onReload, onAfterClose,\n}) {\n const [seed] = useState(() => seedFrom(mapping, current));\n const [base, setBase] = useState(seed.base);\n const [courseId, setCourseId] = useState(seed.courseId);\n const [mappingActive, setMappingActive] = useState(seed.mappingActive);\n const [orderedIds, setOrderedIds] = useState(seed.orderedIds);\n const [enabled, setEnabled] = useState(seed.enabled);\n const [search, setSearch] = useState('');\n const [saving, setSaving] = useState(false);\n const [problem, setProblem] = useState('');\n const [announcement, setAnnouncement] = useState('');\n const [dragOver, setDragOver] = useState(null);\n const [dragId, setDragId] = useState(null);\n const listRef = useRef(null);\n const counsellorsRef = useRef(null);\n const pendingFocus = useRef(null);\n const confirmOpen = useRef(false);\n\n const { canAdd = true, canEdit = true } = permissions;\n const canWriteMapping = base.mapping ? canEdit : canAdd;\n const canWriteDistribution = base.current ? canEdit : canAdd;\n const readOnly = !canWriteMapping && !canWriteDistribution;\n const maxCounsellors = Number(limits?.maxCounsellors) || FALLBACK_MAX_COUNSELLORS;\n\n // Saved inactive members stay listed, so they can be removed or kept. New\n // choices only ever come from the active counsellor list.\n const savedPeople = base.current?.counsellors;\n const savedMapping = base.mapping;\n const peopleById = useMemo(() => {\n const users = new Map(counsellors.map(user => [userIdOf(user), { ...user, isActive: true }]));\n (savedPeople || []).forEach((user) => {\n const id = userIdOf(user);\n if (!users.has(id)) users.set(id, { ...user, isActive: false });\n });\n return users;\n }, [counsellors, savedPeople]);\n\n const nameOf = useCallback(id => peopleById.get(id)?.name || 'Unnamed counsellor', [peopleById]);\n const selectedSet = useMemo(() => new Set(orderedIds), [orderedIds]);\n const orderedPeople = orderedIds.map(id => peopleById.get(id)).filter(Boolean);\n const notSelected = [...counsellors]\n .filter(user => !selectedSet.has(userIdOf(user)))\n .sort((a, b) => String(a.name).localeCompare(String(b.name)));\n const visible = [...orderedPeople, ...notSelected].filter(user => (\n `${user.name || ''} ${user.email || ''}`.toLowerCase().includes(search.trim().toLowerCase())\n ));\n const inactiveMembers = orderedPeople.filter(user => !user.isActive);\n const activeCount = orderedPeople.length - inactiveMembers.length;\n\n const savedIds = (base.current?.counsellors || []).map(userIdOf).filter(Boolean);\n const orderChanged = savedIds.length !== orderedIds.length || savedIds.some((id, index) => id !== orderedIds[index]);\n const distributionChanged = base.current\n ? orderChanged || enabled !== (base.current.isActive !== false)\n : orderedIds.length > 0;\n const mappingChanged = base.mapping\n ? String(courseId) !== String(base.mapping.courseId) || mappingActive !== base.mapping.isActive\n : Boolean(courseId);\n const dirty = mappingChanged || distributionChanged;\n\n // The server skips anyone who cannot receive a lead, so show the first person\n // who can rather than silently resetting to the top of the list.\n const nextCursorId = nextAfterDistributionEdit(base.current, orderedIds);\n const cursorIndex = orderedIds.indexOf(nextCursorId);\n const rotation = cursorIndex < 0 ? orderedIds : [...orderedIds.slice(cursorIndex), ...orderedIds.slice(0, cursorIndex)];\n const nextId = rotation.find(id => peopleById.get(id)?.isActive) || '';\n const nextName = peopleById.get(nextId)?.name || 'No one yet';\n\n const courseOptions = useMemo(() => {\n const options = courses.map(c => ({ value: c.courseId, label: c.courseName }));\n // A course that has since been removed must still show its name, not its id.\n if (savedMapping?.courseId && !options.some(o => o.value === savedMapping.courseId)) {\n options.unshift({ value: savedMapping.courseId, label: savedMapping.courseName || 'Course no longer available' });\n }\n return options;\n }, [courses, savedMapping]);\n\n const reseed = (nextMapping, nextCurrent) => {\n const next = seedFrom(nextMapping, nextCurrent);\n setBase(next.base);\n setCourseId(next.courseId);\n setMappingActive(next.mappingActive);\n setOrderedIds(next.orderedIds);\n setEnabled(next.enabled);\n };\n\n const toggle = (id, checked) => {\n setOrderedIds(prev => (checked ? [...prev.filter(value => value !== id), id] : prev.filter(value => value !== id)));\n setAnnouncement(checked ? `${nameOf(id)} added to the list` : `${nameOf(id)} removed from the list`);\n };\n\n const move = (id, direction) => {\n const from = orderedIds.indexOf(id);\n const to = from + (direction === 'up' ? -1 : 1);\n if (from < 0 || to < 0 || to >= orderedIds.length) return;\n pendingFocus.current = { id, direction };\n setOrderedIds(prev => orderedMove(prev, from, to));\n setAnnouncement(`${nameOf(id)} moved to place ${to + 1} of ${orderedIds.length}`);\n };\n\n // A moved row is put back into the DOM, and at either end its button becomes\n // disabled. Both drop focus, so put it back on the same person's button.\n useLayoutEffect(() => {\n const wanted = pendingFocus.current;\n if (!wanted) return;\n pendingFocus.current = null;\n const buttons = [...(listRef.current?.querySelectorAll('[data-move-id]') || [])]\n .filter(button => button.dataset.moveId === wanted.id && !button.disabled);\n (buttons.find(button => button.dataset.moveDirection === wanted.direction) || buttons[0])?.focus();\n }, [orderedIds]);\n\n const startDrag = (event, id) => {\n setDragId(id);\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', id);\n };\n const dragAcross = (event, id, chosen) => {\n if (!chosen || !dragId || dragId === id) return;\n event.preventDefault();\n setDragOver(id);\n };\n const endDrag = () => { setDragId(null); setDragOver(null); };\n\n const drop = (targetId) => {\n const sourceId = dragId;\n endDrag();\n if (!selectedSet.has(sourceId) || !selectedSet.has(targetId) || sourceId === targetId) return;\n setOrderedIds(prev => orderedMove(prev, prev.indexOf(sourceId), prev.indexOf(targetId)));\n setAnnouncement(`${nameOf(sourceId)} moved`);\n };\n\n const requestClose = () => {\n if (saving) return;\n if (!dirty) { onClose(); return; }\n if (confirmOpen.current) return;\n confirmOpen.current = true;\n Modal.confirm({\n title: 'Discard your changes?',\n content: 'Your changes to this form have not been saved.',\n okText: 'Discard changes',\n okType: 'danger',\n cancelText: 'Keep editing',\n autoFocusButton: 'cancel',\n onOk: () => { confirmOpen.current = false; onClose(); },\n onCancel: () => { confirmOpen.current = false; },\n });\n };\n\n const save = async () => {\n setProblem('');\n if (distributionChanged && !orderedIds.length) {\n setProblem('Choose at least one counsellor. To stop using counsellors on this form, use Remove distribution in the form menu.');\n return;\n }\n if (distributionChanged && orderedIds.length > maxCounsellors) {\n setProblem(`You can choose up to ${maxCounsellors} counsellors. You have chosen ${orderedIds.length}.`);\n return;\n }\n setSaving(true);\n const outcome = await runFormSetupSave({\n mapping: mappingChanged\n ? { input: { formId: row.formId, courseId, isActive: mappingActive }, isEdit: Boolean(base.mapping) }\n : null,\n distribution: distributionChanged\n ? {\n input: { formId: row.formId, counsellorIds: orderedIds, isActive: enabled, version: base.current?.version ?? 0 },\n isEdit: Boolean(base.current),\n }\n : null,\n saveMapping: saveFacebookCourseMapping,\n saveDistribution: saveFacebookDistribution,\n });\n\n if (!outcome.error) {\n setSaving(false);\n message.success('Form setup saved');\n onSaved?.();\n onClose();\n return;\n }\n\n const coursePrefix = outcome.mappingSaved ? 'The course was saved. ' : '';\n if (outcome.failedPart === 'mapping') {\n setProblem(`Nothing was saved. The course could not be saved: ${toPlainError(outcome.error)}`);\n } else if (outcome.error?.status === 409) {\n try {\n const fresh = await onReload();\n reseed(fresh?.mapping, fresh?.current);\n setProblem(`${coursePrefix}Someone else changed these counsellors while you were editing, so yours were not saved. The latest list is now showing. Check it and save again.`);\n } catch {\n setProblem(`${coursePrefix}Someone else changed these counsellors while you were editing, so yours were not saved. The latest list could not be loaded. Close this panel and open it again.`);\n }\n } else {\n if (outcome.mappingSaved) {\n setBase(prev => ({\n ...prev,\n mapping: {\n ...(prev.mapping || {}), formId: row.formId, courseId, isActive: mappingActive,\n courseName: courseOptions.find(o => o.value === courseId)?.label || prev.mapping?.courseName || '',\n },\n }));\n }\n setProblem(`${coursePrefix}The counsellors were not saved: ${toPlainError(outcome.error)}`);\n }\n if (outcome.mappingSaved) onSaved?.();\n setSaving(false);\n };\n\n const footer = (\n <div className=\"fb-setup-footer\">\n {problem && <Alert type=\"error\" showIcon title={problem} className=\"fb-setup-problem\" />}\n <div className=\"fb-setup-footer-actions\">\n <Button onClick={requestClose} disabled={saving}>{readOnly ? 'Close' : 'Cancel'}</Button>\n {!readOnly && <Button type=\"primary\" loading={saving} disabled={!dirty} onClick={save}>Save</Button>}\n </div>\n </div>\n );\n\n const hasSetup = Boolean(base.mapping || base.current);\n\n return (\n <Drawer\n open={open} size={560} rootClassName=\"fb-setup-drawer\" keyboard mask={{ closable: true }}\n title={<span className=\"fb-setup-title\">{hasSetup ? 'Edit' : 'Set up'} form</span>}\n onClose={requestClose} footer={footer}\n afterOpenChange={(isOpen) => {\n if (isOpen && section === 'counsellors') counsellorsRef.current?.scrollIntoView?.({ block: 'start' });\n if (!isOpen) onAfterClose?.();\n }}\n >\n <div className=\"fb-setup-form-name\">\n <Text strong>{row?.formName}</Text>\n <Text type=\"secondary\" className=\"fb-small\" copyable={{ text: row?.formId, tooltips: ['Copy Form ID', 'Copied'] }}>Form ID: {row?.formId}</Text>\n </div>\n\n {readOnly && <Alert type=\"info\" showIcon title=\"You can view this setup, but your role cannot change it.\" className=\"fb-block\" />}\n\n <section className=\"fb-setup-section\" aria-label=\"Course\">\n <SectionHeading number=\"1\" title=\"Course\" />\n <Select\n className=\"fb-setup-select\" showSearch optionFilterProp=\"label\" aria-label=\"Course\"\n placeholder=\"Choose a course\" value={courseId} onChange={setCourseId} options={courseOptions}\n disabled={!canWriteMapping || saving} notFoundContent=\"No matching courses\"\n />\n {courseId\n ? (\n <label className=\"fb-setup-toggle\">\n <span>\n <span className=\"fb-setup-toggle-title\">Use this course for new leads</span>\n <span className=\"fb-hint\">When off, new leads still come in, but without a course.</span>\n </span>\n <Switch\n aria-label=\"Use this course for new leads\" checked={mappingActive} onChange={setMappingActive}\n disabled={!canWriteMapping || saving}\n />\n </label>\n )\n : <div className=\"fb-hint\">No course yet. You can still choose counsellors, and leads will arrive without a course until you pick one.</div>}\n </section>\n\n <section className=\"fb-setup-section\" aria-label=\"Counsellors and order\" ref={counsellorsRef}>\n <SectionHeading\n number=\"2\" title=\"Counsellors and order\"\n aside={`${activeCount} active${inactiveMembers.length ? `, ${inactiveMembers.length} inactive` : ''}`}\n />\n {inactiveMembers.length > 0 && (\n <Alert\n type=\"warning\" showIcon className=\"fb-block\"\n title={inactiveWarning(inactiveMembers.map(user => user.name || 'Unnamed counsellor'))}\n description={canWriteDistribution && (\n <div className=\"fb-inactive-actions\">\n {inactiveMembers.map(user => (\n <Button key={userIdOf(user)} size=\"small\" disabled={saving} onClick={() => toggle(userIdOf(user), false)}>\n Remove {user.name || 'Unnamed counsellor'}\n </Button>\n ))}\n </div>\n )}\n />\n )}\n <Input\n allowClear value={search} prefix={<SearchOutlined aria-hidden=\"true\" />} className=\"fb-block\"\n placeholder=\"Search counsellors\" aria-label=\"Search counsellors\" onChange={e => setSearch(e.target.value)}\n />\n <div className=\"fb-dist-draggable-list\" ref={listRef}>\n {visible.length === 0\n ? <Empty description={counsellors.length || orderedIds.length ? 'No matching counsellors' : 'No active counsellors to choose from'} />\n : visible.map((user) => {\n const id = userIdOf(user);\n const name = user.name || 'Unnamed counsellor';\n const chosen = selectedSet.has(id);\n const index = orderedIds.indexOf(id);\n return (\n <div\n key={id} data-person-row={id}\n className={`fb-dist-unified-row ${chosen ? 'selected' : ''} ${dragOver === id ? 'drag-over' : ''}`}\n draggable={chosen && !saving && canWriteDistribution}\n onDragStart={event => startDrag(event, id)}\n onDragOver={event => dragAcross(event, id, chosen)}\n onDrop={(event) => { event.preventDefault(); drop(id); }}\n onDragEnd={endDrag}\n >\n <span className=\"fb-dist-check\">\n <Checkbox\n aria-label={`Include ${name}`} checked={chosen} disabled={saving || !canWriteDistribution}\n onChange={event => toggle(id, event.target.checked)}\n />\n </span>\n <span className={`fb-dist-grip ${chosen ? '' : 'placeholder'}`} aria-hidden=\"true\"><DragOutlined /></span>\n <span className=\"fb-dist-rank\" aria-hidden={!chosen}>{chosen ? index + 1 : ''}</span>\n <div className=\"fb-dist-person-name\">\n <Text strong={chosen}>{name}</Text>\n {user.email && <Text type=\"secondary\" className=\"fb-small\" ellipsis>{user.email}</Text>}\n </div>\n {!user.isActive && <Tag className=\"fb-status fb-status--bad\"><span className=\"fb-status-dot\" aria-hidden=\"true\" />Inactive</Tag>}\n {chosen && (\n <span className=\"fb-dist-order-buttons\">\n <Tooltip title={`Move ${name} up`}>\n <Button\n type=\"text\" icon={<ArrowUpOutlined aria-hidden=\"true\" />} aria-label={`Move ${name} up`}\n data-move-id={id} data-move-direction=\"up\"\n disabled={index <= 0 || saving || !canWriteDistribution} onClick={() => move(id, 'up')}\n />\n </Tooltip>\n <Tooltip title={`Move ${name} down`}>\n <Button\n type=\"text\" icon={<ArrowDownOutlined aria-hidden=\"true\" />} aria-label={`Move ${name} down`}\n data-move-id={id} data-move-direction=\"down\"\n disabled={index >= orderedIds.length - 1 || saving || !canWriteDistribution} onClick={() => move(id, 'down')}\n />\n </Tooltip>\n </span>\n )}\n </div>\n );\n })}\n </div>\n <div className=\"fb-sr-only\" aria-live=\"polite\">{announcement}</div>\n <div className=\"fb-dist-next-line\">\n <CheckCircleOutlined aria-hidden=\"true\" />\n <span>{orderChanged ? 'Next after save' : 'Next in saved order'}: <strong>{nextName}</strong></span>\n </div>\n <div className=\"fb-hint\">Changes apply to future leads only. Turns carry on from the last person who got a lead, and leads people already have stay with them.</div>\n </section>\n\n <section className=\"fb-setup-section\" aria-label=\"Automatic turns\">\n <SectionHeading number=\"3\" title=\"Automatic turns\" />\n <label className=\"fb-setup-toggle\">\n <span>\n <span className=\"fb-setup-toggle-title\">Send leads to this form automatically</span>\n <span className=\"fb-hint\">When paused, new leads wait until you turn this back on.</span>\n </span>\n <Switch\n aria-label=\"Send leads to this form automatically\" checked={enabled} onChange={setEnabled}\n checkedChildren=\"On\" unCheckedChildren=\"Paused\" disabled={!canWriteDistribution || saving}\n />\n </label>\n </section>\n </Drawer>\n );\n}\n\n/* ── Read-only tabs ──────────────────────────────────────────────────────── */\n\n/** Loads one list. Earlier data stays on screen when a refresh fails. */\nfunction useListResource(load, refreshKey) {\n const [tick, setTick] = useState(0);\n const [state, setState] = useState({ data: null, error: '', settled: null });\n const request = useMemo(() => ({ load, refreshKey, tick }), [load, refreshKey, tick]);\n useEffect(() => {\n let active = true;\n request.load()\n .then((data) => { if (active) setState({ data, error: '', settled: request }); })\n .catch((err) => { if (active) setState(prev => ({ ...prev, error: toPlainError(err), settled: request })); });\n return () => { active = false; };\n }, [request]);\n const reload = useCallback(() => setTick(n => n + 1), []);\n const loading = state.settled !== request;\n return { data: state.data, loading, error: loading ? '' : state.error, reload };\n}\n\nfunction ListError({ title, resource }) {\n if (!resource.error) return null;\n return (\n <Alert\n type=\"error\" showIcon className=\"fb-block\" title={title}\n description={`${resource.error}${resource.data ? ' Showing the last information we could load.' : ''}`}\n action={<Button size=\"small\" onClick={resource.reload}>Try again</Button>}\n />\n );\n}\n\nconst formNameFrom = (rows, record) => record.formName\n || rows.find(r => r.formId === String(record.formId))?.formName || 'Unknown form';\n\n/** Waiting leads and failed leads, in one view. */\nexport function NeedsAttentionPanel({ rows = [], canEdit = true, refreshKey = 0, onChanged }) {\n const [formId, setFormId] = useState('');\n const [waitingStatus, setWaitingStatus] = useState('unassigned');\n const [waitingPage, setWaitingPage] = useState(1);\n const [failedPage, setFailedPage] = useState(1);\n\n const loadWaiting = useCallback(\n () => listFacebookUnassignedLeads({ status: waitingStatus, page: waitingPage, limit: 20, formId }),\n [waitingStatus, waitingPage, formId],\n );\n const loadFailed = useCallback(\n () => listFacebookFailedLeads({ page: failedPage, limit: 20, formId }),\n [failedPage, formId],\n );\n const waiting = useListResource(loadWaiting, refreshKey);\n const failed = useListResource(loadFailed, refreshKey);\n const reloadFailed = failed.reload;\n\n const pickForm = (value) => { setFormId(value); setWaitingPage(1); setFailedPage(1); };\n\n const confirmRetry = (lead) => {\n Modal.confirm({\n title: 'Try this lead again?',\n content: <span>We will try to bring in lead <strong>{lead.facebookLeadId}</strong> from <strong>{formNameFrom(rows, lead)}</strong> again.</span>,\n okText: 'Retry',\n cancelText: 'Cancel',\n autoFocusButton: 'cancel',\n onOk: async () => {\n try {\n await retryFacebookFailedLead(lead.facebookLeadId);\n message.success('This lead will be tried again');\n } catch (err) {\n message.error(err?.status === 409 ? 'This lead is no longer failed. The list has been updated.' : toPlainError(err));\n }\n reloadFailed();\n onChanged?.();\n },\n });\n };\n\n const waitingColumns = [\n { title: 'Form', dataIndex: 'formName', render: (_, r) => formNameFrom(rows, r) },\n { title: 'Lead ID', dataIndex: 'facebookLeadId' },\n { title: 'Why it is waiting', dataIndex: 'reason', render: waitReasonLabel },\n { title: 'Status', dataIndex: 'status', render: v => (v === 'unassigned' ? 'Waiting' : v === 'resolved' ? 'Sorted' : '—') },\n { title: 'First seen', dataIndex: 'firstSeenAt', render: dateLabel },\n ...(waitingStatus === 'unassigned' ? [] : [{ title: 'Sorted at', dataIndex: 'resolvedAt', render: dateLabel }]),\n ];\n const failedColumns = [\n { title: 'Form', dataIndex: 'formName', render: (_, r) => formNameFrom(rows, r) },\n { title: 'Lead ID', dataIndex: 'facebookLeadId' },\n { title: 'What went wrong', dataIndex: 'reason', render: failedReasonLabel },\n { title: 'Tries', dataIndex: 'attempts', width: 72, render: v => v ?? '—' },\n { title: 'When', dataIndex: 'lastFailedAt', render: (v, r) => dateLabel(v || r.firstSeenAt) },\n {\n title: '', key: 'retry', width: 96, render: (_, lead) => (\n <Tooltip title={canEdit ? '' : \"You don't have permission to retry leads\"}>\n <span>\n <Button\n size=\"small\" className=\"fb-inline-btn\" disabled={!canEdit}\n aria-label={`Retry lead ${lead.facebookLeadId}`} onClick={() => confirmRetry(lead)}\n >Retry</Button>\n </span>\n </Tooltip>\n ),\n },\n ];\n const waitingCount = waiting.data?.unassignedCount;\n const failedCount = failed.data?.failedCount ?? failed.data?.total;\n\n return (\n <div className=\"fb-tab-body\">\n <div className=\"fb-toolbar\">\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-attention-form\">Form</label>\n <FormFilterSelect id=\"fb-attention-form\" rows={rows} value={formId} onChange={pickForm} />\n </div>\n </div>\n\n <div className=\"fb-subhead\">\n <h4>Waiting leads{waitingCount === undefined ? '' : ` (${waitingCount})`}</h4>\n <Select\n aria-label=\"Show waiting leads\" value={waitingStatus} className=\"fb-subhead-select\"\n onChange={(value) => { setWaitingStatus(value); setWaitingPage(1); }}\n options={[{ value: 'unassigned', label: 'Waiting' }, { value: 'resolved', label: 'Sorted' }, { value: 'all', label: 'All' }]}\n />\n </div>\n <ListError title=\"Could not load waiting leads\" resource={waiting} />\n <Table\n size=\"small\" rowKey={r => String(r.id || `${r.facebookLeadId}-${r.formId}`)} loading={waiting.loading}\n dataSource={waiting.data?.leads || []} columns={waitingColumns} scroll={{ x: 760 }}\n locale={{ emptyText: waiting.loading || waiting.error ? ' ' : 'No leads are waiting.' }}\n pagination={{ current: waitingPage, pageSize: 20, total: Number(waiting.data?.total || 0), showSizeChanger: false, hideOnSinglePage: true, onChange: setWaitingPage }}\n />\n\n <div className=\"fb-subhead\">\n <h4>Failed leads{failedCount === undefined ? '' : ` (${failedCount})`}</h4>\n </div>\n <ListError title=\"Could not load failed leads\" resource={failed} />\n <Table\n size=\"small\" rowKey={r => String(r.facebookLeadId)} loading={failed.loading}\n dataSource={failed.data?.leads || []} columns={failedColumns} scroll={{ x: 760 }}\n locale={{ emptyText: failed.loading || failed.error ? ' ' : 'No failed leads.' }}\n pagination={{ current: failedPage, pageSize: 20, total: Number(failed.data?.total || 0), showSizeChanger: false, hideOnSinglePage: true, onChange: setFailedPage }}\n />\n </div>\n );\n}\n\n/** Who was skipped, and why. Read only. */\nexport function SkippedCounsellorsPanel({ rows = [], refreshKey = 0 }) {\n const [formId, setFormId] = useState('');\n const [page, setPage] = useState(1);\n const load = useCallback(() => listFacebookDistributionSkips({ page, limit: 20, formId }), [page, formId]);\n const skips = useListResource(load, refreshKey);\n const columns = [\n { title: 'Form', dataIndex: 'formName', render: (_, r) => formNameFrom(rows, r) },\n { title: 'Lead ID', dataIndex: 'facebookLeadId' },\n { title: 'Skipped counsellor', dataIndex: 'skippedCounsellorName', render: v => v || 'Unknown counsellor' },\n { title: 'Reason', dataIndex: 'reason', render: skipReasonLabel },\n { title: 'Went to', dataIndex: 'assignedToName', render: v => v || '—' },\n { title: 'When', dataIndex: 'skippedAt', render: dateLabel },\n ];\n return (\n <div className=\"fb-tab-body\">\n <div className=\"fb-toolbar\">\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-skips-form\">Form</label>\n <FormFilterSelect id=\"fb-skips-form\" rows={rows} value={formId} onChange={(value) => { setFormId(value); setPage(1); }} />\n </div>\n </div>\n <ListError title=\"Could not load skipped counsellors\" resource={skips} />\n <Table\n size=\"small\" rowKey={r => String(r.id || `${r.facebookLeadId}-${r.skippedCounsellorLegacyId}`)}\n loading={skips.loading} dataSource={skips.data?.skips || []} columns={columns} scroll={{ x: 860 }}\n locale={{ emptyText: skips.loading || skips.error ? ' ' : 'No one has been skipped yet.' }}\n pagination={{ current: page, pageSize: 20, total: Number(skips.data?.total || 0), showSizeChanger: false, hideOnSinglePage: true, onChange: setPage }}\n />\n </div>\n );\n}\n\n/** Setup changes, newest first as the server returns them. */\nexport function SetupHistoryPanel({ rows = [], refreshKey = 0 }) {\n const [formId, setFormId] = useState('');\n const [page, setPage] = useState(1);\n const load = useCallback(() => listFacebookHistory({ page, limit: 20, formId }), [page, formId]);\n const history = useListResource(load, refreshKey);\n const columns = [\n { title: 'When', dataIndex: 'at', width: 190, render: dateLabel },\n { title: 'Form', dataIndex: 'formName', render: (_, r) => formNameFrom(rows, r) },\n { title: 'What changed', key: 'change', render: (_, r) => describeHistoryChange(r) },\n { title: 'By', dataIndex: 'performedByName', render: v => v || '—' },\n ];\n return (\n <div className=\"fb-tab-body\">\n <div className=\"fb-toolbar\">\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-history-form\">Form</label>\n <FormFilterSelect id=\"fb-history-form\" rows={rows} value={formId} onChange={(value) => { setFormId(value); setPage(1); }} />\n </div>\n </div>\n <ListError title=\"Could not load history\" resource={history} />\n <Table\n size=\"small\" rowKey={r => String(r.id || `${r.formId}-${r.at}`)} loading={history.loading}\n dataSource={history.data?.history || []} columns={columns} scroll={{ x: 720 }}\n locale={{ emptyText: history.loading || history.error ? ' ' : 'No setup changes yet. They will appear here when someone changes a form.' }}\n pagination={{ current: page, pageSize: 20, total: Number(history.data?.total || 0), showSizeChanger: false, hideOnSinglePage: true, onChange: setPage }}\n />\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport dayjs from 'dayjs';\nimport {\n Alert, Button, Col, DatePicker, Empty, Form, Input, InputNumber, Modal, Popconfirm, Progress, Row, Segmented, Select, Skeleton,\n Space, Statistic, Switch, Table, Tag, TimePicker, Tooltip, Typography, message,\n} from 'antd';\nimport { ReloadOutlined } from '@ant-design/icons';\nimport {\n addCounsellorLeave, deleteCounsellorLeave, getLeadDistributionOverview, getLeadDistributionSettings, listCounsellorLeaves,\n listLeadAssignments, listLeadDistributionQueue, saveLeadDistributionSettings, setCounsellorDistributionEnabled, toPlainError,\n} from '../../../services/facebookDistributionApi';\n\nconst { Text, Paragraph } = Typography;\n\n/**\n * Smart lead distribution screens (REQ-20261106-14), shown as tabs of the Facebook lead screen\n * (Settings → Mapping & Distributions = Admin → Integrations). Every number comes from the\n * server; nothing here decides who gets a lead.\n */\nconst COUNSELLOR_STATUS = {\n eligible: { label: 'Active – Eligible', color: 'green' },\n logged_out: { label: 'Logged Out – Not Eligible', color: 'default' },\n waiting_for_login: { label: 'Waiting for Login', color: 'blue' },\n on_leave: { label: 'On Leave – Skipped', color: 'orange' },\n admin_disabled: { label: 'Admin Disabled – Skipped', color: 'red' },\n inactive: { label: 'Inactive user – Skipped', color: 'red' },\n past_day: { label: 'Past day', color: 'default' },\n};\nconst QUEUE_REASON = {\n awaiting_cutoff: 'Waiting for cut-off',\n no_active_counsellor: 'Waiting for a counsellor to log in',\n distribution_not_configured: 'Form has no counsellor list',\n distribution_disabled: 'Form distribution is switched off',\n};\nconst time = (v) => (v ? dayjs(v).format('h:mm A') : '–');\nconst dateTime = (v) => (v ? dayjs(v).format('D MMM, h:mm A') : '–');\nconst waitedFor = (v) => {\n if (!v) return '–';\n const mins = Math.max(0, dayjs().diff(dayjs(v), 'minute'));\n return mins < 60 ? `${mins} min` : `${Math.floor(mins / 60)} h ${mins % 60} min`;\n};\n\nfunction useLoad(load, deps) {\n const [state, setState] = useState({ loading: true });\n const [tick, setTick] = useState(0);\n useEffect(() => {\n let alive = true;\n load().then((data) => alive && setState({ loading: false, data }), (err) => alive && setState({ loading: false, error: toPlainError(err, 'This could not be loaded.') }));\n return () => { alive = false; };\n }, [tick, ...deps]); // eslint-disable-line react-hooks/exhaustive-deps\n return [state, () => { setState((s) => ({ ...s, loading: true })); setTick((n) => n + 1); }];\n}\n\nconst ErrorState = ({ text, onRetry }) => <Alert type=\"error\" showIcon message={text} action={<Button size=\"small\" onClick={onRetry}>Try again</Button>} />;\n\n// ── Today: dashboard + counsellor management ────────────────────────────────────────────────\nexport function DistributionTodayPanel({ canEdit = false }) {\n const [date, setDate] = useState(null);\n const [state, reload] = useLoad(() => getLeadDistributionOverview(date ? date.format('YYYY-MM-DD') : ''), [date]);\n const [leaveFor, setLeaveFor] = useState(null);\n const [busy, setBusy] = useState('');\n const d = state.data ?? {};\n const s = d.summary ?? {};\n const isToday = !date || d.day === d.today;\n\n const toggle = async (row, enabled) => {\n setBusy(`t${row.legacyUserId}`);\n try {\n await setCounsellorDistributionEnabled(row.legacyUserId, enabled, enabled ? '' : 'Disabled by admin');\n message.success(`${row.name} ${enabled ? 'will receive new leads again' : 'will not receive new leads'}`);\n reload();\n } catch (err) {\n message.error(toPlainError(err));\n } finally {\n setBusy('');\n }\n };\n\n const columns = [\n { title: 'Counsellor', key: 'name', render: (_, r) => <Space direction=\"vertical\" size={0}><Text strong>{r.name}</Text><Text type=\"secondary\" style={{ fontSize: 12 }}>{(r.forms ?? []).join(', ')}</Text></Space> },\n { title: 'First login', dataIndex: 'firstLoginAt', render: time, sorter: (a, b) => String(a.firstLoginAt ?? '').localeCompare(String(b.firstLoginAt ?? '')) },\n { title: 'Last seen / logout', key: 'seen', render: (_, r) => (r.loggedOutAt && (!r.lastSeenAt || r.loggedOutAt > r.lastSeenAt) ? `Logged out ${time(r.loggedOutAt)}` : time(r.lastSeenAt)) },\n { title: 'Status', dataIndex: 'status', render: (v) => <Tag color={COUNSELLOR_STATUS[v]?.color}>{COUNSELLOR_STATUS[v]?.label ?? v}</Tag>,\n filters: Object.entries(COUNSELLOR_STATUS).map(([value, x]) => ({ value, text: x.label })), onFilter: (v, r) => r.status === v },\n { title: 'Leads today', dataIndex: 'assigned', align: 'right', sorter: (a, b) => a.assigned - b.assigned },\n { title: 'Target', dataIndex: 'target', align: 'right' },\n { title: 'Progress', key: 'progress', width: 140, render: (_, r) => <Progress percent={r.target ? Math.min(100, Math.round((r.assigned / r.target) * 100)) : 0} size=\"small\" showInfo={false} /> },\n { title: 'Difference', dataIndex: 'difference', align: 'right', render: (v, r) => (r.status === 'eligible' && v > 0 ? <Text type=\"warning\">{v} behind</Text> : r.status === 'eligible' ? 'On target' : '–') },\n ...(canEdit && isToday ? [{\n title: '', key: 'act', width: 210, render: (_, r) => (r.status === 'inactive' ? null : (\n <Space>\n {r.status === 'admin_disabled' ? (\n <Button size=\"small\" loading={busy === `t${r.legacyUserId}`} onClick={() => toggle(r, true)}>Enable</Button>\n ) : (\n <Popconfirm title={`Stop new leads for ${r.name}?`} description=\"Leads they already have stay with them.\" okText=\"Disable\" okButtonProps={{ danger: true }} onConfirm={() => toggle(r, false)}>\n <Button size=\"small\" danger loading={busy === `t${r.legacyUserId}`}>Disable</Button>\n </Popconfirm>\n )}\n <Button size=\"small\" onClick={() => setLeaveFor(r)}>Leave</Button>\n </Space>\n )),\n }] : []),\n ];\n\n return (\n <div className=\"ld-today\">\n <Space wrap style={{ marginBottom: 12, width: '100%', justifyContent: 'space-between' }}>\n <Space wrap>\n <DatePicker value={date} onChange={setDate} allowClear placeholder=\"Today\" disabledDate={(v) => v && v.isAfter(dayjs(), 'day')} />\n {d.settings ? <Tag color={d.settings.mode === 'equal_daily' ? 'magenta' : 'default'}>{d.settings.mode === 'equal_daily' ? 'Equal daily distribution' : 'Round-robin (earlier behaviour)'}</Tag> : null}\n </Space>\n <Button icon={<ReloadOutlined />} onClick={reload}>Refresh</Button>\n </Space>\n {state.loading && !state.data ? <Skeleton active /> : state.error ? <ErrorState text={state.error} onRetry={reload} /> : (\n <>\n {d.settings?.mode === 'equal_daily' && isToday ? (\n <Alert style={{ marginBottom: 12 }} showIcon type={d.holding ? 'info' : 'success'}\n message={d.holding\n ? `Leads received until ${time(d.cutoffAt)} wait, then they are shared equally among counsellors who are online at ${time(d.cutoffAt)}.`\n : `Cut-off ${time(d.cutoffAt)} has passed: each new lead goes to the online counsellor with the fewest leads today.`} />\n ) : null}\n <Row gutter={[16, 16]} style={{ marginBottom: 16 }}>\n <Col xs={12} md={6} xl={3}><Statistic title=\"Received\" value={s.received ?? 0} /></Col>\n <Col xs={12} md={6} xl={3}><Statistic title=\"Assigned\" value={s.assigned ?? 0} /></Col>\n <Col xs={12} md={6} xl={3}><Statistic title=\"Waiting\" value={s.pending ?? 0} /></Col>\n <Col xs={12} md={6} xl={3}><Statistic title=\"Eligible now\" value={s.eligible ?? 0} /></Col>\n <Col xs={12} md={6} xl={3}><Statistic title=\"Unavailable\" value={s.unavailable ?? 0} /></Col>\n <Col xs={12} md={6} xl={3}><Statistic title=\"Target each\" value={s.target ?? 0} /></Col>\n <Col xs={24} md={12} xl={6}>\n <Statistic title=\"Balance\" valueRender={() => (\n <Tag color={s.balance === 'balanced' ? 'green' : 'gold'} style={{ fontSize: 14, padding: '4px 10px' }}>\n {s.balance === 'balanced' ? 'Balanced' : `Catching up (gap ${s.spread})`}\n </Tag>\n )} />\n </Col>\n </Row>\n {s.balance !== 'balanced' && (s.spread ?? 0) > 1 ? (\n <Paragraph type=\"secondary\" style={{ fontSize: 12 }}>Counsellors who joined later get new leads first until they catch up. Leads already assigned are never moved, so an exact match is not always possible.</Paragraph>\n ) : null}\n <Table rowKey=\"legacyUserId\" size=\"small\" columns={columns} dataSource={d.counsellors ?? []} pagination={false} scroll={{ x: 'max-content' }}\n loading={state.loading} locale={{ emptyText: <Empty description=\"No counsellor is on any form's list yet. Add counsellors in the Forms tab.\" /> }} />\n </>\n )}\n {leaveFor ? <LeaveModal counsellor={leaveFor} onClose={(changed) => { setLeaveFor(null); if (changed) reload(); }} /> : null}\n </div>\n );\n}\n\nfunction LeaveModal({ counsellor, onClose }) {\n const [form] = Form.useForm();\n const [state, reload] = useLoad(() => listCounsellorLeaves(dayjs().format('YYYY-MM-DD')), []);\n const [saving, setSaving] = useState(false);\n const [changed, setChanged] = useState(false);\n const mine = (Array.isArray(state.data) ? state.data : []).filter((l) => Number(l.legacyUserId) === Number(counsellor.legacyUserId));\n const add = async () => {\n const v = await form.validateFields();\n setSaving(true);\n try {\n await addCounsellorLeave({ legacyUserId: counsellor.legacyUserId, from: v.range[0].format('YYYY-MM-DD'), to: v.range[1].format('YYYY-MM-DD'), reason: v.reason ?? '' });\n message.success('Leave saved: no new leads on those days');\n form.resetFields();\n setChanged(true);\n reload();\n } catch (err) {\n message.error(toPlainError(err));\n } finally {\n setSaving(false);\n }\n };\n const remove = async (id) => {\n try {\n await deleteCounsellorLeave(id);\n message.success('Leave removed');\n setChanged(true);\n reload();\n } catch (err) {\n message.error(toPlainError(err));\n }\n };\n return (\n <Modal open title={`Leave · ${counsellor.name}`} onCancel={() => onClose(changed)} footer={<Button onClick={() => onClose(changed)}>Close</Button>}>\n <Form form={form} layout=\"vertical\">\n <Form.Item name=\"range\" label=\"Days on leave\" rules={[{ required: true, message: 'Choose the days' }]}>\n <DatePicker.RangePicker style={{ width: '100%' }} disabledDate={(v) => v && v.isBefore(dayjs(), 'day')} />\n </Form.Item>\n <Form.Item name=\"reason\" label=\"Reason (optional)\"><Input maxLength={300} /></Form.Item>\n <Button type=\"primary\" loading={saving} onClick={add}>Add leave</Button>\n </Form>\n <Paragraph type=\"secondary\" style={{ margin: '12px 0 4px' }}>Upcoming leave</Paragraph>\n {state.loading ? <Skeleton active paragraph={{ rows: 1 }} /> : state.error ? <ErrorState text={state.error} onRetry={reload} /> : mine.length ? (\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n {mine.map((l) => (\n <Space key={String(l._id)} style={{ justifyContent: 'space-between', width: '100%' }}>\n <Text>{dayjs(l.from).format('D MMM')} – {dayjs(l.to).format('D MMM YYYY')}{l.reason ? ` · ${l.reason}` : ''}</Text>\n <Popconfirm title=\"Remove this leave?\" okText=\"Remove\" onConfirm={() => remove(String(l._id))}><Button size=\"small\" type=\"link\" danger>Remove</Button></Popconfirm>\n </Space>\n ))}\n </Space>\n ) : <Text type=\"secondary\">None.</Text>}\n </Modal>\n );\n}\n\n// ── Pending queue ──────────────────────────────────────────────────────────────────────────\nexport function DistributionQueuePanel({ rows: forms = [] }) {\n const [status, setStatus] = useState('waiting');\n const [formId, setFormId] = useState('');\n const [page, setPage] = useState(1);\n const [state, reload] = useLoad(() => listLeadDistributionQueue({ status: status === 'waiting' ? '' : status, formId, page, limit: 25 }), [status, formId, page]);\n const formName = (id) => forms.find((f) => f.formId === id)?.formName ?? `Form ${id}`;\n const columns = [\n { title: 'Lead reference', dataIndex: 'facebookLeadId' },\n { title: 'Form', dataIndex: 'facebookFormId', render: formName },\n { title: 'Received', dataIndex: 'createdAt', render: dateTime },\n { title: 'Waiting', dataIndex: 'createdAt', key: 'waited', render: (v, r) => (r.status === 'dead' ? '–' : waitedFor(v)) },\n { title: 'Status', dataIndex: 'status', render: (v, r) => (v === 'dead' ? <Tag color=\"red\">Assignment Failed</Tag> : v === 'processing' ? <Tag color=\"blue\">Assigning…</Tag>\n : <Tag color={r.lastResult === 'awaiting_cutoff' ? 'purple' : 'gold'}>{QUEUE_REASON[r.lastResult] ?? 'Pending Assignment'}</Tag>) },\n { title: 'Next try', dataIndex: 'nextAttemptAt', render: (v, r) => (r.status === 'dead' ? '–' : dateTime(v)) },\n { title: 'Detail', key: 'detail', render: (_, r) => (r.lastErrorCode || (QUEUE_REASON[r.lastResult] ? '' : r.lastResult)) || '–' },\n ];\n return (\n <div className=\"ld-queue\">\n <Space wrap style={{ marginBottom: 12 }}>\n <Segmented value={status} onChange={(v) => { setStatus(v); setPage(1); }} options={[{ value: 'waiting', label: 'Waiting' }, { value: 'failed', label: 'Failed' }, { value: 'all', label: 'All' }]} />\n <Select style={{ minWidth: 220 }} value={formId} onChange={(v) => { setFormId(v); setPage(1); }}\n options={[{ value: '', label: 'All forms' }, ...forms.map((f) => ({ value: f.formId, label: f.formName ?? f.formId }))]} />\n <Button icon={<ReloadOutlined />} onClick={reload}>Refresh</Button>\n </Space>\n <Paragraph type=\"secondary\" style={{ fontSize: 12 }}>Leads stay here safely until a counsellor can take them; nothing is lost when nobody is logged in. A lead becomes an LMS lead when it is assigned.</Paragraph>\n {state.error ? <ErrorState text={state.error} onRetry={reload} /> : (\n <Table rowKey={(r) => String(r._id ?? r.facebookLeadId)} size=\"small\" loading={state.loading} columns={columns} dataSource={state.data?.rows ?? []} scroll={{ x: 'max-content' }}\n pagination={{ current: page, pageSize: 25, total: state.data?.total ?? 0, onChange: setPage, showSizeChanger: false }}\n locale={{ emptyText: <Empty description={status === 'failed' ? 'No failed leads.' : 'No leads are waiting.'} /> }} />\n )}\n </div>\n );\n}\n\n// ── Assignment history ────────────────────────────────────────────────────────────────────\nexport function DistributionAssignmentsPanel() {\n const [date, setDate] = useState(dayjs());\n const [page, setPage] = useState(1);\n const [state, reload] = useLoad(() => listLeadAssignments({ date: date ? date.format('YYYY-MM-DD') : '', page, limit: 25 }), [date, page]);\n const columns = [\n { title: 'Lead reference', dataIndex: 'facebookLeadId' },\n { title: 'Form', dataIndex: 'formName' },\n { title: 'Received', dataIndex: 'receivedAt', render: dateTime },\n { title: 'Assigned', dataIndex: 'assignedAt', render: dateTime },\n { title: 'Counsellor', dataIndex: 'counsellorName' },\n { title: 'Their leads that day', dataIndex: 'countAtAssignment', align: 'right' },\n { title: 'Skipped', dataIndex: 'skipped', render: (list) => (Array.isArray(list) && list.length ? (\n <Tooltip title={list.map((x) => `${x.name || `#${x.legacyUserId}`}: ${COUNSELLOR_STATUS[x.reason]?.label ?? x.reason}`).join('\\n')}>\n <Tag>{list.length} skipped</Tag>\n </Tooltip>\n ) : '–') },\n ];\n return (\n <div className=\"ld-history\">\n <Space wrap style={{ marginBottom: 12 }}>\n <DatePicker value={date} onChange={(v) => { setDate(v); setPage(1); }} allowClear placeholder=\"All days\" />\n <Button icon={<ReloadOutlined />} onClick={reload}>Refresh</Button>\n </Space>\n <Paragraph type=\"secondary\" style={{ fontSize: 12 }}>Every automatic assignment in equal daily mode. Manual reassignments are in the Reassign leads tab and History.</Paragraph>\n {state.error ? <ErrorState text={state.error} onRetry={reload} /> : (\n <Table rowKey={(r) => String(r._id)} size=\"small\" loading={state.loading} columns={columns} dataSource={state.data?.rows ?? []} scroll={{ x: 'max-content' }}\n pagination={{ current: page, pageSize: 25, total: state.data?.total ?? 0, onChange: setPage, showSizeChanger: false }}\n locale={{ emptyText: <Empty description=\"No assignments for this day yet.\" /> }} />\n )}\n </div>\n );\n}\n\n// ── Settings ───────────────────────────────────────────────────────────────────────────────\nconst TIMEZONES = ['Asia/Kolkata', 'Asia/Dubai', 'Asia/Singapore', 'Europe/London', 'America/New_York', 'UTC'];\n\nexport function DistributionSettingsPanel({ canEdit = false }) {\n const [form] = Form.useForm();\n const [state, reload] = useLoad(() => getLeadDistributionSettings(), []);\n const [saving, setSaving] = useState(false);\n const settings = state.data?.settings;\n useEffect(() => {\n if (!settings) return;\n form.setFieldsValue({ ...settings, startTime: dayjs(settings.startTime, 'HH:mm'), cutoffTime: dayjs(settings.cutoffTime, 'HH:mm'), resetTime: dayjs(settings.resetTime, 'HH:mm') });\n }, [settings, form]);\n const mode = Form.useWatch('mode', form);\n\n const save = async () => {\n const v = await form.validateFields();\n const body = { ...v, startTime: v.startTime.format('HH:mm'), cutoffTime: v.cutoffTime.format('HH:mm'), resetTime: v.resetTime.format('HH:mm') };\n Modal.confirm({\n title: 'Save distribution settings?',\n content: body.mode === 'equal_daily' ? 'New leads will go to the online counsellor with the fewest leads today. Leads already assigned do not move.' : 'New leads will go back to plain round-robin.',\n okText: 'Save',\n onOk: async () => {\n setSaving(true);\n try {\n await saveLeadDistributionSettings(body);\n message.success('Distribution settings saved');\n reload();\n } catch (err) {\n message.error(toPlainError(err));\n } finally {\n setSaving(false);\n }\n },\n });\n };\n\n if (state.loading && !state.data) return <Skeleton active />;\n if (state.error) return <ErrorState text={state.error} onRetry={reload} />;\n return (\n <Form form={form} layout=\"vertical\" disabled={!canEdit} style={{ maxWidth: 720 }}>\n <Form.Item name=\"mode\" label=\"How leads are shared\">\n <Segmented block options={[{ value: 'equal_daily', label: 'Equal daily distribution' }, { value: 'round_robin', label: 'Round-robin (earlier behaviour)' }]} />\n </Form.Item>\n <Paragraph type=\"secondary\">\n {mode === 'equal_daily'\n ? 'Only counsellors who are logged in, enabled and not on leave get leads. Each lead goes to the one with the fewest leads today; equal counts take turns.'\n : 'Leads take turns through each form\\'s counsellor list, skipping inactive users. Login and leave are not checked.'}\n </Paragraph>\n <Row gutter={12}>\n <Col xs={12} md={6}><Form.Item name=\"startTime\" label=\"Day starts\" rules={[{ required: true }]}><TimePicker format=\"HH:mm\" minuteStep={5} style={{ width: '100%' }} /></Form.Item></Col>\n <Col xs={12} md={6}><Form.Item name=\"cutoffTime\" label=\"Initial cut-off\" rules={[{ required: true }]} extra=\"Morning leads wait until this time.\"><TimePicker format=\"HH:mm\" minuteStep={5} style={{ width: '100%' }} /></Form.Item></Col>\n <Col xs={12} md={6}><Form.Item name=\"resetTime\" label=\"Daily reset\" rules={[{ required: true }]}><TimePicker format=\"HH:mm\" minuteStep={5} style={{ width: '100%' }} /></Form.Item></Col>\n <Col xs={12} md={6}><Form.Item name=\"timezone\" label=\"Time zone\" rules={[{ required: true }]}><Select options={TIMEZONES.map((z) => ({ value: z, label: z }))} /></Form.Item></Col>\n <Col xs={24} md={12}><Form.Item name=\"holdUntilCutoff\" label=\"Hold morning leads until the cut-off\" valuePropName=\"checked\" extra=\"Off: leads are shared as soon as they arrive.\"><Switch /></Form.Item></Col>\n <Col xs={24} md={12}><Form.Item name=\"onlineWindowMinutes\" label=\"Offline after no activity for\" rules={[{ required: true }]}><InputNumber min={2} max={120} addonAfter=\"minutes\" style={{ width: '100%' }} /></Form.Item></Col>\n </Row>\n {canEdit ? <Button type=\"primary\" loading={saving} onClick={save}>Save settings</Button> : <Text type=\"secondary\">Only users who can edit lead mapping can change these settings.</Text>}\n </Form>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Button, Dropdown, Empty, Input, Modal, Select, Skeleton, Table, Tabs, Tooltip, Typography, message,\n} from 'antd';\nimport {\n DeleteOutlined, EditOutlined, MoreOutlined, PlusOutlined, ReloadOutlined, SearchOutlined, TeamOutlined,\n} from '@ant-design/icons';\nimport AppAlert from '../../../components/AppAlert.jsx';\nimport StatStrip from '../../../components/COMBAINED_COMPONENTS/helpers/list/StatStrip.jsx';\nimport {\n deleteFacebookCourseMapping, listFacebookCourseMappings,\n listFacebookForms, listFacebookLmsCourses,\n} from '../../../services/facebookCourseMappingApi';\nimport {\n FORM_STATUS, FormSetupDrawer, NeedsAttentionPanel, SetupHistoryPanel, SkippedCounsellorsPanel,\n StatusTag, deriveFormStatus, nextCounsellorName,\n} from './FacebookDistributionUI';\nimport { AttentionBar, ReassignLeadsPanel, useDistributionAlerts } from './FacebookReassignUI';\nimport { DistributionAssignmentsPanel, DistributionQueuePanel, DistributionSettingsPanel, DistributionTodayPanel } from './LeadDistributionPanels';\nimport {\n deleteFacebookDistribution, getFacebookDistributionMeta, listFacebookActiveCounsellors,\n listFacebookDistributions, toPlainError,\n} from '../../../services/facebookDistributionApi';\n\nconst { Text, Title } = Typography;\nconst PAGE_SIZE = 10;\nconst UNKNOWN = '—';\nconst NOT_ALLOWED = \"You don't have permission to do this.\";\nconst NOT_LOADED = 'This could not be loaded. Press Try again first.';\n\nfunction normalizeList(value, key) {\n if (Array.isArray(value)) return value;\n if (Array.isArray(value?.[key])) return value[key];\n return [];\n}\n\nconst SOURCES = {\n forms: { load: listFacebookForms, read: v => normalizeList(v, 'forms'), label: 'Facebook forms' },\n courses: { load: listFacebookLmsCourses, read: v => normalizeList(v, 'courses'), label: 'courses' },\n mappings: { load: listFacebookCourseMappings, read: v => normalizeList(v, 'mappings'), label: 'chosen courses' },\n distributions: { load: listFacebookDistributions, read: v => normalizeList(v, 'distributions'), label: 'counsellor lists' },\n counsellors: { load: listFacebookActiveCounsellors, read: v => normalizeList(v, 'counsellors'), label: 'active counsellors' },\n};\nconst SOURCE_KEYS = Object.keys(SOURCES);\nconst EMPTY_DATA = Object.fromEntries(SOURCE_KEYS.map(key => [key, []]));\n// loaded: it has worked at least once. ok: the last attempt worked.\nconst EMPTY_SOURCES = Object.fromEntries(SOURCE_KEYS.map(key => [key, { loaded: false, ok: false, error: '' }]));\n\n/** Avatars and the next person. The next name is real text, not tooltip-only. */\nfunction WhoGetsLeads({ distribution }) {\n const people = distribution?.counsellors || [];\n if (!people.length) return <Text type=\"secondary\">Not set up</Text>;\n const names = people.map(person => person.name || 'Unnamed counsellor');\n const next = nextCounsellorName(distribution);\n return (\n <div className=\"fb-who\">\n <Tooltip title={names.join(', ')} trigger={['hover', 'focus']}>\n <span className=\"fb-avatars\" role=\"group\" tabIndex={0} aria-label={`Gets leads: ${names.join(', ')}`}>\n {names.slice(0, 3).map((name, index) => (\n <span key={`${name}-${index}`} className=\"fb-avatar\" aria-hidden=\"true\">{(Array.from(name)[0] || '?').toUpperCase()}</span>\n ))}\n {names.length > 3 && <span className=\"fb-avatar fb-avatar--more\" aria-hidden=\"true\">+{names.length - 3}</span>}\n </span>\n </Tooltip>\n <span className=\"fb-next\">Next: {next || 'No one active'}</span>\n </div>\n );\n}\n\nexport default function FacebookCourseMappingsSection() {\n const [data, setData] = useState(EMPTY_DATA);\n const [sources, setSources] = useState(EMPTY_SOURCES);\n const [loading, setLoading] = useState(true);\n const [meta, setMeta] = useState(null);\n const [activeTab, setActiveTab] = useState('forms');\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState('all');\n const [alertFormIds, setAlertFormIds] = useState(null);\n const [page, setPage] = useState(1);\n const [busyFormId, setBusyFormId] = useState('');\n const [setup, setSetup] = useState(null);\n const [setupOpen, setSetupOpen] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n const requestId = useRef(0);\n const setupToken = useRef(0);\n const trigger = useRef({ element: null, formId: '' });\n const rootRef = useRef(null);\n\n const refresh = useCallback(async () => {\n const id = ++requestId.current;\n setLoading(true);\n const settled = await Promise.allSettled(SOURCE_KEYS.map(key => SOURCES[key].load()));\n if (id !== requestId.current) return;\n setData((prev) => {\n const next = { ...prev };\n settled.forEach((result, index) => {\n if (result.status === 'fulfilled') next[SOURCE_KEYS[index]] = SOURCES[SOURCE_KEYS[index]].read(result.value);\n });\n return next;\n });\n setSources((prev) => {\n const next = { ...prev };\n settled.forEach((result, index) => {\n const key = SOURCE_KEYS[index];\n next[key] = result.status === 'fulfilled'\n ? { loaded: true, ok: true, error: '' }\n : { loaded: prev[key].loaded, ok: false, error: toPlainError(result.reason, 'Please try again.', { hideServerText: true }) };\n });\n return next;\n });\n setLoading(false);\n }, []);\n\n const refreshAll = useCallback(() => {\n setRefreshKey(n => n + 1);\n return refresh();\n }, [refresh]);\n\n useEffect(() => { refresh(); }, [refresh]);\n // If /meta fails nothing is blocked. The server still decides every write.\n useEffect(() => {\n let active = true;\n getFacebookDistributionMeta().then((value) => { if (active) setMeta(value); }).catch(() => {});\n return () => { active = false; };\n }, []);\n\n const { alerts, alertsOk, failedCount } = useDistributionAlerts({ refreshKey });\n const can = {\n add: meta?.permissions?.canAdd !== false,\n edit: meta?.permissions?.canEdit !== false,\n remove: meta?.permissions?.canDelete !== false,\n };\n\n const { forms, courses, mappings, distributions, counsellors } = data;\n const knownForms = sources.forms.loaded;\n const knownMappings = sources.mappings.loaded;\n const knownDistributions = sources.distributions.loaded;\n const blocked = !knownForms || !knownMappings || !knownDistributions;\n const firstLoad = loading && !SOURCE_KEYS.some(key => sources[key].loaded);\n\n const distributionByForm = useMemo(() => new Map(distributions.map(d => [String(d.formId), d])), [distributions]);\n const mappingByForm = useMemo(() => new Map(mappings.map(m => [String(m.formId), m])), [mappings]);\n const courseById = useMemo(() => new Map(courses.map(c => [String(c.courseId), c.courseName])), [courses]);\n\n const allRows = useMemo(() => {\n const listed = forms.map(f => ({ formId: String(f.id), formName: f.name || 'Unnamed form', inFormsList: true }));\n const seen = new Set(listed.map(f => f.formId));\n [...mappings, ...distributions].forEach((saved) => {\n const formId = String(saved.formId);\n if (seen.has(formId)) return;\n seen.add(formId);\n listed.push({ formId, formName: saved.formName || 'Unnamed form', inFormsList: false });\n });\n return listed.map((row) => {\n const mapping = mappingByForm.get(row.formId);\n const distribution = distributionByForm.get(row.formId);\n return {\n ...row,\n key: row.formId,\n mapping,\n distribution,\n courseName: mapping ? (courseById.get(String(mapping.courseId)) || mapping.courseName || '') : '',\n status: deriveFormStatus(\n { mapping, distribution, inFormsList: row.inFormsList },\n { forms: knownForms, mappings: knownMappings, distributions: knownDistributions },\n ),\n };\n });\n }, [forms, mappings, distributions, mappingByForm, distributionByForm, courseById, knownForms, knownMappings, knownDistributions]);\n\n const shownRows = useMemo(() => {\n const term = search.trim().toLowerCase();\n return allRows.filter((row) => {\n if (alertFormIds && !alertFormIds.includes(row.formId)) return false;\n if (statusFilter !== 'all' && row.status !== statusFilter) return false;\n return `${row.formName} ${row.formId} ${row.courseName}`.toLowerCase().includes(term);\n });\n }, [allRows, alertFormIds, statusFilter, search]);\n const filtering = Boolean(search.trim()) || statusFilter !== 'all' || Boolean(alertFormIds);\n const currentPage = Math.min(page, Math.max(1, Math.ceil(shownRows.length / PAGE_SIZE)));\n\n const clearFilters = () => { setSearch(''); setStatusFilter('all'); setAlertFormIds(null); setPage(1); };\n const showForms = (ids) => { setSearch(''); setStatusFilter('all'); setAlertFormIds(ids); setPage(1); setActiveTab('forms'); };\n const showStatus = (status) => { setSearch(''); setAlertFormIds(null); setStatusFilter(status); setPage(1); setActiveTab('forms'); };\n\n /* ── Counts ─────────────────────────────────────────────────────────── */\n const statusesCurrent = sources.forms.ok && sources.mappings.ok && sources.distributions.ok;\n const countOf = status => allRows.filter(row => row.status === status).length;\n const waitingCount = alertsOk ? Number(alerts?.unassignedCount || 0) : null;\n const attentionCount = waitingCount === null || failedCount === null ? null : waitingCount + failedCount;\n const statItems = [\n { key: 'ready', label: 'forms ready', value: statusesCurrent ? countOf('ready') : UNKNOWN, onClick: statusesCurrent ? () => showStatus('ready') : undefined },\n { key: 'setup', label: 'need setup', value: statusesCurrent ? countOf('needs_setup') : UNKNOWN, onClick: statusesCurrent ? () => showStatus('needs_setup') : undefined },\n { key: 'waiting', label: 'leads waiting', value: waitingCount ?? UNKNOWN, onClick: waitingCount === null ? undefined : () => setActiveTab('attention') },\n { key: 'failed', label: 'failed leads', value: failedCount ?? UNKNOWN, onClick: failedCount === null ? undefined : () => setActiveTab('attention') },\n { key: 'counsellors', label: 'active counsellors', value: sources.counsellors.ok ? counsellors.length : UNKNOWN },\n ];\n\n /* ── Opening the setup panel ────────────────────────────────────────── */\n const applyFresh = (fresh) => {\n setData(prev => ({ ...prev, ...fresh }));\n setSources((prev) => {\n const next = { ...prev };\n Object.keys(fresh).forEach((key) => { next[key] = { loaded: true, ok: true, error: '' }; });\n return next;\n });\n };\n\n const loadForSetup = async () => {\n const [nextCourses, nextMappings, nextDistributions, nextCounsellors] = await Promise.all([\n listFacebookLmsCourses(), listFacebookCourseMappings(), listFacebookDistributions(), listFacebookActiveCounsellors(),\n ]);\n const fresh = {\n courses: normalizeList(nextCourses, 'courses'),\n mappings: normalizeList(nextMappings, 'mappings'),\n distributions: normalizeList(nextDistributions, 'distributions'),\n counsellors: normalizeList(nextCounsellors, 'counsellors'),\n };\n applyFresh(fresh);\n return fresh;\n };\n\n const openSetup = async (row, section, element = null) => {\n if (blocked) return;\n trigger.current = { element, formId: row.formId };\n setBusyFormId(row.formId);\n try {\n // Always read again here: never edit a stale order or an old version.\n await loadForSetup();\n setupToken.current += 1;\n setSetup({ token: setupToken.current, row, section });\n setSetupOpen(true);\n } catch (err) {\n message.error(toPlainError(err, 'Could not open this form. Please try again.'));\n } finally {\n setBusyFormId('');\n }\n };\n\n const restoreFocus = () => {\n const { element, formId } = trigger.current;\n if (element?.isConnected) { element.focus(); return; }\n const menus = rootRef.current?.querySelectorAll('[data-form-menu]') || [];\n [...menus].find(button => button.dataset.formMenu === formId)?.focus();\n };\n\n const afterSaved = () => { setRefreshKey(n => n + 1); refresh(); };\n\n // The mapping and the distribution are independent records. Removing either\n // must never silently remove the other one or reassign existing leads.\n const confirmRemoveMapping = (row) => {\n Modal.confirm({\n title: 'Remove course mapping?',\n content: <span>Remove the course mapping for <strong>{row.formName}</strong>? Existing lead courses remain unchanged. {row.distribution ? 'This form has saved counsellors. They stay in place unless you remove them separately.' : 'Future leads from this form will arrive without a course.'}</span>,\n okText: 'Remove mapping',\n okType: 'danger',\n cancelText: 'Cancel',\n autoFocusButton: 'cancel',\n onOk: async () => {\n setBusyFormId(row.formId);\n try {\n await deleteFacebookCourseMapping(row.formId);\n message.success('Course mapping removed');\n afterSaved();\n } catch (err) {\n message.error(toPlainError(err, 'Could not remove the mapping. Please try again.'));\n throw err;\n } finally {\n setBusyFormId('');\n }\n },\n });\n };\n\n const confirmRemoveDistribution = (row) => {\n Modal.confirm({\n title: 'Remove counsellor distribution?',\n content: <span>Remove the saved counsellors and whose turn is next for <strong>{row.formName}</strong>? Leads already given out will not change. New leads from this form will wait until counsellors are set up again. Its course mapping stays as it is.</span>,\n okText: 'Remove distribution',\n okType: 'danger',\n cancelText: 'Cancel',\n autoFocusButton: 'cancel',\n onOk: async () => {\n setBusyFormId(row.formId);\n try {\n const result = await deleteFacebookDistribution(row.formId);\n if (result?.deleted === false) throw new Error('This has already been removed. Refresh and try again.');\n message.success('Counsellor distribution removed');\n afterSaved();\n } catch (err) {\n message.error(toPlainError(err, 'Could not remove the distribution. Please try again.'));\n throw err;\n } finally {\n setBusyFormId('');\n }\n },\n });\n };\n\n const menuForForm = (row) => {\n const disabledReason = (allowed) => {\n if (blocked) return NOT_LOADED;\n return allowed ? '' : NOT_ALLOWED;\n };\n const mappingReason = disabledReason(row.mapping ? can.edit : can.add);\n const distributionReason = disabledReason(row.distribution ? can.edit : can.add);\n return {\n items: [\n {\n key: 'mapping',\n icon: row.mapping ? <EditOutlined /> : <PlusOutlined />,\n label: row.mapping ? 'Edit mapping' : 'Set up mapping',\n disabled: Boolean(mappingReason),\n title: mappingReason,\n },\n ...(row.mapping && can.remove ? [{\n key: 'removeMapping', icon: <DeleteOutlined />, label: 'Remove mapping', danger: true, disabled: blocked,\n }] : []),\n { type: 'divider' },\n {\n key: 'distribution',\n icon: <TeamOutlined />,\n label: row.distribution ? 'Edit distribution' : 'Set up distribution',\n disabled: Boolean(distributionReason),\n title: distributionReason,\n },\n ...(row.distribution && can.remove ? [{\n key: 'removeDistribution', icon: <DeleteOutlined />, label: 'Remove distribution', danger: true, disabled: blocked,\n }] : []),\n ],\n onClick: ({ key }) => {\n if (key === 'mapping') openSetup(row, 'course');\n else if (key === 'distribution') openSetup(row, 'counsellors');\n else if (key === 'removeMapping') confirmRemoveMapping(row);\n else if (key === 'removeDistribution') confirmRemoveDistribution(row);\n },\n };\n };\n\n const stopRow = event => event.stopPropagation();\n\n const columns = [\n {\n title: 'Form', dataIndex: 'formName', key: 'form', render: (name, row) => (\n <div>\n <button\n type=\"button\" className=\"fb-form-name\" disabled={blocked}\n onClick={(event) => { stopRow(event); openSetup(row, 'course', event.currentTarget); }}\n >{name}</button>\n <div><Text type=\"secondary\" className=\"fb-small\">Form ID: {row.formId}</Text></div>\n </div>\n ),\n },\n {\n title: 'Course', key: 'course', render: (_, row) => {\n if (!knownMappings) return <Text type=\"secondary\">{UNKNOWN}</Text>;\n if (row.mapping) {\n return (\n <span className=\"fb-course\">\n {row.courseName || 'Course no longer available'}\n {!row.mapping.isActive && <Text type=\"secondary\"> (off)</Text>}\n </span>\n );\n }\n if (!can.add) return <Text type=\"secondary\">No course yet</Text>;\n return (\n <Button\n size=\"small\" className=\"fb-inline-btn\" disabled={blocked} loading={busyFormId === row.formId}\n onClick={(event) => { stopRow(event); openSetup(row, 'course', event.currentTarget); }}\n aria-label={`Map course for ${row.formName}`}\n >Map course</Button>\n );\n },\n },\n {\n title: 'Who gets leads', key: 'who', render: (_, row) => (\n knownDistributions ? <WhoGetsLeads distribution={row.distribution} /> : <Text type=\"secondary\">{UNKNOWN}</Text>\n ),\n },\n { title: 'Status', dataIndex: 'status', key: 'status', width: 170, render: status => <StatusTag status={status} /> },\n {\n title: <span className=\"fb-sr-only\">Actions</span>, key: 'actions', width: 56, align: 'center', render: (_, row) => (\n // Menu clicks reach the row through React even from the popup's portal.\n <span onClick={stopRow}>\n <Dropdown menu={menuForForm(row)} trigger={['click']} placement=\"bottomRight\">\n <Button\n size=\"small\" className=\"fb-form-actions-trigger\" aria-label={`Actions for ${row.formName}`}\n data-form-menu={row.formId} loading={busyFormId === row.formId} icon={<MoreOutlined />}\n />\n </Dropdown>\n </span>\n ),\n },\n ];\n\n const emptyForms = () => {\n if (loading) return ' ';\n if (blocked) return <Empty description=\"Forms can't be shown right now.\" />;\n if (filtering) {\n return <Empty description=\"No forms match these filters.\"><Button onClick={clearFilters}>Clear filters</Button></Empty>;\n }\n return <Empty description=\"No Facebook forms yet. Create a lead form on Facebook, then refresh.\"><Button onClick={refreshAll}>Refresh</Button></Empty>;\n };\n\n /* ── Load problems ──────────────────────────────────────────────────── */\n const failedKeys = SOURCE_KEYS.filter(key => !sources[key].ok && sources[key].error);\n const everLoaded = failedKeys.every(key => sources[key].loaded);\n const failureText = () => {\n const names = failedKeys.map(key => SOURCES[key].label).join(', ');\n const reasons = [...new Set(failedKeys.map(key => sources[key].error))].join(' ');\n return `Could not load ${names}. ${reasons}`;\n };\n\n const formsTab = (\n <div className=\"fb-tab-body\">\n <div className=\"fb-toolbar\">\n <div className=\"fb-field fb-field--grow\">\n <label className=\"fb-field-label\" htmlFor=\"fb-forms-search\">Search forms</label>\n <Input\n id=\"fb-forms-search\" allowClear prefix={<SearchOutlined aria-hidden=\"true\" />} placeholder=\"Form or course name\"\n value={search} onChange={(event) => { setSearch(event.target.value); setPage(1); }}\n />\n </div>\n <div className=\"fb-field\">\n <label className=\"fb-field-label\" htmlFor=\"fb-forms-show\">Show</label>\n <Select\n id=\"fb-forms-show\" className=\"fb-show-select\" value={statusFilter} disabled={!knownMappings || !knownDistributions}\n onChange={(value) => { setStatusFilter(value); setPage(1); }}\n options={[{ value: 'all', label: 'All forms' }, ...Object.entries(FORM_STATUS).map(([value, info]) => ({ value, label: info.label }))]}\n />\n </div>\n </div>\n {alertFormIds && (\n <div className=\"fb-filter-note\" role=\"status\">\n <span>{alertFormIds.length === 1 ? 'Showing 1 form that needs attention.' : `Showing ${alertFormIds.length} forms that need attention.`}</span>\n <Button size=\"small\" type=\"link\" onClick={() => { setAlertFormIds(null); setPage(1); }}>Show all forms</Button>\n </div>\n )}\n {firstLoad\n ? <Skeleton active title={false} paragraph={{ rows: 6 }} />\n : (\n <Table\n rowKey=\"formId\" className={`fb-forms-table${blocked ? '' : ' fb-forms-table--open'}`} columns={columns}\n dataSource={shownRows} loading={loading} size=\"middle\" scroll={{ x: 860 }}\n onRow={row => ({ onClick: () => openSetup(row, 'course') })}\n pagination={{\n current: currentPage, pageSize: PAGE_SIZE, showSizeChanger: false, onChange: setPage,\n showTotal: total => `${total} Facebook form${total === 1 ? '' : 's'}`,\n }}\n locale={{ emptyText: emptyForms() }}\n />\n )}\n <Text type=\"secondary\" className=\"fb-small\">Changing a form affects future leads only. Leads you already have keep their course and counsellor.</Text>\n </div>\n );\n\n const sharedPanelProps = { rows: allRows, refreshKey };\n const tabs = [\n { key: 'forms', label: 'Forms', children: formsTab },\n {\n key: 'attention',\n label: `Needs attention${attentionCount === null ? '' : ` (${attentionCount})`}`,\n children: <NeedsAttentionPanel {...sharedPanelProps} canEdit={can.edit} onChanged={() => setRefreshKey(n => n + 1)} />,\n },\n { key: 'skips', label: 'Skipped counsellors', children: <SkippedCounsellorsPanel {...sharedPanelProps} /> },\n {\n key: 'reassign',\n label: 'Reassign leads',\n children: (\n <ReassignLeadsPanel\n {...sharedPanelProps} eligibleCounsellors={counsellors} limits={meta?.limits} reasonTypes={meta?.reasonTypes}\n canEdit={can.edit} onChanged={() => setRefreshKey(n => n + 1)}\n />\n ),\n },\n { key: 'history', label: 'History', children: <SetupHistoryPanel {...sharedPanelProps} /> },\n // Smart lead distribution (REQ-20261106-14)\n { key: 'today', label: 'Today', children: <DistributionTodayPanel canEdit={can.edit} /> },\n { key: 'queue', label: 'Pending queue', children: <DistributionQueuePanel rows={allRows} /> },\n { key: 'assignments', label: 'Assignment history', children: <DistributionAssignmentsPanel /> },\n { key: 'distributionSettings', label: 'Distribution settings', children: <DistributionSettingsPanel canEdit={can.edit} /> },\n ];\n\n const setupRow = setup ? (allRows.find(row => row.formId === setup.row.formId) || setup.row) : null;\n\n return (\n <div className=\"facebook-course-mapping\" ref={rootRef}>\n <div className=\"admin-section-head fb-head\">\n <div>\n <Title level={4}>Facebook Leads</Title>\n <Text type=\"secondary\">Choose the course and counsellors for each Facebook form.</Text>\n </div>\n <Button icon={<ReloadOutlined aria-hidden=\"true\" />} onClick={refreshAll} loading={loading}>Refresh</Button>\n </div>\n\n <StatStrip items={statItems} className=\"fb-health\" ariaLabel=\"Facebook leads health\" />\n\n {failedKeys.length > 0 && !loading && (\n <AppAlert\n className=\"fb-load-problem\" type={everLoaded ? 'warning' : 'error'}\n title={everLoaded ? 'Showing the last information we could load' : \"Some information didn't load\"}\n description={failureText()}\n action={<Button size=\"small\" onClick={refreshAll}>Try again</Button>}\n />\n )}\n {meta && (!can.add || !can.edit || !can.remove) && (\n <AppAlert className=\"fb-load-problem\" type=\"info\" title=\"Your role can't make some changes here, so those actions are turned off.\" />\n )}\n <AttentionBar\n alerts={alerts} failedCount={failedCount ?? 0}\n onViewLeads={() => setActiveTab('attention')} onShowForms={showForms}\n />\n\n <Tabs size=\"small\" activeKey={activeTab} onChange={setActiveTab} items={tabs} className=\"fb-tabs\" />\n\n {setup && (\n <FormSetupDrawer\n key={setup.token} open={setupOpen} row={setupRow} section={setup.section}\n mapping={mappingByForm.get(setup.row.formId)} current={distributionByForm.get(setup.row.formId)}\n courses={courses} counsellors={counsellors} limits={meta?.limits}\n permissions={{ canAdd: can.add, canEdit: can.edit }}\n onClose={() => setSetupOpen(false)} onSaved={afterSaved} onAfterClose={restoreFocus}\n onReload={async () => {\n const fresh = await loadForSetup();\n const formId = setup.row.formId;\n return {\n mapping: fresh.mappings.find(m => String(m.formId) === formId),\n current: fresh.distributions.find(d => String(d.formId) === formId),\n };\n }}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|