@fayz-ai/admin 0.29.1 → 0.30.0
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/ScheduleEditor-QC6OYBUE.js +7 -0
- package/dist/{ScheduleEditor-KU4UUG6Q.js.map → ScheduleEditor-QC6OYBUE.js.map} +1 -1
- package/dist/SubscriptionPage-TVAEOFNC.js +9 -0
- package/dist/{SubscriptionPage-2JPALG53.js.map → SubscriptionPage-TVAEOFNC.js.map} +1 -1
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/admin-app.d.ts.map +1 -1
- package/dist/app/bottom-nav.d.ts.map +1 -1
- package/dist/app/rail-preset.d.ts +40 -2
- package/dist/app/rail-preset.d.ts.map +1 -1
- package/dist/app/useAppPreset.d.ts +27 -0
- package/dist/app/useAppPreset.d.ts.map +1 -1
- package/dist/chunk-3SREEFHN.js +1685 -0
- package/dist/chunk-3SREEFHN.js.map +1 -0
- package/dist/{chunk-R4HQ2HS2.js → chunk-KSUIF56I.js} +7 -2
- package/dist/chunk-KSUIF56I.js.map +1 -0
- package/dist/{chunk-OVVTLRDD.js → chunk-U6LV4GIH.js} +3 -3
- package/dist/{chunk-OVVTLRDD.js.map → chunk-U6LV4GIH.js.map} +1 -1
- package/dist/{chunk-XJB76FHA.js → chunk-ZUM3Y7VB.js} +50 -17
- package/dist/chunk-ZUM3Y7VB.js.map +1 -0
- package/dist/components/notifications/NotificationInbox.d.ts.map +1 -1
- package/dist/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/components/shared/PersonLink.d.ts.map +1 -1
- package/dist/components/shared/person-actions.d.ts +48 -0
- package/dist/components/shared/person-actions.d.ts.map +1 -0
- package/dist/crud/CrudDetailPage.d.ts +6 -1
- package/dist/crud/CrudDetailPage.d.ts.map +1 -1
- package/dist/crud/CrudListView.d.ts.map +1 -1
- package/dist/crud/archetype-lookup.d.ts +24 -0
- package/dist/crud/archetype-lookup.d.ts.map +1 -1
- package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -1
- package/dist/crud/archetypes/EntityLink.d.ts.map +1 -1
- package/dist/crud/archetypes/KanbanBoard.d.ts +11 -1
- package/dist/crud/archetypes/KanbanBoard.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderDetailView.d.ts +3 -0
- package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
- package/dist/crud/archetypes/PersonDetailTabs.d.ts +22 -0
- package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -1
- package/dist/crud/archetypes/ScheduleDateExceptions.d.ts +6 -0
- package/dist/crud/archetypes/ScheduleDateExceptions.d.ts.map +1 -0
- package/dist/crud/archetypes/ScheduleEditor.d.ts +8 -1
- package/dist/crud/archetypes/ScheduleEditor.d.ts.map +1 -1
- package/dist/crud/archetypes/ScheduleGridPanel.d.ts +10 -0
- package/dist/crud/archetypes/ScheduleGridPanel.d.ts.map +1 -0
- package/dist/hooks/useNotifications.d.ts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1458 -1140
- package/dist/index.js.map +1 -1
- package/dist/lib/dedup.d.ts.map +1 -1
- package/dist/lib/schedule-config.d.ts +15 -0
- package/dist/lib/schedule-config.d.ts.map +1 -1
- package/dist/lib/schedule-service.d.ts +92 -0
- package/dist/lib/schedule-service.d.ts.map +1 -1
- package/dist/org/OrgMark.d.ts.map +1 -1
- package/dist/org/WorkspaceUnitSheet.d.ts +15 -0
- package/dist/org/WorkspaceUnitSheet.d.ts.map +1 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/index.js +2 -2
- package/dist/units/UnitMenuSection.d.ts.map +1 -1
- package/dist/units/UnitPickerDialog.d.ts +4 -0
- package/dist/units/UnitPickerDialog.d.ts.map +1 -0
- package/dist/units/index.d.ts +2 -0
- package/dist/units/index.d.ts.map +1 -1
- package/dist/units/picker.store.d.ts +10 -0
- package/dist/units/picker.store.d.ts.map +1 -0
- package/package.json +6 -6
- package/dist/ScheduleEditor-KU4UUG6Q.js +0 -7
- package/dist/SubscriptionPage-2JPALG53.js +0 -9
- package/dist/chunk-NXFFJY2X.js +0 -1077
- package/dist/chunk-NXFFJY2X.js.map +0 -1
- package/dist/chunk-R4HQ2HS2.js.map +0 -1
- package/dist/chunk-XJB76FHA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/schedule-service.ts","../src/crud/archetype-lookup.ts","../src/lib/schedule-config.ts","../src/crud/archetypes/BlockSettingsPopover.tsx","../src/crud/archetypes/ScheduleGridPanel.tsx","../src/crud/archetypes/ScheduleDateExceptions.tsx","../src/lib/bookable-service.ts","../src/crud/archetypes/BookableToggle.tsx","../src/crud/archetypes/ScheduleEditor.tsx"],"names":["today","todayLocal","emptyDays","useRef","useEffect","useTranslation","jsx","jsxs","useState","useCallback","toast","TooltipProvider","Button","Modal","ModalContent","ModalHeader","ModalTitle","ModalDescription","ModalBody","DatePicker","CalendarOff","TimePicker","Tooltip","TooltipTrigger","Trash2","TooltipContent","Plus","ModalFooter","Skeleton","Badge","React","Card","CardContent","Tabs","TabsList","TabsTrigger"],"mappings":"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","file":"chunk-3SREEFHN.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Standalone Schedule CRUD Service\n// Works outside the agenda plugin context — uses Supabase directly.\n// ---------------------------------------------------------------------------\n\n// Core tables now live in the public schema — use the plain client directly.\nimport { getFayzSupabaseClient as getCoreClient } from '../data/client'\nimport { useOrganizationStore } from '../org'\nimport { localDateKey, todayLocal } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ScheduleRecord {\n id: string\n tenantId: string\n kind: string\n assigneeId: string | null\n /** A UNIDADE, apesar do nome — ver archetype.ts. A sala é `resourceId`. */\n locationId: string | null\n unitId: string | null\n dayOfWeek: number | null\n specificDate: string | null\n startsAt: string\n endsAt: string\n isActive: boolean\n metadata: Record<string, unknown>\n // ── O que a grade do V1 traz e a linha sozinha não dizia (agenda/010) ──\n /** A janela só vale a partir daqui. */\n validFrom: string | null\n /** NULL = eterna. */\n validTo: string | null\n /** `standard` | `exception` — a exceção substitui a padrão NAQUELE weekday. */\n gridKind: string | null\n /** 0 = toda semana; N = atende uma e pula N. */\n weekInterval: number | null\n /** O passo de oferta DESTA grade (5/15/30), não o do parâmetro da chamada. */\n slotIntervalMinutes: number | null\n /** A sala. */\n resourceId: string | null\n}\n\nexport interface SaveScheduleInput {\n assigneeId: string\n locationId?: string\n dayOfWeek?: number\n specificDate?: string\n startsAt: string\n endsAt: string\n isActive?: boolean\n kind?: string\n}\n\n/** Advanced settings stored per schedule block in the metadata jsonb column. */\nexport interface BlockSettings {\n bufferMinutes?: number\n allowedServiceIds?: string[]\n maxConcurrent?: number\n minAdvanceHours?: number\n maxAdvanceDays?: number\n label?: string\n locationId?: string\n}\n\n/** Extract BlockSettings from a schedule record's metadata. */\nexport function parseBlockSettings(metadata: Record<string, unknown>): BlockSettings {\n return {\n bufferMinutes: typeof metadata.bufferMinutes === 'number' ? metadata.bufferMinutes : undefined,\n allowedServiceIds: Array.isArray(metadata.allowedServiceIds) ? metadata.allowedServiceIds : undefined,\n maxConcurrent: typeof metadata.maxConcurrent === 'number' ? metadata.maxConcurrent : undefined,\n minAdvanceHours: typeof metadata.minAdvanceHours === 'number' ? metadata.minAdvanceHours : undefined,\n maxAdvanceDays: typeof metadata.maxAdvanceDays === 'number' ? metadata.maxAdvanceDays : undefined,\n label: typeof metadata.label === 'string' ? metadata.label : undefined,\n locationId: typeof metadata.locationId === 'string' ? metadata.locationId : undefined,\n }\n}\n\n/** Merge BlockSettings into existing metadata object. */\nexport function mergeBlockSettings(metadata: Record<string, unknown>, settings: BlockSettings): Record<string, unknown> {\n const merged = { ...metadata }\n // Only set defined values, remove undefined ones to keep metadata clean\n for (const [key, value] of Object.entries(settings)) {\n if (value !== undefined && value !== null && !(Array.isArray(value) && value.length === 0)) {\n merged[key] = value\n } else {\n delete merged[key]\n }\n }\n return merged\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTenantId(): string {\n const id = useOrganizationStore.getState().currentOrg?.id\n if (!id) throw new Error('No active tenant')\n return id\n}\n\nfunction mapRow(row: Record<string, unknown>): ScheduleRecord {\n const r: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(row)) {\n r[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return r as unknown as ScheduleRecord\n}\n\n// ---------------------------------------------------------------------------\n// Service functions\n// ---------------------------------------------------------------------------\n\nexport async function getSchedules(\n assigneeId: string,\n kind = 'working_hours',\n): Promise<ScheduleRecord[]> {\n const core = getCoreClient()\n const { data, error } = await core\n .from('schedules')\n .select('*')\n .eq('kind', kind)\n .eq('assignee_id', assigneeId)\n .order('day_of_week')\n .order('starts_at')\n\n if (error) throw error\n return (data ?? []).map(mapRow)\n}\n\nexport async function saveSchedule(input: SaveScheduleInput): Promise<ScheduleRecord> {\n const core = getCoreClient()\n const tenantId = getTenantId()\n\n const { data, error } = await core\n .from('schedules')\n .insert({\n tenant_id: tenantId,\n kind: input.kind ?? 'working_hours',\n assignee_id: input.assigneeId,\n location_id: input.locationId ?? null,\n day_of_week: input.dayOfWeek ?? null,\n specific_date: input.specificDate ?? null,\n starts_at: input.startsAt,\n ends_at: input.endsAt,\n is_active: input.isActive ?? true,\n })\n .select('*')\n .single()\n\n if (error) throw error\n return mapRow(data as Record<string, unknown>)\n}\n\nexport async function deleteSchedule(id: string): Promise<void> {\n const core = getCoreClient()\n const { error } = await core.from('schedules').delete().eq('id', id)\n if (error) throw error\n}\n\n/**\n * Replace all weekly schedules (day_of_week based) for an assignee.\n * Deletes existing weekly entries and creates new ones in a single flow.\n */\nexport async function replaceWeeklySchedules(\n assigneeId: string,\n week: Record<number, { enabled: boolean; periods: { startsAt: string; endsAt: string; settings?: BlockSettings }[] }>,\n kind = 'working_hours',\n): Promise<void> {\n const core = getCoreClient()\n const tenantId = getTenantId()\n\n // Delete existing weekly schedules (day_of_week NOT NULL, specific_date IS NULL)\n const { error: delErr } = await core\n .from('schedules')\n .delete()\n .eq('assignee_id', assigneeId)\n .eq('kind', kind)\n .not('day_of_week', 'is', null)\n .is('specific_date', null)\n\n if (delErr) throw delErr\n\n // Build insert rows\n const rows: Record<string, unknown>[] = []\n for (const [dayStr, day] of Object.entries(week)) {\n if (!day.enabled) continue\n for (const period of day.periods) {\n const metadata = period.settings ? mergeBlockSettings({}, period.settings) : {}\n rows.push({\n tenant_id: tenantId,\n kind,\n assignee_id: assigneeId,\n day_of_week: Number(dayStr),\n specific_date: null,\n starts_at: period.startsAt,\n ends_at: period.endsAt,\n is_active: true,\n metadata,\n })\n }\n }\n\n if (rows.length > 0) {\n const { error: insErr } = await core.from('schedules').insert(rows)\n if (insErr) throw insErr\n }\n}\n\n/**\n * Enumerate all dates in a range (inclusive).\n */\nfunction eachDate(startDate: string, endDate: string): string[] {\n const dates: string[] = []\n const current = new Date(startDate + 'T00:00:00Z')\n const end = new Date(endDate + 'T00:00:00Z')\n while (current <= end) {\n dates.push(localDateKey(current))\n current.setUTCDate(current.getUTCDate() + 1)\n }\n return dates\n}\n\n/**\n * Save a date-range exception.\n * type: 'unavailable' marks days off, 'available' sets custom hours.\n * Stores notes and range info in metadata for retrieval.\n */\nexport async function saveException(input: {\n assigneeId: string\n startDate: string\n endDate: string\n type: 'available' | 'unavailable'\n periods: { startsAt: string; endsAt: string }[]\n notes?: string\n settings?: BlockSettings\n kind?: string\n}): Promise<void> {\n const core = getCoreClient()\n const tenantId = getTenantId()\n const kind = input.kind ?? 'working_hours'\n const dates = eachDate(input.startDate, input.endDate)\n const isRange = dates.length > 1\n const meta = mergeBlockSettings(\n {\n ...(input.notes ? { notes: input.notes } : {}),\n ...(isRange ? { rangeStart: input.startDate, rangeEnd: input.endDate } : {}),\n exceptionType: input.type,\n },\n input.settings ?? {},\n )\n\n // Delete existing exceptions for all dates in range (single query)\n const { error: delErr } = await core\n .from('schedules')\n .delete()\n .eq('assignee_id', input.assigneeId)\n .eq('kind', kind)\n .in('specific_date', dates)\n if (delErr) throw delErr\n\n const rows: Record<string, unknown>[] = []\n\n if (input.type === 'unavailable') {\n // One sentinel row per date with is_active: false\n for (const date of dates) {\n rows.push({\n tenant_id: tenantId,\n kind,\n assignee_id: input.assigneeId,\n day_of_week: null,\n specific_date: date,\n starts_at: '00:00',\n ends_at: '00:00',\n is_active: false,\n metadata: meta,\n })\n }\n } else {\n // Custom available hours for each date\n for (const date of dates) {\n for (const p of input.periods) {\n rows.push({\n tenant_id: tenantId,\n kind,\n assignee_id: input.assigneeId,\n day_of_week: null,\n specific_date: date,\n starts_at: p.startsAt,\n ends_at: p.endsAt,\n is_active: true,\n metadata: meta,\n })\n }\n }\n }\n\n if (rows.length > 0) {\n const { error } = await core.from('schedules').insert(rows)\n if (error) throw error\n }\n}\n\n/**\n * Delete an exception by its start date.\n * If it was part of a range, deletes all dates in that range.\n */\nexport async function deleteException(\n assigneeId: string,\n startDate: string,\n endDate?: string,\n kind = 'working_hours',\n): Promise<void> {\n const core = getCoreClient()\n const dates = eachDate(startDate, endDate ?? startDate)\n const { error } = await core\n .from('schedules')\n .delete()\n .eq('assignee_id', assigneeId)\n .eq('kind', kind)\n .in('specific_date', dates)\n if (error) throw error\n}\n\n// ---------------------------------------------------------------------------\n// A GRADE\n//\n// Uma linha de `schedules` descreve UMA janela: (weekday, faixa, sala). Mas a\n// pessoa que configura não pensa em janela — pensa em GRADE: \"de setembro até o\n// Natal, este profissional atende assim\". A grade do V1 é\n// (vigência, tipo, intervalo de oferta) e os BLOCOS são os sete dias dentro\n// dela; a migration 010 desceu os atributos da grade para cada bloco, porque o\n// arquétipo é de linha única.\n//\n// Aqui o caminho é o inverso: as linhas sobem e voltam a ser grade. A chave do\n// agrupamento é (tipo, início, fim, nome) — é o que o V1 mostra no cartão.\n//\n// ── Por que isto não é detalhe ──────────────────────────────────────────────\n//\n// `replaceWeeklySchedules` apaga TODAS as linhas semanais do profissional antes\n// de inserir. Isso era inofensivo quando cada pessoa tinha uma semana só; com o\n// dado do V1 dentro (1.389 linhas, 482 delas de exceção, cada uma com a sua\n// vigência), salvar a semana apagaria o histórico inteiro de quem configurou.\n// Por isso a grade guarda os IDs das linhas que ocupa e a gravação mexe SÓ\n// neles.\n// ---------------------------------------------------------------------------\n\nexport type GridKind = 'standard' | 'exception'\n\nexport interface GridPeriod {\n /** O id da linha, quando veio do banco. Ausente = período novo na tela. */\n id?: string\n startsAt: string\n endsAt: string\n /** A sala (`plg_agenda_resources`). */\n resourceId: string | null\n settings?: BlockSettings\n}\n\nexport interface ScheduleGrid {\n /** Estável enquanto a grade não muda de vigência — serve de key no React. */\n key: string\n kind: GridKind\n validFrom: string | null\n validTo: string | null\n slotIntervalMinutes: number | null\n weekInterval: number\n name: string | null\n unitId: string | null\n /** 0 = domingo … 6 = sábado. */\n days: Record<number, GridPeriod[]>\n /** As linhas que esta grade ocupa hoje no banco. Vazio numa grade nova. */\n rowIds: string[]\n}\n\nconst emptyDays = (): Record<number, GridPeriod[]> => ({ 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [] })\n\nconst gridNameOf = (metadata: Record<string, unknown>): string | null => {\n const agenda = metadata?.agenda as { grid_name?: unknown } | undefined\n return typeof agenda?.grid_name === 'string' ? agenda.grid_name : null\n}\n\nexport const gridKeyOf = (g: Pick<ScheduleGrid, 'kind' | 'validFrom' | 'validTo' | 'name'>): string =>\n [g.kind, g.validFrom ?? '', g.validTo ?? '', g.name ?? ''].join('|')\n\n/** A grade vale hoje? É o selo **Vigente** do V1. */\nexport function isGridCurrent(g: ScheduleGrid, today = todayLocal()): boolean {\n if (g.validFrom && g.validFrom > today) return false\n if (g.validTo && g.validTo < today) return false\n return true\n}\n\n/**\n * As grades deste profissional, da mais recente para a mais antiga.\n *\n * Linha sem `valid_from` (as que o V2 gravou antes da 010) vira uma grade\n * eterna sem nome — que é exatamente o que ela era.\n */\nexport async function listGrids(assigneeId: string, kind = 'working_hours'): Promise<ScheduleGrid[]> {\n const rows = (await getSchedules(assigneeId, kind)).filter(\n (r) => r.dayOfWeek != null && r.specificDate == null && r.isActive,\n )\n\n const byKey = new Map<string, ScheduleGrid>()\n for (const r of rows) {\n const name = gridNameOf(r.metadata ?? {})\n const kindOf = (r.gridKind === 'exception' ? 'exception' : 'standard') as GridKind\n const key = gridKeyOf({ kind: kindOf, validFrom: r.validFrom, validTo: r.validTo, name })\n let grid = byKey.get(key)\n if (!grid) {\n grid = {\n key, kind: kindOf, name,\n validFrom: r.validFrom, validTo: r.validTo,\n slotIntervalMinutes: r.slotIntervalMinutes,\n weekInterval: r.weekInterval ?? 0,\n unitId: r.unitId ?? r.locationId,\n days: emptyDays(), rowIds: [],\n }\n byKey.set(key, grid)\n }\n const settings = parseBlockSettings(r.metadata ?? {})\n const hasSettings = Object.values(settings).some((v) => v !== undefined)\n grid.days[r.dayOfWeek as number].push({\n id: r.id, startsAt: r.startsAt, endsAt: r.endsAt,\n resourceId: r.resourceId, settings: hasSettings ? settings : undefined,\n })\n grid.rowIds.push(r.id)\n }\n\n const grids = [...byKey.values()]\n for (const g of grids) for (const d of Object.values(g.days)) d.sort((a, b) => a.startsAt.localeCompare(b.startsAt))\n // Vigente primeiro, depois a mais recente: quem abre a tela quer a de hoje.\n return grids.sort((a, b) => {\n const cur = Number(isGridCurrent(b)) - Number(isGridCurrent(a))\n if (cur !== 0) return cur\n return (b.validFrom ?? '').localeCompare(a.validFrom ?? '')\n })\n}\n\n/**\n * Grava UMA grade: apaga as linhas dela (pelos ids) e reinsere os períodos.\n *\n * Delete+insert e não upsert porque a grade é um desenho da semana, não um\n * conjunto de linhas com identidade: remover a terça e acrescentar um segundo\n * período na quinta é a operação normal, e casar isso linha a linha só criaria\n * chance de sobrar órfã.\n */\nexport async function saveGrid(assigneeId: string, grid: ScheduleGrid, kind = 'working_hours'): Promise<void> {\n const core = getCoreClient()\n const tenantId = getTenantId()\n\n if (grid.rowIds.length > 0) {\n const { error } = await core.from('schedules').delete().in('id', grid.rowIds)\n if (error) throw error\n }\n\n const rows: Record<string, unknown>[] = []\n for (const [dayStr, periods] of Object.entries(grid.days)) {\n for (const p of periods) {\n const metadata = mergeBlockSettings({}, p.settings ?? {})\n if (grid.name) metadata.agenda = { grid_name: grid.name }\n rows.push({\n tenant_id: tenantId,\n kind,\n assignee_id: assigneeId,\n day_of_week: Number(dayStr),\n specific_date: null,\n starts_at: p.startsAt,\n ends_at: p.endsAt,\n is_active: true,\n metadata,\n valid_from: grid.validFrom,\n valid_to: grid.validTo,\n grid_kind: grid.kind,\n week_interval: grid.weekInterval ?? 0,\n slot_interval_minutes: grid.slotIntervalMinutes,\n resource_id: p.resourceId,\n unit_id: grid.unitId,\n })\n }\n }\n if (rows.length > 0) {\n const { error } = await core.from('schedules').insert(rows)\n if (error) throw error\n }\n}\n\n/**\n * Quem, destes, JÁ tem grade valendo hoje.\n *\n * Uma consulta para a lista inteira, não uma por pessoa: a pergunta aparece\n * numa lista de trinta nomes e vira trinta idas ao banco.\n *\n * Existe por causa de `copyGridTo`: copiar uma semana para quem já tem a sua\n * não substitui nada — soma. As duas grades passam a valer no mesmo dia, e a\n * agenda desenha a união das duas, que é um horário que ninguém definiu.\n */\nexport async function assigneesWithCurrentGrid(\n assigneeIds: string[],\n kind = 'working_hours',\n): Promise<Set<string>> {\n if (assigneeIds.length === 0) return new Set()\n const core = getCoreClient()\n const hoje = todayLocal()\n const { data, error } = await core.from('schedules')\n .select('assignee_id')\n .eq('kind', kind)\n .eq('is_active', true)\n .is('specific_date', null)\n .in('assignee_id', assigneeIds)\n .or(`valid_to.is.null,valid_to.gte.${hoje}`)\n if (error) throw error\n return new Set((data ?? []).map((r: any) => r.assignee_id).filter(Boolean))\n}\n\n/**\n * A MESMA SEMANA, PARA OUTRAS PESSOAS — o \"Duplicar\" do V1 no sentido em que\n * ele o usa: \"montar dez profissionais iguais rápido\".\n *\n * O botão que já existia duplica a grade DENTRO da mesma pessoa (uma vigência\n * nova a partir da atual). Este copia para OUTRAS, que é o gesto de abrir uma\n * unidade: dez pessoas, o mesmo horário, e ninguém quer digitar sete colunas\n * dez vezes.\n *\n * Grava uma grade NOVA para cada — `rowIds` zerado —, nunca reaproveita linha:\n * as linhas são de quem já as tem, e mexer nelas aqui apagaria a grade de\n * alguém por causa de um clique feito noutra ficha.\n */\nexport async function copyGridTo(\n assigneeIds: string[],\n grid: ScheduleGrid,\n kind = 'working_hours',\n): Promise<void> {\n for (const id of assigneeIds) {\n await saveGrid(id, { ...grid, rowIds: [] }, kind)\n }\n}\n\n/**\n * Encerrar vigência — o \"Encerrar vigência\" do V1.\n *\n * NÃO é excluir: a grade antiga continua explicando os agendamentos que ela\n * permitiu. Sobrescrever a atual apagaria essa explicação, e é por isso que o\n * V1 separa as duas ações.\n */\nexport async function endGridValidity(grid: ScheduleGrid, endDate: string): Promise<void> {\n if (grid.rowIds.length === 0) return\n const core = getCoreClient()\n const { error } = await core.from('schedules').update({ valid_to: endDate }).in('id', grid.rowIds)\n if (error) throw error\n}\n\nexport async function deleteGrid(grid: ScheduleGrid): Promise<void> {\n if (grid.rowIds.length === 0) return\n const core = getCoreClient()\n const { error } = await core.from('schedules').delete().in('id', grid.rowIds)\n if (error) throw error\n}\n","import type { EntityDef } from '@fayz-ai/core'\nimport { getSupabaseClientOptional, globalCache, stableKey } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../org/store'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EntityLookupResult {\n id: string\n label: string\n subtitle?: string\n group?: string\n icon?: string\n price?: number\n data?: Record<string, unknown>\n}\n\nexport type EntityLookupMap = Record<string, EntityLookup>\n\n/** What the field sends to be created: the typed text plus whatever the form\n * gathered. `name` is the text — each source writes it to its own label column. */\nexport type EntityLookupDraft = { name: string } & Record<string, unknown>\n\nexport interface EntityLookup {\n search(query: string): Promise<EntityLookupResult[]>\n getById(id: string): Promise<EntityLookupResult | null>\n list?(): Promise<EntityLookupResult[]>\n /**\n * Create on the spot, without leaving the document.\n *\n * Without it, a search field forces abandoning a half-written invoice to\n * register the supplier who just arrived. Optional: not every source writes.\n */\n create?(draft: EntityLookupDraft): Promise<EntityLookupResult>\n /**\n * WHAT this field creates. With it, \"Create\" opens the record's form (the\n * required fields, the rest one click away) instead of writing a name-only\n * row; without it, the name is all there is to write.\n */\n entityDef?: EntityDef\n}\n\nexport type ArchetypeType = 'person' | 'product' | 'service' | 'location'\n\n// ---------------------------------------------------------------------------\n// Person sources\n//\n// Not every \"person\" on a screen lives in `people`. A shop customer is a\n// plg_shop_customers row, and pointing the default archetype lookup at it\n// returns nothing — which reads as a broken popover rather than as the wrong\n// table. A plugin registers where ITS people come from once, and any surface\n// that only knows the kind ('shop_customer') can render them.\n// ---------------------------------------------------------------------------\n\nexport type PersonDetailLookup = Pick<EntityLookup, 'getById'>\n\nconst PERSON_LOOKUPS: Record<string, PersonDetailLookup> = {}\n\n/** Teach PersonLink where people of this kind are loaded from. */\nexport function registerPersonLookup(kind: string, lookup: PersonDetailLookup): void {\n PERSON_LOOKUPS[kind] = lookup\n}\n\nexport function getPersonLookup(kind: string): PersonDetailLookup | null {\n return PERSON_LOOKUPS[kind] ?? null\n}\n\n// ---------------------------------------------------------------------------\n// Archetype display config\n// ---------------------------------------------------------------------------\n\nconst ARCHETYPE_DISPLAY: Record<ArchetypeType, {\n table: string\n labelField: string\n subtitleFields: string[]\n priceField?: string\n groupField?: string\n}> = {\n person: { table: 'people', labelField: 'name', subtitleFields: ['phone'], groupField: 'kind' },\n product: { table: 'products', labelField: 'name', subtitleFields: ['sku', 'description'], priceField: 'price' },\n service: { table: 'products', labelField: 'name', subtitleFields: ['duration_minutes', 'description'], priceField: 'price' },\n location: { table: 'v_units', labelField: 'name', subtitleFields: ['city', 'address'], groupField: 'kind' },\n}\n\n// ---------------------------------------------------------------------------\n// What each archetype creates.\n//\n// Keys are the base table's COLUMNS — this writes straight through, without the\n// provider's camelCase layer — and only fields the table actually has\n// (ARCHETYPE_COLUMNS in core/data/archetype.ts). One required field: the name.\n//\n// A default, not the last word: an app that already defines \"Client\" with its\n// own fields passes its `entityDef` and this drops out.\n// ---------------------------------------------------------------------------\n\nconst ARCHETYPE_ENTITY_DEFS: Record<ArchetypeType, EntityDef> = {\n person: {\n name: 'Contato', namePlural: 'Contatos', icon: 'User',\n fields: [\n { key: 'name', label: 'Nome', type: 'text', required: true },\n { key: 'phone', label: 'Telefone', type: 'phone' },\n { key: 'email', label: 'E-mail', type: 'email' },\n { key: 'document_number', label: 'CPF / CNPJ', type: 'text' },\n { key: 'notes', label: 'Observações', type: 'textarea' },\n ],\n },\n product: {\n name: 'Produto', namePlural: 'Produtos', icon: 'Package',\n fields: [\n { key: 'name', label: 'Nome', type: 'text', required: true },\n { key: 'price', label: 'Preço', type: 'currency' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'unit', label: 'Unidade', type: 'text' },\n { key: 'description', label: 'Descrição', type: 'textarea' },\n ],\n },\n service: {\n name: 'Serviço', namePlural: 'Serviços', icon: 'Sparkles',\n fields: [\n { key: 'name', label: 'Nome', type: 'text', required: true },\n { key: 'price', label: 'Preço', type: 'currency' },\n { key: 'duration_minutes', label: 'Duração (min)', type: 'number' },\n { key: 'description', label: 'Descrição', type: 'textarea' },\n ],\n },\n location: {\n name: 'Local', namePlural: 'Locais', icon: 'MapPin',\n fields: [\n { key: 'name', label: 'Nome', type: 'text', required: true },\n { key: 'phone', label: 'Telefone', type: 'phone' },\n { key: 'address', label: 'Endereço', type: 'text' },\n { key: 'city', label: 'Cidade', type: 'text' },\n ],\n },\n}\n\ninterface ArchetypeLookupConfig {\n archetype: ArchetypeType\n kind?: string | string[]\n kindLabels?: Record<string, string>\n limit?: number\n subtitleFields?: string[]\n /** De onde ler, quando a tabela do arquétipo não tem o que a tela precisa.\n *\n * `people` não guarda a empresa — ela mora na ligação com `plg_crm_companies`\n * ou no `metadata`. Uma tela que precisa procurar POR empresa tem de ler de\n * uma view que já a carrega (`v_leads`), e é só isso que esta opção faz:\n * trocar a origem, mantendo os mesmos campos de rótulo e subtítulo. */\n table?: string\n /** Em que colunas a busca procura. O padrão é só o rótulo — procurar em mais\n * colunas por padrão mudaria o resultado de toda tela que já usa isto. */\n searchFields?: string[]\n /** The quick-create form. Defaults to the archetype's (above); `null` falls\n * back to name-only, with no dialog at all. */\n entityDef?: EntityDef | null\n /**\n * Os tipos que o CADASTRO RÁPIDO pode escolher, quando eles não são os\n * mesmos que a busca varre.\n *\n * Uma conta a pagar PROCURA fornecedor — é quem costuma estar do outro lado\n * — mas paga também o funcionário que adiantou a compra e o cliente que\n * levou reembolso. Sem isto, o cadastro rápido nasce mudo e grava tudo como\n * fornecedor; com isto, ele pergunta com o tipo da tela já marcado.\n */\n createKinds?: string[]\n /**\n * Só o que se MARCA na agenda (`is_bookable`).\n *\n * O catálogo de uma clínica tem 122 serviços e três deles se agendam: o\n * resto é vendido em pacote, e o que vai para a agenda é o passo do processo\n * — a avaliação, a revisão, a entrega. Oferecer os 122 no agendamento faz a\n * recepção escolher o tratamento onde devia escolher o passo, e é assim que\n * o histórico do cliente deixa de fechar com o que ele pagou.\n *\n * `is_bookable IS NULL` volta junto: pool sem a migration 120 não tem a\n * coluna preenchida, e esconder o catálogo inteiro por causa de uma coluna\n * que falta seria trocar um incômodo por uma tela vazia.\n */\n bookableOnly?: boolean\n}\n\n/**\n * ONDE A BUSCA PROCURA.\n *\n * O V1 procura cliente por **nome, telefone ou CPF** — e é o que a recepção\n * faz: a pessoa está ao telefone, o número aparece na tela, e é por ele que se\n * acha a ficha. Procurar só por nome obriga a perguntar \"como se escreve?\" a\n * quem já é cliente há dez anos.\n *\n * O telefone vai por `phone_digits` (migration 126), que é o mesmo número sem\n * a pontuação: 100.322 dos 120.808 contatos deste salão têm o telefone gravado\n * COM formato, e comparar \"(21) 99999-9999\" com o que alguém digita é uma\n * loteria sobre como o dado foi digitado anos atrás.\n *\n * Três dígitos é o piso para número: com menos, \"21\" traria dez mil fichas e a\n * lista deixaria de responder qualquer coisa. O nome não tem esse piso — quem\n * digita \"An\" está procurando Ana e vê a lista encurtar enquanto escreve.\n */\nfunction searchTargets(\n archetype: ArchetypeType,\n labelField: string,\n query: string,\n declarados?: string[],\n): string[] {\n // Vírgula e parênteses são a GRAMÁTICA do `or` do PostgREST. Um nome com\n // vírgula partiria a expressão ao meio e a consulta voltaria com outra coisa\n // — ou com erro. Aspas resolvem, e o `*` é o curinga dentro do `or`.\n const aspas = (v: string) => `\"${v.replace(/[\"\\\\]/g, '')}\"`\n // Quem declarou os campos mandou: a entidade sabe onde o nome dela mora.\n if (declarados?.length) return declarados.map((c) => `${c}.ilike.${aspas(`*${query}*`)}`)\n const alvos = [`${labelField}.ilike.${aspas(`*${query}*`)}`]\n if (archetype !== 'person') return alvos\n const digitos = query.replace(/\\D+/g, '')\n if (digitos.length >= 3) {\n alvos.push(`phone_digits.ilike.${aspas(`*${digitos}*`)}`)\n alvos.push(`document_number.ilike.${aspas(`*${digitos}*`)}`)\n }\n return alvos\n}\n\nfunction toResult(\n row: Record<string, unknown>,\n display: typeof ARCHETYPE_DISPLAY[ArchetypeType],\n kindLabels?: Record<string, string>,\n kinds?: string[],\n): EntityLookupResult {\n const label = String(row[display.labelField] ?? row.name ?? '')\n const subtitleParts = display.subtitleFields\n .map((f) => row[f])\n .filter(Boolean)\n .map((v) => {\n if (typeof v === 'number') return `${v}min`\n return String(v)\n })\n\n // SEM RÓTULO, SEM SELO. `kind` é vocabulário do schema — 'customer',\n // 'shop_customer' — e mandá-lo cru para a tela escreve \"customer\" num cartão\n // em português. Um enum na tela ocupa a linha dizendo que existe uma\n // classificação e não diz qual; quem quiser o selo registra o `kindLabels`.\n //\n // A exceção é a busca que abrange VÁRIOS papéis: ali o grupo é o que separa\n // o fornecedor do cliente na mesma lista, e uma palavra imperfeita vale mais\n // que uma lista onde os dois se parecem.\n let group: string | undefined\n if (display.groupField && row[display.groupField]) {\n const rawGroup = String(row[display.groupField])\n const labelled = kindLabels?.[rawGroup]\n group = labelled ?? (kinds && kinds.length > 1 ? rawGroup : undefined)\n }\n\n return {\n id: String(row.id),\n label,\n subtitle: subtitleParts.length > 0 ? subtitleParts.join(' · ') : undefined,\n group,\n price: display.priceField ? Number(row[display.priceField]) || undefined : undefined,\n data: row,\n }\n}\n\n/**\n * Create an EntityLookup that queries a core archetype table via Supabase.\n * Returns empty results if Supabase is not configured.\n */\nexport function createArchetypeLookup(config: ArchetypeLookupConfig): EntityLookup {\n const baseDisplay = ARCHETYPE_DISPLAY[config.archetype]\n const display = {\n ...baseDisplay,\n ...(config.subtitleFields ? { subtitleFields: config.subtitleFields } : {}),\n ...(config.table ? { table: config.table } : {}),\n }\n const limit = config.limit ?? 20\n const kinds = config.kind\n ? Array.isArray(config.kind) ? config.kind : [config.kind]\n // Um serviço É um produto de `kind='service'` desde a 191 do spine, que\n // aposentou o espelho `public.services`. A tabela aqui já era `products`;\n // o que faltava era o RECORTE — e sem ele `archetype: 'service'` devolvia\n // o catálogo inteiro. O formulário de agendamento de uma clínica oferecia\n // \"Ácido Glicólico 30% (frasco 20ml) — Fornecedor: Victalab\" como serviço\n // para marcar com a cliente.\n : config.archetype === 'service' ? ['service'] : undefined\n\n function applyKindFilter(qb: any) {\n if (kinds && kinds.length === 1) return qb.eq('kind', kinds[0])\n if (kinds && kinds.length > 1) return qb.in('kind', kinds)\n return qb\n }\n\n // O CADASTRO RÁPIDO DIZ O QUE ESTÁ CADASTRANDO.\n //\n // O arquétipo se chama \"Contato\", e é o nome certo para a tabela: `people`\n // guarda cliente, fornecedor, funcionário e lead na mesma casa. Mas a tela\n // sabe mais que a tabela — \"Pagar para\" procura FORNECEDOR — e abrir ali um\n // diálogo \"Novo: Contato\" esconde de quem digita o que aquele nome vai\n // virar. O título passa a ser o do tipo, quando a tela nomeou o tipo.\n //\n // E o tipo vira PERGUNTA sempre que houver mais de uma resposta possível:\n // quando a busca varre vários papéis (deixado em branco, o registro nasce\n // fora do próprio filtro que o pediu e some do campo um instante depois), e\n // quando a tela oferece `createKinds` — a conta a pagar que também paga o\n // funcionário que adiantou a compra. Marcado, em ambos os casos, com o tipo\n // que a tela procura.\n const defaultKind = kinds?.[0]\n const createKinds = config.createKinds ?? kinds\n const baseDef = config.entityDef === null ? undefined : (config.entityDef ?? ARCHETYPE_ENTITY_DEFS[config.archetype])\n const namedDef: EntityDef | undefined = baseDef && !config.entityDef && defaultKind && config.kindLabels?.[defaultKind]\n ? { ...baseDef, name: config.kindLabels[defaultKind]! }\n : baseDef\n const entityDef: EntityDef | undefined = namedDef && createKinds && createKinds.length > 1\n ? {\n ...namedDef,\n fields: [\n namedDef.fields[0]!,\n {\n key: 'kind',\n label: 'Tipo',\n type: 'select',\n required: true,\n options: createKinds.map((k) => ({ value: k, label: config.kindLabels?.[k] ?? k })),\n defaultValue: defaultKind ?? createKinds[0],\n },\n ...namedDef.fields.slice(1),\n ],\n }\n : namedDef\n\n return {\n entityDef,\n\n async search(query: string) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n\n let qb = supabase\n .from(display.table)\n .select('*')\n .order(display.labelField, { ascending: true })\n .limit(limit)\n\n // `not(is, false)` e não `or(eq.true, is.null)`: o PostgREST aceita UM\n // `or` por consulta — dois viram dois parâmetros `or=` na URL e ele fica\n // com um deles, em silêncio. O `or` desta consulta é do TEXTO\n // PROCURADO, que é o que muda a resposta para quem digita; as duas\n // condições de flag dizem a mesma coisa sem gastá-lo.\n qb = config.archetype === 'service'\n ? qb.not('is_active', 'is', false)\n : qb.eq('is_active', true)\n if (config.bookableOnly) qb = qb.not('is_bookable', 'is', false)\n\n if (query) {\n // Os campos que a entidade declarou, quando ela declarou; senão, os\n // que o arquétipo sabe procurar (nome, e para gente também telefone e\n // documento). `searchTargets` cuida da gramática do `or` do PostgREST.\n const alvos = searchTargets(config.archetype, display.labelField, query, config.searchFields)\n qb = alvos.length > 1\n ? qb.or(alvos.join(','))\n : qb.ilike(config.searchFields?.[0] ?? display.labelField, `%${query}%`)\n }\n qb = applyKindFilter(qb)\n\n const { data } = await qb\n return (data ?? []).map((row: Record<string, unknown>) =>\n toResult(row, display, config.kindLabels, kinds),\n )\n },\n\n /**\n * O catálogo inteiro — e ele quase nunca muda entre duas perguntas.\n *\n * Toda abertura do formulário de agendamento relia a lista de serviços do\n * banco, e fechar e reabrir relia de novo. Numa tela que a recepção abre\n * dezenas de vezes por turno isso é uma consulta por clique para devolver\n * a MESMA resposta.\n *\n * Um minuto de TTL: tempo de um turno de balcão inteiro sem repetir a\n * pergunta, e curto o bastante para um serviço cadastrado agora aparecer\n * sozinho no próximo agendamento. A chave leva conta e unidade — duas\n * casas não compartilham catálogo, e sob RLS a mesma URL devolve linhas\n * diferentes.\n */\n async list() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n\n const cacheKey = stableKey(\n 'lookup:list', display.table, kinds ?? [], limit,\n config.bookableOnly ? 'bookable' : '',\n useOrganizationStore.getState().currentOrg?.id ?? '',\n )\n const hit = globalCache.get<EntityLookupResult[]>(cacheKey)\n if (hit) return hit\n\n let qb = supabase\n .from(display.table)\n .select('*')\n .order(display.labelField, { ascending: true })\n .limit(limit)\n\n qb = config.archetype === 'service'\n ? qb.or('is_active.eq.true,is_active.is.null')\n : qb.eq('is_active', true)\n if (config.bookableOnly) qb = qb.or('is_bookable.eq.true,is_bookable.is.null')\n\n qb = applyKindFilter(qb)\n\n const { data } = await qb\n const rows = (data ?? []).map((row: Record<string, unknown>) =>\n toResult(row, display, config.kindLabels, kinds),\n )\n globalCache.set(cacheKey, rows)\n return rows\n },\n\n // Create on the spot: what the form gathered, under the search's `kind`.\n async create(draft: EntityLookupDraft) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('No database connection')\n // Without a tenant the row exists but no policy lets it in: RLS refuses\n // with 42501 and the screen only says \"violates row-level security\".\n const tenantId = useOrganizationStore.getState().currentOrg?.id\n if (!tenantId) throw new Error('Nenhuma organização ativa — tente de novo em um instante.')\n\n const { name, ...rest } = draft\n // Empty fields are dropped: '' in a formatted column (email, date) is\n // refused by the database, and null is the column default anyway.\n const filled = Object.fromEntries(\n Object.entries(rest).filter(([, v]) => v !== '' && v !== null && v !== undefined),\n )\n const row: Record<string, unknown> = {\n ...filled,\n [display.labelField]: name,\n tenant_id: tenantId,\n is_active: true,\n }\n // O que o formulário respondeu manda; o tipo da busca é o padrão de quem\n // não perguntou.\n if (!row.kind && defaultKind) row.kind = defaultKind\n const { data, error } = await supabase\n .from(display.table)\n .insert(row)\n .select('*')\n .single()\n if (error) throw new Error(error.message)\n return toResult(data as Record<string, unknown>, display, config.kindLabels, kinds)\n },\n\n async getById(id: string) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n const { data } = await supabase\n .from(display.table)\n .select('*')\n .eq('id', id)\n .single()\n\n return data\n ? toResult(data as Record<string, unknown>, display, config.kindLabels, kinds)\n : null\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Schedule Block Config Registry\n// Lightweight global config — set by the agenda plugin, read by ScheduleEditor.\n// No React context needed. Graceful degradation when not configured.\n// ---------------------------------------------------------------------------\n\nexport interface ScheduleBlockConfig {\n defaults: {\n bufferMinutes: number\n maxConcurrent: number\n minAdvanceHours: number\n maxAdvanceDays: number\n }\n /** Available services for the multi-select filter. */\n services?: { id: string; name: string }[]\n showServices?: boolean\n showConcurrent?: boolean\n showBookingWindow?: boolean\n /** Available locations for per-block assignment. */\n locations?: { id: string; name: string }[]\n showLocations?: boolean\n /** Lazy fetcher — called when locations are needed but not yet loaded. */\n fetchLocations?: () => Promise<{ id: string; name: string }[]>\n /**\n * As SALAS (`plg_agenda_resources`), para o seletor de cada dia da grade.\n * Separado de `locations` de propósito: aquilo é UNIDADE. O editor de grade\n * vive no admin e não pode conhecer uma tabela de plugin — quem preenche é o\n * plugin da agenda.\n */\n resources?: { id: string; name: string }[]\n showResources?: boolean\n fetchResources?: () => Promise<{ id: string; name: string }[]>\n}\n\nlet globalConfig: ScheduleBlockConfig | null = null\nconst listeners = new Set<() => void>()\n\nexport function setScheduleBlockConfig(config: ScheduleBlockConfig): void {\n globalConfig = config\n listeners.forEach((fn) => fn())\n}\n\nexport function getScheduleBlockConfig(): ScheduleBlockConfig | null {\n return globalConfig\n}\n\n/** Subscribe to config changes. Returns unsubscribe function. */\nexport function subscribeScheduleBlockConfig(listener: () => void): () => void {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n}\n","import React, { useRef, useEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, ChevronDown } from 'lucide-react'\nimport type { BlockSettings } from '../../lib/schedule-service'\nimport type { ScheduleBlockConfig } from '../../lib/schedule-config'\nimport { useTranslation } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\ninterface BlockSettingsPopoverProps {\n settings: BlockSettings\n onChange: (settings: BlockSettings) => void\n config: ScheduleBlockConfig\n /** Ref to the trigger element for positioning */\n triggerRef: React.RefObject<HTMLElement | null>\n open: boolean\n onClose: () => void\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function BlockSettingsPopover({\n settings,\n onChange,\n config,\n triggerRef,\n open,\n onClose,\n}: BlockSettingsPopoverProps) {\n const t = useTranslation()\n const popoverRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState({ top: 0, left: 0 })\n\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n const popW = 280\n let left = rect.left + rect.width / 2 - popW / 2\n if (left + popW > window.innerWidth - 12) left = window.innerWidth - popW - 12\n if (left < 8) left = 8\n setPos({ top: rect.bottom + 6, left })\n }, [open, triggerRef])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n if (popoverRef.current?.contains(e.target as Node)) return\n if (triggerRef.current?.contains(e.target as Node)) return\n onClose()\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open, onClose, triggerRef])\n\n if (!open) return null\n\n const showServices = config.showServices !== false && config.services && config.services.length > 0\n const showConcurrent = config.showConcurrent !== false\n const showBookingWindow = config.showBookingWindow !== false\n const showLocations = config.showLocations === true && config.locations && config.locations.length > 0\n\n function update(patch: Partial<BlockSettings>) {\n onChange({ ...settings, ...patch })\n }\n\n return createPortal(\n <div\n ref={popoverRef}\n style={{ position: 'fixed', top: pos.top, left: pos.left, zIndex: 9999 }}\n className=\"fayz-glass-surface w-[280px] rounded-xl border bg-popover shadow-xl\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-3 py-2.5 border-b\">\n <span className=\"text-xs font-semibold\">{t('schedule.blockSettings.title')}</span>\n <button type=\"button\" onClick={onClose} className=\"p-0.5 rounded text-muted-foreground hover:text-foreground\">\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n <div className=\"p-3 space-y-3\">\n {/* Location select */}\n {showLocations && (\n <LocationSelect\n locations={config.locations!}\n value={settings.locationId}\n onChange={(id) => update({ locationId: id || undefined })}\n />\n )}\n\n {/* Services multi-select */}\n {showServices && (\n <ServiceSelect\n services={config.services!}\n selected={settings.allowedServiceIds ?? []}\n onChange={(ids) => update({ allowedServiceIds: ids.length > 0 ? ids : undefined })}\n />\n )}\n\n {/* Max concurrent */}\n {showConcurrent && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.maxConcurrent')}</label>\n <div className=\"flex items-center gap-2 mt-1\">\n <button\n type=\"button\"\n onClick={() => update({ maxConcurrent: Math.max(1, (settings.maxConcurrent ?? config.defaults.maxConcurrent) - 1) })}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border text-sm hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n -\n </button>\n <span className=\"text-sm font-medium w-6 text-center\">\n {settings.maxConcurrent ?? config.defaults.maxConcurrent}\n </span>\n <button\n type=\"button\"\n onClick={() => update({ maxConcurrent: (settings.maxConcurrent ?? config.defaults.maxConcurrent) + 1 })}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border text-sm hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n +\n </button>\n </div>\n </div>\n )}\n\n {/* Booking window */}\n {showBookingWindow && (\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.minAdvance')}</label>\n <div className=\"flex items-center gap-1 mt-1\">\n <input\n type=\"number\"\n min={0}\n value={settings.minAdvanceHours ?? config.defaults.minAdvanceHours}\n onChange={(e) => update({ minAdvanceHours: Number(e.target.value) || 0 })}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1 text-xs tabular-nums\"\n />\n <span className=\"text-[10px] text-muted-foreground shrink-0\">{t('schedule.blockSettings.hrs')}</span>\n </div>\n </div>\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.maxAdvance')}</label>\n <div className=\"flex items-center gap-1 mt-1\">\n <input\n type=\"number\"\n min={1}\n value={settings.maxAdvanceDays ?? config.defaults.maxAdvanceDays}\n onChange={(e) => update({ maxAdvanceDays: Number(e.target.value) || 30 })}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1 text-xs tabular-nums\"\n />\n <span className=\"text-[10px] text-muted-foreground shrink-0\">{t('schedule.blockSettings.days')}</span>\n </div>\n </div>\n </div>\n )}\n\n {/* Label */}\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.label')}</label>\n <input\n type=\"text\"\n value={settings.label ?? ''}\n onChange={(e) => update({ label: e.target.value || undefined })}\n placeholder={t('schedule.blockSettings.labelPlaceholder')}\n className=\"mt-1 w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1 text-xs placeholder:text-muted-foreground/40\"\n />\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Service multi-select (simple dropdown with checkboxes)\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Location select (custom dropdown)\n// ---------------------------------------------------------------------------\n\nfunction LocationSelect({\n locations,\n value,\n onChange,\n}: {\n locations: { id: string; name: string }[]\n value: string | undefined\n onChange: (id: string) => void\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const current = value ? locations.find((l) => l.id === value) : null\n const label = current ? current.name : t('schedule.blockSettings.noLocation')\n\n return (\n <div ref={ref} className=\"relative\">\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.location')}</label>\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n className=\"mt-1 flex items-center justify-between w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1.5 text-xs hover:bg-muted/30 transition-colors\"\n >\n <span className={current ? '' : 'text-muted-foreground'}>{label}</span>\n <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 z-10 mt-1 w-full max-h-40 overflow-y-auto rounded-lg border bg-popover shadow-lg py-1\">\n <button\n type=\"button\"\n onClick={() => { onChange(''); setOpen(false) }}\n className={`block w-full px-2.5 py-1.5 text-xs text-left transition-colors ${!value ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'}`}\n >\n {t('schedule.blockSettings.noLocation')}\n </button>\n {locations.map((l) => (\n <button\n key={l.id}\n type=\"button\"\n onClick={() => { onChange(l.id); setOpen(false) }}\n className={`block w-full px-2.5 py-1.5 text-xs text-left transition-colors ${l.id === value ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'}`}\n >\n {l.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Service multi-select (simple dropdown with checkboxes)\n// ---------------------------------------------------------------------------\n\nfunction ServiceSelect({\n services,\n selected,\n onChange,\n}: {\n services: { id: string; name: string }[]\n selected: string[]\n onChange: (ids: string[]) => void\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const allSelected = selected.length === 0\n const label = allSelected\n ? t('schedule.blockSettings.allServices')\n : selected.length === 1\n ? services.find((s) => s.id === selected[0])?.name ?? t('schedule.blockSettings.oneService')\n : t('schedule.blockSettings.nServices', { count: selected.length })\n\n function toggle(id: string) {\n onChange(selected.includes(id) ? selected.filter((s) => s !== id) : [...selected, id])\n }\n\n return (\n <div ref={ref} className=\"relative\">\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.allowedServices')}</label>\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n className=\"mt-1 flex items-center justify-between w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1.5 text-xs hover:bg-muted/30 transition-colors\"\n >\n <span className={allSelected ? 'text-muted-foreground' : ''}>{label}</span>\n <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 z-10 mt-1 w-full max-h-40 overflow-y-auto rounded-lg border bg-popover shadow-lg py-1\">\n <button\n type=\"button\"\n onClick={() => onChange([])}\n className={`block w-full px-2.5 py-1.5 text-xs text-left transition-colors ${allSelected ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'}`}\n >\n {t('schedule.blockSettings.allServices')}\n </button>\n {services.map((s) => {\n const checked = selected.includes(s.id)\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => toggle(s.id)}\n className={`flex items-center gap-2 w-full px-2.5 py-1.5 text-xs text-left transition-colors ${checked ? 'bg-primary/5' : 'hover:bg-muted/50'}`}\n >\n <span className={`flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-sm border ${\n checked ? 'border-primary bg-primary text-primary-foreground' : 'border-muted-foreground/30'\n }`}>\n {checked && <svg className=\"h-2.5 w-2.5\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className=\"truncate\">{s.name}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import React, { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { CalendarOff, Check, Copy, Plus, Settings, Trash2, Users } from 'lucide-react'\nimport {\n Badge, Button, DatePicker, Input, Modal, ModalBody, ModalContent, ModalDescription, ModalFooter,\n ModalHeader, ModalTitle, Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n Skeleton, TimePicker, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, toast,\n} from '@fayz-ai/ui'\nimport { useTranslation, todayLocal } from '@fayz-ai/core'\nimport {\n assigneesWithCurrentGrid, copyGridTo, deleteGrid, endGridValidity, gridKeyOf, isGridCurrent,\n listGrids, saveGrid,\n} from '../../lib/schedule-service'\nimport { createArchetypeLookup } from '../archetype-lookup'\nimport type { GridKind, GridPeriod, ScheduleGrid } from '../../lib/schedule-service'\nimport { getScheduleBlockConfig, subscribeScheduleBlockConfig } from '../../lib/schedule-config'\nimport { BlockSettingsPopover } from './BlockSettingsPopover'\n\n// ---------------------------------------------------------------------------\n// A GRADE DE HORÁRIOS, NA FORMA EM QUE QUEM CONFIGURA PENSA NELA.\n//\n// A tela antiga editava UMA semana por profissional. O V1 edita uma GRADE: um\n// cartão de vigência (\"04/09/2026 → 25/12/2027\", selo Vigente) com sete\n// colunas dentro, e ao lado dele as grades anteriores, que continuam ali.\n//\n// A diferença não é de layout, é de conceito, e ela tem uma razão operacional:\n// **vigência é histórico, não edição**. Quando o profissional muda de horário\n// em março, o certo é encerrar a grade de janeiro e criar outra — porque os\n// agendamentos de fevereiro foram permitidos por aquela grade, e sobrescrevê-la\n// apaga a explicação de por que eles existem. Foi por isso que o V1 pôs\n// \"Encerrar vigência\" e \"Excluir grade\" lado a lado, com verbos diferentes.\n//\n// ── Sete colunas e não sete linhas ─────────────────────────────────────────\n//\n// A semana inteira cabe na largura sem rolagem, e é assim que se enxerga que\n// sábado ficou de fora. Em tela estreita as colunas viram duas e depois uma —\n// a grade não é tabela, é uma lista de dias que sabe se espalhar.\n// ---------------------------------------------------------------------------\n\nconst WEEK_ORDER = [1, 2, 3, 4, 5, 6, 0] // Segunda → Domingo\nconst DAY_KEYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']\nconst SLOT_OPTIONS = [5, 10, 15, 20, 30, 45, 60]\nconst DEFAULT_SLOT = 30\n\nconst today = () => todayLocal()\n\nfunction formatDay(date: string | null): string {\n if (!date) return ''\n const [y, m, d] = date.split('-')\n return `${d}/${m}/${y}`\n}\n\nconst emptyDays = (): Record<number, GridPeriod[]> => ({ 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [] })\n\nfunction newGrid(kind: GridKind): ScheduleGrid {\n return {\n key: `novo:${kind}`,\n kind,\n validFrom: today(),\n validTo: null,\n slotIntervalMinutes: DEFAULT_SLOT,\n weekInterval: 0,\n name: null,\n unitId: null,\n days: emptyDays(),\n rowIds: [],\n }\n}\n\n/** Cópia funda — o rascunho não pode compartilhar array com a lista carregada. */\nfunction cloneGrid(g: ScheduleGrid): ScheduleGrid {\n const days = emptyDays()\n for (const [d, periods] of Object.entries(g.days)) {\n days[Number(d)] = periods.map((p) => ({ ...p, settings: p.settings ? { ...p.settings } : undefined }))\n }\n return { ...g, days }\n}\n\nfunction useResources(): { id: string; name: string }[] {\n const config = useSyncExternalStore(subscribeScheduleBlockConfig, getScheduleBlockConfig, () => null)\n const asked = useRef(false)\n useEffect(() => {\n if (asked.current) return\n if (config?.resources?.length || !config?.fetchResources) return\n asked.current = true\n void config.fetchResources()\n }, [config])\n return config?.resources ?? []\n}\n\n/**\n * Confirmar pelo diálogo do design system, nunca pela caixa do navegador.\n *\n * O `confirm` nativo desenha uma janela do SISTEMA OPERACIONAL: ignora o tema,\n * não põe o verbo da ação no botão (\"OK\" não diz se vai excluir), e trava a\n * página inteira enquanto está aberta — inclusive para a automação que prova a\n * tela. Aqui o botão diz o que faz e a cor diz se dói.\n */\nfunction ConfirmDialog({\n open, title, description, confirmLabel, destructive, onConfirm, onCancel,\n}: {\n open: boolean\n title: string\n description: string\n confirmLabel: string\n destructive?: boolean\n onConfirm: () => void\n onCancel: () => void\n}) {\n const t = useTranslation()\n return (\n <Modal open={open} onOpenChange={(o) => { if (!o) onCancel() }}>\n <ModalContent size=\"sm\">\n <ModalHeader>\n <ModalTitle>{title}</ModalTitle>\n <ModalDescription>{description}</ModalDescription>\n </ModalHeader>\n <ModalBody />\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onCancel}>{t('common.cancel')}</Button>\n <Button variant={destructive ? 'destructive' : 'default'} onClick={onConfirm}>{confirmLabel}</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Um período dentro de um dia\n// ---------------------------------------------------------------------------\n\nfunction PeriodBox({\n period, resources, onChange, onRemove, onCopyToAll,\n}: {\n period: GridPeriod\n resources: { id: string; name: string }[]\n onChange: (patch: Partial<GridPeriod>) => void\n onRemove: () => void\n onCopyToAll: () => void\n}) {\n const t = useTranslation()\n const gearRef = useRef<HTMLButtonElement>(null)\n const [settingsOpen, setSettingsOpen] = useState(false)\n const blockConfig = useSyncExternalStore(subscribeScheduleBlockConfig, getScheduleBlockConfig, () => null)\n const hasSettings = period.settings && Object.values(period.settings).some((v) => v !== undefined)\n\n return (\n <div className=\"space-y-1.5 rounded-md border border-border/60 bg-background p-1.5\">\n <TimePicker value={period.startsAt} onChange={(v) => onChange({ startsAt: v })} interval={15} className=\"w-full\" />\n <TimePicker value={period.endsAt} onChange={(v) => onChange({ endsAt: v })} interval={15} min={period.startsAt} className=\"w-full\" />\n\n {resources.length > 1 && (\n <Select value={period.resourceId ?? ''} onValueChange={(v) => onChange({ resourceId: v || null })}>\n <SelectTrigger className=\"h-8 w-full text-xs\">\n <SelectValue placeholder={t('schedule.grid.room')} />\n </SelectTrigger>\n <SelectContent>\n {resources.map((r) => <SelectItem key={r.id} value={r.id}>{r.name}</SelectItem>)}\n </SelectContent>\n </Select>\n )}\n\n {/* Empilhado, como no V1: numa coluna de 110px \"Configurar\" ao lado de\n dois ícones não cabe, e o que sai na tela é a palavra cortada pela\n borda. Cada ação na sua linha. */}\n <div className=\"space-y-0.5 pt-0.5\">\n <div className=\"flex items-center gap-1\">\n {blockConfig && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n ref={gearRef} type=\"button\" onClick={() => setSettingsOpen((v) => !v)}\n aria-label={t('schedule.grid.configure')}\n className={'flex flex-1 items-center gap-1 rounded px-1 py-0.5 text-[11px] transition-colors ' +\n (hasSettings ? 'text-primary' : 'text-muted-foreground hover:bg-muted hover:text-foreground')}\n >\n <Settings className=\"h-3 w-3 shrink-0\" />{t('schedule.grid.configure')}\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.blockSettings.title')}</TooltipContent>\n </Tooltip>\n )}\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={onCopyToAll} aria-label={t('schedule.editor.copyToAll')}\n className=\"ml-auto shrink-0 rounded p-1 text-muted-foreground/50 transition-colors hover:bg-muted hover:text-foreground\">\n <Copy className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.copyToAll')}</TooltipContent>\n </Tooltip>\n </div>\n <button type=\"button\" onClick={onRemove}\n className=\"flex w-full items-center gap-1 rounded px-1 py-0.5 text-[11px] text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\">\n <Trash2 className=\"h-3 w-3 shrink-0\" />{t('schedule.grid.removePeriod')}\n </button>\n </div>\n\n {blockConfig && (\n <BlockSettingsPopover\n settings={period.settings ?? {}}\n onChange={(s) => onChange({ settings: s })}\n config={blockConfig}\n triggerRef={gearRef}\n open={settingsOpen}\n onClose={() => setSettingsOpen(false)}\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// O painel\n// ---------------------------------------------------------------------------\n\nexport interface ScheduleGridPanelProps {\n assigneeId: string\n kind: GridKind\n /** Recarrega quem depende da grade (a agenda) depois de gravar. */\n onSaved?: () => void\n}\n\nexport function ScheduleGridPanel({ assigneeId, kind, onSaved }: ScheduleGridPanelProps) {\n const t = useTranslation()\n const resources = useResources()\n\n const [grids, setGrids] = useState<ScheduleGrid[] | null>(null)\n const [draft, setDraft] = useState<ScheduleGrid | null>(null)\n const [dirty, setDirty] = useState(false)\n const [saving, setSaving] = useState(false)\n const [confirm, setConfirm] = useState<'end' | 'delete' | null>(null)\n const [pendingSelect, setPendingSelect] = useState<ScheduleGrid | null>(null)\n\n const load = useCallback(async () => {\n setGrids(null)\n try {\n const all = await listGrids(assigneeId)\n const mine = all.filter((g) => g.kind === kind)\n setGrids(mine)\n setDraft(mine[0] ? cloneGrid(mine[0]) : null)\n setDirty(false)\n } catch (err: any) {\n setGrids([])\n toast.error(t('schedule.editor.failedToLoad'), { description: err?.message })\n }\n }, [assigneeId, kind, t])\n\n useEffect(() => { void load() }, [load])\n\n const patch = (p: Partial<ScheduleGrid>) => { setDraft((d) => (d ? { ...d, ...p } : d)); setDirty(true) }\n\n const patchDay = (dow: number, periods: GridPeriod[]) => {\n setDraft((d) => (d ? { ...d, days: { ...d.days, [dow]: periods } } : d))\n setDirty(true)\n }\n\n const addPeriod = (dow: number) => {\n const periods = draft?.days[dow] ?? []\n const last = periods[periods.length - 1]\n patchDay(dow, [...periods, { startsAt: last?.endsAt ?? '08:00', endsAt: '18:00', resourceId: last?.resourceId ?? resources[0]?.id ?? null }])\n }\n\n /** Copia este período para os sete dias — o atalho de montar a semana. */\n const copyToAll = (period: GridPeriod) => {\n if (!draft) return\n const days = emptyDays()\n for (const d of WEEK_ORDER) days[d] = [{ ...period, id: undefined, settings: period.settings ? { ...period.settings } : undefined }]\n setDraft({ ...draft, days })\n setDirty(true)\n }\n\n const selectGrid = (g: ScheduleGrid) => {\n if (dirty) { setPendingSelect(g); return }\n setDraft(cloneGrid(g)); setDirty(false)\n }\n\n const startNew = () => { setDraft(newGrid(kind)); setDirty(true) }\n\n const duplicate = () => {\n if (!draft) return\n const copy = cloneGrid(draft)\n copy.key = `novo:${kind}`\n copy.rowIds = []\n copy.validFrom = today()\n copy.validTo = null\n copy.name = draft.name ? `${draft.name} (${t('common.copy')})` : null\n for (const d of Object.keys(copy.days)) copy.days[Number(d)] = copy.days[Number(d)].map((p) => ({ ...p, id: undefined }))\n setDraft(copy); setDirty(true)\n }\n\n // ── Copiar esta grade para outras pessoas ──────────────────────────────\n //\n // Quem JÁ tem grade vigente aparece marcado e travado: copiar por cima não\n // substitui nada, SOMA. As duas grades passariam a valer no mesmo dia e a\n // agenda desenharia a união — um horário que ninguém definiu. Quem quiser\n // trocar a grade de alguém encerra a dela e cria outra, que é o gesto que a\n // vigência existe para preservar.\n const [copyOpen, setCopyOpen] = useState(false)\n const [people, setPeople] = useState<Array<{ id: string; name: string; hasGrid: boolean }> | null>(null)\n const [picked, setPicked] = useState<string[]>([])\n const [copyTerm, setCopyTerm] = useState('')\n const [copying, setCopying] = useState(false)\n\n const openCopy = async () => {\n setCopyOpen(true); setPicked([]); setCopyTerm(''); setPeople(null)\n try {\n const lookup = createArchetypeLookup({ archetype: 'person', bookableOnly: true, limit: 200 })\n const rows = (await lookup.list?.() ?? []).filter((r) => r.id !== assigneeId)\n // SEM o `kind` do painel aqui. Ele é o da GRADE ('standard' | 'exception',\n // que vai em `grid_kind`); o `kind` da LINHA é sempre 'working_hours'.\n // Passar um pelo outro fazia a consulta perguntar por `kind='standard'`\n // e voltar vazia — ninguém aparecia travado, e a próxima cópia somaria\n // uma segunda grade em cima de quem já tinha a sua.\n const comGrade = await assigneesWithCurrentGrid(rows.map((r) => r.id))\n setPeople(rows.map((r) => ({ id: r.id, name: r.label, hasGrid: comGrade.has(r.id) })))\n } catch (err: any) {\n setPeople([])\n toast.error('Não foi possível listar as pessoas', { description: err?.message })\n }\n }\n\n const runCopy = async () => {\n if (!draft || picked.length === 0) return\n setCopying(true)\n try {\n await copyGridTo(picked, draft)\n toast.success(picked.length === 1 ? 'Grade copiada para 1 pessoa' : `Grade copiada para ${picked.length} pessoas`)\n setCopyOpen(false)\n onSaved?.()\n } catch (err: any) {\n toast.error('Não foi possível copiar a grade', { description: err?.message })\n } finally {\n setCopying(false)\n }\n }\n\n const save = async () => {\n if (!draft) return\n if (!draft.validFrom) { toast.error(t('schedule.grid.needsStart')); return }\n if (draft.validTo && draft.validTo < draft.validFrom) { toast.error(t('schedule.editor.endDateAfterStart')); return }\n const total = Object.values(draft.days).reduce((n, p) => n + p.length, 0)\n if (total === 0) { toast.error(t('schedule.grid.needsOneDay')); return }\n setSaving(true)\n try {\n await saveGrid(assigneeId, draft)\n toast.success(t('schedule.editor.saved'))\n onSaved?.()\n await load()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToSave'), { description: err?.message })\n } finally { setSaving(false) }\n }\n\n const endValidity = async () => {\n if (!draft || draft.rowIds.length === 0) return\n setConfirm(null)\n try {\n await endGridValidity(draft, today())\n toast.success(t('schedule.grid.ended'))\n onSaved?.(); await load()\n } catch (err: any) { toast.error(t('schedule.editor.failedToSave'), { description: err?.message }) }\n }\n\n const removeGrid = async () => {\n if (!draft) return\n if (draft.rowIds.length === 0) { setDraft(grids?.[0] ? cloneGrid(grids[0]) : null); setDirty(false); setConfirm(null); return }\n setConfirm(null)\n try {\n await deleteGrid(draft)\n toast.success(t('schedule.grid.deleted'))\n onSaved?.(); await load()\n } catch (err: any) { toast.error(t('schedule.editor.failedToDelete'), { description: err?.message }) }\n }\n\n // ── esqueleto com a FORMA da grade ───────────────────────────────────────\n if (grids === null) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-16 w-56\" />\n <div className=\"flex gap-3\"><Skeleton className=\"h-14 w-36\" /><Skeleton className=\"h-14 w-36\" /><Skeleton className=\"h-14 w-40\" /></div>\n <div className=\"grid grid-cols-2 gap-2 lg:grid-cols-7\">\n {WEEK_ORDER.map((d) => <Skeleton key={d} className=\"h-36 w-full\" />)}\n </div>\n </div>\n )\n }\n\n // ── o vazio: o V1 explica para que serve antes de pedir o primeiro clique ──\n if (!draft) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 py-16 text-center\">\n <p className=\"max-w-md text-sm text-muted-foreground\">\n {kind === 'standard' ? t('schedule.grid.emptyStandard') : t('schedule.grid.emptyException')}\n </p>\n <Button onClick={startNew} className=\"gap-1.5\">\n <Plus className=\"h-4 w-4\" />\n {kind === 'standard' ? t('schedule.grid.createFirst') : t('schedule.grid.createException')}\n </Button>\n </div>\n )\n }\n\n const isNew = draft.rowIds.length === 0\n\n return (\n <TooltipProvider delayDuration={300}>\n <div className=\"space-y-4\">\n {/* Os cartões de vigência — o histórico fica à vista, não escondido. */}\n <div className=\"flex flex-wrap items-stretch gap-2\">\n {grids.map((g) => {\n const active = gridKeyOf(g) === gridKeyOf(draft) && !isNew\n return (\n <button\n key={g.key} type=\"button\" onClick={() => selectGrid(g)}\n className={'min-w-[13rem] rounded-lg border px-3 py-2 text-left transition-colors ' +\n (active ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/50')}\n >\n <span className=\"block text-sm font-medium tabular-nums\">\n {formatDay(g.validFrom)} → {g.validTo ? formatDay(g.validTo) : t('schedule.grid.noEnd')}\n </span>\n <span className=\"mt-1 flex items-center gap-1.5\">\n {isGridCurrent(g) && <Badge variant=\"success\" className=\"text-[10px]\">{t('schedule.grid.current')}</Badge>}\n {g.name && <span className=\"truncate text-xs text-muted-foreground\">{g.name}</span>}\n </span>\n </button>\n )\n })}\n {isNew && (\n <div className=\"min-w-[13rem] rounded-lg border border-primary bg-primary/5 px-3 py-2\">\n <span className=\"block text-sm font-medium\">{t('schedule.grid.newGrid')}</span>\n <span className=\"text-xs text-muted-foreground\">{t('schedule.grid.notSavedYet')}</span>\n </div>\n )}\n <button type=\"button\" onClick={startNew}\n className=\"flex min-w-[9rem] items-center justify-center gap-1.5 rounded-lg border border-dashed px-3 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-foreground\">\n <Plus className=\"h-4 w-4\" />{t('schedule.grid.newGrid')}\n </button>\n <button type=\"button\" onClick={duplicate}\n className=\"flex min-w-[9rem] items-center justify-center gap-1.5 rounded-lg border border-dashed px-3 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-foreground\">\n <Copy className=\"h-4 w-4\" />{t('schedule.grid.duplicate')}\n </button>\n {/* DUPLICAR é dentro da mesma pessoa (uma vigência nova a partir\n desta); COPIAR PARA é para outras. O V1 chama os dois de\n \"Duplicar\" e explica o segundo em prosa — \"serve para montar dez\n profissionais iguais rápido\" —, que é o gesto de abrir uma\n unidade. Aqui cada um diz o que faz. */}\n {!isNew && (\n <button type=\"button\" onClick={openCopy}\n className=\"flex min-w-[9rem] items-center justify-center gap-1.5 rounded-lg border border-dashed px-3 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-foreground\">\n <Users className=\"h-4 w-4\" />Copiar para…\n </button>\n )}\n </div>\n\n {/* O cabeçalho da grade */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">{t('schedule.grid.validFrom')}</label>\n <DatePicker value={draft.validFrom ?? ''} format=\"numeric\" onChange={(v) => patch({ validFrom: v || null })} />\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">{t('schedule.grid.validTo')}</label>\n <DatePicker value={draft.validTo ?? ''} format=\"numeric\" onChange={(v) => patch({ validTo: v || null })} />\n <p className=\"mt-1 text-[11px] text-muted-foreground\">{t('schedule.grid.validToHint')}</p>\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">{t('schedule.grid.slotInterval')}</label>\n <Select\n value={String(draft.slotIntervalMinutes ?? DEFAULT_SLOT)}\n onValueChange={(v) => patch({ slotIntervalMinutes: Number(v) })}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {SLOT_OPTIONS.map((m) => <SelectItem key={m} value={String(m)}>{t('schedule.grid.minutes', { n: m })}</SelectItem>)}\n </SelectContent>\n </Select>\n <p className=\"mt-1 text-[11px] text-muted-foreground\">{t('schedule.grid.slotHint')}</p>\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">{t('schedule.grid.name')}</label>\n <Input value={draft.name ?? ''} onChange={(e) => patch({ name: e.target.value || null })}\n placeholder={t('schedule.grid.namePlaceholder')} />\n </div>\n </div>\n\n {/* Os sete dias */}\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-4 xl:grid-cols-7\">\n {WEEK_ORDER.map((dow) => {\n const periods = draft.days[dow] ?? []\n return (\n <div key={dow} className=\"rounded-lg border bg-muted/20 p-2\">\n <p className=\"mb-2 text-center text-xs font-semibold\">{t(`schedule.daysFull.${DAY_KEYS[dow]}`)}</p>\n <div className=\"space-y-2\">\n {periods.map((p, i) => (\n <PeriodBox\n key={p.id ?? `novo-${i}`}\n period={p}\n resources={resources}\n onChange={(pp) => patchDay(dow, periods.map((x, j) => (j === i ? { ...x, ...pp } : x)))}\n onRemove={() => patchDay(dow, periods.filter((_, j) => j !== i))}\n onCopyToAll={() => copyToAll(p)}\n />\n ))}\n </div>\n <button type=\"button\" onClick={() => addPeriod(dow)}\n className=\"mt-2 flex w-full items-center justify-center gap-1 rounded-md border border-dashed py-1.5 text-xs text-muted-foreground transition-colors hover:border-primary hover:text-foreground\">\n <Plus className=\"h-3 w-3\" />{t('schedule.grid.add')}\n </button>\n </div>\n )\n })}\n </div>\n\n {/* O pé: encerrar e excluir são verbos DIFERENTES, e ficam longe de salvar.\n E ele GRUDA no fim da caixa: sete colunas mais o cabeçalho passam da\n altura do diálogo, então quem mexeu na sexta-feira rolava de volta\n até em cima para achar \"Salvar grade\" — e um botão que se procura é\n um botão que se esquece de apertar. */}\n <div className=\"sticky bottom-0 z-10 -mx-1 flex flex-wrap items-center gap-2 border-t bg-background px-1 py-3\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setConfirm('end')} disabled={isNew} className=\"gap-1.5\">\n <CalendarOff className=\"h-3.5 w-3.5\" />{t('schedule.grid.endValidity')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => (isNew ? removeGrid() : setConfirm('delete'))}\n className=\"gap-1.5 text-destructive hover:bg-destructive/10 hover:text-destructive\">\n <Trash2 className=\"h-3.5 w-3.5\" />{t('schedule.grid.deleteGrid')}\n </Button>\n <div className=\"ml-auto flex items-center gap-2\">\n {dirty && <span className=\"text-xs text-muted-foreground\">{t('schedule.grid.unsaved')}</span>}\n <Button size=\"sm\" onClick={save} disabled={saving || !dirty} className=\"gap-1.5\">\n <Check className=\"h-3.5 w-3.5\" />\n {saving ? t('common.saving') : t('schedule.grid.save')}\n </Button>\n </div>\n </div>\n\n <Modal open={copyOpen} onOpenChange={(o) => { if (!o) setCopyOpen(false) }}>\n <ModalContent size=\"sm\">\n <ModalHeader>\n <ModalTitle>Copiar esta grade</ModalTitle>\n <ModalDescription>\n A mesma semana vira uma grade NOVA para quem você escolher. Quem já tem grade\n vigente fica de fora: copiar por cima não substitui a dela, soma — e a agenda\n passaria a desenhar as duas.\n </ModalDescription>\n </ModalHeader>\n <ModalBody>\n <Input\n value={copyTerm}\n onChange={(e) => setCopyTerm(e.target.value)}\n placeholder=\"Buscar pessoa…\"\n className=\"mb-2\"\n />\n {people === null ? (\n <div className=\"space-y-1.5\">\n <Skeleton className=\"h-8 w-full\" />\n <Skeleton className=\"h-8 w-full\" />\n <Skeleton className=\"h-8 w-full\" />\n </div>\n ) : people.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-muted-foreground\">Nenhuma outra pessoa agendável.</p>\n ) : (\n <ul className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n {people\n .filter((pe) => !copyTerm.trim() || pe.name.toLowerCase().includes(copyTerm.trim().toLowerCase()))\n .map((pe) => (\n <li key={pe.id}>\n <label className={'flex items-center gap-2 rounded-md px-2 py-1.5 text-sm '\n + (pe.hasGrid ? 'opacity-50' : 'cursor-pointer hover:bg-muted')}>\n <input\n type=\"checkbox\"\n disabled={pe.hasGrid}\n checked={picked.includes(pe.id)}\n onChange={() => setPicked((cur) =>\n cur.includes(pe.id) ? cur.filter((x) => x !== pe.id) : [...cur, pe.id])}\n />\n <span className=\"min-w-0 flex-1 truncate\">{pe.name}</span>\n {pe.hasGrid && (\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">já tem grade</span>\n )}\n </label>\n </li>\n ))}\n </ul>\n )}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={() => setCopyOpen(false)}>{t('common.cancel')}</Button>\n {/* Ação bloqueada DIZ o que falta, em vez de um botão morto em silêncio. */}\n <Button onClick={runCopy} disabled={picked.length === 0 || copying}>\n {copying ? 'Copiando…' : picked.length === 0 ? 'Escolha ao menos uma pessoa' : `Copiar para ${picked.length}`}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n <ConfirmDialog\n open={confirm === 'end'}\n title={t('schedule.grid.endValidity')}\n description={t('schedule.grid.confirmEnd')}\n confirmLabel={t('schedule.grid.endValidity')}\n onConfirm={endValidity}\n onCancel={() => setConfirm(null)}\n />\n <ConfirmDialog\n open={confirm === 'delete'}\n title={t('schedule.grid.deleteGrid')}\n description={t('schedule.grid.confirmDelete')}\n confirmLabel={t('schedule.grid.deleteGrid')}\n destructive\n onConfirm={removeGrid}\n onCancel={() => setConfirm(null)}\n />\n <ConfirmDialog\n open={pendingSelect !== null}\n title={t('schedule.grid.discardTitle')}\n description={t('schedule.grid.discardChanges')}\n confirmLabel={t('schedule.grid.discard')}\n destructive\n onConfirm={() => { if (pendingSelect) { setDraft(cloneGrid(pendingSelect)); setDirty(false) } setPendingSelect(null) }}\n onCancel={() => setPendingSelect(null)}\n />\n </div>\n </TooltipProvider>\n )\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { CalendarOff, CalendarPlus, Clock, Plus, Save, Trash2 } from 'lucide-react'\nimport {\n Badge, Button, Card, CardContent, DatePicker, Modal, ModalBody, ModalContent, ModalDescription,\n ModalFooter, ModalHeader, ModalTitle, Skeleton, Tabs, TabsList, TabsTrigger, TimePicker,\n Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, toast,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { deleteException, getSchedules, saveException } from '../../lib/schedule-service'\nimport type { ScheduleRecord } from '../../lib/schedule-service'\n\n// ---------------------------------------------------------------------------\n// AUSÊNCIAS E DATAS ESPECÍFICAS\n//\n// Isto NÃO é a grade de exceção do V1 — aquela é uma semana que substitui a\n// padrão durante um período, e vive no `ScheduleGridPanel`. Isto aqui é a\n// exceção por DATA: \"dia 12 não atendo\", \"no dia 20 atendo só de manhã\".\n//\n// O V1 resolve isso pelo bloqueio, na própria agenda. Mantemos a tela aqui, ao\n// pé da aba de exceções, por dois motivos: o dado já existe (linhas com\n// `specific_date`, que `agenda_working_windows` continua honrando) e é onde\n// quem procura \"uma coisa temporária\" vai olhar. Sumir com a tela deixaria o\n// dado inalcançável, que é pior do que uma seção a mais.\n// ---------------------------------------------------------------------------\n\ninterface ExceptionEntry {\n startDate: string\n endDate: string\n type: 'available' | 'unavailable'\n periods: { startsAt: string; endsAt: string }[]\n notes: string\n}\n\nfunction schedulesToExceptions(schedules: ScheduleRecord[]): ExceptionEntry[] {\n const map = new Map<string, ExceptionEntry>()\n for (const s of schedules) {\n if (!s.specificDate) continue\n const meta = (s.metadata ?? {}) as Record<string, unknown>\n const rangeStart = (meta.rangeStart as string) ?? s.specificDate\n const rangeEnd = (meta.rangeEnd as string) ?? s.specificDate\n const key = `${rangeStart}__${rangeEnd}`\n const exType = (meta.exceptionType as string) === 'available' ? 'available' : 'unavailable'\n const notes = (meta.notes as string) ?? ''\n\n const existing = map.get(key)\n if (!existing) {\n map.set(key, {\n startDate: rangeStart, endDate: rangeEnd, type: exType,\n periods: s.isActive ? [{ startsAt: s.startsAt, endsAt: s.endsAt }] : [],\n notes,\n })\n } else if (s.isActive && s.specificDate === rangeStart) {\n existing.periods.push({ startsAt: s.startsAt, endsAt: s.endsAt })\n }\n }\n return Array.from(map.values()).sort((a, b) => a.startDate.localeCompare(b.startDate))\n}\n\nfunction formatDate(dateStr: string): string {\n const d = new Date(dateStr + 'T00:00:00')\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })\n}\n\nexport function ScheduleDateExceptions({ assigneeId, onChanged }: { assigneeId: string; onChanged?: () => void }) {\n const t = useTranslation()\n const [exceptions, setExceptions] = useState<ExceptionEntry[] | null>(null)\n const [showAdd, setShowAdd] = useState(false)\n const [startDate, setStartDate] = useState('')\n const [endDate, setEndDate] = useState('')\n const [type, setType] = useState<'unavailable' | 'available'>('unavailable')\n const [periods, setPeriods] = useState([{ startsAt: '09:00', endsAt: '17:00' }])\n const [notes, setNotes] = useState('')\n const [saving, setSaving] = useState(false)\n\n const load = useCallback(async () => {\n try {\n setExceptions(schedulesToExceptions(await getSchedules(assigneeId)))\n } catch {\n setExceptions([])\n toast.error(t('schedule.editor.failedToLoad'))\n }\n }, [assigneeId, t])\n\n useEffect(() => { void load() }, [load])\n\n async function add() {\n if (!startDate) { toast.error(t('schedule.editor.selectStartDate')); return }\n const end = endDate || startDate\n if (end < startDate) { toast.error(t('schedule.editor.endDateAfterStart')); return }\n setSaving(true)\n try {\n await saveException({\n assigneeId, startDate, endDate: end, type,\n periods: type === 'unavailable' ? [] : periods,\n notes: notes || undefined,\n })\n toast.success(t('schedule.editor.exceptionAdded'))\n setShowAdd(false); setStartDate(''); setEndDate(''); setType('unavailable')\n setPeriods([{ startsAt: '09:00', endsAt: '17:00' }]); setNotes('')\n onChanged?.(); await load()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToSaveException'), { description: err?.message })\n }\n setSaving(false)\n }\n\n async function remove(from: string, to: string) {\n try {\n await deleteException(assigneeId, from, to)\n toast.success(t('schedule.editor.exceptionRemoved'))\n onChanged?.(); await load()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToDelete'), { description: err?.message })\n }\n }\n\n return (\n <TooltipProvider delayDuration={300}>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold\">{t('schedule.editor.exceptionsTitle')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('schedule.editor.exceptionsDescription')}</p>\n </div>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowAdd(true)} className=\"gap-1.5\">\n <CalendarPlus className=\"h-4 w-4\" />{t('schedule.editor.addException')}\n </Button>\n </div>\n\n <Modal open={showAdd} onOpenChange={setShowAdd}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle>{t('schedule.editor.addException')}</ModalTitle>\n <ModalDescription>{t('schedule.editor.exceptionsDescription')}</ModalDescription>\n </ModalHeader>\n <ModalBody className=\"space-y-5\">\n <div className=\"fz-fields fz-fields-2\">\n <div>\n <label className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">{t('schedule.editor.startDate')}</label>\n <DatePicker value={startDate} onChange={(v) => { setStartDate(v); if (!endDate || v > endDate) setEndDate(v) }} />\n </div>\n <div>\n <label className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">{t('schedule.editor.endDate')}</label>\n <DatePicker value={endDate || startDate} onChange={setEndDate} />\n </div>\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">{t('schedule.editor.type')}</label>\n <Tabs value={type} onValueChange={(v) => setType(v as 'unavailable' | 'available')}>\n <TabsList className=\"h-9 w-full\">\n <TabsTrigger value=\"unavailable\" className=\"flex-1 gap-1.5 text-xs\">\n <CalendarOff className=\"h-3.5 w-3.5\" />{t('schedule.editor.unavailable')}\n </TabsTrigger>\n <TabsTrigger value=\"available\" className=\"flex-1 gap-1.5 text-xs\">\n <Clock className=\"h-3.5 w-3.5\" />{t('schedule.editor.customHours')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n </div>\n\n {type === 'available' && (\n <div className=\"space-y-3\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('schedule.editor.workingHours')}</label>\n {periods.map((period, idx) => (\n <div key={idx} className=\"flex items-center gap-3\">\n <TimePicker value={period.startsAt} interval={30} className=\"flex-1\"\n onChange={(v) => setPeriods(periods.map((p, i) => (i === idx ? { ...p, startsAt: v } : p)))} />\n <span className=\"shrink-0 text-xs text-muted-foreground\">{t('schedule.editor.to')}</span>\n <TimePicker value={period.endsAt} interval={30} min={period.startsAt} className=\"flex-1\"\n onChange={(v) => setPeriods(periods.map((p, i) => (i === idx ? { ...p, endsAt: v } : p)))} />\n {periods.length > 1 && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" aria-label={t('schedule.editor.removeInterval')}\n onClick={() => setPeriods(periods.filter((_, i) => i !== idx))}\n className=\"shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-destructive/5 hover:text-destructive\">\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.removeInterval')}</TooltipContent>\n </Tooltip>\n )}\n </div>\n ))}\n <button type=\"button\" className=\"flex items-center gap-1 text-xs text-primary hover:underline\"\n onClick={() => {\n const last = periods[periods.length - 1]\n setPeriods([...periods, { startsAt: last?.endsAt ?? '13:00', endsAt: '18:00' }])\n }}>\n <Plus className=\"h-3 w-3\" /> {t('schedule.editor.addTimeBlock')}\n </button>\n </div>\n )}\n\n <div>\n <label className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">{t('schedule.editor.notes')}</label>\n <input type=\"text\" value={notes} onChange={(e) => setNotes(e.target.value)}\n placeholder={t('schedule.editor.notesPlaceholder')}\n className=\"block w-full rounded-input border border-input bg-card px-3 py-2 text-sm shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] placeholder:text-muted-foreground/40 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\" />\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={() => setShowAdd(false)}>{t('common.cancel')}</Button>\n <Button onClick={add} disabled={saving} className=\"gap-1.5\">\n <Save className=\"h-3.5 w-3.5\" />{saving ? t('common.saving') : t('schedule.editor.saveException')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {exceptions === null ? (\n <Card><CardContent className=\"space-y-2 p-4\"><Skeleton className=\"h-4 w-64\" /><Skeleton className=\"h-4 w-48\" /></CardContent></Card>\n ) : exceptions.length > 0 ? (\n <Card>\n <CardContent className=\"divide-y p-0\">\n {exceptions.map((ex) => {\n const label = ex.startDate !== ex.endDate\n ? `${formatDate(ex.startDate)} — ${formatDate(ex.endDate)}`\n : formatDate(ex.startDate)\n return (\n <div key={ex.startDate + ex.endDate} className=\"flex items-center justify-between px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className={`h-2.5 w-2.5 shrink-0 rounded-full ${ex.type === 'unavailable' ? 'bg-destructive' : 'bg-success'}`} />\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">{label}</span>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {ex.type === 'unavailable' ? t('schedule.editor.unavailable') : t('schedule.editor.customHours')}\n </Badge>\n {ex.type === 'available' && ex.periods.length > 0 && (\n <span className=\"text-xs text-muted-foreground\">\n {ex.periods.map((p) => `${p.startsAt} — ${p.endsAt}`).join(', ')}\n </span>\n )}\n </div>\n {ex.notes && <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">{ex.notes}</p>}\n </div>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={() => remove(ex.startDate, ex.endDate)}\n aria-label={t('schedule.editor.removeException')}\n className=\"ml-2 shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-destructive/5 hover:text-destructive\">\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.removeException')}</TooltipContent>\n </Tooltip>\n </div>\n )\n })}\n </CardContent>\n </Card>\n ) : (\n <Card>\n <CardContent className=\"flex items-center justify-center py-6 text-sm text-muted-foreground\">\n {t('schedule.editor.noExceptions')}\n </CardContent>\n </Card>\n )}\n </div>\n </TooltipProvider>\n )\n}\n","// ---------------------------------------------------------------------------\n// Person calendar visibility (public.people.is_bookable)\n// ---------------------------------------------------------------------------\n//\n// The agenda already filters its resource columns by this flag, but until now\n// no screen could set it: a person entered by hand is born `true` and shows up\n// as a column in the week grid, with free hours anyone can book on top of.\n// The accountant and the manager are staff too — they work here, they just do\n// not attend clients.\n\nimport { getFayzSupabaseClient as getCoreClient } from '../data/client'\n\n/** Postgres: column does not exist. */\nconst UNDEFINED_COLUMN = '42703'\n\n/**\n * Reads the flag. Answers `null` on a pool that never got the column, so the\n * caller hides the switch instead of showing one that cannot be saved.\n */\nexport async function getPersonBookable(personId: string): Promise<boolean | null> {\n const core = getCoreClient()\n const { data, error } = await core\n .from('people')\n .select('is_bookable')\n .eq('id', personId)\n .maybeSingle()\n\n if (error) {\n if ((error as { code?: string }).code === UNDEFINED_COLUMN) return null\n throw error\n }\n return (data as { is_bookable?: boolean } | null)?.is_bookable ?? null\n}\n\nexport async function setPersonBookable(personId: string, isBookable: boolean): Promise<void> {\n const core = getCoreClient()\n const { error } = await core\n .from('people')\n .update({ is_bookable: isBookable })\n .eq('id', personId)\n if (error) throw error\n}\n","import React from 'react'\nimport { CalendarCheck, CalendarOff } from 'lucide-react'\nimport { Card, CardContent, Skeleton, Switch, toast } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getPersonBookable, setPersonBookable } from '../../lib/bookable-service'\n\n/**\n * Whether this person is a calendar resource.\n *\n * Lives above the working-hours grid because the two answer different\n * questions: the grid says WHEN this person works, this switch says whether\n * clients are booked onto her at all. An accountant has hours and no agenda.\n */\nexport function BookableToggle({ personId }: { personId: string }) {\n const t = useTranslation()\n const [value, setValue] = React.useState<boolean | null>(null)\n const [loading, setLoading] = React.useState(true)\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n let cancelled = false\n setLoading(true)\n getPersonBookable(personId)\n .then((v) => { if (!cancelled) setValue(v) })\n .catch(() => { if (!cancelled) setValue(null) })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [personId])\n\n async function toggle(next: boolean) {\n const previous = value\n setValue(next) // optimistic: an interruptor that waits for the round trip reads as broken\n setSaving(true)\n try {\n await setPersonBookable(personId, next)\n toast.success(next ? t('crud.archetype.bookable.on') : t('crud.archetype.bookable.off'))\n } catch {\n setValue(previous)\n toast.error(t('crud.archetype.bookable.saveFailed'))\n } finally {\n setSaving(false)\n }\n }\n\n if (loading) return <Skeleton className=\"h-16 w-full\" />\n // A pool without the column has nothing to switch — hiding beats a control\n // that silently fails to save.\n if (value === null) return null\n\n const Icon = value ? CalendarCheck : CalendarOff\n\n return (\n <Card>\n <CardContent className=\"flex items-center justify-between gap-4 py-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">{t('crud.archetype.bookable.title')}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5 max-w-md\">\n {value\n ? t('crud.archetype.bookable.descriptionOn')\n : t('crud.archetype.bookable.descriptionOff')}\n </p>\n </div>\n </div>\n <Switch size=\"md\" checked={value} onCheckedChange={toggle} disabled={saving} />\n </CardContent>\n </Card>\n )\n}\n","import React, { useState } from 'react'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ScheduleGridPanel } from './ScheduleGridPanel'\nimport { ScheduleDateExceptions } from './ScheduleDateExceptions'\nimport { BookableToggle } from './BookableToggle'\n\n// ---------------------------------------------------------------------------\n// CONFIGURAR HORÁRIOS DE ATENDIMENTO\n//\n// A tela mais A MONTANTE do sistema: quase tudo depende dela e ela depende de\n// quase nada. E é a causa nº 1 de todo chamado de suporte — \"abri a agenda e\n// não aparece nada\" quase nunca é agenda sem cliente, é agenda sem grade.\n//\n// Duas abas, como no V1:\n//\n// Grade padrão a semana que vale por padrão, com vigência\n// Grades de exceção a semana que SUBSTITUI a padrão durante um período,\n// e só nos dias configurados — atendimento em outra\n// unidade, mutirão, cobertura de colega\n//\n// Ao pé da segunda, as ausências por data, que são outra coisa ainda e estão\n// documentadas lá.\n//\n// ── Uma superfície só, em todas as portas ──────────────────────────────────\n//\n// Esta tela é aberta de três lugares: o botão \"Horários\" da agenda, a aba\n// Agenda da ficha da pessoa e a escala do RH. Eram três portas para o mesmo\n// quarto, e por um tempo só a ficha mostrava o \"Aparece na agenda\" — de modo\n// que quem abria pela agenda, justamente porque uma coluna sumiu, via metade\n// da resposta. Uma coluna some por DOIS motivos, e os dois moram aqui:\n//\n// não aparece na agenda a pessoa não recebe cliente (o interruptor)\n// não tem grade vigente a pessoa recebe, mas não disse quando\n//\n// O que muda entre as portas é só QUEM é o assunto: na agenda a pessoa ainda\n// precisa ser escolhida (o diálogo põe a coluna de nomes ao lado), na ficha\n// ela já é o assunto. O miolo é este arquivo, e é um só.\n//\n// O editor não conhece sala: `plg_agenda_resources` é tabela de plugin, e o\n// admin não pode importar plugin. Quem preenche a lista é o plugin da agenda,\n// pelo `ScheduleBlockConfig` (ver lib/schedule-config).\n// ---------------------------------------------------------------------------\n\ninterface ScheduleEditorProps {\n assigneeId: string\n /** Chamado depois de qualquer gravação — a agenda relê a grade. */\n onSaved?: () => void\n /**\n * Esconde o \"Aparece na agenda\". Só para quem JÁ mostra esse interruptor\n * logo acima — do contrário a resposta some de uma das portas.\n */\n hideBookable?: boolean\n}\n\nexport function ScheduleEditor({ assigneeId, onSaved, hideBookable }: ScheduleEditorProps) {\n const t = useTranslation()\n const [tab, setTab] = useState<'standard' | 'exception'>('standard')\n\n return (\n <div className=\"space-y-4\">\n {!hideBookable && <BookableToggle personId={assigneeId} />}\n <Tabs value={tab} onValueChange={(v) => setTab(v as 'standard' | 'exception')} className=\"space-y-4\">\n <TabsList>\n <TabsTrigger value=\"standard\">{t('schedule.grid.standardTab')}</TabsTrigger>\n <TabsTrigger value=\"exception\">{t('schedule.grid.exceptionTab')}</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"standard\">\n <ScheduleGridPanel assigneeId={assigneeId} kind=\"standard\" onSaved={onSaved} />\n </TabsContent>\n\n <TabsContent value=\"exception\" className=\"space-y-6\">\n {/* A regra vai escrita: a exceção é PARCIAL por dia, não um bloco que\n apaga a semana. Sem esta frase ninguém adivinha isso. */}\n <p className=\"text-xs text-muted-foreground\">{t('schedule.grid.exceptionHint')}</p>\n <ScheduleGridPanel assigneeId={assigneeId} kind=\"exception\" onSaved={onSaved} />\n <div className=\"border-t pt-6\">\n <ScheduleDateExceptions assigneeId={assigneeId} onChanged={onSaved} />\n </div>\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n"]}
|
|
@@ -277,6 +277,11 @@ function OrgProvider({
|
|
|
277
277
|
if (memberships.length === 0 && accepted > 0) {
|
|
278
278
|
memberships = await adapterRef.current.listUserOrgs(user.id);
|
|
279
279
|
}
|
|
280
|
+
for (let attempt = 0; memberships.length === 0 && attempt < 2; attempt++) {
|
|
281
|
+
await new Promise((resolve) => setTimeout(resolve, 250 * (attempt + 1)));
|
|
282
|
+
if (cancelled) return;
|
|
283
|
+
memberships = await adapterRef.current.listUserOrgs(user.id);
|
|
284
|
+
}
|
|
280
285
|
if (cancelled) return;
|
|
281
286
|
setUserOrgs(memberships);
|
|
282
287
|
setOrgsReadFor(user.id);
|
|
@@ -366,5 +371,5 @@ function OrgProvider({
|
|
|
366
371
|
}
|
|
367
372
|
|
|
368
373
|
export { ORG_CACHE_TTL_MS, OrgProvider, clearOrgSnapshot, decideWorkspaceChoice, getAutoPick, markWorkspaceSwitch, readOrgSnapshot, setAutoPick, takeWorkspaceSwitch, useOrgAdapter, useOrgAdapterOptional, useTenant, useTenantOptional };
|
|
369
|
-
//# sourceMappingURL=chunk-
|
|
370
|
-
//# sourceMappingURL=chunk-
|
|
374
|
+
//# sourceMappingURL=chunk-KSUIF56I.js.map
|
|
375
|
+
//# sourceMappingURL=chunk-KSUIF56I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/org/choice.ts","../src/org/cache.ts","../src/org/context.tsx"],"names":[],"mappings":"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","file":"chunk-KSUIF56I.js","sourcesContent":["import type { OrgMembership } from '@fayz-ai/core'\n\n/**\n * Which workspace this account lands in, when it belongs to more than one.\n *\n * The provider used to answer this by itself — `handoff ?? pinned ?? first` —\n * and that last fallback is a guess with no way to correct it: an account in\n * seven workspaces opened whichever one sorted first and never learnt that the\n * other six existed. The rule below keeps every branch that IS an answer and\n * hands the remaining case to the person, once.\n */\n\nconst AUTOPICK_KEY = 'fayz:workspace-autopick'\n\n/**\n * The workspace a switch already committed to, surviving exactly one reload.\n *\n * Changing workspace ends in a full page reload — the only way to guarantee\n * that every plugin store, cache and open screen is rebuilt against the new\n * tenant instead of showing the previous one's rows. That reload comes back\n * through the same boot path as a fresh login, so without this marker the\n * picker would open and ask a question the user answered one second ago.\n *\n * sessionStorage, not local: it is about THIS navigation, and a tab opened\n * tomorrow should ask again.\n */\nconst SWITCHING_KEY = 'fayz:workspace-switching'\n\n/** Records the destination, for the boot that happens after the reload. */\nexport function markWorkspaceSwitch(orgId: string): void {\n try {\n if (typeof sessionStorage === 'undefined') return\n sessionStorage.setItem(SWITCHING_KEY, orgId)\n } catch {\n // ignore\n }\n}\n\n/** Reads the destination and consumes it — it is good for one boot only. */\nexport function takeWorkspaceSwitch(): string | null {\n try {\n if (typeof sessionStorage === 'undefined') return null\n const v = sessionStorage.getItem(SWITCHING_KEY)\n if (v) sessionStorage.removeItem(SWITCHING_KEY)\n return v\n } catch {\n return null\n }\n}\n\n/** Whether the last explicit choice stands in for every future login. */\nexport function getAutoPick(): boolean {\n try {\n if (typeof localStorage === 'undefined') return false\n return localStorage.getItem(AUTOPICK_KEY) === '1'\n } catch {\n return false\n }\n}\n\nexport function setAutoPick(on: boolean): void {\n try {\n if (typeof localStorage === 'undefined') return\n if (on) localStorage.setItem(AUTOPICK_KEY, '1')\n else localStorage.removeItem(AUTOPICK_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface WorkspaceChoiceInput {\n /** Every workspace this account belongs to, as the membership list read it. */\n memberships: OrgMembership[]\n /** A switch that is completing across a reload — already answered, once. */\n switchingToId?: string | null\n /** A sibling app's switcher named a workspace on the way in (008). */\n handoffId: string | null\n /** `fayz:current-org` — the last workspace this browser was in. */\n pinnedId: string | null\n /** \"Não perguntar novamente\" is on for this browser. */\n autoPick: boolean\n}\n\nexport type WorkspaceChoice =\n /** Open this one without asking. */\n | { kind: 'resolved'; orgId: string }\n /** Put the picker on screen; `suggestedId` is the row to pre-select. */\n | { kind: 'ask'; suggestedId: string | null }\n /** No workspace at all — the first-run setup flow's business, not ours. */\n | { kind: 'none' }\n\n/**\n * The decision, as a function, so the one piece of logic that decides what a\n * multi-workspace account sees after login can be tested without a browser.\n */\nexport function decideWorkspaceChoice({\n memberships,\n switchingToId = null,\n handoffId,\n pinnedId,\n autoPick,\n}: WorkspaceChoiceInput): WorkspaceChoice {\n if (memberships.length === 0) return { kind: 'none' }\n\n const has = (id: string | null): string | null =>\n id && memberships.some((m) => m.orgId === id) ? id : null\n\n // The freshest answer there is: this reload IS the switch completing.\n const switching = has(switchingToId)\n if (switching) return { kind: 'resolved', orgId: switching }\n\n // A handoff is somebody clicking a specific account in a sibling app's\n // switcher one second ago. That is a fresher answer than anything stored\n // here, and asking again would be asking a question already answered.\n const handoff = has(handoffId)\n if (handoff) return { kind: 'resolved', orgId: handoff }\n\n // One workspace is not a choice.\n if (memberships.length === 1) return { kind: 'resolved', orgId: memberships[0]!.orgId }\n\n // The pin is a HINT, always re-validated against the list we just read: a\n // workspace someone was removed from falls through to the question instead of\n // opening an account they can no longer see.\n const pinned = has(pinnedId)\n if (pinned && autoPick) return { kind: 'resolved', orgId: pinned }\n\n return { kind: 'ask', suggestedId: pinned }\n}\n","import type { Organization, OrgMember, OrgMembership, PermissionProfile } from '@fayz-ai/core'\n\n/**\n * Snapshot of the org bootstrap (org + memberships + members + permission\n * profiles) so a page reload doesn't wait on the whole chain again.\n *\n * Every mount used to pay `acceptPendingInvites → listUserOrgs → getOrg →\n * listMembers + listProfiles` before `org.id` existed, and every screen keyed\n * off the tenant (Conectores, plugin tabs, permission gates) sat idle until\n * then. The snapshot paints that state synchronously and the network is only\n * touched again once it goes stale.\n */\n\nconst STORAGE_KEY = 'fayz:org-snapshot'\nconst VERSION = 1\n\n/** Served without touching the network. */\nexport const ORG_CACHE_TTL_MS = 5 * 60 * 1000\n/** Older than this and the snapshot is dropped instead of painted. */\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000\n/** Bigger than this (huge member lists) and we skip persisting rather than blow the quota. */\nconst MAX_BYTES = 512 * 1024\n\nexport interface OrgSnapshot {\n version: number\n /** Who the snapshot belongs to — a different user gets a cold load. */\n userId: string\n /** When the data last came from the server (store patches don't move it). */\n savedAt: number\n org: Organization\n userOrgs: OrgMembership[]\n members: OrgMember[]\n profiles: PermissionProfile[]\n currentProfileId: string | null\n}\n\nexport type OrgSnapshotInput = Omit<OrgSnapshot, 'version' | 'savedAt'>\n\nfunction storage(): Storage | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage\n } catch {\n return null\n }\n}\n\nexport function readOrgSnapshot(): OrgSnapshot | null {\n const store = storage()\n if (!store) return null\n try {\n const raw = store.getItem(STORAGE_KEY)\n if (!raw) return null\n const snapshot = JSON.parse(raw) as OrgSnapshot\n if (snapshot?.version !== VERSION || !snapshot.org?.id || !snapshot.userId) return null\n if (snapshotAge(snapshot) > MAX_AGE_MS) {\n store.removeItem(STORAGE_KEY)\n return null\n }\n return snapshot\n } catch {\n return null\n }\n}\n\nexport function snapshotAge(snapshot: OrgSnapshot): number {\n const age = Date.now() - snapshot.savedAt\n // A clock that moved backwards shouldn't hand out an eternally fresh cache.\n return age < 0 ? Number.POSITIVE_INFINITY : age\n}\n\nexport function isSnapshotFresh(snapshot: OrgSnapshot, ttlMs: number): boolean {\n return snapshotAge(snapshot) < ttlMs\n}\n\n/** Record a fresh server read — restarts the TTL window. */\nexport function saveOrgSnapshot(input: OrgSnapshotInput): void {\n write({ ...input, version: VERSION, savedAt: Date.now() })\n}\n\n/**\n * Keep the snapshot in step with store writes made outside the provider\n * (renaming the org in Settings, editing a role) WITHOUT restarting the TTL —\n * otherwise a UI-only change would push the next revalidation out forever.\n */\nexport function patchOrgSnapshot(input: OrgSnapshotInput): void {\n const current = readOrgSnapshot()\n if (!current || current.userId !== input.userId) return\n write({ ...input, version: VERSION, savedAt: current.savedAt })\n}\n\nexport function clearOrgSnapshot(): void {\n try {\n storage()?.removeItem(STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nfunction write(snapshot: OrgSnapshot): void {\n const store = storage()\n if (!store) return\n try {\n const raw = JSON.stringify(snapshot)\n if (raw.length > MAX_BYTES) return\n store.setItem(STORAGE_KEY, raw)\n } catch {\n // Quota or serialization failure — the cache is an optimization, not state.\n }\n}\n","import * as React from 'react'\nimport { errorMessage, type OrgAdapter, type Organization, type OrgMembership } from '@fayz-ai/core'\nimport { useAuthStore, readAppHandoff } from '@fayz-ai/auth'\nimport { useOrganizationStore, getPersistedOrgId } from './store'\nimport { decideWorkspaceChoice, getAutoPick, takeWorkspaceSwitch } from './choice'\nimport { usePermissionsStore } from '../permissions'\nimport {\n ORG_CACHE_TTL_MS,\n clearOrgSnapshot,\n isSnapshotFresh,\n patchOrgSnapshot,\n readOrgSnapshot,\n saveOrgSnapshot,\n type OrgSnapshot,\n} from './cache'\n\n// ---------------------------------------------------------------------------\n// Adapter context\n// ---------------------------------------------------------------------------\n\nconst OrgAdapterContext = React.createContext<OrgAdapter | null>(null)\n\nexport function useOrgAdapter(): OrgAdapter {\n const adapter = React.useContext(OrgAdapterContext)\n if (!adapter) {\n throw new Error('useOrgAdapter must be used within an <OrgProvider>')\n }\n return adapter\n}\n\nexport function useOrgAdapterOptional(): OrgAdapter | null {\n return React.useContext(OrgAdapterContext)\n}\n\n// ---------------------------------------------------------------------------\n// Tenant / org hook\n// ---------------------------------------------------------------------------\n\nexport interface TenantContext {\n /** The currently active organization */\n org: Organization | null\n /** All orgs the current user belongs to */\n userOrgs: OrgMembership[]\n loading: boolean\n /**\n * The bootstrap has finished at least once, so `org === null` now MEANS\n * \"belongs to no workspace\" instead of \"we have not looked yet\".\n *\n * `loading` cannot answer that: it starts `false`, before the effect that\n * loads anything has run. Anything deciding what to render from an empty org\n * — the setup gate — reads this, or it decides during the gap and flips its\n * mind a frame later.\n */\n settled: boolean\n /**\n * The membership list was actually READ for this account, and answered.\n *\n * Distinct from `settled`, which only says the wait is over — it is set in a\n * `finally`, so a failed `listUserOrgs` settles too. Anything that treats\n * \"no orgs\" as a FACT (the first-run setup gate) has to ask this instead.\n */\n orgsKnown: boolean\n /**\n * A leitura das contas FALHOU — e falhou é diferente de \"não tem nenhuma\".\n *\n * `orgsKnown: false` já dizia \"não sabemos\", mas dizia isso também no\n * instante antes de saber, então ninguém podia agir nele. Sem esta mensagem\n * um erro de rede chegava na tela como um sistema de uma linha só e um\n * seletor oferecendo \"criar área de trabalho\" — a resposta errada,\n * apresentada com a mesma cara da certa.\n */\n loadError: string | null\n /** Tenta ler as contas de novo, depois de uma falha. */\n retryOrgs: () => void\n /** Switch the active org */\n switchOrg: (orgId: string) => Promise<void>\n /** Refresh the current org from the adapter */\n refreshOrg: () => Promise<void>\n}\n\nconst TenantContext = React.createContext<TenantContext | null>(null)\n\n/**\n * Access the current tenant / organization.\n * Must be used inside <OrgProvider>.\n */\nexport function useTenant(): TenantContext {\n const ctx = React.useContext(TenantContext)\n if (!ctx) {\n throw new Error('useTenant must be used inside <OrgProvider>')\n }\n return ctx\n}\n\nexport function useTenantOptional(): TenantContext | null {\n return React.useContext(TenantContext)\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface OrgProviderProps {\n adapter: OrgAdapter\n /** When true, automatically creates an org if the user has none */\n autoCreate?: boolean\n /**\n * How long the cached org bootstrap is served before the provider goes back\n * to the network (default 5 min). A cached load paints synchronously, so\n * screens that key off `org.id` don't wait a round trip on every reload.\n * `0` disables the cache and restores the always-fetch behaviour.\n */\n cacheTtlMs?: number\n children: React.ReactNode\n}\n\nconst useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nexport function OrgProvider({\n adapter,\n autoCreate = false,\n cacheTtlMs = ORG_CACHE_TTL_MS,\n children,\n}: OrgProviderProps) {\n const { user, isLoading: authLoading } = useAuthStore()\n const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } =\n useOrganizationStore()\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n const setProfileKnownFor = usePermissionsStore((s) => s.setProfileKnownFor)\n\n const adapterRef = React.useRef(adapter)\n adapterRef.current = adapter\n\n const [snapshot] = React.useState<OrgSnapshot | null>(() =>\n cacheTtlMs > 0 ? readOrgSnapshot() : null,\n )\n // One load per signed-in user per mount — auth reports `isLoading` and `user`\n // in two separate store writes, so the effect would otherwise fire twice.\n const loadedForRef = React.useRef<string | null>(null)\n\n // WHOSE bootstrap has finished, not whether one has. A boolean could not tell\n // the difference between \"we know this account has no workspace\" and \"we knew\n // that about the account that just signed out\" — which is what flashed the\n // setup flow over every login: sign-out settled it, and sign-in kept the\n // stale `true` for the whole round trip.\n //\n // A painted snapshot is already an answer for its own user: that account HAS a\n // workspace, and revalidation will not turn that into \"has none\".\n const [settledFor, setSettledFor] = React.useState<string | null>(() =>\n snapshot?.org ? snapshot.userId : null,\n )\n // Same shape, different question: WHOSE membership list came back. Seeded\n // from a painted snapshot for the same reason — that account's list was read\n // once and cached, and revalidation cannot turn \"has one\" into \"has none\".\n const [orgsReadFor, setOrgsReadFor] = React.useState<string | null>(() =>\n snapshot?.org ? snapshot.userId : null,\n )\n // Signed out there is nothing to wait for; signed in, only this user's answer counts.\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [retryTick, setRetryTick] = React.useState(0)\n const retryOrgs = React.useCallback(() => {\n // `loadedForRef` é o que impede a releitura; zerá-lo é o que faz o efeito\n // abaixo rodar de novo para o mesmo usuário.\n loadedForRef.current = null\n setLoadError(null)\n setRetryTick((n) => n + 1)\n }, [])\n\n const settled = user ? settledFor === user.id : !authLoading\n const orgsKnown = !!user && orgsReadFor === user.id\n\n // Paint the last known org before the first child renders. The stores are\n // filled in a layout effect, so nothing gets a frame with `org === null`.\n useIsomorphicLayoutEffect(() => {\n if (!snapshot) return\n setUserOrgs(snapshot.userOrgs)\n setCurrentOrg(snapshot.org)\n setMembers(snapshot.members)\n setProfiles(snapshot.profiles)\n setCurrentProfile(snapshot.profiles.find((p) => p.id === snapshot.currentProfileId) ?? null)\n // O snapshot É uma resposta: quem entra por ele já sabe quem é.\n setProfileKnownFor(snapshot.org.id)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Keep the snapshot in step with store writes made outside this provider —\n // renaming the org in Settings, editing a role — so the cache never serves a\n // value the user already changed on screen. Patching leaves `savedAt` alone:\n // a UI-only edit must not push the next revalidation further out.\n React.useEffect(() => {\n if (cacheTtlMs <= 0 || !user) return\n const uid = user.id\n const sync = () => {\n const org = useOrganizationStore.getState()\n if (!org.currentOrg) return\n const perms = usePermissionsStore.getState()\n patchOrgSnapshot({\n userId: uid,\n org: org.currentOrg,\n userOrgs: org.userOrgs,\n members: org.members,\n profiles: perms.profiles,\n // realProfile, not currentProfile: an impersonation preview is not\n // something to cache back as the user's own role.\n currentProfileId: perms.realProfile?.id ?? null,\n })\n }\n const unsubscribeOrg = useOrganizationStore.subscribe(sync)\n const unsubscribePerms = usePermissionsStore.subscribe(sync)\n return () => {\n unsubscribeOrg()\n unsubscribePerms()\n }\n }, [user?.id, cacheTtlMs])\n\n // Load the org's members + permission profiles into the shared stores whenever\n // an org resolves. This is what makes the role list, the invite dialog's role\n // dropdown, and permission checks work — previously nothing loaded them here,\n // so those surfaces came up empty. Also resolves the signed-in user's own role.\n const hydrateOrg = React.useCallback(\n async (org: Organization, memberships: OrgMembership[], uid: string | undefined) => {\n try {\n const [members, profiles] = await Promise.all([\n adapterRef.current.listMembers(org.id),\n adapterRef.current.listProfiles(org.id),\n ])\n setMembers(members)\n setProfiles(profiles)\n const myMembership = uid ? members.find((m) => m.userId === uid) : undefined\n const profile = profiles.find((p) => p.id === myMembership?.profileId) ?? null\n setCurrentProfile(profile)\n // Everything the next reload needs, stamped now — this is the only\n // place the TTL window restarts.\n if (cacheTtlMs > 0 && uid) {\n saveOrgSnapshot({\n userId: uid,\n org,\n userOrgs: memberships,\n members,\n profiles,\n currentProfileId: profile?.id ?? null,\n })\n }\n } catch {\n // Non-fatal — leave stores as-is if the load fails.\n } finally {\n // Respondida é respondida, mesmo que a resposta seja \"nenhum papel\" ou\n // que a leitura tenha falhado. Segurar a tela para sempre esperando uma\n // resposta que não vem é pior que mostrar o que se sabe.\n setProfileKnownFor(org.id)\n }\n },\n [setMembers, setProfiles, setCurrentProfile, setProfileKnownFor, cacheTtlMs],\n )\n\n // Load orgs when user is authenticated\n React.useEffect(() => {\n if (!user) {\n // A cold load reports `user === null` while the session hydrates — that's\n // not a sign-out, so the painted snapshot stands until auth settles.\n if (authLoading) return\n loadedForRef.current = null\n reset()\n clearOrgSnapshot()\n setSettledFor(null)\n setOrgsReadFor(null)\n return\n }\n\n const cached = snapshot?.userId === user.id ? snapshot : null\n\n // Already painted and still inside its window: skip the whole bootstrap.\n if (cached && isSnapshotFresh(cached, cacheTtlMs)) {\n setSettledFor(user.id)\n setOrgsReadFor(user.id)\n return\n }\n\n // A snapshot from another account was painted — drop it before loading.\n if (snapshot && snapshot.userId !== user.id && loadedForRef.current === null) {\n reset()\n clearOrgSnapshot()\n }\n\n if (loadedForRef.current === user.id) return\n loadedForRef.current = user.id\n\n // Stale but painted: revalidate quietly, so screens keep the data they're\n // showing instead of flipping back to a skeleton.\n const silent = !!cached\n\n let cancelled = false\n\n async function loadOrgs() {\n if (!silent) setLoading(true)\n try {\n // Redeem invites first — an invitee has no membership until this runs,\n // and without it autoCreate below would hand them a personal org\n // instead of the one that invited them.\n let accepted = 0\n try {\n accepted = (await adapterRef.current.acceptPendingInvites?.()) ?? 0\n } catch {\n // Non-fatal: fall through and load whatever memberships exist.\n }\n\n if (cancelled) return\n\n let memberships = await adapterRef.current.listUserOrgs(user!.id)\n\n // An empty list right after accepting means the read was deduped onto a\n // request that started before the invite landed. Ask once more.\n if (memberships.length === 0 && accepted > 0) {\n memberships = await adapterRef.current.listUserOrgs(user!.id)\n }\n\n // UMA LISTA VAZIA É A ÚNICA RESPOSTA QUE MERECE DÚVIDA.\n //\n // Ela é a que decide se esta conta entra no aplicativo ou no fluxo de\n // criação de área de trabalho — e é também a única que a infraestrutura\n // consegue produzir por engano. A leitura passa por RLS: sem a sessão\n // ainda aplicada, a política simplesmente não casa com nenhuma linha e\n // a resposta é `200 []`, indistinguível de \"esta conta não tem nenhuma\".\n // Logo depois do login essa janela existe, e o sintoma é exatamente o\n // relatado: o assistente de criação aparece sozinho e some no refresh.\n //\n // Perguntar de novo é o único jeito de separar as duas. Custa duas\n // requisições e menos de um segundo, e só para quem de fato não tem\n // workspace nenhum — que é uma vez na vida da conta. O erro na outra\n // direção custa o aplicativo inteiro coberto por um fluxo do qual não\n // se sai.\n for (let attempt = 0; memberships.length === 0 && attempt < 2; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, 250 * (attempt + 1)))\n if (cancelled) return\n memberships = await adapterRef.current.listUserOrgs(user!.id)\n }\n\n if (cancelled) return\n\n setUserOrgs(memberships)\n // The read answered. Everything after this can still fail without\n // turning \"this account has no workspace\" into a guess.\n setOrgsReadFor(user!.id)\n\n // Auto-create org if user has none\n if (memberships.length === 0 && accepted === 0 && autoCreate) {\n const newOrg = await adapterRef.current.createOrg(\n user!.fullName ? `${user!.fullName}'s Organization` : 'My Organization',\n user!.id,\n )\n if (!cancelled) {\n const ownMembership: OrgMembership[] = [\n {\n orgId: newOrg.id,\n orgName: newOrg.name,\n orgSlug: newOrg.slug,\n profileId: 'owner',\n profileName: 'Owner',\n },\n ]\n setUserOrgs(ownMembership)\n setCurrentOrg(newOrg)\n await hydrateOrg(newOrg, ownMembership, user!.id)\n }\n return\n }\n\n // Which workspace to open — or whether to open one at all. The ladder\n // lives in `decideWorkspaceChoice`; the only branch that changed shape\n // here is the last one. It used to be `?? memberships[0]`, which turned\n // \"we do not know which of your seven accounts you meant\" into a silent\n // guess the user could not see, let alone correct.\n const choice = decideWorkspaceChoice({\n memberships,\n // Consumed here, and only here: this is the one boot the marker was\n // written for, and leaving it behind would pin the next one too.\n switchingToId: takeWorkspaceSwitch(),\n handoffId: readAppHandoff()?.tenantId ?? null,\n pinnedId: getPersistedOrgId(),\n autoPick: getAutoPick(),\n })\n\n // Leaving `currentOrg` null IS the ask: the chooser gate reads exactly\n // this state — a membership list we have read, more than one row in it,\n // and no active workspace — so no extra flag has to be kept in sync.\n if (choice.kind !== 'resolved') return\n\n if (!cancelled) {\n const org = await adapterRef.current.getOrg(choice.orgId)\n if (!cancelled) {\n setCurrentOrg(org)\n await hydrateOrg(org, memberships, user!.id)\n }\n }\n } catch (err) {\n // Engolir aqui era o defeito: a lista ficava vazia, `orgsKnown` ficava\n // falso, e a tela não tinha como distinguir isso de uma conta nova.\n if (!cancelled) setLoadError(errorMessage(err))\n } finally {\n if (!cancelled && !silent) setLoading(false)\n // Settled even when the load threw: the answer is then \"we asked and\n // could not tell\", and holding the screen forever is worse than showing\n // the app. It is about the wait being over, not about success.\n if (!cancelled) setSettledFor(user!.id)\n }\n }\n\n void loadOrgs()\n\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.id, authLoading, retryTick])\n\n async function switchOrg(orgId: string): Promise<void> {\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(orgId)\n setCurrentOrg(org)\n await hydrateOrg(org, useOrganizationStore.getState().userOrgs, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n // Explicit refresh always goes to the network and restarts the cache window.\n async function refreshOrg(): Promise<void> {\n if (!currentOrg) return\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(currentOrg.id)\n setCurrentOrg(org)\n await hydrateOrg(org, useOrganizationStore.getState().userOrgs, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n const tenantValue: TenantContext = {\n org: currentOrg,\n userOrgs,\n loading,\n settled,\n orgsKnown,\n loadError,\n retryOrgs,\n switchOrg,\n refreshOrg,\n }\n\n return (\n <OrgAdapterContext.Provider value={adapter}>\n <TenantContext.Provider value={tenantValue}>\n {children}\n </TenantContext.Provider>\n </OrgAdapterContext.Provider>\n )\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useTranslation } from './chunk-YUHCC7JY.js';
|
|
2
2
|
import { useBillingStore, useTrial, effectivePlan, resolvePlanBadge } from './chunk-ZOUIXHKI.js';
|
|
3
|
-
import { useTenantOptional, useOrgAdapterOptional } from './chunk-
|
|
3
|
+
import { useTenantOptional, useOrgAdapterOptional } from './chunk-KSUIF56I.js';
|
|
4
4
|
import { usePermissionsStore } from './chunk-UQ2NTFQC.js';
|
|
5
5
|
import { cn, useOrganizationStore } from './chunk-W5IBKM3K.js';
|
|
6
6
|
import * as React from 'react';
|
|
@@ -527,5 +527,5 @@ function SubscriptionPage({ className }) {
|
|
|
527
527
|
}
|
|
528
528
|
|
|
529
529
|
export { AccessProvider, CORE_LIMIT_DECLARATIONS, PlanFeatureItem, SubscriptionPage, checkAccess, entityDerivedLimitDeclarations, featureDisplayName, getAccessSnapshot, getPlanEntitlements, guardLimit, invalidateLimit, resolvePlanCurrency, useAccess, useAccessOptional, useLimit, useLimitGuard, useModuleNavAccess, useUpgradeModalStore };
|
|
530
|
-
//# sourceMappingURL=chunk-
|
|
531
|
-
//# sourceMappingURL=chunk-
|
|
530
|
+
//# sourceMappingURL=chunk-U6LV4GIH.js.map
|
|
531
|
+
//# sourceMappingURL=chunk-U6LV4GIH.js.map
|