@fayz-ai/admin 0.15.0 → 0.17.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/{CommandPalette-U7MMA2WH.js → CommandPalette-XY3VOEAV.js} +23 -13
- package/dist/CommandPalette-XY3VOEAV.js.map +1 -0
- package/dist/{ScheduleEditor-57AYL7B6.js → ScheduleEditor-63TVSCJC.js} +5 -4
- package/dist/ScheduleEditor-63TVSCJC.js.map +1 -0
- package/dist/SubscriptionPage-5PJ25YAD.js +8 -0
- package/dist/{SubscriptionPage-FE2B5ZXF.js.map → SubscriptionPage-5PJ25YAD.js.map} +1 -1
- package/dist/access/context.d.ts +3 -1
- package/dist/access/context.d.ts.map +1 -1
- package/dist/app/AdminShell.d.ts +6 -0
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/admin-app.d.ts.map +1 -1
- package/dist/app/bottom-nav.d.ts +24 -0
- package/dist/app/bottom-nav.d.ts.map +1 -0
- package/dist/app/config.d.ts +16 -0
- package/dist/app/config.d.ts.map +1 -1
- package/dist/app/scaffold.d.ts.map +1 -1
- package/dist/billing/TrialWidget.d.ts +25 -0
- package/dist/billing/TrialWidget.d.ts.map +1 -0
- package/dist/billing/index.d.ts +2 -0
- package/dist/billing/index.d.ts.map +1 -1
- package/dist/billing/index.js +2 -1
- package/dist/billing/trial.d.ts +48 -0
- package/dist/billing/trial.d.ts.map +1 -0
- package/dist/chunk-7DFJEXCR.js +48 -0
- package/dist/chunk-7DFJEXCR.js.map +1 -0
- package/dist/chunk-ERDS4OJS.js +194 -0
- package/dist/chunk-ERDS4OJS.js.map +1 -0
- package/dist/{chunk-IPWXA46H.js → chunk-G5PBC5OB.js} +10 -9
- package/dist/chunk-G5PBC5OB.js.map +1 -0
- package/dist/{chunk-45EZQW4M.js → chunk-LZRLWKJ2.js} +17 -5
- package/dist/chunk-LZRLWKJ2.js.map +1 -0
- package/dist/{chunk-OB7ZSTQD.js → chunk-WN6PGQSG.js} +9 -51
- package/dist/chunk-WN6PGQSG.js.map +1 -0
- package/dist/components/RightRail.d.ts.map +1 -1
- package/dist/components/billing/SoftLimitBanner.d.ts.map +1 -1
- package/dist/components/chat/ChatComposer.d.ts +5 -1
- package/dist/components/chat/ChatComposer.d.ts.map +1 -1
- package/dist/components/chat/ChatConversation.d.ts.map +1 -1
- package/dist/components/chat/ChatFab.d.ts +1 -5
- package/dist/components/chat/ChatFab.d.ts.map +1 -1
- package/dist/components/chat/ChatMessages.d.ts.map +1 -1
- package/dist/components/chat/ChoiceCard.d.ts +23 -0
- package/dist/components/chat/ChoiceCard.d.ts.map +1 -0
- package/dist/components/chat/ConnectorSuggestionCard.d.ts.map +1 -1
- package/dist/components/chat/RecordChip.d.ts.map +1 -1
- package/dist/components/connect/ConnectorDetail.d.ts.map +1 -1
- package/dist/components/connect/ConnectorsTab.d.ts.map +1 -1
- package/dist/components/connect/connector-map.generated.d.ts.map +1 -1
- package/dist/components/connect/useConnectors.d.ts.map +1 -1
- package/dist/components/layout/CommandPalette.d.ts.map +1 -1
- package/dist/components/organization/PermissionProfilesTab.d.ts.map +1 -1
- package/dist/components/organization/TeamTab.d.ts.map +1 -1
- package/dist/components/settings/SettingsPage.d.ts +9 -1
- package/dist/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/components/shared/RecordPickerModal.d.ts.map +1 -1
- package/dist/crud/CrudAgentSurface.d.ts +24 -2
- package/dist/crud/CrudAgentSurface.d.ts.map +1 -1
- package/dist/crud/CrudDetailPage.d.ts.map +1 -1
- package/dist/crud/CrudFormPage.d.ts +20 -1
- package/dist/crud/CrudFormPage.d.ts.map +1 -1
- package/dist/crud/CrudListView.d.ts +18 -5
- package/dist/crud/CrudListView.d.ts.map +1 -1
- package/dist/crud/CrudPage.d.ts +2 -7
- package/dist/crud/CrudPage.d.ts.map +1 -1
- package/dist/crud/CrudRecordModal.d.ts +9 -1
- package/dist/crud/CrudRecordModal.d.ts.map +1 -1
- package/dist/crud/CrudSkeletons.d.ts +7 -3
- package/dist/crud/CrudSkeletons.d.ts.map +1 -1
- package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderDetailView.d.ts +9 -0
- package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
- package/dist/crud/archetypes/PersonFormLayout.d.ts.map +1 -1
- package/dist/crud/createCrudPage.d.ts +2 -7
- package/dist/crud/createCrudPage.d.ts.map +1 -1
- package/dist/crud/index.d.ts +2 -0
- package/dist/crud/index.d.ts.map +1 -1
- package/dist/crud/write-errors.d.ts +24 -0
- package/dist/crud/write-errors.d.ts.map +1 -0
- package/dist/data/client.d.ts +10 -0
- package/dist/data/client.d.ts.map +1 -1
- package/dist/handbook/HandbookAgentSurface.d.ts +2 -0
- package/dist/handbook/HandbookAgentSurface.d.ts.map +1 -0
- package/dist/handbook/HandbookProvider.d.ts +7 -0
- package/dist/handbook/HandbookProvider.d.ts.map +1 -0
- package/dist/handbook/NotebookPanel.d.ts +5 -0
- package/dist/handbook/NotebookPanel.d.ts.map +1 -0
- package/dist/handbook/backend.d.ts +42 -0
- package/dist/handbook/backend.d.ts.map +1 -0
- package/dist/handbook/index.d.ts +10 -0
- package/dist/handbook/index.d.ts.map +1 -0
- package/dist/handbook/store.d.ts +36 -0
- package/dist/handbook/store.d.ts.map +1 -0
- package/dist/handbook/types.d.ts +124 -0
- package/dist/handbook/types.d.ts.map +1 -0
- package/dist/hooks/useAppConfig.d.ts +20 -0
- package/dist/hooks/useAppConfig.d.ts.map +1 -0
- package/dist/hooks/useChat.d.ts.map +1 -1
- package/dist/hooks/useLayout.d.ts +1 -0
- package/dist/hooks/useLayout.d.ts.map +1 -1
- package/dist/hooks/useTenantPlugins.d.ts.map +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6734 -4097
- package/dist/index.js.map +1 -1
- package/dist/lib/ai-tool-handlers.d.ts.map +1 -1
- package/dist/lib/attachments.d.ts +34 -0
- package/dist/lib/attachments.d.ts.map +1 -1
- package/dist/lib/choice-cards.d.ts +16 -0
- package/dist/lib/choice-cards.d.ts.map +1 -0
- package/dist/lib/fayz-events.d.ts.map +1 -1
- package/dist/lib/reveal-page.d.ts +19 -0
- package/dist/lib/reveal-page.d.ts.map +1 -0
- package/dist/onboarding/ActivationAgentSurface.d.ts +6 -0
- package/dist/onboarding/ActivationAgentSurface.d.ts.map +1 -0
- package/dist/onboarding/ActivationChecklistCard.d.ts +23 -0
- package/dist/onboarding/ActivationChecklistCard.d.ts.map +1 -0
- package/dist/onboarding/ActivationProvider.d.ts +17 -0
- package/dist/onboarding/ActivationProvider.d.ts.map +1 -0
- package/dist/onboarding/GettingStartedWidget.d.ts +5 -5
- package/dist/onboarding/activation.store.d.ts +53 -0
- package/dist/onboarding/activation.store.d.ts.map +1 -0
- package/dist/onboarding/backend.d.ts +14 -0
- package/dist/onboarding/backend.d.ts.map +1 -1
- package/dist/onboarding/checklist.d.ts +23 -0
- package/dist/onboarding/checklist.d.ts.map +1 -1
- package/dist/onboarding/guided-runner.d.ts +87 -0
- package/dist/onboarding/guided-runner.d.ts.map +1 -0
- package/dist/onboarding/guided.d.ts +27 -0
- package/dist/onboarding/guided.d.ts.map +1 -0
- package/dist/onboarding/handbook-seed.d.ts +70 -0
- package/dist/onboarding/handbook-seed.d.ts.map +1 -0
- package/dist/onboarding/index.d.ts +12 -3
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/programs.d.ts +78 -0
- package/dist/onboarding/programs.d.ts.map +1 -0
- package/dist/onboarding/submit.d.ts +7 -2
- package/dist/onboarding/submit.d.ts.map +1 -1
- package/dist/onboarding/tasks.d.ts +7 -0
- package/dist/onboarding/tasks.d.ts.map +1 -1
- package/dist/onboarding/useActivationWatch.d.ts +2 -0
- package/dist/onboarding/useActivationWatch.d.ts.map +1 -0
- package/dist/org/adapters/supabase.d.ts.map +1 -1
- package/dist/org/index.js +3 -2
- package/dist/plugins/ModuleActionBar.d.ts +16 -9
- package/dist/plugins/ModuleActionBar.d.ts.map +1 -1
- package/dist/plugins/PageActions.d.ts +16 -0
- package/dist/plugins/PageActions.d.ts.map +1 -0
- package/dist/plugins/header-actions.d.ts +11 -0
- package/dist/plugins/header-actions.d.ts.map +1 -0
- package/dist/stores/app-config.store.d.ts +27 -0
- package/dist/stores/app-config.store.d.ts.map +1 -0
- package/dist/stores/chat.store.d.ts +47 -4
- package/dist/stores/chat.store.d.ts.map +1 -1
- package/dist/tasks/components/TaskCard.d.ts.map +1 -1
- package/dist/tasks/components/TaskDetail.d.ts.map +1 -1
- package/dist/tasks/data/supabase.d.ts.map +1 -1
- package/dist/timeline/PersonTimeline.d.ts.map +1 -1
- package/dist/types/crud.d.ts +10 -0
- package/dist/types/crud.d.ts.map +1 -1
- package/dist/units/data.d.ts +14 -7
- package/dist/units/data.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/CommandPalette-U7MMA2WH.js.map +0 -1
- package/dist/ScheduleEditor-57AYL7B6.js.map +0 -1
- package/dist/SubscriptionPage-FE2B5ZXF.js +0 -7
- package/dist/chunk-45EZQW4M.js.map +0 -1
- package/dist/chunk-IPWXA46H.js.map +0 -1
- package/dist/chunk-OB7ZSTQD.js.map +0 -1
- package/dist/chunk-VN5NTK26.js +0 -36
- package/dist/chunk-VN5NTK26.js.map +0 -1
- package/dist/components/notes/NotesPanel.d.ts +0 -13
- package/dist/components/notes/NotesPanel.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/schedule-service.ts","../src/crud/archetypes/BlockSettingsPopover.tsx","../src/crud/archetypes/ScheduleEditor.tsx"],"names":["useTranslation","useRef","jsx","jsxs","X","useState","useEffect"],"mappings":"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","file":"ScheduleEditor-57AYL7B6.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'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ScheduleRecord {\n id: string\n tenantId: string\n kind: string\n assigneeId: string | null\n locationId: 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}\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(current.toISOString().slice(0, 10))\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","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, { useEffect, useState, useCallback, useRef, useSyncExternalStore } from 'react'\nimport { Clock, Plus, Trash2, Copy, Save, CalendarOff, CalendarPlus, Check, Settings, X } from 'lucide-react'\nimport { toast } from '@fayz-ai/ui'\nimport {\n getSchedules,\n replaceWeeklySchedules,\n saveException,\n deleteException,\n parseBlockSettings,\n} from '../../lib/schedule-service'\nimport type { ScheduleRecord, BlockSettings } from '../../lib/schedule-service'\nimport { getScheduleBlockConfig, subscribeScheduleBlockConfig } from '../../lib/schedule-config'\nimport type { ScheduleBlockConfig } from '../../lib/schedule-config'\nimport { useTranslation } from '@fayz-ai/core'\nimport { BlockSettingsPopover } from './BlockSettingsPopover'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { DatePicker } from '@fayz-ai/ui'\nimport { TimePicker } from '@fayz-ai/ui'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@fayz-ai/ui'\nimport { Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription } from '@fayz-ai/ui'\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DAY_KEYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']\nconst WEEK_ORDER = [1, 2, 3, 4, 5, 6, 0] // Mon–Sun display order\n\ninterface Period {\n id?: string\n startsAt: string\n endsAt: string\n settings?: BlockSettings\n}\n\ninterface DaySchedule {\n enabled: boolean\n periods: Period[]\n}\n\ntype WeekSchedule = Record<number, DaySchedule>\n\ninterface ExceptionEntry {\n startDate: string\n endDate: string\n type: 'available' | 'unavailable'\n periods: { startsAt: string; endsAt: string }[]\n notes: string\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction schedulesToWeek(schedules: ScheduleRecord[]): WeekSchedule {\n const week: WeekSchedule = {}\n for (let i = 0; i < 7; i++) {\n week[i] = { enabled: false, periods: [] }\n }\n for (const s of schedules) {\n if (s.dayOfWeek == null || s.specificDate != null) continue\n const day = week[s.dayOfWeek]\n if (s.isActive) {\n day.enabled = true\n const settings = parseBlockSettings(s.metadata ?? {})\n const hasSettings = Object.values(settings).some((v) => v !== undefined)\n day.periods.push({\n id: s.id,\n startsAt: s.startsAt,\n endsAt: s.endsAt,\n settings: hasSettings ? settings : undefined,\n })\n }\n }\n for (const day of Object.values(week)) {\n day.periods.sort((a, b) => a.startsAt.localeCompare(b.startsAt))\n }\n return week\n}\n\nfunction schedulesToExceptions(schedules: ScheduleRecord[]): ExceptionEntry[] {\n // Group by range key (rangeStart–rangeEnd or single date)\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,\n endDate: rangeEnd,\n 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\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// PeriodRow — single time block as a horizontal row\n// ---------------------------------------------------------------------------\n\ninterface PeriodRowProps {\n period: Period\n dayOfWeek: number\n blockConfig: ScheduleBlockConfig | null\n settingsOpen: boolean\n onUpdateTime: (field: 'startsAt' | 'endsAt', value: string) => void\n onUpdateBuffer: (value: number) => void\n onUpdateSettings: (settings: BlockSettings) => void\n onRemove: () => void\n onAddBlock: () => void\n onCopyToAll: () => void\n onToggleSettings: () => void\n onCloseSettings: () => void\n}\n\nfunction PeriodRow({\n period, blockConfig, dayOfWeek,\n settingsOpen, onUpdateTime, onUpdateBuffer, onUpdateSettings,\n onRemove, onCopyToAll, onToggleSettings, onCloseSettings,\n onAddBlock,\n}: PeriodRowProps) {\n const t = useTranslation()\n const gearRef = useRef<HTMLButtonElement>(null)\n const bufferValue = period.settings?.bufferMinutes ?? blockConfig?.defaults.bufferMinutes ?? 0\n const hasCustomSettings = period.settings && Object.entries(period.settings).some(\n ([k, v]) => k !== 'bufferMinutes' && v !== undefined,\n )\n const dayName = t(`schedule.days.${DAY_KEYS[dayOfWeek]}`)\n\n return (\n <TooltipProvider delayDuration={300}>\n <div className=\"flex items-center gap-1.5 group\">\n {/* Label */}\n {period.settings?.label && (\n <span className=\"text-[10px] font-medium text-primary bg-primary/10 rounded-full px-2 py-0.5 shrink-0\">\n {period.settings.label}\n </span>\n )}\n\n {/* Time range */}\n <TimePicker value={period.startsAt} onChange={(v) => onUpdateTime('startsAt', v)} interval={30} className=\"w-[90px]\" />\n <span className=\"text-xs text-muted-foreground/50\">-</span>\n <TimePicker value={period.endsAt} onChange={(v) => onUpdateTime('endsAt', v)} interval={30} min={period.startsAt} className=\"w-[90px]\" />\n\n {/* Buffer pill */}\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex items-center gap-1 rounded-full border bg-muted/30 px-2 py-1 shrink-0\">\n <input\n type=\"number\"\n min={0}\n max={120}\n value={bufferValue}\n onChange={(e) => onUpdateBuffer(Number(e.target.value) || 0)}\n className=\"w-8 bg-transparent text-xs text-center tabular-nums outline-none\"\n />\n <span className=\"text-[10px] text-muted-foreground\">{t('schedule.editor.min')}</span>\n </div>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.bufferTooltip')}</TooltipContent>\n </Tooltip>\n\n {/* Actions */}\n <div className=\"flex items-center gap-0.5 shrink-0 ml-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={onRemove}\n className=\"p-1.5 rounded-md text-muted-foreground/30 hover:text-destructive hover:bg-destructive/5 transition-colors\">\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.removeInterval')}</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={onAddBlock}\n className=\"p-1.5 rounded-md text-muted-foreground/30 hover:text-foreground hover:bg-muted transition-colors\">\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.newInterval', { day: dayName })}</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={onCopyToAll}\n className=\"p-1.5 rounded-md text-muted-foreground/30 hover:text-foreground hover:bg-muted transition-colors\">\n <Copy className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.copyToAll')}</TooltipContent>\n </Tooltip>\n\n {blockConfig && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button ref={gearRef} type=\"button\" onClick={onToggleSettings}\n className={`p-1.5 rounded-md transition-colors ${\n hasCustomSettings\n ? 'text-primary bg-primary/5'\n : 'text-muted-foreground/30 hover:text-foreground hover:bg-muted'\n }`}>\n <Settings className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.blockSettings.title')}</TooltipContent>\n </Tooltip>\n )}\n </div>\n\n {/* Settings popover */}\n {blockConfig && (\n <BlockSettingsPopover\n settings={period.settings ?? {}}\n onChange={onUpdateSettings}\n config={blockConfig}\n triggerRef={gearRef}\n open={settingsOpen}\n onClose={onCloseSettings}\n />\n )}\n </div>\n </TooltipProvider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\ninterface ScheduleEditorProps {\n assigneeId: string\n}\n\nexport function ScheduleEditor({ assigneeId }: ScheduleEditorProps) {\n const t = useTranslation()\n const [week, setWeek] = useState<WeekSchedule>({})\n const [exceptions, setExceptions] = useState<ExceptionEntry[]>([])\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [showAddException, setShowAddException] = useState(false)\n const blockConfig = useSyncExternalStore(subscribeScheduleBlockConfig, getScheduleBlockConfig)\n const [settingsPopover, setSettingsPopover] = useState<{ dayOfWeek: number; idx: number } | null>(null)\n const [weekDirty, setWeekDirty] = useState(false)\n\n // Lazy-fetch locations when showLocations is enabled but locations aren't loaded yet\n useEffect(() => {\n if (blockConfig?.showLocations && (!blockConfig.locations || blockConfig.locations.length === 0) && blockConfig.fetchLocations) {\n blockConfig.fetchLocations().catch(() => {})\n }\n }, [blockConfig?.showLocations, blockConfig?.locations?.length])\n\n // New exception form state\n const [newExStartDate, setNewExStartDate] = useState('')\n const [newExEndDate, setNewExEndDate] = useState('')\n const [newExType, setNewExType] = useState<'unavailable' | 'available'>('unavailable')\n const [newExPeriods, setNewExPeriods] = useState([{ startsAt: '09:00', endsAt: '17:00' }])\n const [newExNotes, setNewExNotes] = useState('')\n const [savingException, setSavingException] = useState(false)\n\n const loadData = useCallback(async () => {\n setLoading(true)\n try {\n const data = await getSchedules(assigneeId)\n setWeek(schedulesToWeek(data))\n setExceptions(schedulesToExceptions(data))\n setWeekDirty(false)\n } catch {\n toast.error(t('schedule.editor.failedToLoad'))\n }\n setLoading(false)\n }, [assigneeId])\n\n useEffect(() => {\n loadData()\n }, [loadData])\n\n // --- Weekly hours handlers ---\n\n function markDirty() { setWeekDirty(true) }\n\n function toggleDay(dayOfWeek: number) {\n markDirty()\n setWeek((prev) => ({\n ...prev,\n [dayOfWeek]: {\n ...prev[dayOfWeek],\n enabled: !prev[dayOfWeek]?.enabled,\n periods: prev[dayOfWeek]?.enabled ? [] : [{ startsAt: '09:00', endsAt: '18:00' }],\n },\n }))\n }\n\n function updatePeriod(dayOfWeek: number, idx: number, field: 'startsAt' | 'endsAt', value: string) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const periods = [...day.periods]\n periods[idx] = { ...periods[idx], [field]: value }\n return { ...prev, [dayOfWeek]: { ...day, periods } }\n })\n }\n\n function addPeriod(dayOfWeek: number) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const last = day.periods[day.periods.length - 1]\n day.periods = [...day.periods, { startsAt: last?.endsAt ?? '13:00', endsAt: '18:00' }]\n return { ...prev, [dayOfWeek]: day }\n })\n }\n\n function removePeriod(dayOfWeek: number, idx: number) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n day.periods = day.periods.filter((_, i) => i !== idx)\n if (day.periods.length === 0) day.enabled = false\n return { ...prev, [dayOfWeek]: day }\n })\n }\n\n function updatePeriodSettings(dayOfWeek: number, idx: number, settings: BlockSettings) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const periods = [...day.periods]\n periods[idx] = { ...periods[idx], settings }\n return { ...prev, [dayOfWeek]: { ...day, periods } }\n })\n }\n\n function updateBufferMinutes(dayOfWeek: number, idx: number, value: number) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const periods = [...day.periods]\n const existing = periods[idx].settings ?? {}\n periods[idx] = { ...periods[idx], settings: { ...existing, bufferMinutes: value || undefined } }\n return { ...prev, [dayOfWeek]: { ...day, periods } }\n })\n }\n\n function copyToAll(sourceDayOfWeek: number) {\n markDirty()\n const source = week[sourceDayOfWeek]\n if (!source) return\n setWeek((prev) => {\n const next = { ...prev }\n for (let i = 0; i < 7; i++) {\n if (i === sourceDayOfWeek) continue\n next[i] = {\n enabled: source.enabled,\n periods: source.periods.map((p) => ({ startsAt: p.startsAt, endsAt: p.endsAt, settings: p.settings ? { ...p.settings } : undefined })),\n }\n }\n return next\n })\n }\n\n async function handleSaveWeekly() {\n setSaving(true)\n try {\n await replaceWeeklySchedules(assigneeId, week)\n toast.success(t('schedule.editor.saved'))\n loadData()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToSave'), { description: err?.message })\n }\n setSaving(false)\n }\n\n // --- Exception handlers ---\n\n async function handleAddException() {\n if (!newExStartDate) {\n toast.error(t('schedule.editor.selectStartDate'))\n return\n }\n const endDate = newExEndDate || newExStartDate\n if (endDate < newExStartDate) {\n toast.error(t('schedule.editor.endDateAfterStart'))\n return\n }\n setSavingException(true)\n try {\n await saveException({\n assigneeId,\n startDate: newExStartDate,\n endDate,\n type: newExType,\n periods: newExType === 'unavailable' ? [] : newExPeriods,\n notes: newExNotes || undefined,\n })\n toast.success(t('schedule.editor.exceptionAdded'))\n setShowAddException(false)\n setNewExStartDate('')\n setNewExEndDate('')\n setNewExType('unavailable')\n setNewExPeriods([{ startsAt: '09:00', endsAt: '17:00' }])\n setNewExNotes('')\n loadData()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToSaveException'), { description: err?.message })\n }\n setSavingException(false)\n }\n\n async function handleDeleteException(startDate: string, endDate: string) {\n try {\n await deleteException(assigneeId, startDate, endDate)\n toast.success(t('schedule.editor.exceptionRemoved'))\n loadData()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToDelete'), { description: err?.message })\n }\n }\n\n // --- Render ---\n\n if (loading) {\n return (\n <div className=\"fz-fields fz-fields-2 gap-6\">\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-9 w-9 rounded-lg\" />\n <div className=\"space-y-1.5\"><Skeleton className=\"h-4 w-36\" /><Skeleton className=\"h-3 w-48\" /></div>\n </div>\n <Skeleton className=\"h-8 w-20 rounded-md\" />\n </div>\n <Card>\n <CardContent className=\"p-0 divide-y\">\n {Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-4 py-3\">\n <Skeleton className=\"h-5 w-5 rounded-full\" />\n <Skeleton className=\"h-4 w-8\" />\n {i < 5 ? (\n <>\n <Skeleton className=\"h-8 w-24 rounded-lg\" />\n <Skeleton className=\"h-3 w-3\" />\n <Skeleton className=\"h-8 w-24 rounded-lg\" />\n </>\n ) : (\n <Skeleton className=\"h-4 w-20\" />\n )}\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-9 w-9 rounded-lg\" />\n <div className=\"space-y-1.5\"><Skeleton className=\"h-4 w-32\" /><Skeleton className=\"h-3 w-44\" /></div>\n </div>\n <Skeleton className=\"h-8 w-32 rounded-md\" />\n </div>\n <Card><CardContent className=\"flex items-center justify-center py-8\"><Skeleton className=\"h-3 w-48\" /></CardContent></Card>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"fz-fields fz-fields-2 gap-6\">\n {/* ---- Weekly Working Hours ---- */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10\">\n <Clock className=\"h-4 w-4 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">{t('schedule.editor.weeklyTitle')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('schedule.editor.weeklyDescription')}</p>\n </div>\n </div>\n {weekDirty && (\n <Button size=\"sm\" onClick={handleSaveWeekly} disabled={saving}>\n <Save className=\"h-4 w-4 mr-1.5\" />\n {saving ? t('common.saving') : t('common.save')}\n </Button>\n )}\n </div>\n\n {/* Day rows */}\n <Card>\n <CardContent className=\"p-0 divide-y\">\n {WEEK_ORDER.map((dayOfWeek) => {\n const day = week[dayOfWeek] ?? { enabled: false, periods: [] }\n return (\n <div\n key={dayOfWeek}\n className={`flex items-start gap-4 px-4 py-3 transition-colors ${day.enabled ? '' : 'bg-muted/20'}`}\n >\n {/* Day toggle checkbox + label */}\n <button\n type=\"button\"\n onClick={() => toggleDay(dayOfWeek)}\n className=\"flex items-center gap-2.5 w-20 shrink-0 pt-1.5\"\n >\n <span className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full transition-all ${\n day.enabled\n ? 'bg-primary text-primary-foreground shadow-sm'\n : 'border-2 border-muted-foreground/25 hover:border-muted-foreground/40'\n }`}>\n {day.enabled && <Check className=\"h-3 w-3\" strokeWidth={3} />}\n </span>\n <span className={`text-sm font-medium ${day.enabled ? '' : 'text-muted-foreground/40'}`}>\n {t(`schedule.days.${DAY_KEYS[dayOfWeek]}`)}\n </span>\n </button>\n\n {/* Content */}\n {day.enabled ? (\n <div className=\"flex-1 space-y-2\">\n {day.periods.map((period, idx) => (\n <PeriodRow\n key={idx}\n period={period}\n dayOfWeek={dayOfWeek}\n blockConfig={blockConfig}\n settingsOpen={settingsPopover?.dayOfWeek === dayOfWeek && settingsPopover?.idx === idx}\n onUpdateTime={(field, v) => updatePeriod(dayOfWeek, idx, field, v)}\n onUpdateBuffer={(v) => updateBufferMinutes(dayOfWeek, idx, v)}\n onUpdateSettings={(s) => updatePeriodSettings(dayOfWeek, idx, s)}\n onRemove={() => removePeriod(dayOfWeek, idx)}\n onAddBlock={() => addPeriod(dayOfWeek)}\n onCopyToAll={() => copyToAll(dayOfWeek)}\n onToggleSettings={() => setSettingsPopover(\n settingsPopover?.dayOfWeek === dayOfWeek && settingsPopover?.idx === idx ? null : { dayOfWeek, idx }\n )}\n onCloseSettings={() => setSettingsPopover(null)}\n />\n ))}\n </div>\n ) : (\n <TooltipProvider delayDuration={300}>\n <div className=\"flex items-center gap-2 pt-1.5\">\n <span className=\"text-sm text-muted-foreground/40\">{t('schedule.editor.unavailable')}</span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => toggleDay(dayOfWeek)}\n className=\"flex h-6 w-6 items-center justify-center rounded-full border border-muted-foreground/25 text-muted-foreground/40 hover:border-foreground/40 hover:text-foreground hover:bg-muted transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.addHoursFor', { day: t(`schedule.days.${DAY_KEYS[dayOfWeek]}`) })}</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n )}\n </div>\n )\n })}\n </CardContent>\n </Card>\n </div>\n\n {/* ---- Date Exceptions ---- */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-orange-500/10\">\n <CalendarOff className=\"h-4 w-4 text-orange-600\" />\n </div>\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 </div>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setShowAddException(true)}\n >\n <CalendarPlus className=\"h-4 w-4 mr-1.5\" />\n {t('schedule.editor.addException')}\n </Button>\n </div>\n\n {/* Add exception modal */}\n <Modal open={showAddException} onOpenChange={setShowAddException}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle>{t('schedule.editor.addException')}</ModalTitle>\n <ModalDescription>{t('schedule.editor.exceptionsDescription')}</ModalDescription>\n </ModalHeader>\n\n <ModalBody className=\"space-y-5\">\n {/* Date range */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.startDate')}</label>\n <DatePicker\n value={newExStartDate}\n onChange={(v) => {\n setNewExStartDate(v)\n if (!newExEndDate || v > newExEndDate) setNewExEndDate(v)\n }}\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.endDate')}</label>\n <DatePicker\n value={newExEndDate || newExStartDate}\n onChange={setNewExEndDate}\n />\n </div>\n </div>\n\n {/* Type — segmented tabs */}\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.type')}</label>\n <Tabs value={newExType} onValueChange={(v) => setNewExType(v as 'unavailable' | 'available')}>\n <TabsList className=\"h-9 w-full\">\n <TabsTrigger value=\"unavailable\" className=\"text-xs gap-1.5 flex-1\">\n <CalendarOff className=\"h-3.5 w-3.5\" />\n {t('schedule.editor.unavailable')}\n </TabsTrigger>\n <TabsTrigger value=\"available\" className=\"text-xs gap-1.5 flex-1\">\n <Clock className=\"h-3.5 w-3.5\" />\n {t('schedule.editor.customHours')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n </div>\n\n {/* Custom hours — only when type=available */}\n {newExType === 'available' && (\n <div className=\"space-y-3\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('schedule.editor.workingHours')}</label>\n {newExPeriods.map((period, idx) => (\n <div key={idx} className=\"flex items-center gap-3\">\n <TimePicker\n value={period.startsAt}\n onChange={(v) => {\n const updated = [...newExPeriods]\n updated[idx] = { ...updated[idx], startsAt: v }\n setNewExPeriods(updated)\n }}\n interval={30}\n className=\"flex-1\"\n />\n <span className=\"text-xs text-muted-foreground shrink-0\">{t('schedule.editor.to')}</span>\n <TimePicker\n value={period.endsAt}\n onChange={(v) => {\n const updated = [...newExPeriods]\n updated[idx] = { ...updated[idx], endsAt: v }\n setNewExPeriods(updated)\n }}\n interval={30}\n min={period.startsAt}\n className=\"flex-1\"\n />\n {newExPeriods.length > 1 && (\n <button\n type=\"button\"\n onClick={() => setNewExPeriods(newExPeriods.filter((_, i) => i !== idx))}\n className=\"p-1.5 rounded-md text-muted-foreground hover:text-destructive hover:bg-destructive/5 transition-colors shrink-0\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const last = newExPeriods[newExPeriods.length - 1]\n setNewExPeriods([...newExPeriods, { startsAt: last?.endsAt ?? '13:00', endsAt: '18:00' }])\n }}\n className=\"flex items-center gap-1 text-xs text-primary hover:underline\"\n >\n <Plus className=\"h-3 w-3\" /> {t('schedule.editor.addTimeBlock')}\n </button>\n </div>\n )}\n\n {/* Notes */}\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.notes')}</label>\n <input\n type=\"text\"\n value={newExNotes}\n onChange={(e) => setNewExNotes(e.target.value)}\n placeholder={t('schedule.editor.notesPlaceholder')}\n className=\"block w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm placeholder:text-muted-foreground/40 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\"\n />\n </div>\n </ModalBody>\n\n <ModalFooter>\n <Button variant=\"ghost\" onClick={() => setShowAddException(false)}>\n {t('common.cancel')}\n </Button>\n <Button onClick={handleAddException} disabled={savingException}>\n <Save className=\"h-3.5 w-3.5 mr-1.5\" />\n {savingException ? t('common.saving') : t('schedule.editor.saveException')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Exception list */}\n {exceptions.length > 0 ? (\n <Card>\n <CardContent className=\"p-0 divide-y\">\n {exceptions.map((ex) => {\n const isRange = ex.startDate !== ex.endDate\n const dateLabel = isRange\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 group\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {/* Type indicator dot */}\n <span className={`h-2.5 w-2.5 shrink-0 rounded-full ${\n ex.type === 'unavailable' ? 'bg-destructive' : 'bg-success'\n }`} />\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm font-medium\">{dateLabel}</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 && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">{ex.notes}</p>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => handleDeleteException(ex.startDate, ex.endDate)}\n className=\"p-1.5 rounded-md text-muted-foreground hover:text-destructive hover:bg-destructive/5 transition-colors shrink-0 ml-2\"\n title={t('schedule.editor.removeException')}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n })}\n </CardContent>\n </Card>\n ) : (\n !showAddException && (\n <Card>\n <CardContent className=\"flex items-center justify-center py-8 text-sm text-muted-foreground\">\n {t('schedule.editor.noExceptions')}\n </CardContent>\n </Card>\n )\n )}\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { SubscriptionPage } from './chunk-IPWXA46H.js';
|
|
2
|
-
import './chunk-YUHCC7JY.js';
|
|
3
|
-
import './chunk-VN5NTK26.js';
|
|
4
|
-
import './chunk-OB7ZSTQD.js';
|
|
5
|
-
import './chunk-VTEP2AQX.js';
|
|
6
|
-
//# sourceMappingURL=SubscriptionPage-FE2B5ZXF.js.map
|
|
7
|
-
//# sourceMappingURL=SubscriptionPage-FE2B5ZXF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/client.ts","../src/org/team-rows.ts","../src/org/adapters/supabase.ts","../src/org/adapters/mock.ts"],"names":["capitalize","slugify"],"mappings":"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","file":"chunk-45EZQW4M.js","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport { setGlobalSupabaseClient, getActiveUnitId } from '@fayz-ai/core'\nimport { createDedupedFetch } from '@fayz-ai/sdk'\n\nlet _client: SupabaseClient | null = null\n\n/**\n * Create (and cache) the Supabase client for the Fayz app.\n * Also registers it as the global client in @fayz-ai/core so data providers\n * can resolve it without prop-drilling.\n *\n * Idempotent — subsequent calls with the same URL return the cached client.\n */\nexport function createFayzSupabaseClient(url: string, anonKey: string): SupabaseClient {\n if (_client) return _client\n\n if (!url || !anonKey) {\n throw new Error(\n '[@fayz-ai/admin] Supabase URL and anon key are required. ' +\n 'Pass supabaseUrl and supabaseAnonKey to createFayzApp.',\n )\n }\n\n // Every read goes through this client — the one place that can see two\n // components asking the same thing at the same instant.\n const deduped = createDedupedFetch()\n\n _client = createClient(url, anonKey, {\n auth: { autoRefreshToken: true, persistSession: true },\n global: {\n // The active unit rides on every request so the DATABASE can stamp a\n // write with it (041's trigger reads this header). Reads are narrowed by\n // an explicit filter, not by this — a header cannot be trusted to narrow,\n // and it must never be able to widen: the policies resolve unit access\n // through `public.user_unit_ids()`, never through what was sent here.\n //\n // `x-fayz-unit` is in the dedupe vary list. Without that, two identical\n // URLs under different units collapse into one response.\n fetch: (input: RequestInfo | URL, init: RequestInit = {}) => {\n const unit = getActiveUnitId()\n if (!unit) return deduped(input, init)\n const headers = new Headers(init.headers)\n headers.set('x-fayz-unit', unit)\n return deduped(input, { ...init, headers })\n },\n },\n })\n\n // Register globally so @fayz-ai/core data providers can use it\n setGlobalSupabaseClient(_client)\n\n return _client\n}\n\n/** Get the cached client — throws if not initialised */\nexport function getFayzSupabaseClient(): SupabaseClient {\n if (!_client) {\n throw new Error(\n '[@fayz-ai/admin] Supabase client not initialised. Call createFayzApp with supabaseUrl and supabaseAnonKey first.',\n )\n }\n return _client\n}\n\n/** Safe getter — returns null if not initialised (mock/offline mode) */\nexport function getFayzSupabaseClientOptional(): SupabaseClient | null {\n return _client\n}\n","import type { TeamPerson } from '@fayz-ai/core'\n\n/** A `people` row as the team query selects it. */\nexport interface TeamPeopleRow {\n id: string\n name?: string | null\n kind?: string | null\n email?: string | null\n avatar_url?: string | null\n is_active?: boolean | null\n}\n\n/** A `tenant_members` row as the team query selects it. */\nexport interface TeamMemberRow {\n id: string\n user_id: string\n role?: string | null\n person_id?: string | null\n created_at?: string | null\n}\n\n/** A `profiles` row for a member's login. */\nexport interface TeamProfileRow {\n id: string\n full_name?: string | null\n email?: string | null\n avatar_url?: string | null\n}\n\n/** The signed-in user, used to name their own row when `profiles` has no row for them. */\nexport interface TeamCurrentUser {\n id: string\n email?: string | null\n fullName?: string | null\n}\n\nconst capitalize = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s)\n\n/**\n * Fallback display name for a login with no person record. `profiles` is not\n * guaranteed to have a row (accounts created before the trigger, seeded demos),\n * and its RLS only ever exposes your own — so the session is the last resort for\n * your own row, and the email handle the one after that.\n */\nfunction loginName(profile: TeamProfileRow | undefined, session: TeamCurrentUser | undefined): string {\n const candidates = [profile?.full_name, session?.fullName, profile?.email, session?.email]\n for (const candidate of candidates) {\n const value = candidate?.trim()\n if (value) return value.includes('@') ? value.split('@')[0] : value\n }\n return ''\n}\n\n/**\n * Merges the two halves of the team into one list.\n *\n * People of the configured kinds are the roster; `tenant_members` is the access\n * overlay linked by `person_id`. But a login is not required to have a person\n * record — the owner who created the workspace never gets one — and dropping\n * those rows left the Team screen empty for every account that had not staffed\n * itself as a person. So memberships that match no listed person come back as\n * rows of their own, named from their login profile and carrying no `personId`.\n * Logins come first: whoever holds access is the answer to \"who is my team?\"\n * before the roster of people who may never sign in.\n */\nexport function buildTeamRows(\n people: TeamPeopleRow[],\n members: TeamMemberRow[],\n profiles: TeamProfileRow[],\n currentUser?: TeamCurrentUser | null,\n): TeamPerson[] {\n const personIds = new Set(people.map((p) => p.id))\n const byPerson = new Map<string, TeamMemberRow>()\n const unlinked: TeamMemberRow[] = []\n\n for (const m of members) {\n if (m.person_id && personIds.has(m.person_id)) byPerson.set(m.person_id, m)\n else unlinked.push(m)\n }\n\n const profileById = new Map(profiles.map((p) => [p.id, p]))\n\n const toMembership = (m: TeamMemberRow) => ({\n memberId: m.id,\n userId: m.user_id,\n profileId: (m.role as string) ?? '',\n profileName: capitalize((m.role as string) ?? ''),\n joinedAt: m.created_at ?? undefined,\n })\n\n const loginRows: TeamPerson[] = unlinked.map((m) => {\n const profile = profileById.get(m.user_id)\n const session = currentUser && currentUser.id === m.user_id ? currentUser : undefined\n return {\n name: loginName(profile, session),\n email: profile?.email ?? session?.email ?? undefined,\n avatarUrl: profile?.avatar_url ?? undefined,\n isActive: true,\n membership: toMembership(m),\n }\n })\n\n const personRows: TeamPerson[] = people.map((p) => {\n const m = byPerson.get(p.id)\n return {\n personId: p.id,\n name: p.name ?? '',\n kind: p.kind ?? undefined,\n email: p.email ?? undefined,\n avatarUrl: p.avatar_url ?? undefined,\n isActive: p.is_active ?? true,\n membership: m ? toMembership(m) : undefined,\n }\n })\n\n return [...loginRows, ...personRows]\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n TeamPerson,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile, SystemPermission, AuthAdapter } from '@fayz-ai/core'\nimport { getFayzSupabaseClient } from '../../data/client'\nimport { buildTeamRows } from '../team-rows'\nimport type { TeamMemberRow, TeamPeopleRow, TeamProfileRow } from '../team-rows'\n\n// ---------------------------------------------------------------------------\n// Request dedup — prevents duplicate in-flight requests (React StrictMode etc.)\n// ---------------------------------------------------------------------------\n\nconst inflightRequests = new Map<string, Promise<unknown>>()\n\nfunction dedup<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = inflightRequests.get(key)\n if (existing) return existing as Promise<T>\n\n const promise = fn().finally(() => {\n inflightRequests.delete(key)\n })\n inflightRequests.set(key, promise)\n return promise\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction mapTenantToOrg(row: Record<string, unknown>): Organization {\n return {\n id: row['id'] as string,\n name: row['name'] as string,\n slug: row['slug'] as string,\n logoUrl: (row['logo_url'] as string | null) ?? undefined,\n verticalId: (row['vertical_id'] as string | null) ?? undefined,\n plan: (row['plan'] as string | null) ?? undefined,\n settings: (row['settings'] as Record<string, unknown> | null) ?? undefined,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\nfunction mapMemberRow(row: Record<string, unknown>): OrgMember {\n const profile = (row['profile'] as Record<string, unknown>) ?? {}\n return {\n id: row['id'] as string,\n userId: row['user_id'] as string,\n orgId: row['tenant_id'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n user: {\n id: row['user_id'] as string,\n email: (profile['email'] as string) ?? '',\n fullName: (profile['full_name'] as string) ?? '',\n avatarUrl: (profile['avatar_url'] as string | null) ?? undefined,\n },\n // tenant_members has no `joined_at` column — it's `created_at`.\n joinedAt: (row['joined_at'] ?? row['created_at']) as string,\n }\n}\n\nfunction mapLocationRow(row: Record<string, unknown>): Location {\n return {\n id: row['id'] as string,\n tenantId: row['tenant_id'] as string,\n name: row['name'] as string,\n address: (row['address'] as string | null) ?? undefined,\n city: (row['city'] as string | null) ?? undefined,\n state: (row['state'] as string | null) ?? undefined,\n country: (row['country'] as string | null) ?? undefined,\n phone: (row['phone'] as string | null) ?? undefined,\n isHeadquarters: (row['is_headquarters'] as boolean) ?? false,\n isActive: (row['is_active'] as boolean) ?? true,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\nfunction mapInviteRow(row: Record<string, unknown>): Invite {\n return {\n id: row['id'] as string,\n orgId: row['tenant_id'] as string,\n email: row['email'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n invitedBy: row['invited_by'] as string,\n token: row['token'] as string,\n status: (row['status'] as Invite['status']) ?? 'pending',\n createdAt: row['created_at'] as string,\n expiresAt: row['expires_at'] as string,\n }\n}\n\n/** Minimal role identity the adapter needs to build profiles. Grants come from\n * the DB catalog; id/name/order/description come from what the app declares. */\nexport interface RoleIdentity {\n id: string\n name: string\n description?: string\n /** System roles are app-defined and static (not user-editable). Custom roles\n * (duplicated by users, stored in tenant_roles) are false. Defaults true. */\n isSystem?: boolean\n}\n\n// Matrix emits read/create/edit/delete; map back to DB action verbs.\nconst DB_ACTION: Record<string, string> = {\n read: 'read', create: 'create', edit: 'update', write: 'create', manage: 'manage', delete: 'delete',\n}\n\nfunction slugifyRole(name: string): string {\n return name.toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'role'\n}\n\n// Fallback role set when the host app declares none. The SDK is domain-agnostic:\n// each app defines its OWN business roles (a salon's roles ≠ an agency's) via\n// config.permissions.defaultProfiles. These five are only a back-compat default.\nconst DEFAULT_ROLES: RoleIdentity[] = [\n { id: 'owner', name: 'Owner' },\n { id: 'admin', name: 'Admin' },\n { id: 'manager', name: 'Manager' },\n { id: 'staff', name: 'Staff' },\n { id: 'viewer', name: 'Viewer' },\n]\n\n// DB permission ids that confer an org-management system permission.\nconst SYSTEM_PERMISSION_MAP: Record<string, SystemPermission> = {\n 'team.read': 'manage_team',\n 'team.invite': 'manage_team',\n 'team.manage': 'manage_team',\n 'team.manage_roles': 'manage_permissions',\n 'billing.read': 'manage_billing',\n 'billing.manage': 'manage_billing',\n 'settings.read': 'manage_settings',\n 'settings.update': 'manage_settings',\n}\nconst ALL_SYSTEM_PERMISSIONS: SystemPermission[] = ['manage_team', 'manage_billing', 'manage_settings', 'manage_permissions']\n\n// Map DB permission ids to feature action grants\nfunction buildPermissionProfiles(\n roles: RoleIdentity[],\n permissions: Array<{ id: string; category: string }>,\n rolePerms: Array<{ role: string; permission_id: string }>,\n overrides: Array<{ role: string; permission_id: string; granted: boolean }>,\n): PermissionProfile[] {\n const overrideMap = new Map<string, boolean>()\n for (const o of overrides) {\n overrideMap.set(`${o.role}:${o.permission_id}`, o.granted)\n }\n\n // The role SET comes from what the app declares — the SDK no longer bakes it in.\n const rolePermMap = new Map<string, Set<string>>()\n for (const r of roles) {\n rolePermMap.set(r.id, new Set())\n }\n // Convention: an 'owner' role (if declared) gets every permission implicitly.\n if (rolePermMap.has('owner')) {\n for (const p of permissions) rolePermMap.get('owner')!.add(p.id)\n }\n for (const rp of rolePerms) {\n rolePermMap.get(rp.role)?.add(rp.permission_id)\n }\n\n // Apply overrides\n for (const [key, granted] of overrideMap) {\n const colonIdx = key.indexOf(':')\n const role = key.slice(0, colonIdx)\n const permId = key.slice(colonIdx + 1)\n const perms = rolePermMap.get(role)\n if (!perms) continue\n if (granted) {\n perms.add(permId)\n } else {\n perms.delete(permId)\n }\n }\n\n // Align DB actions with the matrix's action vocabulary (read/create/edit/delete).\n const actionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n update: 'edit',\n manage: 'edit',\n delete: 'delete',\n configure: 'edit',\n invite: 'create',\n }\n\n return roles.map(({ id: role, name, description, isSystem }) => {\n const permIds = rolePermMap.get(role)!\n const features: Record<string, string[]> = {}\n\n for (const permId of permIds) {\n // LAST dot, not the first: a feature id may contain dots (plugin-crm\n // declares `crm.leads`), an action never does. Splitting on the first one\n // read `crm.leads.read` as feature `crm` + action `leads.read`, which no\n // action map knows — so every dotted feature the matrix granted came back\n // empty on the next load, silently.\n const dotIdx = permId.lastIndexOf('.')\n if (dotIdx <= 0) continue\n const category = permId.slice(0, dotIdx)\n const action = permId.slice(dotIdx + 1)\n const mappedAction = actionMap[action]\n if (!mappedAction) continue\n\n if (!features[category]) features[category] = []\n if (!features[category].includes(mappedAction)) {\n features[category].push(mappedAction)\n }\n }\n\n // Org-management system permissions, derived from team/billing/settings\n // grants (owner gets all four). These gate the Equipe/Permissões tabs.\n const systemPermissions: SystemPermission[] = []\n const source = role === 'owner' ? ALL_SYSTEM_PERMISSIONS : [...permIds].map((id) => SYSTEM_PERMISSION_MAP[id])\n for (const sp of source) {\n if (sp && !systemPermissions.includes(sp)) systemPermissions.push(sp)\n }\n\n return {\n id: role,\n name: name || capitalize(role),\n description,\n isSystem: isSystem ?? true,\n systemPermissions,\n grants: features,\n }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factory\n// ---------------------------------------------------------------------------\n\nexport interface SupabaseOrgAdapterConfig {\n /** Deprecated — core tables now live in the public schema; this field is ignored. */\n coreSchema?: string\n /** Business roles the host app declares (config.permissions.defaultProfiles).\n * Falls back to the generic five when omitted. */\n roles?: RoleIdentity[]\n /** Auth adapter used to actually DELIVER invites (send the e-mail + create the\n * auth user) — the org adapter only records the audit row. Injected by the app;\n * when omitted, invites are recorded but not delivered. */\n authAdapter?: AuthAdapter\n /** Canonical, deployment-fixed origin baked into invite/magic-link redirects\n * (e.g. https://beauty-saas.live.fayz.ai). The container injects it as\n * VITE_APP_URL; the app wiring passes it here. Falls back to\n * window.location.origin, which is wrong when an admin invites from a preview\n * or localhost origin. Note: whatever origin ends up here must ALSO be in the\n * Supabase project's Redirect URLs allow-list, or Supabase silently swaps it\n * for its Site URL (default http://localhost:3000). */\n siteUrl?: string\n}\n\nexport function createSupabaseOrgAdapter(config?: SupabaseOrgAdapterConfig): OrgAdapter {\n const roles: RoleIdentity[] = config?.roles && config.roles.length > 0 ? config.roles : DEFAULT_ROLES\n const authAdapter = config?.authAdapter\n const originBase =\n config?.siteUrl?.replace(/\\/+$/, '') ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n const inviteRedirectTo = originBase ? `${originBase}/` : undefined\n\n function supabase() {\n return getFayzSupabaseClient()\n }\n\n function core() {\n return supabase()\n }\n\n return {\n async acceptPendingInvites(): Promise<number> {\n const { data, error } = await supabase().rpc('accept_pending_invitations')\n if (error) {\n // A pool still on the pre-022 spine has no such function. Not fatal —\n // the user just lands org-less, exactly as before this shipped.\n console.warn('[org] accept_pending_invitations failed:', error.message)\n return 0\n }\n return typeof data === 'number' ? data : 0\n },\n\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n return dedup(`listUserOrgs:${userId}`, async () => {\n const { data, error } = await core()\n .from('tenant_members')\n .select('tenant_id, role, tenant:tenants(id, name, slug, logo_url)')\n .eq('user_id', userId)\n\n if (error) throw error\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => ({\n orgId: row['tenant_id'] as string,\n orgName: ((row['tenant'] as Record<string, unknown>)?.['name'] as string) ?? '',\n orgSlug: ((row['tenant'] as Record<string, unknown>)?.['slug'] as string) ?? '',\n orgLogoUrl: ((row['tenant'] as Record<string, unknown>)?.['logo_url'] as string | null) ?? undefined,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n }))\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const { data, error } = await core()\n .from('tenants')\n .select('*')\n .eq('id', orgId)\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const { data: tenant, error } = await supabase()\n .rpc('create_tenant_with_owner', {\n p_name: name,\n p_slug: slugify(name),\n p_user_id: userId,\n p_vertical_id: options?.verticalId ?? null,\n p_plan: 'free',\n p_settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n teamSize: options?.teamSize ?? undefined,\n branding: options?.branding ?? {},\n },\n })\n\n if (error) throw error\n return mapTenantToOrg(tenant as Record<string, unknown>)\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const row: Record<string, unknown> = {}\n if (updates.name !== undefined) row['name'] = updates.name\n if (updates.slug !== undefined) row['slug'] = updates.slug\n if (updates.logoUrl !== undefined) row['logo_url'] = updates.logoUrl\n if (updates.verticalId !== undefined) row['vertical_id'] = updates.verticalId\n if (updates.plan !== undefined) row['plan'] = updates.plan\n if (updates.settings !== undefined) row['settings'] = updates.settings\n\n const { data, error } = await core()\n .from('tenants')\n .update(row)\n .eq('id', orgId)\n .select()\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const { data, error } = await core()\n .from('tenant_members')\n .select('*')\n .eq('tenant_id', orgId)\n\n if (error) throw error\n\n const userIds = ((data ?? []) as Array<Record<string, unknown>>).map((m) => m['user_id'] as string)\n const { data: profiles } = userIds.length > 0\n ? await core().from('profiles').select('id, full_name, avatar_url, email').in('id', userIds)\n : { data: [] }\n\n const profileMap = new Map(\n ((profiles ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'], p]),\n )\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const profile = profileMap.get(row['user_id'] as string) ?? {}\n return mapMemberRow({ ...row, profile })\n })\n },\n\n // Person-first team list: people of `personKinds` are the roster and\n // `tenant_members` (login + role) is the overlay linked by person_id — plus\n // every membership that links to no listed person, so an account with access\n // is never missing from its own Team screen. See buildTeamRows.\n async listTeam(orgId: string, personKinds: string[]): Promise<TeamPerson[]> {\n if (!personKinds || personKinds.length === 0) return []\n\n const [peopleResult, membersResult] = await Promise.all([\n core()\n .from('people')\n .select('id, name, kind, email, avatar_url, is_active')\n .eq('tenant_id', orgId)\n .in('kind', personKinds)\n // Only people still on the roster. `not is false` rather than\n // `eq true` so a row that never set the flag stays visible — the\n // same `?? true` reading buildTeamRows applies. A deactivated\n // person who still holds a login does not vanish: their membership\n // stops matching a listed person and comes back as a login row,\n // which is the invariant that keeps access auditable.\n .not('is_active', 'is', false),\n core()\n .from('tenant_members')\n .select('id, user_id, role, person_id, created_at')\n .eq('tenant_id', orgId),\n ])\n if (peopleResult.error) throw peopleResult.error\n\n const people = (peopleResult.data ?? []) as TeamPeopleRow[]\n const members = (membersResult.data ?? []) as TeamMemberRow[]\n\n // Login-only rows are named from their auth profile — there is no person\n // record to name them after. The session is the fallback for your own row:\n // `profiles` has no row for accounts predating its trigger.\n const userIds = members.map((m) => m.user_id).filter(Boolean)\n const [profilesResult, sessionResult] = await Promise.all([\n userIds.length > 0\n ? core().from('profiles').select('id, full_name, avatar_url, email').in('id', userIds)\n : Promise.resolve({ data: [] }),\n core().auth.getSession(),\n ])\n\n const sessionUser = sessionResult?.data?.session?.user\n const currentUser = sessionUser\n ? {\n id: sessionUser.id,\n email: sessionUser.email,\n fullName: (sessionUser.user_metadata?.['full_name'] as string | undefined) ?? undefined,\n }\n : null\n\n return buildTeamRows(people, members, (profilesResult.data ?? []) as TeamProfileRow[], currentUser)\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .update({ role: profileId })\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .delete()\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const [permsResult, rolePermsResult, overridesResult, customResult] = await Promise.all([\n core().from('permissions').select('id, category'),\n core().from('role_permissions').select('role, permission_id'),\n core().from('tenant_role_overrides').select('role, permission_id, granted').eq('tenant_id', orgId),\n // Custom roles the tenant created by duplicating a system role. Tolerate a\n // missing table (pre-seed) — just show the system roles in that case.\n core().from('tenant_roles').select('key, name, description').eq('tenant_id', orgId),\n ])\n\n if (permsResult.error) throw permsResult.error\n if (rolePermsResult.error) throw rolePermsResult.error\n if (overridesResult.error) throw overridesResult.error\n\n const systemRoles: RoleIdentity[] = roles.map((r) => ({ ...r, isSystem: true }))\n const customRoles: RoleIdentity[] = customResult.error\n ? []\n : ((customResult.data ?? []) as Array<{ key: string; name: string; description: string | null }>).map((r) => ({\n id: r.key,\n name: r.name,\n description: r.description ?? undefined,\n isSystem: false,\n }))\n\n return buildPermissionProfiles(\n [...systemRoles, ...customRoles],\n (permsResult.data ?? []) as Array<{ id: string; category: string }>,\n (rolePermsResult.data ?? []) as Array<{ role: string; permission_id: string }>,\n (overridesResult.data ?? []) as Array<{ role: string; permission_id: string; granted: boolean }>,\n )\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n // Custom roles live in tenant_roles (identity/name) + tenant_role_overrides\n // (their grants). System roles stay app-defined and untouched.\n const existing = new Set(\n ((await core().from('tenant_roles').select('key').eq('tenant_id', orgId)).data ?? [])\n .map((r: { key: string }) => r.key),\n )\n let key = slugifyRole(profile.name)\n if (existing.has(key) || roles.some((r) => r.id === key)) {\n let n = 2\n while (existing.has(`${key}-${n}`) || roles.some((r) => r.id === `${key}-${n}`)) n++\n key = `${key}-${n}`\n }\n\n const insertRole = await core()\n .from('tenant_roles')\n .insert({ tenant_id: orgId, key, name: profile.name, description: profile.description ?? null })\n if (insertRole.error) throw insertRole.error\n\n const overrides = Object.entries(profile.grants ?? {}).flatMap(([category, actions]) =>\n actions.map((action) => ({\n tenant_id: orgId,\n role: key,\n permission_id: `${category}.${DB_ACTION[action] ?? action}`,\n granted: true,\n })),\n )\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\n\n const profiles = await this.listProfiles(orgId)\n return profiles.find((p) => p.id === key) ?? {\n id: key, name: profile.name, description: profile.description, isSystem: false,\n systemPermissions: profile.systemPermissions ?? [], grants: profile.grants ?? {},\n }\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n data: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n // Identity lives in tenant_roles, grants in tenant_role_overrides. Only\n // the grants half used to be written, so renaming a custom profile — from\n // the matrix editor or from the assistant — silently did nothing.\n if (data.name !== undefined || data.description !== undefined) {\n const patch: Record<string, unknown> = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.description !== undefined) patch.description = data.description ?? null\n const { error } = await core()\n .from('tenant_roles')\n .update(patch)\n .eq('tenant_id', orgId)\n .eq('key', profileId)\n if (error) throw error\n }\n\n if (data.grants) {\n await core()\n .from('tenant_role_overrides')\n .delete()\n .eq('tenant_id', orgId)\n .eq('role', profileId)\n\n const overrides = Object.entries(data.grants).flatMap(([category, actions]) =>\n actions.map((action) => ({\n tenant_id: orgId,\n role: profileId,\n permission_id: `${category}.${DB_ACTION[action] ?? action}`,\n granted: true,\n })),\n )\n\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\n }\n\n const profiles = await this.listProfiles(orgId)\n const updated = profiles.find((p) => p.id === profileId)\n if (!updated) throw new Error(`Profile not found: ${profileId}`)\n return updated\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n // Only custom roles (present in tenant_roles) can be deleted; system roles\n // are app-defined and static.\n const found = await core()\n .from('tenant_roles')\n .select('key')\n .eq('tenant_id', orgId)\n .eq('key', profileId)\n .maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error('System roles cannot be deleted.')\n\n await core().from('tenant_role_overrides').delete().eq('tenant_id', orgId).eq('role', profileId)\n const { error } = await core().from('tenant_roles').delete().eq('tenant_id', orgId).eq('key', profileId)\n if (error) throw error\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const { data, error } = await core()\n .from('invitations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('created_at', { ascending: false })\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async createInvite(orgId: string, email: string, profileId: string, invitedBy: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .insert({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n })\n .select()\n .single()\n\n if (error) throw error\n // Deliver via the auth abstraction (sends the e-mail + creates the auth user,\n // stamping tenant_id/role on its metadata for the accept-time membership trigger).\n await authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n })\n return mapInviteRow(data as Record<string, unknown>)\n },\n\n async bulkInvite(orgId: string, emails: string[], profileId: string, invitedBy: string): Promise<Invite[]> {\n const rows = emails.map((email) => ({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n }))\n\n const { data, error } = await core().from('invitations').insert(rows).select()\n if (error) throw error\n await Promise.all(\n emails.map((email) =>\n authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n }),\n ),\n )\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const { error } = await core()\n .from('invitations')\n .update({ status: 'revoked' })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .update({\n status: 'pending',\n expires_at: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n .select()\n .single()\n\n if (error) throw error\n const row = data as Record<string, unknown>\n // Re-send the invite e-mail through the auth abstraction.\n await authAdapter?.inviteUser?.(row.email as string, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: row.role as string, invited_by: row.invited_by as string },\n })\n return mapInviteRow(row)\n },\n\n async listLocations(orgId: string): Promise<Location[]> {\n const { data, error } = await core()\n .from('locations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('is_headquarters', { ascending: false })\n .order('name')\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapLocationRow)\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n const { data, error } = await core()\n .from('locations')\n .insert({\n tenant_id: orgId,\n name: input.name,\n address: input.address ?? null,\n city: input.city ?? null,\n state: input.state ?? null,\n country: input.country ?? 'BR',\n phone: input.phone ?? null,\n is_headquarters: input.isHeadquarters ?? false,\n })\n .select()\n .single()\n\n if (error) throw error\n return mapLocationRow(data as Record<string, unknown>)\n },\n }\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:mock-orgs'\n\ninterface MockOrgData {\n orgs: Organization[]\n members: OrgMember[]\n profiles: Record<string, PermissionProfile[]>\n invites: Record<string, Invite[]>\n userOrgMap: Record<string, string[]>\n}\n\nfunction getStored(): MockOrgData {\n try {\n if (typeof localStorage === 'undefined') return empty()\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) return JSON.parse(raw) as MockOrgData\n } catch {\n // ignore\n }\n return empty()\n}\n\nfunction empty(): MockOrgData {\n return { orgs: [], members: [], profiles: {}, invites: {}, userOrgMap: {} }\n}\n\nfunction setStored(data: MockOrgData): void {\n try {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } catch {\n // ignore\n }\n}\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nexport function createMockOrgAdapter(defaultProfiles?: PermissionProfile[]): OrgAdapter {\n function seedOrgForUser(userId: string, userName?: string): MockOrgData {\n const data = getStored()\n if (data.userOrgMap[userId]?.length) return data\n\n const orgId = crypto.randomUUID()\n const memberId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name: 'My Organization',\n slug: 'my-organization',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: memberId,\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: userName\n ? `${userName.toLowerCase().replace(/\\s+/g, '.')}@example.com`\n : 'user@example.com',\n fullName: userName ?? 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n data.userOrgMap[userId] = [orgId]\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return data\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n const data = seedOrgForUser(userId)\n const orgIds = data.userOrgMap[userId] ?? []\n return orgIds.map((orgId) => {\n const org = data.orgs.find((o) => o.id === orgId)!\n const member = data.members.find((m) => m.orgId === orgId && m.userId === userId)\n return {\n orgId,\n orgName: org.name,\n orgSlug: org.slug,\n orgLogoUrl: org.logoUrl,\n profileId: member?.profileId ?? 'owner',\n profileName: member?.profileName ?? 'Owner',\n }\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const data = getStored()\n const org = data.orgs.find((o) => o.id === orgId)\n if (!org) throw new Error(`Org not found: ${orgId}`)\n return org\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const data = getStored()\n const orgId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name,\n slug: slugify(name),\n verticalId: options?.verticalId,\n plan: 'free',\n settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: crypto.randomUUID(),\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: 'user@example.com',\n fullName: 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n if (!data.userOrgMap[userId]) data.userOrgMap[userId] = []\n data.userOrgMap[userId].push(orgId)\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return org\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const data = getStored()\n const idx = data.orgs.findIndex((o) => o.id === orgId)\n if (idx === -1) throw new Error(`Org not found: ${orgId}`)\n data.orgs[idx] = { ...data.orgs[idx], ...updates, updatedAt: new Date().toISOString() }\n setStored(data)\n return data.orgs[idx]\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const data = getStored()\n return data.members.filter((m) => m.orgId === orgId)\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const data = getStored()\n const member = data.members.find((m) => m.id === memberId && m.orgId === orgId)\n if (!member) throw new Error(`Member not found: ${memberId}`)\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n member.profileId = profileId\n member.profileName = profile?.name ?? profileId\n setStored(data)\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const data = getStored()\n const memberIdx = data.members.findIndex((m) => m.id === memberId && m.orgId === orgId)\n if (memberIdx === -1) return\n const member = data.members[memberIdx]\n data.members.splice(memberIdx, 1)\n const userOrgs = data.userOrgMap[member.userId]\n if (userOrgs) {\n const orgIdx = userOrgs.indexOf(orgId)\n if (orgIdx !== -1) userOrgs.splice(orgIdx, 1)\n }\n setStored(data)\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const data = getStored()\n return data.profiles[orgId] ?? defaultProfiles ?? []\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const newProfile: PermissionProfile = {\n ...profile,\n id: crypto.randomUUID(),\n isSystem: false,\n }\n if (!data.profiles[orgId]) {\n data.profiles[orgId] = defaultProfiles ? [...defaultProfiles] : []\n }\n data.profiles[orgId].push(newProfile)\n setStored(data)\n return newProfile\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n updates: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const idx = profiles.findIndex((p) => p.id === profileId)\n if (idx === -1) throw new Error(`Profile not found: ${profileId}`)\n profiles[idx] = { ...profiles[idx], ...updates }\n data.profiles[orgId] = profiles\n setStored(data)\n return profiles[idx]\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n if (profile?.isSystem) throw new Error('Cannot delete system profile')\n data.profiles[orgId] = profiles.filter((p) => p.id !== profileId)\n setStored(data)\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const data = getStored()\n return data.invites[orgId] ?? []\n },\n\n async createInvite(\n orgId: string,\n email: string,\n profileId: string,\n invitedBy: string,\n ): Promise<Invite> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? defaultProfiles ?? []\n const profile = profiles.find((p) => p.id === profileId)\n\n const invite: Invite = {\n id: crypto.randomUUID(),\n orgId,\n email,\n profileId,\n profileName: profile?.name ?? profileId,\n invitedBy,\n token: crypto.randomUUID(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n }\n\n if (!data.invites[orgId]) data.invites[orgId] = []\n data.invites[orgId].push(invite)\n setStored(data)\n return invite\n },\n\n async bulkInvite(\n orgId: string,\n emails: string[],\n profileId: string,\n invitedBy: string,\n ): Promise<Invite[]> {\n const results: Invite[] = []\n for (const email of emails) {\n results.push(await this.createInvite(orgId, email, profileId, invitedBy))\n }\n return results\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (invite) {\n invite.status = 'expired'\n setStored(data)\n }\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (!invite) throw new Error(`Invite not found: ${inviteId}`)\n invite.expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n invite.status = 'pending'\n setStored(data)\n return invite\n },\n\n async listLocations(_orgId: string): Promise<Location[]> {\n return []\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n return {\n id: crypto.randomUUID(),\n tenantId: orgId,\n name: input.name,\n address: input.address,\n city: input.city,\n state: input.state,\n country: input.country ?? 'BR',\n phone: input.phone,\n isHeadquarters: input.isHeadquarters ?? false,\n isActive: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n },\n }\n}\n"]}
|