@fayz-ai/plugin-tasks 0.1.7 → 0.8.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/README.md +2 -0
- package/dist/data/supabase.d.ts.map +1 -1
- package/dist/data/tables.d.ts +5 -0
- package/dist/data/tables.d.ts.map +1 -0
- package/dist/index.cjs +95 -52
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +95 -52
- package/dist/index.js.map +1 -1
- package/dist/migrations/index.d.ts +7 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/registries.d.ts.map +1 -1
- package/package.json +10 -4
- package/src/data/capability.test.ts +1 -1
- package/src/data/supabase.ts +11 -10
- package/src/data/tables.ts +6 -0
- package/src/index.ts +9 -56
- package/src/migrations/000_plg_rename.sql +12 -0
- package/src/migrations/001_tasks_base.sql +34 -34
- package/src/migrations/index.ts +89 -0
- package/src/registries.ts +2 -1
package/dist/index.js
CHANGED
|
@@ -146,6 +146,12 @@ function createMockTasksProvider() {
|
|
|
146
146
|
};
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
+
// src/data/tables.ts
|
|
150
|
+
var T = {
|
|
151
|
+
tasks: "plg_tasks_tasks",
|
|
152
|
+
labels: "plg_tasks_labels"
|
|
153
|
+
};
|
|
154
|
+
|
|
149
155
|
// src/data/supabase.ts
|
|
150
156
|
function getTenantId() {
|
|
151
157
|
return getActiveTenantId();
|
|
@@ -172,7 +178,7 @@ function createSupabaseTasksProvider() {
|
|
|
172
178
|
async getTasks(query) {
|
|
173
179
|
const tenantId = getTenantId();
|
|
174
180
|
if (!tenantId) return [];
|
|
175
|
-
let q = getClient().from(
|
|
181
|
+
let q = getClient().from(T.tasks).select("*").eq("tenant_id", tenantId);
|
|
176
182
|
if (query.parentId === null) {
|
|
177
183
|
q = q.is("parent_id", null);
|
|
178
184
|
} else if (query.parentId) {
|
|
@@ -200,19 +206,19 @@ function createSupabaseTasksProvider() {
|
|
|
200
206
|
return (data ?? []).map(toTask);
|
|
201
207
|
},
|
|
202
208
|
async getTaskById(id) {
|
|
203
|
-
const { data } = await getClient().from(
|
|
209
|
+
const { data } = await getClient().from(T.tasks).select("*").eq("id", id).maybeSingle();
|
|
204
210
|
return data ? toTask(data) : null;
|
|
205
211
|
},
|
|
206
212
|
async getSubtasks(parentId) {
|
|
207
|
-
const { data } = await getClient().from(
|
|
213
|
+
const { data } = await getClient().from(T.tasks).select("*").eq("parent_id", parentId).order("position", { ascending: true });
|
|
208
214
|
return (data ?? []).map(toTask);
|
|
209
215
|
},
|
|
210
216
|
async createTask(input) {
|
|
211
217
|
const tenantId = getTenantId();
|
|
212
218
|
if (!tenantId) throw new Error("No active tenant");
|
|
213
|
-
const { data: maxData } = await getClient().from(
|
|
219
|
+
const { data: maxData } = await getClient().from(T.tasks).select("position").eq("tenant_id", tenantId).eq("status", input.status ?? "todo").is("parent_id", input.parentId ?? null).order("position", { ascending: false }).limit(1);
|
|
214
220
|
const maxPos = maxData?.[0]?.position ?? -1;
|
|
215
|
-
const { data, error } = await getClient().from(
|
|
221
|
+
const { data, error } = await getClient().from(T.tasks).insert({
|
|
216
222
|
tenant_id: tenantId,
|
|
217
223
|
title: input.title,
|
|
218
224
|
description: input.description ?? null,
|
|
@@ -237,26 +243,26 @@ function createSupabaseTasksProvider() {
|
|
|
237
243
|
if (input.assignedToId !== void 0) payload.assigned_to_id = input.assignedToId;
|
|
238
244
|
if (input.labels !== void 0) payload.labels = input.labels;
|
|
239
245
|
if (input.position !== void 0) payload.position = input.position;
|
|
240
|
-
const { data, error } = await getClient().from(
|
|
246
|
+
const { data, error } = await getClient().from(T.tasks).update(payload).eq("id", id).select("*").single();
|
|
241
247
|
if (error) throw error;
|
|
242
248
|
return toTask(data);
|
|
243
249
|
},
|
|
244
250
|
async deleteTask(id) {
|
|
245
|
-
await getClient().from(
|
|
251
|
+
await getClient().from(T.tasks).delete().eq("id", id);
|
|
246
252
|
},
|
|
247
253
|
async reorderTask(id, newPosition, status) {
|
|
248
|
-
await getClient().from(
|
|
254
|
+
await getClient().from(T.tasks).update({ position: newPosition, status, updated_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", id);
|
|
249
255
|
},
|
|
250
256
|
async getLabels() {
|
|
251
257
|
const tenantId = getTenantId();
|
|
252
258
|
if (!tenantId) return [];
|
|
253
|
-
const { data } = await getClient().from(
|
|
259
|
+
const { data } = await getClient().from(T.labels).select("*").eq("tenant_id", tenantId).eq("is_active", true).order("name");
|
|
254
260
|
return (data ?? []).map((r) => snakeToCamel(r));
|
|
255
261
|
},
|
|
256
262
|
async getSummary() {
|
|
257
263
|
const tenantId = getTenantId();
|
|
258
264
|
if (!tenantId) return { total: 0, todo: 0, inProgress: 0, done: 0, overdue: 0, dueToday: 0, highPriority: 0 };
|
|
259
|
-
const { data } = await getClient().from(
|
|
265
|
+
const { data } = await getClient().from(T.tasks).select("status, priority, due_date").eq("tenant_id", tenantId).is("parent_id", null);
|
|
260
266
|
const tasks = data ?? [];
|
|
261
267
|
const today2 = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
262
268
|
return {
|
|
@@ -467,7 +473,7 @@ var taskLabelEntity = {
|
|
|
467
473
|
{ key: "color", label: "Color", type: "text", showInTable: true, defaultValue: "#6366f1" },
|
|
468
474
|
{ key: "isActive", label: "Active", type: "boolean", showInTable: true, defaultValue: true }
|
|
469
475
|
],
|
|
470
|
-
data: { table:
|
|
476
|
+
data: { table: T.labels, tenantScoped: true }
|
|
471
477
|
};
|
|
472
478
|
var tasksRegistries = [
|
|
473
479
|
{
|
|
@@ -949,40 +955,49 @@ function TasksTopbarButtonInner({ store }) {
|
|
|
949
955
|
);
|
|
950
956
|
}
|
|
951
957
|
|
|
952
|
-
// src/index.ts
|
|
953
|
-
var
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
958
|
+
// src/migrations/index.ts
|
|
959
|
+
var MIGRATION_000_PLG_RENAME = `-- 000_plg_rename.sql \u2014 rename legacy tasks tables to plg_tasks_* for pools
|
|
960
|
+
-- provisioned before the industry-pool rename. Guarded: fires only when legacy
|
|
961
|
+
-- name exists and target does not, so fresh pools skip every branch.
|
|
962
|
+
DO $$
|
|
963
|
+
BEGIN
|
|
964
|
+
IF to_regclass('public.tsk_tasks') IS NOT NULL AND to_regclass('public.plg_tasks_tasks') IS NULL THEN
|
|
965
|
+
ALTER TABLE public.tsk_tasks RENAME TO plg_tasks_tasks;
|
|
966
|
+
END IF;
|
|
967
|
+
IF to_regclass('public.tsk_labels') IS NOT NULL AND to_regclass('public.plg_tasks_labels') IS NULL THEN
|
|
968
|
+
ALTER TABLE public.tsk_labels RENAME TO plg_tasks_labels;
|
|
969
|
+
END IF;
|
|
970
|
+
END $$;
|
|
971
|
+
`;
|
|
972
|
+
var MIGRATION_001_TASKS_BASE = `-- Tasks Plugin: Base Tables
|
|
973
|
+
-- Prefix: plg_tasks_
|
|
974
|
+
|
|
975
|
+
-- Label definitions for categorizing tasks
|
|
976
|
+
CREATE TABLE IF NOT EXISTS public.plg_tasks_labels (
|
|
965
977
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
966
|
-
tenant_id uuid NOT NULL REFERENCES
|
|
978
|
+
tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
|
|
967
979
|
name text NOT NULL,
|
|
968
980
|
color text NOT NULL DEFAULT '#6366f1',
|
|
969
981
|
is_active boolean NOT NULL DEFAULT true,
|
|
970
982
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
971
983
|
);
|
|
972
|
-
ALTER TABLE public.
|
|
973
|
-
CREATE INDEX IF NOT EXISTS
|
|
984
|
+
ALTER TABLE public.plg_tasks_labels ENABLE ROW LEVEL SECURITY;
|
|
985
|
+
CREATE INDEX IF NOT EXISTS idx_plg_tasks_labels_tenant ON public.plg_tasks_labels(tenant_id);
|
|
974
986
|
|
|
975
|
-
|
|
987
|
+
-- Main tasks table (subtasks via parent_id self-reference)
|
|
988
|
+
CREATE TABLE IF NOT EXISTS public.plg_tasks_tasks (
|
|
976
989
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
977
|
-
tenant_id uuid NOT NULL REFERENCES
|
|
990
|
+
tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
|
|
978
991
|
title text NOT NULL,
|
|
979
992
|
description text,
|
|
980
|
-
status text NOT NULL DEFAULT 'todo'
|
|
981
|
-
|
|
993
|
+
status text NOT NULL DEFAULT 'todo'
|
|
994
|
+
CHECK (status IN ('todo', 'in_progress', 'done', 'cancelled')),
|
|
995
|
+
priority text NOT NULL DEFAULT 'medium'
|
|
996
|
+
CHECK (priority IN ('low', 'medium', 'high', 'urgent')),
|
|
982
997
|
due_date date,
|
|
983
998
|
assigned_to_id uuid,
|
|
984
999
|
assigned_to_name text,
|
|
985
|
-
parent_id uuid REFERENCES public.
|
|
1000
|
+
parent_id uuid REFERENCES public.plg_tasks_tasks(id) ON DELETE CASCADE,
|
|
986
1001
|
labels jsonb NOT NULL DEFAULT '[]'::jsonb,
|
|
987
1002
|
position integer NOT NULL DEFAULT 0,
|
|
988
1003
|
created_by_id uuid,
|
|
@@ -990,26 +1005,48 @@ CREATE TABLE IF NOT EXISTS public.tsk_tasks (
|
|
|
990
1005
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
991
1006
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
992
1007
|
);
|
|
993
|
-
ALTER TABLE public.
|
|
994
|
-
CREATE INDEX IF NOT EXISTS
|
|
995
|
-
CREATE INDEX IF NOT EXISTS
|
|
996
|
-
CREATE INDEX IF NOT EXISTS
|
|
997
|
-
CREATE INDEX IF NOT EXISTS
|
|
998
|
-
CREATE INDEX IF NOT EXISTS
|
|
1008
|
+
ALTER TABLE public.plg_tasks_tasks ENABLE ROW LEVEL SECURITY;
|
|
1009
|
+
CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_tenant ON public.plg_tasks_tasks(tenant_id);
|
|
1010
|
+
CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_status ON public.plg_tasks_tasks(tenant_id, status);
|
|
1011
|
+
CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_parent ON public.plg_tasks_tasks(parent_id);
|
|
1012
|
+
CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_assigned ON public.plg_tasks_tasks(assigned_to_id);
|
|
1013
|
+
CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_due ON public.plg_tasks_tasks(tenant_id, due_date)
|
|
1014
|
+
WHERE due_date IS NOT NULL;
|
|
1015
|
+
|
|
1016
|
+
-- RLS policies for plg_tasks_tasks (idempotent \u2014 DROP IF EXISTS before CREATE)
|
|
1017
|
+
DROP POLICY IF EXISTS plg_tasks_tasks_select ON public.plg_tasks_tasks;
|
|
1018
|
+
CREATE POLICY plg_tasks_tasks_select ON public.plg_tasks_tasks FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1019
|
+
DROP POLICY IF EXISTS plg_tasks_tasks_insert ON public.plg_tasks_tasks;
|
|
1020
|
+
CREATE POLICY plg_tasks_tasks_insert ON public.plg_tasks_tasks FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1021
|
+
DROP POLICY IF EXISTS plg_tasks_tasks_update ON public.plg_tasks_tasks;
|
|
1022
|
+
CREATE POLICY plg_tasks_tasks_update ON public.plg_tasks_tasks FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1023
|
+
DROP POLICY IF EXISTS plg_tasks_tasks_delete ON public.plg_tasks_tasks;
|
|
1024
|
+
CREATE POLICY plg_tasks_tasks_delete ON public.plg_tasks_tasks FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1025
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_tasks TO authenticated;
|
|
999
1026
|
|
|
1000
|
-
-- RLS policies for
|
|
1001
|
-
|
|
1002
|
-
CREATE POLICY
|
|
1003
|
-
|
|
1004
|
-
CREATE POLICY
|
|
1005
|
-
|
|
1027
|
+
-- RLS policies for plg_tasks_labels (idempotent)
|
|
1028
|
+
DROP POLICY IF EXISTS plg_tasks_labels_select ON public.plg_tasks_labels;
|
|
1029
|
+
CREATE POLICY plg_tasks_labels_select ON public.plg_tasks_labels FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1030
|
+
DROP POLICY IF EXISTS plg_tasks_labels_insert ON public.plg_tasks_labels;
|
|
1031
|
+
CREATE POLICY plg_tasks_labels_insert ON public.plg_tasks_labels FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1032
|
+
DROP POLICY IF EXISTS plg_tasks_labels_update ON public.plg_tasks_labels;
|
|
1033
|
+
CREATE POLICY plg_tasks_labels_update ON public.plg_tasks_labels FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1034
|
+
DROP POLICY IF EXISTS plg_tasks_labels_delete ON public.plg_tasks_labels;
|
|
1035
|
+
CREATE POLICY plg_tasks_labels_delete ON public.plg_tasks_labels FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
|
|
1036
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_labels TO authenticated;
|
|
1037
|
+
`;
|
|
1006
1038
|
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1039
|
+
// src/index.ts
|
|
1040
|
+
var DEFAULT_LABELS = {
|
|
1041
|
+
drawerTitle: "Tasks",
|
|
1042
|
+
settingsTitle: "Tasks",
|
|
1043
|
+
quickAddPlaceholder: "Add a task..."
|
|
1044
|
+
};
|
|
1045
|
+
function resolveConfig(options) {
|
|
1046
|
+
return {
|
|
1047
|
+
labels: { ...DEFAULT_LABELS, ...options?.labels }
|
|
1048
|
+
};
|
|
1049
|
+
}
|
|
1013
1050
|
function createTasksPlugin(options) {
|
|
1014
1051
|
const config = resolveConfig(options);
|
|
1015
1052
|
registerTranslations(tasksLocales);
|
|
@@ -1086,11 +1123,17 @@ function createTasksPlugin(options) {
|
|
|
1086
1123
|
}
|
|
1087
1124
|
],
|
|
1088
1125
|
migrations: [
|
|
1126
|
+
{
|
|
1127
|
+
id: "tasks-000-plg-rename",
|
|
1128
|
+
version: "1.0.0",
|
|
1129
|
+
sql: MIGRATION_000_PLG_RENAME,
|
|
1130
|
+
description: "Rename legacy tsk_* tables to plg_tasks_* in-place for pools provisioned before the industry-pool rename (guarded no-op on fresh pools)"
|
|
1131
|
+
},
|
|
1089
1132
|
{
|
|
1090
1133
|
id: "tasks-001-base-tables",
|
|
1091
1134
|
version: "1.0.0",
|
|
1092
|
-
sql:
|
|
1093
|
-
description: "Create
|
|
1135
|
+
sql: MIGRATION_001_TASKS_BASE,
|
|
1136
|
+
description: "Create plg_tasks_tasks and plg_tasks_labels"
|
|
1094
1137
|
}
|
|
1095
1138
|
],
|
|
1096
1139
|
locales: tasksLocales
|