@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/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("tsk_tasks").select("*").eq("tenant_id", tenantId);
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("tsk_tasks").select("*").eq("id", id).maybeSingle();
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("tsk_tasks").select("*").eq("parent_id", parentId).order("position", { ascending: true });
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("tsk_tasks").select("position").eq("tenant_id", tenantId).eq("status", input.status ?? "todo").is("parent_id", input.parentId ?? null).order("position", { ascending: false }).limit(1);
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("tsk_tasks").insert({
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("tsk_tasks").update(payload).eq("id", id).select("*").single();
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("tsk_tasks").delete().eq("id", id);
251
+ await getClient().from(T.tasks).delete().eq("id", id);
246
252
  },
247
253
  async reorderTask(id, newPosition, status) {
248
- await getClient().from("tsk_tasks").update({ position: newPosition, status, updated_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", id);
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("tsk_labels").select("*").eq("tenant_id", tenantId).eq("is_active", true).order("name");
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("tsk_tasks").select("status, priority, due_date").eq("tenant_id", tenantId).is("parent_id", null);
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: "tsk_labels", tenantScoped: true }
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 DEFAULT_LABELS = {
954
- drawerTitle: "Tasks",
955
- settingsTitle: "Tasks",
956
- quickAddPlaceholder: "Add a task..."
957
- };
958
- function resolveConfig(options) {
959
- return {
960
- labels: { ...DEFAULT_LABELS, ...options?.labels }
961
- };
962
- }
963
- var MIGRATION_001 = `-- Tasks Plugin: Base Tables
964
- CREATE TABLE IF NOT EXISTS public.tsk_labels (
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 saas_core.tenants(id) ON DELETE CASCADE,
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.tsk_labels ENABLE ROW LEVEL SECURITY;
973
- CREATE INDEX IF NOT EXISTS idx_tsk_labels_tenant ON public.tsk_labels(tenant_id);
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
- CREATE TABLE IF NOT EXISTS public.tsk_tasks (
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 saas_core.tenants(id) ON DELETE CASCADE,
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' CHECK (status IN ('todo','in_progress','done','cancelled')),
981
- priority text NOT NULL DEFAULT 'medium' CHECK (priority IN ('low','medium','high','urgent')),
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.tsk_tasks(id) ON DELETE CASCADE,
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.tsk_tasks ENABLE ROW LEVEL SECURITY;
994
- CREATE INDEX IF NOT EXISTS idx_tsk_tasks_tenant ON public.tsk_tasks(tenant_id);
995
- CREATE INDEX IF NOT EXISTS idx_tsk_tasks_status ON public.tsk_tasks(tenant_id, status);
996
- CREATE INDEX IF NOT EXISTS idx_tsk_tasks_parent ON public.tsk_tasks(parent_id);
997
- CREATE INDEX IF NOT EXISTS idx_tsk_tasks_assigned ON public.tsk_tasks(assigned_to_id);
998
- CREATE INDEX IF NOT EXISTS idx_tsk_tasks_due ON public.tsk_tasks(tenant_id, due_date) WHERE due_date IS NOT NULL;
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 tsk_tasks
1001
- CREATE POLICY tsk_tasks_select ON public.tsk_tasks FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
1002
- CREATE POLICY tsk_tasks_insert ON public.tsk_tasks FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));
1003
- CREATE POLICY tsk_tasks_update ON public.tsk_tasks FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
1004
- CREATE POLICY tsk_tasks_delete ON public.tsk_tasks FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
1005
- GRANT SELECT, INSERT, UPDATE, DELETE ON public.tsk_tasks TO authenticated;
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
- -- RLS policies for tsk_labels
1008
- CREATE POLICY tsk_labels_select ON public.tsk_labels FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
1009
- CREATE POLICY tsk_labels_insert ON public.tsk_labels FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));
1010
- CREATE POLICY tsk_labels_update ON public.tsk_labels FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
1011
- CREATE POLICY tsk_labels_delete ON public.tsk_labels FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
1012
- GRANT SELECT, INSERT, UPDATE, DELETE ON public.tsk_labels TO authenticated;`;
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: MIGRATION_001,
1093
- description: "Create tsk_tasks and tsk_labels tables"
1135
+ sql: MIGRATION_001_TASKS_BASE,
1136
+ description: "Create plg_tasks_tasks and plg_tasks_labels"
1094
1137
  }
1095
1138
  ],
1096
1139
  locales: tasksLocales