@fayz-ai/plugin-tasks 0.1.1

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.
Files changed (75) hide show
  1. package/dist/TasksContext.d.ts +20 -0
  2. package/dist/TasksContext.d.ts.map +1 -0
  3. package/dist/components/TaskCard.d.ts +10 -0
  4. package/dist/components/TaskCard.d.ts.map +1 -0
  5. package/dist/components/TaskDetail.d.ts +5 -0
  6. package/dist/components/TaskDetail.d.ts.map +1 -0
  7. package/dist/components/TaskLabelBadge.d.ts +9 -0
  8. package/dist/components/TaskLabelBadge.d.ts.map +1 -0
  9. package/dist/components/TaskPriorityBadge.d.ts +7 -0
  10. package/dist/components/TaskPriorityBadge.d.ts.map +1 -0
  11. package/dist/components/TaskQuickAdd.d.ts +5 -0
  12. package/dist/components/TaskQuickAdd.d.ts.map +1 -0
  13. package/dist/components/TaskStatusGroup.d.ts +7 -0
  14. package/dist/components/TaskStatusGroup.d.ts.map +1 -0
  15. package/dist/components/TasksDrawer.d.ts +3 -0
  16. package/dist/components/TasksDrawer.d.ts.map +1 -0
  17. package/dist/components/TasksFilterBar.d.ts +3 -0
  18. package/dist/components/TasksFilterBar.d.ts.map +1 -0
  19. package/dist/components/TasksGeneralSettings.d.ts +3 -0
  20. package/dist/components/TasksGeneralSettings.d.ts.map +1 -0
  21. package/dist/components/TasksTopbarButton.d.ts +15 -0
  22. package/dist/components/TasksTopbarButton.d.ts.map +1 -0
  23. package/dist/data/capability.test.d.ts +2 -0
  24. package/dist/data/capability.test.d.ts.map +1 -0
  25. package/dist/data/mock.d.ts +3 -0
  26. package/dist/data/mock.d.ts.map +1 -0
  27. package/dist/data/supabase.d.ts +3 -0
  28. package/dist/data/supabase.d.ts.map +1 -0
  29. package/dist/data/types.d.ts +13 -0
  30. package/dist/data/types.d.ts.map +1 -0
  31. package/dist/index.cjs +1108 -0
  32. package/dist/index.cjs.map +1 -0
  33. package/dist/index.d.ts +21 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +1102 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/lib/tenant.d.ts +3 -0
  38. package/dist/lib/tenant.d.ts.map +1 -0
  39. package/dist/locales/en.d.ts +2 -0
  40. package/dist/locales/en.d.ts.map +1 -0
  41. package/dist/locales/index.d.ts +2 -0
  42. package/dist/locales/index.d.ts.map +1 -0
  43. package/dist/locales/pt-BR.d.ts +2 -0
  44. package/dist/locales/pt-BR.d.ts.map +1 -0
  45. package/dist/registries.d.ts +3 -0
  46. package/dist/registries.d.ts.map +1 -0
  47. package/dist/store.d.ts +27 -0
  48. package/dist/store.d.ts.map +1 -0
  49. package/dist/types.d.ts +68 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/package.json +55 -0
  52. package/src/TasksContext.tsx +24 -0
  53. package/src/components/TaskCard.tsx +81 -0
  54. package/src/components/TaskDetail.tsx +184 -0
  55. package/src/components/TaskLabelBadge.tsx +37 -0
  56. package/src/components/TaskPriorityBadge.tsx +21 -0
  57. package/src/components/TaskQuickAdd.tsx +42 -0
  58. package/src/components/TaskStatusGroup.tsx +44 -0
  59. package/src/components/TasksDrawer.tsx +94 -0
  60. package/src/components/TasksFilterBar.tsx +57 -0
  61. package/src/components/TasksGeneralSettings.tsx +29 -0
  62. package/src/components/TasksTopbarButton.tsx +64 -0
  63. package/src/data/capability.test.ts +43 -0
  64. package/src/data/mock.ts +143 -0
  65. package/src/data/supabase.ts +193 -0
  66. package/src/data/types.ts +16 -0
  67. package/src/index.ts +217 -0
  68. package/src/lib/tenant.ts +13 -0
  69. package/src/locales/en.ts +40 -0
  70. package/src/locales/index.ts +7 -0
  71. package/src/locales/pt-BR.ts +40 -0
  72. package/src/migrations/001_tasks_base.sql +57 -0
  73. package/src/registries.ts +32 -0
  74. package/src/store.ts +148 -0
  75. package/src/types.ts +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TasksContext.tsx","../src/data/mock.ts","../src/data/supabase.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/registries.ts","../src/components/TasksGeneralSettings.tsx","../src/components/TasksFilterBar.tsx","../src/components/TaskQuickAdd.tsx","../src/components/TaskPriorityBadge.tsx","../src/components/TaskLabelBadge.tsx","../src/components/TaskCard.tsx","../src/components/TaskStatusGroup.tsx","../src/types.ts","../src/components/TaskDetail.tsx","../src/components/TasksDrawer.tsx","../src/components/TasksTopbarButton.tsx","../src/index.ts"],"names":["today","useTranslation","jsx","jsxs","useState","useCallback","ChevronDown","Calendar","React","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { createPluginContext } from '@fayz-ai/saas'\nimport type { TasksDataProvider } from './data/types'\nimport type { TasksUIState } from './store'\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface TasksPluginLabels {\n drawerTitle: string\n settingsTitle: string\n quickAddPlaceholder: string\n}\n\nexport interface ResolvedTasksConfig {\n labels: TasksPluginLabels\n}\n\nconst ctx = createPluginContext<ResolvedTasksConfig, TasksDataProvider, TasksUIState>('TasksContextProvider')\n\nexport const TasksContextProvider = ctx.ContextProvider\nexport const useTasksConfig = ctx.useConfig\nexport const useTasksProvider = ctx.useProvider\nexport const useTasksStore = ctx.useStore\n","import type { TasksDataProvider } from './types'\nimport type {\n Task, TaskLabel, CreateTaskInput, UpdateTaskInput,\n TaskQuery, TasksSummary, TaskStatus,\n} from '../types'\n\nfunction uid(): string { return crypto.randomUUID?.() ?? String(Date.now()) }\nfunction now(): string { return new Date().toISOString() }\nfunction today(): string { return new Date().toISOString().slice(0, 10) }\n\nconst SEED_LABELS: TaskLabel[] = [\n { id: 'lbl-bug', name: 'Bug', color: '#ef4444', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-feature', name: 'Feature', color: '#3b82f6', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-urgent', name: 'Urgent', color: '#f59e0b', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-personal', name: 'Personal', color: '#8b5cf6', isActive: true, tenantId: 'mock', createdAt: now() },\n]\n\nfunction makeSeedTasks(): Task[] {\n const base = {\n tenantId: 'mock',\n description: null,\n assignedToId: null,\n assignedToName: null,\n parentId: null,\n labels: [],\n createdById: null,\n createdByName: null,\n createdAt: now(),\n updatedAt: now(),\n }\n return [\n { ...base, id: uid(), title: 'Setup payment gateway', status: 'todo' as const, priority: 'high' as const, dueDate: today(), position: 0 },\n { ...base, id: uid(), title: 'Update menu photos', status: 'todo' as const, priority: 'medium' as const, dueDate: null, position: 1 },\n { ...base, id: uid(), title: 'Review monthly report', status: 'in_progress' as const, priority: 'medium' as const, dueDate: null, position: 0 },\n { ...base, id: uid(), title: 'Fix login bug', status: 'in_progress' as const, priority: 'urgent' as const, dueDate: today(), position: 1, labels: ['lbl-bug'] },\n { ...base, id: uid(), title: 'Onboard new employee', status: 'done' as const, priority: 'low' as const, dueDate: null, position: 0 },\n ]\n}\n\nfunction matchesQuery(task: Task, query: TaskQuery): boolean {\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n if (!statuses.includes(task.status)) return false\n }\n if (query.priority) {\n const priorities = Array.isArray(query.priority) ? query.priority : [query.priority]\n if (!priorities.includes(task.priority)) return false\n }\n if (query.assignedToId && task.assignedToId !== query.assignedToId) return false\n if (query.parentId !== undefined) {\n if (query.parentId === null && task.parentId !== null) return false\n if (query.parentId !== null && task.parentId !== query.parentId) return false\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n if (!task.title.toLowerCase().includes(s)) return false\n }\n if (query.overdue && task.dueDate) {\n if (task.dueDate >= today()) return false\n }\n return true\n}\n\nexport function createMockTasksProvider(): TasksDataProvider {\n let tasks = makeSeedTasks()\n const labels = [...SEED_LABELS]\n\n return {\n async getTasks(query) {\n return tasks.filter((t) => matchesQuery(t, query)).sort((a, b) => a.position - b.position)\n },\n\n async getTaskById(id) {\n return tasks.find((t) => t.id === id) ?? null\n },\n\n async getSubtasks(parentId) {\n return tasks.filter((t) => t.parentId === parentId).sort((a, b) => a.position - b.position)\n },\n\n async createTask(input: CreateTaskInput) {\n const statusTasks = tasks.filter((t) => t.status === (input.status ?? 'todo') && t.parentId === (input.parentId ?? null))\n const maxPos = statusTasks.reduce((max, t) => Math.max(max, t.position), -1)\n const task: Task = {\n id: uid(),\n title: input.title,\n description: input.description ?? null,\n status: input.status ?? 'todo',\n priority: input.priority ?? 'medium',\n dueDate: input.dueDate ?? null,\n assignedToId: input.assignedToId ?? null,\n assignedToName: null,\n parentId: input.parentId ?? null,\n labels: input.labels ?? [],\n position: maxPos + 1,\n createdById: null,\n createdByName: null,\n tenantId: 'mock',\n createdAt: now(),\n updatedAt: now(),\n }\n tasks.push(task)\n return task\n },\n\n async updateTask(id, input: UpdateTaskInput) {\n const idx = tasks.findIndex((t) => t.id === id)\n if (idx === -1) throw new Error('Task not found')\n tasks[idx] = { ...tasks[idx], ...input, updatedAt: now() } as Task\n return tasks[idx]\n },\n\n async deleteTask(id) {\n tasks = tasks.filter((t) => t.id !== id && t.parentId !== id)\n },\n\n async reorderTask(id, newPosition, status) {\n const task = tasks.find((t) => t.id === id)\n if (!task) return\n task.status = status\n task.position = newPosition\n task.updatedAt = now()\n },\n\n async getLabels() {\n return labels.filter((l) => l.isActive)\n },\n\n async getSummary() {\n const topLevel = tasks.filter((t) => t.parentId === null)\n const d = today()\n return {\n total: topLevel.length,\n todo: topLevel.filter((t) => t.status === 'todo').length,\n inProgress: topLevel.filter((t) => t.status === 'in_progress').length,\n done: topLevel.filter((t) => t.status === 'done').length,\n overdue: topLevel.filter((t) => t.dueDate != null && t.dueDate < d && t.status !== 'done' && t.status !== 'cancelled').length,\n dueToday: topLevel.filter((t) => t.dueDate === d && t.status !== 'done' && t.status !== 'cancelled').length,\n highPriority: topLevel.filter((t) => (t.priority === 'high' || t.priority === 'urgent') && t.status !== 'done' && t.status !== 'cancelled').length,\n }\n },\n }\n}\n","import type { TasksDataProvider } from './types'\nimport type { Task, TaskLabel, TasksSummary, TaskStatus } from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { getTasksTenantId } from '../lib/tenant'\n\nfunction getTenantId(): string | undefined {\n // Local override wins; else use the app's active tenant so writes pass RLS.\n return getTasksTenantId() ?? getActiveTenantId()\n}\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return result\n}\n\nfunction toTask(row: Record<string, unknown>): Task {\n const t = snakeToCamel(row) as unknown as Task\n // Ensure labels is always an array\n if (!Array.isArray(t.labels)) t.labels = []\n return t\n}\n\nexport function createSupabaseTasksProvider(): TasksDataProvider {\n return {\n async getTasks(query) {\n const tenantId = getTenantId()\n if (!tenantId) return []\n let q = getClient()\n .from('tsk_tasks')\n .select('*')\n .eq('tenant_id', tenantId)\n\n if (query.parentId === null) {\n q = q.is('parent_id', null)\n } else if (query.parentId) {\n q = q.eq('parent_id', query.parentId)\n }\n\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n q = q.in('status', statuses)\n }\n if (query.priority) {\n const priorities = Array.isArray(query.priority) ? query.priority : [query.priority]\n q = q.in('priority', priorities)\n }\n if (query.assignedToId) {\n q = q.eq('assigned_to_id', query.assignedToId)\n }\n if (query.search) {\n q = q.ilike('title', `%${query.search}%`)\n }\n if (query.overdue) {\n q = q.lt('due_date', new Date().toISOString().slice(0, 10))\n .not('status', 'in', '(\"done\",\"cancelled\")')\n }\n\n q = q.order('position', { ascending: true }).order('created_at', { ascending: false })\n\n const { data } = await q\n return (data ?? []).map(toTask)\n },\n\n async getTaskById(id) {\n const { data } = await getClient()\n .from('tsk_tasks')\n .select('*')\n .eq('id', id)\n .maybeSingle()\n return data ? toTask(data) : null\n },\n\n async getSubtasks(parentId) {\n const { data } = await getClient()\n .from('tsk_tasks')\n .select('*')\n .eq('parent_id', parentId)\n .order('position', { ascending: true })\n return (data ?? []).map(toTask)\n },\n\n async createTask(input) {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n // Get max position for the status group\n const { data: maxData } = await getClient()\n .from('tsk_tasks')\n .select('position')\n .eq('tenant_id', tenantId)\n .eq('status', input.status ?? 'todo')\n .is('parent_id', input.parentId ?? null)\n .order('position', { ascending: false })\n .limit(1)\n const maxPos = maxData?.[0]?.position ?? -1\n\n const { data, error } = await getClient()\n .from('tsk_tasks')\n .insert({\n tenant_id: tenantId,\n title: input.title,\n description: input.description ?? null,\n status: input.status ?? 'todo',\n priority: input.priority ?? 'medium',\n due_date: input.dueDate ?? null,\n assigned_to_id: input.assignedToId ?? null,\n parent_id: input.parentId ?? null,\n labels: input.labels ?? [],\n position: maxPos + 1,\n })\n .select('*')\n .single()\n if (error) throw error\n return toTask(data)\n },\n\n async updateTask(id, input) {\n const payload: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.title !== undefined) payload.title = input.title\n if (input.description !== undefined) payload.description = input.description\n if (input.status !== undefined) payload.status = input.status\n if (input.priority !== undefined) payload.priority = input.priority\n if (input.dueDate !== undefined) payload.due_date = input.dueDate\n if (input.assignedToId !== undefined) payload.assigned_to_id = input.assignedToId\n if (input.labels !== undefined) payload.labels = input.labels\n if (input.position !== undefined) payload.position = input.position\n\n const { data, error } = await getClient()\n .from('tsk_tasks')\n .update(payload)\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw error\n return toTask(data)\n },\n\n async deleteTask(id) {\n await getClient().from('tsk_tasks').delete().eq('id', id)\n },\n\n async reorderTask(id, newPosition, status) {\n await getClient()\n .from('tsk_tasks')\n .update({ position: newPosition, status, updated_at: new Date().toISOString() })\n .eq('id', id)\n },\n\n async getLabels() {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data } = await getClient()\n .from('tsk_labels')\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .order('name')\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as TaskLabel)\n },\n\n async getSummary() {\n const tenantId = getTenantId()\n if (!tenantId) return { total: 0, todo: 0, inProgress: 0, done: 0, overdue: 0, dueToday: 0, highPriority: 0 }\n\n const { data } = await getClient()\n .from('tsk_tasks')\n .select('status, priority, due_date')\n .eq('tenant_id', tenantId)\n .is('parent_id', null)\n\n const tasks = data ?? []\n const today = new Date().toISOString().slice(0, 10)\n return {\n total: tasks.length,\n todo: tasks.filter((t: any) => t.status === 'todo').length,\n inProgress: tasks.filter((t: any) => t.status === 'in_progress').length,\n done: tasks.filter((t: any) => t.status === 'done').length,\n overdue: tasks.filter((t: any) => t.due_date && t.due_date < today && t.status !== 'done' && t.status !== 'cancelled').length,\n dueToday: tasks.filter((t: any) => t.due_date === today && t.status !== 'done' && t.status !== 'cancelled').length,\n highPriority: tasks.filter((t: any) => (t.priority === 'high' || t.priority === 'urgent') && t.status !== 'done' && t.status !== 'cancelled').length,\n }\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/saas'\nimport type { TasksDataProvider } from './data/types'\nimport type {\n Task, TaskLabel, TasksSummary, TaskQuery,\n CreateTaskInput, UpdateTaskInput, TaskStatus,\n} from './types'\n\nexport interface TasksUIState {\n // Data\n tasks: Task[]\n tasksLoading: boolean\n labels: TaskLabel[]\n summary: TasksSummary | null\n summaryLoading: boolean\n\n // Drawer UI\n drawerOpen: boolean\n selectedTaskId: string | null\n activeFilter: TaskStatus | 'all'\n\n // Actions — data\n fetchTasks(query?: TaskQuery): Promise<void>\n fetchLabels(): Promise<void>\n fetchSummary(): Promise<void>\n createTask(input: CreateTaskInput): Promise<Task>\n updateTask(id: string, input: UpdateTaskInput): Promise<Task>\n deleteTask(id: string): Promise<void>\n reorderTask(id: string, newPosition: number, status: TaskStatus): Promise<void>\n\n // Actions — UI\n openDrawer(): void\n closeDrawer(): void\n toggleDrawer(): void\n selectTask(id: string | null): void\n setFilter(filter: TaskStatus | 'all'): void\n}\n\nexport function createTasksStore(provider: TasksDataProvider): StoreApi<TasksUIState> {\n return createStore<TasksUIState>((set, get) => ({\n tasks: [],\n tasksLoading: false,\n labels: [],\n summary: null,\n summaryLoading: false,\n\n drawerOpen: false,\n selectedTaskId: null,\n activeFilter: 'all',\n\n // ----- Data actions -----\n\n async fetchTasks(query?: TaskQuery) {\n return dedup('tasks:list', async () => {\n set({ tasksLoading: true })\n try {\n const filter = get().activeFilter\n const q: TaskQuery = {\n parentId: null,\n ...query,\n ...(filter !== 'all' ? { status: filter } : {}),\n }\n const tasks = await provider.getTasks(q)\n set({ tasks, tasksLoading: false })\n } catch {\n set({ tasksLoading: false })\n }\n })\n },\n\n async fetchLabels() {\n return dedup('tasks:labels', async () => {\n try {\n const labels = await provider.getLabels()\n set({ labels })\n } catch { /* silent */ }\n })\n },\n\n async fetchSummary() {\n return dedup('tasks:summary', async () => {\n set({ summaryLoading: true })\n try {\n const summary = await provider.getSummary()\n set({ summary, summaryLoading: false })\n } catch {\n set({ summaryLoading: false })\n }\n })\n },\n\n async createTask(input) {\n const task = await provider.createTask(input)\n // Re-fetch to get correct ordering\n await get().fetchTasks()\n await get().fetchSummary()\n return task\n },\n\n async updateTask(id, input) {\n const task = await provider.updateTask(id, input)\n // Update in-place for snappy UI, then re-fetch\n set((s) => ({ tasks: s.tasks.map((t) => (t.id === id ? task : t)) }))\n await get().fetchSummary()\n return task\n },\n\n async deleteTask(id) {\n await provider.deleteTask(id)\n set((s) => ({ tasks: s.tasks.filter((t) => t.id !== id), selectedTaskId: null }))\n await get().fetchSummary()\n },\n\n async reorderTask(id, newPosition, status) {\n await provider.reorderTask(id, newPosition, status)\n await get().fetchTasks()\n },\n\n // ----- UI actions -----\n\n openDrawer() {\n set({ drawerOpen: true })\n // Refresh data when opening\n get().fetchTasks()\n get().fetchLabels()\n get().fetchSummary()\n },\n\n closeDrawer() {\n set({ drawerOpen: false, selectedTaskId: null })\n },\n\n toggleDrawer() {\n const { drawerOpen } = get()\n if (drawerOpen) get().closeDrawer()\n else get().openDrawer()\n },\n\n selectTask(id) {\n set({ selectedTaskId: id })\n },\n\n setFilter(filter) {\n set({ activeFilter: filter })\n get().fetchTasks()\n },\n }))\n}\n","export const en: Record<string, string> = {\n 'tasks.title': 'Tasks',\n 'tasks.drawer.title': 'Tasks',\n 'tasks.drawer.subtitle': 'Manage your team tasks',\n 'tasks.quickAdd.placeholder': 'Add a task...',\n 'tasks.filter.all': 'All',\n 'tasks.filter.todo': 'To Do',\n 'tasks.filter.inProgress': 'In Progress',\n 'tasks.filter.done': 'Done',\n 'tasks.status.todo': 'To Do',\n 'tasks.status.in_progress': 'In Progress',\n 'tasks.status.done': 'Done',\n 'tasks.status.cancelled': 'Cancelled',\n 'tasks.priority.low': 'Low',\n 'tasks.priority.medium': 'Medium',\n 'tasks.priority.high': 'High',\n 'tasks.priority.urgent': 'Urgent',\n 'tasks.detail.description': 'Description',\n 'tasks.detail.descriptionPlaceholder': 'Add a description...',\n 'tasks.detail.status': 'Status',\n 'tasks.detail.priority': 'Priority',\n 'tasks.detail.dueDate': 'Due Date',\n 'tasks.detail.assignee': 'Assigned To',\n 'tasks.detail.labels': 'Labels',\n 'tasks.detail.subtasks': 'Subtasks',\n 'tasks.detail.delete': 'Delete Task',\n 'tasks.detail.deleteConfirm': 'Are you sure you want to delete this task?',\n 'tasks.detail.created': 'Created',\n 'tasks.detail.updated': 'Updated',\n 'tasks.detail.addSubtask': 'Add subtask...',\n 'tasks.detail.back': 'Back to list',\n 'tasks.summary.overdue': 'overdue',\n 'tasks.summary.dueToday': 'due today',\n 'tasks.empty': 'No tasks yet',\n 'tasks.empty.description': 'Add your first task using the input above',\n 'tasks.settings.title': 'Tasks',\n 'tasks.settings.general': 'General',\n 'tasks.settings.defaultPriority': 'Default Priority',\n 'tasks.settings.autoAssign': 'Auto-assign tasks to creator',\n}\n","export const ptBR: Record<string, string> = {\n 'tasks.title': 'Tarefas',\n 'tasks.drawer.title': 'Tarefas',\n 'tasks.drawer.subtitle': 'Gerencie as tarefas da equipe',\n 'tasks.quickAdd.placeholder': 'Adicionar tarefa...',\n 'tasks.filter.all': 'Todas',\n 'tasks.filter.todo': 'A Fazer',\n 'tasks.filter.inProgress': 'Em Andamento',\n 'tasks.filter.done': 'Concluídas',\n 'tasks.status.todo': 'A Fazer',\n 'tasks.status.in_progress': 'Em Andamento',\n 'tasks.status.done': 'Concluída',\n 'tasks.status.cancelled': 'Cancelada',\n 'tasks.priority.low': 'Baixa',\n 'tasks.priority.medium': 'Média',\n 'tasks.priority.high': 'Alta',\n 'tasks.priority.urgent': 'Urgente',\n 'tasks.detail.description': 'Descrição',\n 'tasks.detail.descriptionPlaceholder': 'Adicionar descrição...',\n 'tasks.detail.status': 'Status',\n 'tasks.detail.priority': 'Prioridade',\n 'tasks.detail.dueDate': 'Data de Vencimento',\n 'tasks.detail.assignee': 'Responsável',\n 'tasks.detail.labels': 'Etiquetas',\n 'tasks.detail.subtasks': 'Subtarefas',\n 'tasks.detail.delete': 'Excluir Tarefa',\n 'tasks.detail.deleteConfirm': 'Tem certeza que deseja excluir esta tarefa?',\n 'tasks.detail.created': 'Criada em',\n 'tasks.detail.updated': 'Atualizada em',\n 'tasks.detail.addSubtask': 'Adicionar subtarefa...',\n 'tasks.detail.back': 'Voltar à lista',\n 'tasks.summary.overdue': 'atrasadas',\n 'tasks.summary.dueToday': 'vencem hoje',\n 'tasks.empty': 'Nenhuma tarefa ainda',\n 'tasks.empty.description': 'Adicione sua primeira tarefa usando o campo acima',\n 'tasks.settings.title': 'Tarefas',\n 'tasks.settings.general': 'Geral',\n 'tasks.settings.defaultPriority': 'Prioridade Padrão',\n 'tasks.settings.autoAssign': 'Atribuir tarefas automaticamente ao criador',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const tasksLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst taskLabelEntity: EntityDef = {\n name: 'Task Label',\n namePlural: 'Task Labels',\n icon: 'Tag',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'color', label: 'Color', type: 'text', showInTable: true, defaultValue: '#6366f1' },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'tsk_labels', tenantScoped: true },\n}\n\nexport const tasksRegistries: PluginRegistryDef[] = [\n {\n id: 'task-labels',\n entity: taskLabelEntity,\n icon: 'Tag',\n description: 'Labels for categorizing tasks',\n display: 'table',\n seedData: [\n { id: 'lbl-bug', name: 'Bug', color: '#ef4444', isActive: true },\n { id: 'lbl-feature', name: 'Feature', color: '#3b82f6', isActive: true },\n { id: 'lbl-urgent', name: 'Urgent', color: '#f59e0b', isActive: true },\n { id: 'lbl-personal', name: 'Personal', color: '#8b5cf6', isActive: true },\n ],\n },\n]\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\n\nexport function TasksGeneralSettings() {\n const t = useTranslation()\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h3 className=\"text-sm font-semibold mb-1\">{t('tasks.settings.general')}</h3>\n <p className=\"text-xs text-muted-foreground mb-3\">\n {t('tasks.drawer.subtitle')}\n </p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('tasks.settings.defaultPriority')}</label>\n <select className=\"w-full max-w-xs rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm\">\n <option value=\"low\">{t('tasks.priority.low')}</option>\n <option value=\"medium\" selected>{t('tasks.priority.medium')}</option>\n <option value=\"high\">{t('tasks.priority.high')}</option>\n <option value=\"urgent\">{t('tasks.priority.urgent')}</option>\n </select>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../TasksContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { TaskStatus } from '../types'\n\nconst FILTERS: Array<{ key: TaskStatus | 'all'; labelKey: string }> = [\n { key: 'all', labelKey: 'tasks.filter.all' },\n { key: 'todo', labelKey: 'tasks.filter.todo' },\n { key: 'in_progress', labelKey: 'tasks.filter.inProgress' },\n { key: 'done', labelKey: 'tasks.filter.done' },\n]\n\nexport function TasksFilterBar() {\n const t = useTranslation()\n const activeFilter = useTasksStore((s) => s.activeFilter)\n const setFilter = useTasksStore((s) => s.setFilter)\n const summary = useTasksStore((s) => s.summary)\n\n const getCount = (key: TaskStatus | 'all'): number | undefined => {\n if (!summary) return undefined\n switch (key) {\n case 'all': return summary.total\n case 'todo': return summary.todo\n case 'in_progress': return summary.inProgress\n case 'done': return summary.done\n default: return undefined\n }\n }\n\n return (\n <div className=\"flex items-center gap-1 px-3 py-2 border-b overflow-x-auto\">\n {FILTERS.map(({ key, labelKey }) => {\n const active = activeFilter === key\n const count = getCount(key)\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => setFilter(key)}\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium transition-colors whitespace-nowrap ${\n active\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {t(labelKey)}\n {count != null && (\n <span className={`text-[10px] ${active ? 'text-primary-foreground/80' : 'text-muted-foreground'}`}>\n {count}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { Plus } from 'lucide-react'\nimport { useTasksStore, useTasksConfig } from '../TasksContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { TaskPriority } from '../types'\n\nexport function TaskQuickAdd({ parentId }: { parentId?: string | null }) {\n const t = useTranslation()\n const createTask = useTasksStore((s) => s.createTask)\n const [title, setTitle] = useState('')\n const [loading, setLoading] = useState(false)\n\n const handleSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n const trimmed = title.trim()\n if (!trimmed || loading) return\n setLoading(true)\n try {\n await createTask({\n title: trimmed,\n parentId: parentId ?? null,\n })\n setTitle('')\n } finally {\n setLoading(false)\n }\n }, [title, loading, createTask, parentId])\n\n return (\n <form onSubmit={handleSubmit} className=\"flex items-center gap-2 px-3 py-2 border-b\">\n <Plus className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={parentId ? t('tasks.detail.addSubtask') : t('tasks.quickAdd.placeholder')}\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground/60\"\n disabled={loading}\n />\n </form>\n )\n}\n","import React from 'react'\nimport { AlertTriangle, ArrowUp, ArrowDown, Minus } from 'lucide-react'\nimport type { TaskPriority } from '../types'\n\nconst PRIORITY_CONFIG: Record<TaskPriority, { color: string; bg: string; icon: React.ComponentType<{ className?: string }> }> = {\n low: { color: 'text-muted-foreground', bg: 'bg-muted', icon: ArrowDown },\n medium: { color: 'text-info-soft-foreground', bg: 'bg-info-soft', icon: Minus },\n high: { color: 'text-warning-soft-foreground', bg: 'bg-warning-soft', icon: ArrowUp },\n urgent: { color: 'text-destructive-soft-foreground', bg: 'bg-destructive-soft', icon: AlertTriangle },\n}\n\nexport function TaskPriorityBadge({ priority, showLabel }: { priority: TaskPriority; showLabel?: boolean }) {\n const cfg = PRIORITY_CONFIG[priority]\n const Icon = cfg.icon\n return (\n <span className={`inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-xs font-medium ${cfg.color} ${cfg.bg}`}>\n <Icon className=\"h-3 w-3\" />\n {showLabel && <span className=\"capitalize\">{priority}</span>}\n </span>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../TasksContext'\n\nexport function TaskLabelBadge({ labelId }: { labelId: string }) {\n const labels = useTasksStore((s) => s.labels)\n const label = labels.find((l) => l.id === labelId)\n if (!label) return null\n\n return (\n <span\n className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium leading-none\"\n style={{\n backgroundColor: label.color + '20',\n color: label.color,\n }}\n >\n {label.name}\n </span>\n )\n}\n\nexport function TaskLabelBadges({ labelIds, max = 2 }: { labelIds: string[]; max?: number }) {\n if (labelIds.length === 0) return null\n const visible = labelIds.slice(0, max)\n const overflow = labelIds.length - max\n\n return (\n <span className=\"inline-flex items-center gap-1\">\n {visible.map((id) => (\n <TaskLabelBadge key={id} labelId={id} />\n ))}\n {overflow > 0 && (\n <span className=\"text-[10px] text-muted-foreground\">+{overflow}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { Calendar, ListChecks } from 'lucide-react'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { useTasksStore } from '../TasksContext'\nimport { TaskPriorityBadge } from './TaskPriorityBadge'\nimport { TaskLabelBadges } from './TaskLabelBadge'\nimport type { Task } from '../types'\n\nfunction isOverdue(dueDate: string | null): boolean {\n if (!dueDate) return false\n return dueDate < new Date().toISOString().slice(0, 10)\n}\n\nfunction isToday(dueDate: string | null): boolean {\n if (!dueDate) return false\n return dueDate === new Date().toISOString().slice(0, 10)\n}\n\nfunction formatDueDate(dueDate: string): string {\n const d = new Date(dueDate + 'T00:00:00')\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\n}\n\nexport function TaskCard({ task, subtaskCount }: { task: Task; subtaskCount?: { done: number; total: number } }) {\n const selectTask = useTasksStore((s) => s.selectTask)\n const updateTask = useTasksStore((s) => s.updateTask)\n\n const isDone = task.status === 'done'\n const overdue = !isDone && isOverdue(task.dueDate)\n const dueToday = !isDone && isToday(task.dueDate)\n\n const handleCheck = (e: React.MouseEvent) => {\n e.stopPropagation()\n updateTask(task.id, { status: isDone ? 'todo' : 'done' })\n }\n\n return (\n <div\n onClick={() => selectTask(task.id)}\n className=\"group flex items-start gap-2.5 rounded-lg border border-transparent px-3 py-2.5 transition-colors hover:bg-muted bg-card shadow-button active:shadow-button-inset hover:border-border cursor-pointer\"\n >\n <div className=\"pt-0.5\" onClick={handleCheck}>\n <Checkbox checked={isDone} onChange={() => {}} />\n </div>\n\n <div className=\"min-w-0 flex-1 space-y-1\">\n <p className={`text-sm leading-snug ${isDone ? 'line-through text-muted-foreground' : ''}`}>\n {task.title}\n </p>\n\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <TaskPriorityBadge priority={task.priority} />\n\n {task.dueDate && (\n <span className={`inline-flex items-center gap-1 text-[11px] ${\n overdue ? 'text-destructive font-medium' : dueToday ? 'text-warning font-medium' : 'text-muted-foreground'\n }`}>\n <Calendar className=\"h-3 w-3\" />\n {formatDueDate(task.dueDate)}\n </span>\n )}\n\n {subtaskCount && subtaskCount.total > 0 && (\n <span className=\"inline-flex items-center gap-1 text-[11px] text-muted-foreground\">\n <ListChecks className=\"h-3 w-3\" />\n {subtaskCount.done}/{subtaskCount.total}\n </span>\n )}\n\n <TaskLabelBadges labelIds={task.labels} max={2} />\n </div>\n </div>\n\n {task.assignedToName && (\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-[10px] font-medium text-primary\" title={task.assignedToName}>\n {task.assignedToName.split(' ').map((n) => n[0]).join('').slice(0, 2).toUpperCase()}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TaskCard } from './TaskCard'\nimport type { Task, TaskStatus } from '../types'\n\nconst STATUS_COLORS: Record<TaskStatus, string> = {\n todo: 'bg-muted-foreground',\n in_progress: 'bg-info',\n done: 'bg-success',\n cancelled: 'bg-muted-foreground/60',\n}\n\nexport function TaskStatusGroup({ status, tasks }: { status: TaskStatus; tasks: Task[] }) {\n const t = useTranslation()\n const [collapsed, setCollapsed] = useState(status === 'cancelled')\n\n if (tasks.length === 0) return null\n\n const Chevron = collapsed ? ChevronRight : ChevronDown\n\n return (\n <div className=\"space-y-0.5\">\n <button\n type=\"button\"\n onClick={() => setCollapsed(!collapsed)}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider hover:text-foreground transition-colors\"\n >\n <span className={`h-2 w-2 rounded-full ${STATUS_COLORS[status]}`} />\n <span>{t(`tasks.status.${status}`)}</span>\n <span className=\"text-[10px] font-normal\">({tasks.length})</span>\n <Chevron className=\"ml-auto h-3.5 w-3.5\" />\n </button>\n\n {!collapsed && (\n <div>\n {tasks.map((task) => (\n <TaskCard key={task.id} task={task} />\n ))}\n </div>\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Tasks Plugin — Domain Types\n// ---------------------------------------------------------------------------\n\nexport type TaskStatus = 'todo' | 'in_progress' | 'done' | 'cancelled'\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent'\n\nexport const TASK_STATUSES: TaskStatus[] = ['todo', 'in_progress', 'done', 'cancelled']\nexport const TASK_PRIORITIES: TaskPriority[] = ['low', 'medium', 'high', 'urgent']\n\n// ---------------------------------------------------------------------------\n// Core entities\n// ---------------------------------------------------------------------------\n\nexport interface Task {\n id: string\n title: string\n description: string | null\n status: TaskStatus\n priority: TaskPriority\n dueDate: string | null\n assignedToId: string | null\n assignedToName: string | null\n parentId: string | null\n labels: string[]\n position: number\n createdById: string | null\n createdByName: string | null\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface TaskLabel {\n id: string\n name: string\n color: string\n isActive: boolean\n tenantId: string\n createdAt: string\n}\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface CreateTaskInput {\n title: string\n description?: string\n status?: TaskStatus\n priority?: TaskPriority\n dueDate?: string | null\n assignedToId?: string | null\n parentId?: string | null\n labels?: string[]\n}\n\nexport interface UpdateTaskInput {\n title?: string\n description?: string | null\n status?: TaskStatus\n priority?: TaskPriority\n dueDate?: string | null\n assignedToId?: string | null\n labels?: string[]\n position?: number\n}\n\n// ---------------------------------------------------------------------------\n// Query types\n// ---------------------------------------------------------------------------\n\nexport interface TaskQuery {\n status?: TaskStatus | TaskStatus[]\n priority?: TaskPriority | TaskPriority[]\n assignedToId?: string\n parentId?: string | null\n search?: string\n overdue?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Aggregation\n// ---------------------------------------------------------------------------\n\nexport interface TasksSummary {\n total: number\n todo: number\n inProgress: number\n done: number\n overdue: number\n dueToday: number\n highPriority: number\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ArrowLeft, Trash2, Calendar, ChevronDown } from 'lucide-react'\nimport { useTasksStore } from '../TasksContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TaskPriorityBadge } from './TaskPriorityBadge'\nimport { TaskLabelBadges } from './TaskLabelBadge'\nimport { TaskQuickAdd } from './TaskQuickAdd'\nimport { TaskCard } from './TaskCard'\nimport type { Task, TaskStatus, TaskPriority } from '../types'\nimport { TASK_STATUSES, TASK_PRIORITIES } from '../types'\n\nconst STATUS_DOT: Record<TaskStatus, string> = {\n todo: 'bg-muted-foreground',\n in_progress: 'bg-info',\n done: 'bg-success',\n cancelled: 'bg-muted-foreground/60',\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\n}\n\nexport function TaskDetail({ taskId }: { taskId: string }) {\n const t = useTranslation()\n const tasks = useTasksStore((s) => s.tasks)\n const selectTask = useTasksStore((s) => s.selectTask)\n const updateTask = useTasksStore((s) => s.updateTask)\n const deleteTask = useTasksStore((s) => s.deleteTask)\n\n const task = tasks.find((tt) => tt.id === taskId)\n\n const [title, setTitle] = useState('')\n const [description, setDescription] = useState('')\n const [subtasks, setSubtasks] = useState<Task[]>([])\n\n useEffect(() => {\n if (task) {\n setTitle(task.title)\n setDescription(task.description ?? '')\n }\n }, [task])\n\n useEffect(() => { setSubtasks([]) }, [taskId])\n\n const handleTitleBlur = useCallback(() => {\n if (task && title.trim() && title !== task.title) {\n updateTask(task.id, { title: title.trim() })\n }\n }, [task, title, updateTask])\n\n const handleDescriptionBlur = useCallback(() => {\n if (task && description !== (task.description ?? '')) {\n updateTask(task.id, { description: description || null })\n }\n }, [task, description, updateTask])\n\n const handleDelete = useCallback(() => {\n if (task && confirm(t('tasks.detail.deleteConfirm'))) {\n deleteTask(task.id)\n }\n }, [task, deleteTask, t])\n\n if (!task) {\n return (\n <div className=\"flex flex-col items-center justify-center py-8 text-muted-foreground\">\n <p className=\"text-sm\">Task not found</p>\n <button type=\"button\" onClick={() => selectTask(null)} className=\"mt-2 text-xs text-primary hover:underline\">\n {t('tasks.detail.back')}\n </button>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-3\">\n {/* Back + title row */}\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => selectTask(null)}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={handleTitleBlur}\n onKeyDown={(e) => { if (e.key === 'Enter') e.currentTarget.blur() }}\n className=\"flex-1 bg-transparent text-sm font-semibold outline-none\"\n />\n </div>\n\n {/* Inline property chips */}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {/* Status chip */}\n <div className=\"relative\">\n <select\n value={task.status}\n onChange={(e) => updateTask(task.id, { status: e.target.value as TaskStatus })}\n className=\"appearance-none rounded-full border bg-background pl-5 pr-6 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors\"\n >\n {TASK_STATUSES.map((s) => (\n <option key={s} value={s}>{t(`tasks.status.${s}`)}</option>\n ))}\n </select>\n <span className={`absolute left-2 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full ${STATUS_DOT[task.status]}`} />\n <ChevronDown className=\"absolute right-1.5 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Priority chip */}\n <div className=\"relative\">\n <select\n value={task.priority}\n onChange={(e) => updateTask(task.id, { priority: e.target.value as TaskPriority })}\n className=\"appearance-none rounded-full border bg-background pl-2 pr-6 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors\"\n >\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>{t(`tasks.priority.${p}`)}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-1.5 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Due date chip */}\n <div className=\"relative\">\n <input\n type=\"date\"\n value={task.dueDate ?? ''}\n onChange={(e) => updateTask(task.id, { dueDate: e.target.value || null })}\n className=\"appearance-none rounded-full border bg-background pl-6 pr-2 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors w-[120px]\"\n />\n <Calendar className=\"absolute left-2 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Labels */}\n {task.labels.length > 0 && <TaskLabelBadges labelIds={task.labels} max={3} />}\n </div>\n\n {/* Description */}\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onBlur={handleDescriptionBlur}\n placeholder={t('tasks.detail.descriptionPlaceholder')}\n rows={3}\n className=\"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-xs outline-none resize-none placeholder:text-muted-foreground/50 leading-relaxed\"\n />\n\n {/* Subtasks */}\n <div>\n <p className=\"text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-1\">\n {t('tasks.detail.subtasks')}\n </p>\n <div className=\"rounded-md border overflow-hidden\">\n <TaskQuickAdd parentId={task.id} />\n {subtasks.length > 0 && (\n <div className=\"divide-y\">\n {subtasks.map((st) => (\n <TaskCard key={st.id} task={st} />\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Footer: timestamps + delete */}\n <div className=\"flex items-center justify-between pt-2 border-t\">\n <span className=\"text-[10px] text-muted-foreground\">\n {formatDate(task.createdAt)} · {t('tasks.detail.updated')} {formatDate(task.updatedAt)}\n </span>\n <button\n type=\"button\"\n onClick={handleDelete}\n className=\"inline-flex items-center gap-1 text-[11px] text-muted-foreground hover:text-destructive transition-colors\"\n >\n <Trash2 className=\"h-3 w-3\" />\n {t('tasks.detail.delete')}\n </button>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport {\n Sheet, SheetContent, SheetHeader, SheetBody, SheetTitle, SheetDescription,\n} from '@fayz-ai/ui'\nimport { useTasksStore } from '../TasksContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksFilterBar } from './TasksFilterBar'\nimport { TaskQuickAdd } from './TaskQuickAdd'\nimport { TaskCard } from './TaskCard'\nimport { TaskStatusGroup } from './TaskStatusGroup'\nimport { TaskDetail } from './TaskDetail'\nimport { ClipboardList } from 'lucide-react'\nimport type { TaskStatus } from '../types'\n\nconst STATUS_ORDER: TaskStatus[] = ['todo', 'in_progress', 'done', 'cancelled']\n\nexport function TasksDrawer() {\n const t = useTranslation()\n const drawerOpen = useTasksStore((s) => s.drawerOpen)\n const closeDrawer = useTasksStore((s) => s.closeDrawer)\n const selectedTaskId = useTasksStore((s) => s.selectedTaskId)\n const tasks = useTasksStore((s) => s.tasks)\n const tasksLoading = useTasksStore((s) => s.tasksLoading)\n const summary = useTasksStore((s) => s.summary)\n const activeFilter = useTasksStore((s) => s.activeFilter)\n\n // Group tasks by status\n const grouped = React.useMemo(() => {\n const map = new Map<TaskStatus, typeof tasks>()\n for (const s of STATUS_ORDER) map.set(s, [])\n for (const task of tasks) {\n const group = map.get(task.status)\n if (group) group.push(task)\n }\n return map\n }, [tasks])\n\n // Summary line\n const summaryLine = React.useMemo(() => {\n if (!summary) return ''\n const parts: string[] = []\n if (summary.overdue > 0) parts.push(`${summary.overdue} ${t('tasks.summary.overdue')}`)\n if (summary.dueToday > 0) parts.push(`${summary.dueToday} ${t('tasks.summary.dueToday')}`)\n return parts.join(' · ')\n }, [summary, t])\n\n return (\n <Sheet open={drawerOpen} onOpenChange={(v) => { if (!v) closeDrawer() }}>\n <SheetContent width=\"max-w-lg\" overlay=\"dim\">\n <SheetHeader>\n <SheetTitle>{t('tasks.drawer.title')}</SheetTitle>\n <SheetDescription>\n {summaryLine || t('tasks.drawer.subtitle')}\n </SheetDescription>\n </SheetHeader>\n\n {!selectedTaskId && <TasksFilterBar />}\n {!selectedTaskId && <TaskQuickAdd />}\n\n <SheetBody className=\"px-0 py-0\">\n {selectedTaskId ? (\n <div className=\"px-5 py-4\">\n <TaskDetail taskId={selectedTaskId} />\n </div>\n ) : tasksLoading && tasks.length === 0 ? (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n ) : tasks.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-muted-foreground\">\n <ClipboardList className=\"h-10 w-10 mb-3 opacity-40\" />\n <p className=\"text-sm font-medium\">{t('tasks.empty')}</p>\n <p className=\"text-xs mt-1\">{t('tasks.empty.description')}</p>\n </div>\n ) : activeFilter !== 'all' ? (\n <div className=\"py-1\">\n {tasks.map((task) => (\n <div key={task.id} className=\"px-2\">\n <TaskCard task={task} />\n </div>\n ))}\n </div>\n ) : (\n <div className=\"py-2 space-y-2\">\n {STATUS_ORDER.filter((s) => s !== 'cancelled' || (grouped.get(s)?.length ?? 0) > 0).map((status) => (\n <TaskStatusGroup key={status} status={status} tasks={grouped.get(status) ?? []} />\n ))}\n </div>\n )}\n </SheetBody>\n </SheetContent>\n </Sheet>\n )\n}\n","import React, { useEffect } from 'react'\nimport { CheckSquare } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { TasksContextProvider, type ResolvedTasksConfig } from '../TasksContext'\nimport { TasksDrawer } from './TasksDrawer'\nimport type { TasksDataProvider } from '../data/types'\nimport type { TasksUIState } from '../store'\nimport { useStore, type StoreApi } from 'zustand'\n\ninterface TasksTopbarWidgetProps {\n config: {\n tasksConfig: ResolvedTasksConfig\n tasksProvider: TasksDataProvider\n tasksStore: StoreApi<TasksUIState>\n }\n}\n\nexport function TasksTopbarButton({ config }: TasksTopbarWidgetProps) {\n const { tasksConfig, tasksProvider, tasksStore } = config\n\n return (\n <TasksContextProvider config={tasksConfig} provider={tasksProvider} store={tasksStore}>\n <TasksTopbarButtonInner store={tasksStore} />\n <TasksDrawer />\n </TasksContextProvider>\n )\n}\n\nfunction TasksTopbarButtonInner({ store }: { store: StoreApi<TasksUIState> }) {\n const toggleDrawer = useStore(store, (s) => s.toggleDrawer)\n const fetchSummary = useStore(store, (s) => s.fetchSummary)\n const summary = useStore(store, (s) => s.summary)\n\n useEffect(() => {\n fetchSummary()\n }, [fetchSummary])\n\n const pendingCount = summary ? summary.todo + summary.inProgress : 0\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn('relative text-sidebar-foreground/70 hover:bg-sidebar/30 hover:text-sidebar-foreground')}\n onClick={toggleDrawer}\n aria-label=\"Tasks\"\n >\n <CheckSquare className=\"h-5 w-5\" />\n {pendingCount > 0 && (\n <span\n className={cn(\n 'absolute -right-0.5 -top-0.5 flex items-center justify-center rounded-full bg-destructive text-destructive-foreground',\n pendingCount > 9\n ? 'h-5 min-w-5 px-1 text-[10px]'\n : 'h-4 w-4 text-[10px]'\n )}\n >\n {pendingCount > 99 ? '99+' : pendingCount}\n </span>\n )}\n </Button>\n )\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { TasksContextProvider, type ResolvedTasksConfig, type TasksPluginLabels } from './TasksContext'\nimport type { TasksDataProvider } from './data/types'\nimport type { TaskPriority } from './types'\nimport { createMockTasksProvider } from './data/mock'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { createSupabaseTasksProvider } from './data/supabase'\nimport { createTasksStore } from './store'\nimport { tasksLocales } from './locales'\nimport { tasksRegistries } from './registries'\nimport { TasksGeneralSettings } from './components/TasksGeneralSettings'\nimport { TasksTopbarButton } from './components/TasksTopbarButton'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface TasksPluginOptions {\n /** Label overrides */\n labels?: Partial<TasksPluginLabels>\n /** Plugin scope */\n scope?: PluginScope\n /** Vertical ID */\n verticalId?: VerticalId\n /** Data provider override (defaults to safe auto-selection) */\n dataProvider?: TasksDataProvider\n /** Default priority for new tasks (default: 'medium') */\n defaultPriority?: TaskPriority\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: TasksPluginLabels = {\n drawerTitle: 'Tasks',\n settingsTitle: 'Tasks',\n quickAddPlaceholder: 'Add a task...',\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: TasksPluginOptions): ResolvedTasksConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Migration SQL\n// ---------------------------------------------------------------------------\n\nconst MIGRATION_001 = `-- Tasks Plugin: Base Tables\nCREATE TABLE IF NOT EXISTS public.tsk_labels (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES saas_core.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n color text NOT NULL DEFAULT '#6366f1',\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.tsk_labels ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_tsk_labels_tenant ON public.tsk_labels(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.tsk_tasks (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES saas_core.tenants(id) ON DELETE CASCADE,\n title text NOT NULL,\n description text,\n status text NOT NULL DEFAULT 'todo' CHECK (status IN ('todo','in_progress','done','cancelled')),\n priority text NOT NULL DEFAULT 'medium' CHECK (priority IN ('low','medium','high','urgent')),\n due_date date,\n assigned_to_id uuid,\n assigned_to_name text,\n parent_id uuid REFERENCES public.tsk_tasks(id) ON DELETE CASCADE,\n labels jsonb NOT NULL DEFAULT '[]'::jsonb,\n position integer NOT NULL DEFAULT 0,\n created_by_id uuid,\n created_by_name text,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.tsk_tasks ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_tsk_tasks_tenant ON public.tsk_tasks(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_tsk_tasks_status ON public.tsk_tasks(tenant_id, status);\nCREATE INDEX IF NOT EXISTS idx_tsk_tasks_parent ON public.tsk_tasks(parent_id);\nCREATE INDEX IF NOT EXISTS idx_tsk_tasks_assigned ON public.tsk_tasks(assigned_to_id);\nCREATE INDEX IF NOT EXISTS idx_tsk_tasks_due ON public.tsk_tasks(tenant_id, due_date) WHERE due_date IS NOT NULL;\n\n-- RLS policies for tsk_tasks\nCREATE POLICY tsk_tasks_select ON public.tsk_tasks FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY tsk_tasks_insert ON public.tsk_tasks FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY tsk_tasks_update ON public.tsk_tasks FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY tsk_tasks_delete ON public.tsk_tasks FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.tsk_tasks TO authenticated;\n\n-- RLS policies for tsk_labels\nCREATE POLICY tsk_labels_select ON public.tsk_labels FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY tsk_labels_insert ON public.tsk_labels FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY tsk_labels_update ON public.tsk_labels FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY tsk_labels_delete ON public.tsk_labels FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.tsk_labels TO authenticated;`\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createTasksPlugin(options?: TasksPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Register locales globally so the plugin's translations resolve even when the\n // host shell does not mount @fayz-ai/core's I18nProvider (incremental de-bridge).\n registerTranslations(tasksLocales)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseTasksProvider(),\n () => createMockTasksProvider(),\n )\n const store = createTasksStore(provider)\n\n return {\n id: 'tasks',\n name: config.labels.drawerTitle,\n icon: 'CheckSquare',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n\n navigation: [],\n\n routes: [],\n\n widgets: [\n {\n id: 'tasks-topbar-button',\n zone: 'shell.topbar.end',\n component: TasksTopbarButton as unknown as React.ComponentType<unknown>,\n order: 10,\n props: {\n tasksConfig: config,\n tasksProvider: provider,\n tasksStore: store,\n },\n },\n ],\n\n aiTools: [\n {\n id: 'tasks.summary',\n name: 'getTasksSummary',\n description: 'Returns a summary of pending tasks: total, overdue, due today, by status and priority.',\n icon: 'CheckSquare',\n mode: 'read' as const,\n category: 'Tasks',\n parameters: {\n type: 'object' as const,\n properties: {\n status: {\n type: 'string' as const,\n description: 'Filter by task status',\n enum: ['todo', 'in_progress', 'done', 'cancelled', 'all'],\n },\n },\n },\n suggestions: [\n { label: 'What tasks are overdue?' },\n { label: 'How many tasks are pending?' },\n { label: \"What's due today?\" },\n ],\n },\n ],\n\n registries: tasksRegistries,\n\n settings: [\n {\n id: 'tasks',\n label: config.labels.settingsTitle,\n icon: 'CheckSquare',\n component: (() => {\n const Tab: React.FC = () =>\n React.createElement(TasksContextProvider, { config, provider, store },\n React.createElement(TasksGeneralSettings),\n )\n Tab.displayName = 'TasksSettingsTab'\n return Tab as unknown as React.ComponentType<unknown>\n })(),\n order: 14,\n },\n ],\n\n migrations: [\n {\n id: 'tasks-001-base-tables',\n version: '1.0.0',\n sql: MIGRATION_001,\n description: 'Create tsk_tasks and tsk_labels tables',\n },\n ],\n\n locales: tasksLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type { TasksDataProvider } from './data/types'\nexport type { ResolvedTasksConfig, TasksPluginLabels } from './TasksContext'\nexport type {\n Task, TaskLabel, TaskStatus, TaskPriority, TasksSummary,\n CreateTaskInput, UpdateTaskInput, TaskQuery,\n} from './types'\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function setTasksTenantId(id: string | undefined): void;
2
+ export declare function getTasksTenantId(): string | undefined;
3
+ //# sourceMappingURL=tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/lib/tenant.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD"}
@@ -0,0 +1,2 @@
1
+ export declare const en: Record<string, string>;
2
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuCrC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const tasksLocales: Record<string, Record<string, string>>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/locales/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAG/D,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const ptBR: Record<string, string>;
2
+ //# sourceMappingURL=pt-BR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuCvC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { PluginRegistryDef } from '@fayz-ai/core';
2
+ export declare const tasksRegistries: PluginRegistryDef[];
3
+ //# sourceMappingURL=registries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAiBtD,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAc9C,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { type StoreApi } from 'zustand/vanilla';
2
+ import type { TasksDataProvider } from './data/types';
3
+ import type { Task, TaskLabel, TasksSummary, TaskQuery, CreateTaskInput, UpdateTaskInput, TaskStatus } from './types';
4
+ export interface TasksUIState {
5
+ tasks: Task[];
6
+ tasksLoading: boolean;
7
+ labels: TaskLabel[];
8
+ summary: TasksSummary | null;
9
+ summaryLoading: boolean;
10
+ drawerOpen: boolean;
11
+ selectedTaskId: string | null;
12
+ activeFilter: TaskStatus | 'all';
13
+ fetchTasks(query?: TaskQuery): Promise<void>;
14
+ fetchLabels(): Promise<void>;
15
+ fetchSummary(): Promise<void>;
16
+ createTask(input: CreateTaskInput): Promise<Task>;
17
+ updateTask(id: string, input: UpdateTaskInput): Promise<Task>;
18
+ deleteTask(id: string): Promise<void>;
19
+ reorderTask(id: string, newPosition: number, status: TaskStatus): Promise<void>;
20
+ openDrawer(): void;
21
+ closeDrawer(): void;
22
+ toggleDrawer(): void;
23
+ selectTask(id: string | null): void;
24
+ setFilter(filter: TaskStatus | 'all'): void;
25
+ }
26
+ export declare function createTasksStore(provider: TasksDataProvider): StoreApi<TasksUIState>;
27
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EACV,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EACxC,eAAe,EAAE,eAAe,EAAE,UAAU,EAC7C,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,YAAY;IAE3B,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,YAAY,EAAE,OAAO,CAAA;IACrB,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;IAC5B,cAAc,EAAE,OAAO,CAAA;IAGvB,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,EAAE,UAAU,GAAG,KAAK,CAAA;IAGhC,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAG/E,UAAU,IAAI,IAAI,CAAA;IAClB,WAAW,IAAI,IAAI,CAAA;IACnB,YAAY,IAAI,IAAI,CAAA;IACpB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IACnC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG,IAAI,CAAA;CAC5C;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,QAAQ,CAAC,YAAY,CAAC,CA6GpF"}
@@ -0,0 +1,68 @@
1
+ export type TaskStatus = 'todo' | 'in_progress' | 'done' | 'cancelled';
2
+ export type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';
3
+ export declare const TASK_STATUSES: TaskStatus[];
4
+ export declare const TASK_PRIORITIES: TaskPriority[];
5
+ export interface Task {
6
+ id: string;
7
+ title: string;
8
+ description: string | null;
9
+ status: TaskStatus;
10
+ priority: TaskPriority;
11
+ dueDate: string | null;
12
+ assignedToId: string | null;
13
+ assignedToName: string | null;
14
+ parentId: string | null;
15
+ labels: string[];
16
+ position: number;
17
+ createdById: string | null;
18
+ createdByName: string | null;
19
+ tenantId: string;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ }
23
+ export interface TaskLabel {
24
+ id: string;
25
+ name: string;
26
+ color: string;
27
+ isActive: boolean;
28
+ tenantId: string;
29
+ createdAt: string;
30
+ }
31
+ export interface CreateTaskInput {
32
+ title: string;
33
+ description?: string;
34
+ status?: TaskStatus;
35
+ priority?: TaskPriority;
36
+ dueDate?: string | null;
37
+ assignedToId?: string | null;
38
+ parentId?: string | null;
39
+ labels?: string[];
40
+ }
41
+ export interface UpdateTaskInput {
42
+ title?: string;
43
+ description?: string | null;
44
+ status?: TaskStatus;
45
+ priority?: TaskPriority;
46
+ dueDate?: string | null;
47
+ assignedToId?: string | null;
48
+ labels?: string[];
49
+ position?: number;
50
+ }
51
+ export interface TaskQuery {
52
+ status?: TaskStatus | TaskStatus[];
53
+ priority?: TaskPriority | TaskPriority[];
54
+ assignedToId?: string;
55
+ parentId?: string | null;
56
+ search?: string;
57
+ overdue?: boolean;
58
+ }
59
+ export interface TasksSummary {
60
+ total: number;
61
+ todo: number;
62
+ inProgress: number;
63
+ done: number;
64
+ overdue: number;
65
+ dueToday: number;
66
+ highPriority: number;
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,CAAA;AACtE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;AAE/D,eAAO,MAAM,aAAa,EAAE,UAAU,EAAiD,CAAA;AACvF,eAAO,MAAM,eAAe,EAAE,YAAY,EAAwC,CAAA;AAMlF,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAA;IAClC,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;IACxC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACrB"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@fayz-ai/plugin-tasks",
3
+ "version": "0.1.1",
4
+ "description": "Fayz SDK — plugin-tasks plugin",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "source": "./src/index.ts",
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src"
20
+ ],
21
+ "peerDependencies": {
22
+ "react": "^18.0.0 || ^19.0.0",
23
+ "react-dom": "^18.0.0 || ^19.0.0"
24
+ },
25
+ "dependencies": {
26
+ "lucide-react": "^0.400.0",
27
+ "zustand": "^4.5.0",
28
+ "@fayz-ai/core": "^0.1.6",
29
+ "@fayz-ai/saas": "^0.1.6",
30
+ "@fayz-ai/ui": "^0.1.6"
31
+ },
32
+ "devDependencies": {
33
+ "@types/react": "^18.3.0",
34
+ "react": "^18.3.0",
35
+ "tsup": "^8.2.0",
36
+ "typescript": "^5.5.0",
37
+ "vitest": "^2.1.9"
38
+ },
39
+ "license": "MIT",
40
+ "keywords": [
41
+ "fayz",
42
+ "fayz-plugin",
43
+ "fayz-sdk"
44
+ ],
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "scripts": {
49
+ "build": "tsup && tsc --emitDeclarationOnly --declaration --declarationMap --noEmit false",
50
+ "dev": "tsup --watch",
51
+ "typecheck": "tsc --noEmit",
52
+ "test": "vitest run",
53
+ "clean": "rm -rf dist"
54
+ }
55
+ }
@@ -0,0 +1,24 @@
1
+ import { createPluginContext } from '@fayz-ai/saas'
2
+ import type { TasksDataProvider } from './data/types'
3
+ import type { TasksUIState } from './store'
4
+
5
+ // ---------------------------------------------------------------------------
6
+ // Config
7
+ // ---------------------------------------------------------------------------
8
+
9
+ export interface TasksPluginLabels {
10
+ drawerTitle: string
11
+ settingsTitle: string
12
+ quickAddPlaceholder: string
13
+ }
14
+
15
+ export interface ResolvedTasksConfig {
16
+ labels: TasksPluginLabels
17
+ }
18
+
19
+ const ctx = createPluginContext<ResolvedTasksConfig, TasksDataProvider, TasksUIState>('TasksContextProvider')
20
+
21
+ export const TasksContextProvider = ctx.ContextProvider
22
+ export const useTasksConfig = ctx.useConfig
23
+ export const useTasksProvider = ctx.useProvider
24
+ export const useTasksStore = ctx.useStore
@@ -0,0 +1,81 @@
1
+ import React from 'react'
2
+ import { Calendar, ListChecks } from 'lucide-react'
3
+ import { Checkbox } from '@fayz-ai/ui'
4
+ import { useTasksStore } from '../TasksContext'
5
+ import { TaskPriorityBadge } from './TaskPriorityBadge'
6
+ import { TaskLabelBadges } from './TaskLabelBadge'
7
+ import type { Task } from '../types'
8
+
9
+ function isOverdue(dueDate: string | null): boolean {
10
+ if (!dueDate) return false
11
+ return dueDate < new Date().toISOString().slice(0, 10)
12
+ }
13
+
14
+ function isToday(dueDate: string | null): boolean {
15
+ if (!dueDate) return false
16
+ return dueDate === new Date().toISOString().slice(0, 10)
17
+ }
18
+
19
+ function formatDueDate(dueDate: string): string {
20
+ const d = new Date(dueDate + 'T00:00:00')
21
+ return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })
22
+ }
23
+
24
+ export function TaskCard({ task, subtaskCount }: { task: Task; subtaskCount?: { done: number; total: number } }) {
25
+ const selectTask = useTasksStore((s) => s.selectTask)
26
+ const updateTask = useTasksStore((s) => s.updateTask)
27
+
28
+ const isDone = task.status === 'done'
29
+ const overdue = !isDone && isOverdue(task.dueDate)
30
+ const dueToday = !isDone && isToday(task.dueDate)
31
+
32
+ const handleCheck = (e: React.MouseEvent) => {
33
+ e.stopPropagation()
34
+ updateTask(task.id, { status: isDone ? 'todo' : 'done' })
35
+ }
36
+
37
+ return (
38
+ <div
39
+ onClick={() => selectTask(task.id)}
40
+ className="group flex items-start gap-2.5 rounded-lg border border-transparent px-3 py-2.5 transition-colors hover:bg-muted bg-card shadow-button active:shadow-button-inset hover:border-border cursor-pointer"
41
+ >
42
+ <div className="pt-0.5" onClick={handleCheck}>
43
+ <Checkbox checked={isDone} onChange={() => {}} />
44
+ </div>
45
+
46
+ <div className="min-w-0 flex-1 space-y-1">
47
+ <p className={`text-sm leading-snug ${isDone ? 'line-through text-muted-foreground' : ''}`}>
48
+ {task.title}
49
+ </p>
50
+
51
+ <div className="flex flex-wrap items-center gap-1.5">
52
+ <TaskPriorityBadge priority={task.priority} />
53
+
54
+ {task.dueDate && (
55
+ <span className={`inline-flex items-center gap-1 text-[11px] ${
56
+ overdue ? 'text-destructive font-medium' : dueToday ? 'text-warning font-medium' : 'text-muted-foreground'
57
+ }`}>
58
+ <Calendar className="h-3 w-3" />
59
+ {formatDueDate(task.dueDate)}
60
+ </span>
61
+ )}
62
+
63
+ {subtaskCount && subtaskCount.total > 0 && (
64
+ <span className="inline-flex items-center gap-1 text-[11px] text-muted-foreground">
65
+ <ListChecks className="h-3 w-3" />
66
+ {subtaskCount.done}/{subtaskCount.total}
67
+ </span>
68
+ )}
69
+
70
+ <TaskLabelBadges labelIds={task.labels} max={2} />
71
+ </div>
72
+ </div>
73
+
74
+ {task.assignedToName && (
75
+ <div className="flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-[10px] font-medium text-primary" title={task.assignedToName}>
76
+ {task.assignedToName.split(' ').map((n) => n[0]).join('').slice(0, 2).toUpperCase()}
77
+ </div>
78
+ )}
79
+ </div>
80
+ )
81
+ }