@fayz-ai/tasks 0.0.0-stage → 0.49.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/LICENSE +21 -0
- package/README.md +34 -2
- package/dist/chunk-5DWYILP2.js +102 -0
- package/dist/chunk-5DWYILP2.js.map +1 -0
- package/dist/chunk-BHNXKHFW.js +29 -0
- package/dist/chunk-BHNXKHFW.js.map +1 -0
- package/dist/chunk-H435KYKF.js +26 -0
- package/dist/chunk-H435KYKF.js.map +1 -0
- package/dist/chunk-IHQV22ML.js +128 -0
- package/dist/chunk-IHQV22ML.js.map +1 -0
- package/dist/chunk-IYQSFHSK.js +175 -0
- package/dist/chunk-IYQSFHSK.js.map +1 -0
- package/dist/chunk-KM7XZUFP.js +114 -0
- package/dist/chunk-KM7XZUFP.js.map +1 -0
- package/dist/chunk-KUO4ZJPR.js +187 -0
- package/dist/chunk-KUO4ZJPR.js.map +1 -0
- package/dist/chunk-KXUCWLLG.js +80 -0
- package/dist/chunk-KXUCWLLG.js.map +1 -0
- package/dist/chunk-LY4RNYRG.js +57 -0
- package/dist/chunk-LY4RNYRG.js.map +1 -0
- package/dist/chunk-Q5FSJ2D6.js +60 -0
- package/dist/chunk-Q5FSJ2D6.js.map +1 -0
- package/dist/chunk-WNIXFQM4.js +22 -0
- package/dist/chunk-WNIXFQM4.js.map +1 -0
- package/dist/chunk-XVAIXG7V.js +42 -0
- package/dist/chunk-XVAIXG7V.js.map +1 -0
- package/dist/components/TaskCard.d.ts +17 -0
- package/dist/components/TaskCard.d.ts.map +1 -0
- package/dist/components/TaskCard.js +7 -0
- package/dist/components/TaskCard.js.map +1 -0
- package/dist/components/TaskDetail.d.ts +21 -0
- package/dist/components/TaskDetail.d.ts.map +1 -0
- package/dist/components/TaskDetail.js +10 -0
- package/dist/components/TaskDetail.js.map +1 -0
- package/dist/components/TaskLabelBadge.d.ts +11 -0
- package/dist/components/TaskLabelBadge.d.ts.map +1 -0
- package/dist/components/TaskLabelBadge.js +4 -0
- package/dist/components/TaskLabelBadge.js.map +1 -0
- package/dist/components/TaskPriorityBadge.d.ts +7 -0
- package/dist/components/TaskPriorityBadge.d.ts.map +1 -0
- package/dist/components/TaskPriorityBadge.js +3 -0
- package/dist/components/TaskPriorityBadge.js.map +1 -0
- package/dist/components/TaskQuickAdd.d.ts +8 -0
- package/dist/components/TaskQuickAdd.d.ts.map +1 -0
- package/dist/components/TaskQuickAdd.js +3 -0
- package/dist/components/TaskQuickAdd.js.map +1 -0
- package/dist/components/TaskSourceBadge.d.ts +5 -0
- package/dist/components/TaskSourceBadge.d.ts.map +1 -0
- package/dist/components/TaskSourceBadge.js +4 -0
- package/dist/components/TaskSourceBadge.js.map +1 -0
- package/dist/components/TaskStatusGroup.d.ts +16 -0
- package/dist/components/TaskStatusGroup.d.ts.map +1 -0
- package/dist/components/TaskStatusGroup.js +3 -0
- package/dist/components/TaskStatusGroup.js.map +1 -0
- package/dist/components/TasksFilterBar.d.ts +13 -0
- package/dist/components/TasksFilterBar.d.ts.map +1 -0
- package/dist/components/TasksFilterBar.js +4 -0
- package/dist/components/TasksFilterBar.js.map +1 -0
- package/dist/data/mock.d.ts +3 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/mock.js +4 -0
- package/dist/data/mock.js.map +1 -0
- package/dist/data/provider.d.ts +13 -0
- package/dist/data/provider.d.ts.map +1 -0
- package/dist/data/provider.js +3 -0
- package/dist/data/provider.js.map +1 -0
- package/dist/data/supabase.d.ts +9 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/supabase.js +4 -0
- package/dist/data/supabase.js.map +1 -0
- package/dist/domain/task.d.ts +121 -0
- package/dist/domain/task.d.ts.map +1 -0
- package/dist/domain/task.js +3 -0
- package/dist/domain/task.js.map +1 -0
- package/dist/store.d.ts +35 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +6 -0
- package/dist/store.js.map +1 -0
- package/dist/views/TasksPanel.d.ts +8 -0
- package/dist/views/TasksPanel.d.ts.map +1 -0
- package/dist/views/TasksPanel.js +103 -0
- package/dist/views/TasksPanel.js.map +1 -0
- package/package.json +51 -3
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { TasksFilterBar } from '../chunk-Q5FSJ2D6.js';
|
|
2
|
+
import { useTasksStore } from '../chunk-KM7XZUFP.js';
|
|
3
|
+
import '../chunk-IHQV22ML.js';
|
|
4
|
+
import '../chunk-IYQSFHSK.js';
|
|
5
|
+
import { TaskDetail } from '../chunk-KUO4ZJPR.js';
|
|
6
|
+
import { TaskCard } from '../chunk-KXUCWLLG.js';
|
|
7
|
+
import '../chunk-BHNXKHFW.js';
|
|
8
|
+
import '../chunk-WNIXFQM4.js';
|
|
9
|
+
import { TaskQuickAdd } from '../chunk-XVAIXG7V.js';
|
|
10
|
+
import '../chunk-H435KYKF.js';
|
|
11
|
+
import { splitOnboardingTasks, groupByStatus } from '../chunk-5DWYILP2.js';
|
|
12
|
+
import { TaskGroup, TaskStatusGroup } from '../chunk-LY4RNYRG.js';
|
|
13
|
+
import React from 'react';
|
|
14
|
+
import { ClipboardList } from 'lucide-react';
|
|
15
|
+
import { useTranslation } from '@fayz-ai/core';
|
|
16
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
17
|
+
|
|
18
|
+
function TasksPanel({ locale, onDelegate, renderActions }) {
|
|
19
|
+
const t = useTranslation();
|
|
20
|
+
const s = useTasksStore();
|
|
21
|
+
React.useEffect(() => {
|
|
22
|
+
void s.fetchTasks();
|
|
23
|
+
void s.fetchLabels();
|
|
24
|
+
void s.fetchSummary();
|
|
25
|
+
}, [s.fetchTasks, s.fetchLabels, s.fetchSummary]);
|
|
26
|
+
const { onboarding, groups } = React.useMemo(() => {
|
|
27
|
+
const split = splitOnboardingTasks(s.tasks);
|
|
28
|
+
return { onboarding: split.onboarding, groups: groupByStatus(split.rest) };
|
|
29
|
+
}, [s.tasks]);
|
|
30
|
+
const card = (showSource) => (task) => /* @__PURE__ */ jsx(
|
|
31
|
+
TaskCard,
|
|
32
|
+
{
|
|
33
|
+
task,
|
|
34
|
+
labels: s.labels,
|
|
35
|
+
locale,
|
|
36
|
+
showSource,
|
|
37
|
+
onSelect: s.selectTask,
|
|
38
|
+
onUpdate: s.updateTask
|
|
39
|
+
},
|
|
40
|
+
task.id
|
|
41
|
+
);
|
|
42
|
+
if (s.selectedTaskId) {
|
|
43
|
+
return /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx(
|
|
44
|
+
TaskDetail,
|
|
45
|
+
{
|
|
46
|
+
task: s.tasks.find((task) => task.id === s.selectedTaskId),
|
|
47
|
+
labels: s.labels,
|
|
48
|
+
locale,
|
|
49
|
+
onSelect: s.selectTask,
|
|
50
|
+
onUpdate: s.updateTask,
|
|
51
|
+
onDelete: s.deleteTask,
|
|
52
|
+
onCreate: s.createTask,
|
|
53
|
+
onDelegate,
|
|
54
|
+
renderActions
|
|
55
|
+
}
|
|
56
|
+
) });
|
|
57
|
+
}
|
|
58
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
TasksFilterBar,
|
|
61
|
+
{
|
|
62
|
+
activeFilter: s.activeFilter,
|
|
63
|
+
summary: s.summary,
|
|
64
|
+
mine: s.mine,
|
|
65
|
+
currentUserId: s.currentUserId,
|
|
66
|
+
onFilterChange: s.setFilter,
|
|
67
|
+
onMineChange: s.setMine
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
/* @__PURE__ */ jsx(TaskQuickAdd, { onCreate: s.createTask }),
|
|
71
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: s.tasksLoading && s.tasks.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-16", children: /* @__PURE__ */ jsx("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-primary border-t-transparent" }) }) : s.tasks.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-16 text-muted-foreground", children: [
|
|
72
|
+
/* @__PURE__ */ jsx(ClipboardList, { className: "mb-3 h-10 w-10 opacity-40" }),
|
|
73
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t("tasks.empty") }),
|
|
74
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs", children: t("tasks.empty.description") })
|
|
75
|
+
] }) : s.activeFilter !== "all" ? /* @__PURE__ */ jsx("div", { className: "px-1 py-1", children: s.tasks.map(card(true)) }) : /* @__PURE__ */ jsxs("div", { className: "space-y-2 py-2", children: [
|
|
76
|
+
/* @__PURE__ */ jsx(
|
|
77
|
+
TaskGroup,
|
|
78
|
+
{
|
|
79
|
+
title: t("tasks.group.onboarding"),
|
|
80
|
+
dotClass: "bg-primary",
|
|
81
|
+
tasks: onboarding,
|
|
82
|
+
renderTask: card(false)
|
|
83
|
+
}
|
|
84
|
+
),
|
|
85
|
+
groups.map((group) => /* @__PURE__ */ jsx(TaskStatusGroup, { status: group.status, tasks: group.tasks, renderTask: card(true) }, group.status))
|
|
86
|
+
] }) })
|
|
87
|
+
] });
|
|
88
|
+
}
|
|
89
|
+
function useTasksSummaryLine() {
|
|
90
|
+
const t = useTranslation();
|
|
91
|
+
const summary = useTasksStore((s) => s.summary);
|
|
92
|
+
return React.useMemo(() => {
|
|
93
|
+
if (!summary) return "";
|
|
94
|
+
const parts = [];
|
|
95
|
+
if (summary.overdue > 0) parts.push(`${summary.overdue} ${t("tasks.summary.overdue")}`);
|
|
96
|
+
if (summary.dueToday > 0) parts.push(`${summary.dueToday} ${t("tasks.summary.dueToday")}`);
|
|
97
|
+
return parts.join(" \xB7 ");
|
|
98
|
+
}, [summary, t]);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export { TasksPanel, useTasksSummaryLine };
|
|
102
|
+
//# sourceMappingURL=TasksPanel.js.map
|
|
103
|
+
//# sourceMappingURL=TasksPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/views/TasksPanel.tsx"],"names":[],"mappings":"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","file":"TasksPanel.js","sourcesContent":["import React from 'react'\nimport { ClipboardList } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useTasksStore } from '../store'\nimport { groupByStatus, splitOnboardingTasks, type Task } from '../domain/task'\nimport { TasksFilterBar } from '../components/TasksFilterBar'\nimport { TaskQuickAdd } from '../components/TaskQuickAdd'\nimport { TaskCard } from '../components/TaskCard'\nimport { TaskGroup, TaskStatusGroup } from '../components/TaskStatusGroup'\nimport { TaskDetail, type TaskDetailProps } from '../components/TaskDetail'\n\nexport type TasksPanelProps = Pick<TaskDetailProps, 'locale' | 'onDelegate' | 'renderActions'>\n\n/** The task list with no box around it: the host decides whether it is a rail tab or a sheet. */\nexport function TasksPanel({ locale, onDelegate, renderActions }: TasksPanelProps) {\n const t = useTranslation()\n const s = useTasksStore()\n\n // Mounted directly by the rail, where openDrawer() never runs; reads are shared, so the sheet does not double-load.\n React.useEffect(() => {\n void s.fetchTasks()\n void s.fetchLabels()\n void s.fetchSummary()\n }, [s.fetchTasks, s.fetchLabels, s.fetchSummary])\n\n const { onboarding, groups } = React.useMemo(() => {\n const split = splitOnboardingTasks(s.tasks)\n return { onboarding: split.onboarding, groups: groupByStatus(split.rest) }\n }, [s.tasks])\n\n const card = (showSource: boolean) => (task: Task) => (\n <TaskCard\n key={task.id}\n task={task}\n labels={s.labels}\n locale={locale}\n showSource={showSource}\n onSelect={s.selectTask}\n onUpdate={s.updateTask}\n />\n )\n\n if (s.selectedTaskId) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <TaskDetail\n task={s.tasks.find((task) => task.id === s.selectedTaskId)}\n labels={s.labels}\n locale={locale}\n onSelect={s.selectTask}\n onUpdate={s.updateTask}\n onDelete={s.deleteTask}\n onCreate={s.createTask}\n onDelegate={onDelegate}\n renderActions={renderActions}\n />\n </div>\n )\n }\n\n return (\n <>\n <TasksFilterBar\n activeFilter={s.activeFilter}\n summary={s.summary}\n mine={s.mine}\n currentUserId={s.currentUserId}\n onFilterChange={s.setFilter}\n onMineChange={s.setMine}\n />\n <TaskQuickAdd onCreate={s.createTask} />\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {s.tasksLoading && s.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 ) : s.tasks.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-muted-foreground\">\n <ClipboardList className=\"mb-3 h-10 w-10 opacity-40\" />\n <p className=\"text-sm font-medium\">{t('tasks.empty')}</p>\n <p className=\"mt-1 text-xs\">{t('tasks.empty.description')}</p>\n </div>\n ) : s.activeFilter !== 'all' ? (\n <div className=\"px-1 py-1\">{s.tasks.map(card(true))}</div>\n ) : (\n <div className=\"space-y-2 py-2\">\n <TaskGroup\n title={t('tasks.group.onboarding')}\n dotClass=\"bg-primary\"\n tasks={onboarding}\n renderTask={card(false)}\n />\n {groups.map((group) => (\n <TaskStatusGroup key={group.status} status={group.status} tasks={group.tasks} renderTask={card(true)} />\n ))}\n </div>\n )}\n </div>\n </>\n )\n}\n\n/** One-line summary of what needs attention (\"3 atrasadas · 2 para hoje\"). */\nexport function useTasksSummaryLine(): string {\n const t = useTranslation()\n const summary = useTasksStore((s) => s.summary)\n return 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fayz-ai/tasks",
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
"fayz": {
|
|
4
|
+
"status": "beta"
|
|
5
|
+
},
|
|
6
|
+
"version": "0.49.0",
|
|
7
|
+
"description": "Fayz SDK tasks context — the task domain, its repository port and adapters, store and UI",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"sideEffects": false,
|
|
10
|
+
"exports": {
|
|
11
|
+
"./*": {
|
|
12
|
+
"types": "./dist/*.d.ts",
|
|
13
|
+
"import": "./dist/*.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"@supabase/supabase-js": "^2.45.0",
|
|
21
|
+
"lucide-react": ">=0.400.0 <1.0.0",
|
|
22
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
23
|
+
"zustand": "^4.5.0 || ^5.0.0"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@fayz-ai/core": "^0.49.0",
|
|
27
|
+
"@fayz-ai/ui": "^0.49.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@supabase/supabase-js": "^2.45.0",
|
|
31
|
+
"@types/react": "^18.3.0",
|
|
32
|
+
"lucide-react": "^0.400.0",
|
|
33
|
+
"react": "^18.3.0",
|
|
34
|
+
"tsup": "^8.2.0",
|
|
35
|
+
"typescript": "^5.5.0",
|
|
36
|
+
"vitest": "^4.1.5",
|
|
37
|
+
"zustand": "^4.5.0"
|
|
38
|
+
},
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"keywords": [
|
|
41
|
+
"fayz",
|
|
42
|
+
"tasks"
|
|
43
|
+
],
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsup && tsc -b --force",
|
|
49
|
+
"dev": "tsup --watch",
|
|
50
|
+
"typecheck": "tsc -b tsconfig.test.json",
|
|
51
|
+
"test": "vitest run",
|
|
52
|
+
"clean": "rm -rf dist .tsbuildinfo"
|
|
53
|
+
}
|
|
6
54
|
}
|