@fayz-ai/admin 0.30.2 → 0.31.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-YE42HL7P.js +7 -0
- package/dist/{ScheduleEditor-QC6OYBUE.js.map → ScheduleEditor-YE42HL7P.js.map} +1 -1
- package/dist/{chunk-3SREEFHN.js → chunk-XDYY5PLH.js} +24 -3
- package/dist/chunk-XDYY5PLH.js.map +1 -0
- package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
- package/dist/crud/CrudListView.d.ts.map +1 -1
- package/dist/crud/archetype-lookup.d.ts +4 -0
- package/dist/crud/archetype-lookup.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderFormView.d.ts +9 -2
- package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
- package/dist/crud/useLookupCreate.d.ts +3 -0
- package/dist/crud/useLookupCreate.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1004 -908
- package/dist/index.js.map +1 -1
- package/dist/types/plugins.d.ts +2 -0
- package/dist/types/plugins.d.ts.map +1 -1
- package/dist/units/index.d.ts +2 -0
- package/dist/units/index.d.ts.map +1 -1
- package/dist/units/useUnitFilter.d.ts +46 -0
- package/dist/units/useUnitFilter.d.ts.map +1 -0
- package/package.json +5 -5
- package/dist/ScheduleEditor-QC6OYBUE.js +0 -7
- package/dist/chunk-3SREEFHN.js.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ScheduleEditor } from './chunk-XDYY5PLH.js';
|
|
2
|
+
import './chunk-ZUM3Y7VB.js';
|
|
3
|
+
import './chunk-KSUIF56I.js';
|
|
4
|
+
import './chunk-UQ2NTFQC.js';
|
|
5
|
+
import './chunk-W5IBKM3K.js';
|
|
6
|
+
//# sourceMappingURL=ScheduleEditor-YE42HL7P.js.map
|
|
7
|
+
//# sourceMappingURL=ScheduleEditor-YE42HL7P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ScheduleEditor-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ScheduleEditor-YE42HL7P.js"}
|
|
@@ -2,7 +2,7 @@ import { getFayzSupabaseClient } from './chunk-ZUM3Y7VB.js';
|
|
|
2
2
|
import { useOrganizationStore } from './chunk-W5IBKM3K.js';
|
|
3
3
|
import React4, { useState, useCallback, useEffect, useSyncExternalStore, useRef } from 'react';
|
|
4
4
|
import { toast, Skeleton, Button, TooltipProvider, Badge, DatePicker, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Input, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, ModalFooter, Tabs, TabsList, TabsTrigger, TimePicker, Tooltip, TooltipTrigger, TooltipContent, Card, CardContent, TabsContent, Switch } from '@fayz-ai/ui';
|
|
5
|
-
import { getSupabaseClientOptional,
|
|
5
|
+
import { getSupabaseClientOptional, globalCache, stableKey, useTranslation, todayLocal, localDateKey } from '@fayz-ai/core';
|
|
6
6
|
import { Plus, Copy, Users, CalendarOff, Trash2, Check, CalendarPlus, Clock, Save, Settings, CalendarCheck, X, ChevronDown } from 'lucide-react';
|
|
7
7
|
import { createPortal } from 'react-dom';
|
|
8
8
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -487,6 +487,27 @@ function createArchetypeLookup(config) {
|
|
|
487
487
|
if (error) throw new Error(error.message);
|
|
488
488
|
return toResult(data, display, config.kindLabels, kinds);
|
|
489
489
|
},
|
|
490
|
+
async load(id) {
|
|
491
|
+
const supabase = getSupabaseClientOptional();
|
|
492
|
+
if (!supabase) return null;
|
|
493
|
+
const { data } = await supabase.from(display.table).select("*").eq("id", id).maybeSingle();
|
|
494
|
+
return data ?? null;
|
|
495
|
+
},
|
|
496
|
+
// Only the form's own fields are written: the row carries columns (tenant,
|
|
497
|
+
// flags, timestamps) the form never showed and must not overwrite.
|
|
498
|
+
async update(id, patch) {
|
|
499
|
+
const supabase = getSupabaseClientOptional();
|
|
500
|
+
if (!supabase) throw new Error("No database connection");
|
|
501
|
+
const editable = new Set((entityDef?.fields ?? []).map((f) => f.key));
|
|
502
|
+
const row = Object.fromEntries(
|
|
503
|
+
Object.entries(patch).filter(([k]) => editable.has(k)).map(([k, v]) => [k, v === "" ? null : v])
|
|
504
|
+
);
|
|
505
|
+
if (patch.name !== void 0 && !(display.labelField in row)) row[display.labelField] = patch.name;
|
|
506
|
+
const { data, error } = await supabase.from(display.table).update(row).eq("id", id).select("*").single();
|
|
507
|
+
if (error) throw new Error(error.message);
|
|
508
|
+
globalCache.invalidate(`lookup:list:${display.table}`);
|
|
509
|
+
return toResult(data, display, config.kindLabels, kinds);
|
|
510
|
+
},
|
|
490
511
|
async getById(id) {
|
|
491
512
|
const supabase = getSupabaseClientOptional();
|
|
492
513
|
if (!supabase) return null;
|
|
@@ -1681,5 +1702,5 @@ function ScheduleEditor({ assigneeId, onSaved, hideBookable }) {
|
|
|
1681
1702
|
}
|
|
1682
1703
|
|
|
1683
1704
|
export { ScheduleDateExceptions, ScheduleEditor, ScheduleGridPanel, createArchetypeLookup, deleteSchedule, getPersonBookable, getPersonLookup, getScheduleBlockConfig, getSchedules, mergeBlockSettings, parseBlockSettings, registerPersonLookup, replaceWeeklySchedules, saveSchedule, setPersonBookable, setScheduleBlockConfig, subscribeScheduleBlockConfig };
|
|
1684
|
-
//# sourceMappingURL=chunk-
|
|
1685
|
-
//# sourceMappingURL=chunk-
|
|
1705
|
+
//# sourceMappingURL=chunk-XDYY5PLH.js.map
|
|
1706
|
+
//# sourceMappingURL=chunk-XDYY5PLH.js.map
|
|
@@ -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-XDYY5PLH.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 /** The raw record behind a result, for the edit form. Pairs with `update`. */\n load?(id: string): Promise<Record<string, unknown> | null>\n /** Edit on the spot — fixing a price or a phone without leaving the document. */\n update?(id: string, patch: Record<string, unknown>): 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 load(id: string) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n const { data } = await supabase.from(display.table).select('*').eq('id', id).maybeSingle()\n return (data as Record<string, unknown> | null) ?? null\n },\n\n // Only the form's own fields are written: the row carries columns (tenant,\n // flags, timestamps) the form never showed and must not overwrite.\n async update(id: string, patch: Record<string, unknown>) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('No database connection')\n const editable = new Set((entityDef?.fields ?? []).map((f) => f.key))\n const row = Object.fromEntries(\n Object.entries(patch)\n .filter(([k]) => editable.has(k))\n .map(([k, v]) => [k, v === '' ? null : v]),\n )\n if (patch.name !== undefined && !(display.labelField in row)) row[display.labelField] = patch.name\n const { data, error } = await supabase\n .from(display.table)\n .update(row)\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw new Error(error.message)\n globalCache.invalidate(`lookup:list:${display.table}`)\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginSettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/plugins/PluginSettingsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAMhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAY5D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB;AASD,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;IACjE,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,
|
|
1
|
+
{"version":3,"file":"PluginSettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/plugins/PluginSettingsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAMhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAY5D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB;AASD,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;IACjE,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,qBAIA;AAyGD,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE;IAC/G;;;;+BAI2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACjC,yDAAyD;IACzD,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC/B,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,qBA6GA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrudListView.d.ts","sourceRoot":"","sources":["../../src/crud/CrudListView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAGhD,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAM9C,OAAO,EAAmH,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAOpL,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"CrudListView.d.ts","sourceRoot":"","sources":["../../src/crud/CrudListView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,10 @@ export interface EntityLookup {
|
|
|
25
25
|
* register the supplier who just arrived. Optional: not every source writes.
|
|
26
26
|
*/
|
|
27
27
|
create?(draft: EntityLookupDraft): Promise<EntityLookupResult>;
|
|
28
|
+
/** The raw record behind a result, for the edit form. Pairs with `update`. */
|
|
29
|
+
load?(id: string): Promise<Record<string, unknown> | null>;
|
|
30
|
+
/** Edit on the spot — fixing a price or a phone without leaving the document. */
|
|
31
|
+
update?(id: string, patch: Record<string, unknown>): Promise<EntityLookupResult>;
|
|
28
32
|
/**
|
|
29
33
|
* WHAT this field creates. With it, "Create" opens the record's form (the
|
|
30
34
|
* required fields, the rest one click away) instead of writing a name-only
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archetype-lookup.d.ts","sourceRoot":"","sources":["../../src/crud/archetype-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAQ9C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;AAE1D;oFACoF;AACpF,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1E,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACtC;;;;;OAKG;IACH,MAAM,CAAC,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAC9D;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;AAYzE,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;AAI9D,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEnF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAEvE;AAuED,UAAU,qBAAqB;IAC7B,SAAS,EAAE,aAAa,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB;;;;;4EAKwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;+EAC2E;IAC3E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;oDACgD;IAChD,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IAC5B;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAiFD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"archetype-lookup.d.ts","sourceRoot":"","sources":["../../src/crud/archetype-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAQ9C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;AAE1D;oFACoF;AACpF,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1E,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACtC;;;;;OAKG;IACH,MAAM,CAAC,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAC9D,8EAA8E;IAC9E,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1D,iFAAiF;IACjF,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAChF;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;AAYzE,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;AAI9D,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEnF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAEvE;AAuED,UAAU,qBAAqB;IAC7B,SAAS,EAAE,aAAa,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB;;;;;4EAKwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;+EAC2E;IAC3E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;oDACgD;IAChD,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IAC5B;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAiFD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,YAAY,CAmOjF"}
|