@fayz-ai/plugin-forms 0.2.0 → 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 +7 -0
- package/dist/data/tables.d.ts.map +1 -0
- package/dist/index.cjs +27 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -19
- package/dist/index.js.map +1 -1
- package/dist/migrations/index.d.ts +8 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -4
- package/src/data/supabase.ts +20 -19
- package/src/data/tables.ts +7 -0
- package/src/index.ts +2 -1
- package/src/migrations/000_plg_rename.sql +21 -0
- package/src/migrations/001_frm_base.sql +92 -56
- package/src/migrations/002_document_archetype.sql +130 -42
- package/src/migrations/index.ts +433 -0
- package/src/types.ts +4 -4
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAUnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAyCxD,YAAY,EAAE,wBAAwB,EAAE,CAAA;AACxC,OAAO,EAAE,4BAA4B,EAAE,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEnH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,cAAc,CA6J1F"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,14 @@ import { FileText, Image, Paperclip, Search, Plus, Pencil, Trash2, ArrowLeft, Lo
|
|
|
7
7
|
import { Input, Button, Card, CardContent, Badge, useSaveBar, Dropdown, DropdownTrigger, DropdownContent, DropdownSeparator, DropdownLabel, DropdownItem } from '@fayz-ai/ui';
|
|
8
8
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
9
9
|
|
|
10
|
+
// src/data/tables.ts
|
|
11
|
+
var T = {
|
|
12
|
+
documents: "plg_forms_documents",
|
|
13
|
+
templates: "plg_forms_templates",
|
|
14
|
+
documentFiles: "plg_forms_document_files",
|
|
15
|
+
categories: "plg_forms_categories"
|
|
16
|
+
};
|
|
17
|
+
|
|
10
18
|
// src/data/mock.ts
|
|
11
19
|
function uuid() {
|
|
12
20
|
return crypto.randomUUID();
|
|
@@ -255,7 +263,7 @@ function createSupabaseFormsProvider() {
|
|
|
255
263
|
// ── Templates ──────────────────────────────────────────
|
|
256
264
|
async getTemplates(query) {
|
|
257
265
|
const db = getClient();
|
|
258
|
-
let qb = db.from(
|
|
266
|
+
let qb = db.from(T.templates).select("*", { count: "exact" }).eq("tenant_id", getTenantId()).eq("is_current", true).eq("is_deleted", false);
|
|
259
267
|
if (query.category) qb = qb.eq("category", query.category);
|
|
260
268
|
if (query.search) qb = qb.ilike("name", `%${query.search}%`);
|
|
261
269
|
const page = query.page ?? 1;
|
|
@@ -267,14 +275,14 @@ function createSupabaseFormsProvider() {
|
|
|
267
275
|
},
|
|
268
276
|
async getTemplateById(id) {
|
|
269
277
|
const db = getClient();
|
|
270
|
-
const { data, error } = await db.from(
|
|
278
|
+
const { data, error } = await db.from(T.templates).select("*").eq("id", id).eq("is_deleted", false).single();
|
|
271
279
|
if (error || !data) return null;
|
|
272
280
|
return mapTemplate(data);
|
|
273
281
|
},
|
|
274
282
|
async createTemplate(input) {
|
|
275
283
|
const db = getClient();
|
|
276
284
|
const tenantId = getTenantId();
|
|
277
|
-
const { data, error } = await db.from(
|
|
285
|
+
const { data, error } = await db.from(T.templates).insert({
|
|
278
286
|
tenant_id: tenantId,
|
|
279
287
|
name: input.name,
|
|
280
288
|
description: input.description,
|
|
@@ -290,12 +298,12 @@ function createSupabaseFormsProvider() {
|
|
|
290
298
|
async updateTemplate(id, input) {
|
|
291
299
|
const db = getClient();
|
|
292
300
|
const tenantId = getTenantId();
|
|
293
|
-
const { count } = await db.from(
|
|
301
|
+
const { count } = await db.from(T.documents).select("document_id", { count: "exact", head: true }).eq("template_id", id);
|
|
294
302
|
const hasDocuments = (count ?? 0) > 0;
|
|
295
303
|
if (hasDocuments && input.schema) {
|
|
296
304
|
const existing = await this.getTemplateById(id);
|
|
297
305
|
if (!existing) throw new Error("Template not found");
|
|
298
|
-
const { data: newRow, error: insertError } = await db.from(
|
|
306
|
+
const { data: newRow, error: insertError } = await db.from(T.templates).insert({
|
|
299
307
|
tenant_id: tenantId,
|
|
300
308
|
name: input.name ?? existing.name,
|
|
301
309
|
description: input.description ?? existing.description,
|
|
@@ -310,7 +318,7 @@ function createSupabaseFormsProvider() {
|
|
|
310
318
|
parent_id: existing.parentId ?? existing.id
|
|
311
319
|
}).select().single();
|
|
312
320
|
if (insertError) throw new Error(insertError.message);
|
|
313
|
-
await db.from(
|
|
321
|
+
await db.from(T.templates).update({ is_current: false, updated_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", id);
|
|
314
322
|
return mapTemplate(newRow);
|
|
315
323
|
}
|
|
316
324
|
const updates = { updated_at: (/* @__PURE__ */ new Date()).toISOString() };
|
|
@@ -322,16 +330,16 @@ function createSupabaseFormsProvider() {
|
|
|
322
330
|
if (input.tags !== void 0) updates.tags = input.tags;
|
|
323
331
|
if (input.metadata !== void 0) updates.metadata = input.metadata;
|
|
324
332
|
if (input.isActive !== void 0) updates.is_active = input.isActive;
|
|
325
|
-
const { data, error } = await db.from(
|
|
333
|
+
const { data, error } = await db.from(T.templates).update(updates).eq("id", id).select().single();
|
|
326
334
|
if (error) throw new Error(error.message);
|
|
327
335
|
return mapTemplate(data);
|
|
328
336
|
},
|
|
329
337
|
async deleteTemplate(id) {
|
|
330
338
|
const db = getClient();
|
|
331
|
-
const { error } = await db.from(
|
|
339
|
+
const { error } = await db.from(T.templates).update({ is_deleted: true, updated_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", id);
|
|
332
340
|
if (error) throw new Error(error.message);
|
|
333
341
|
},
|
|
334
|
-
// ── Documents (
|
|
342
|
+
// ── Documents (public.documents + plg_forms_documents extension) ──
|
|
335
343
|
async getDocuments(query) {
|
|
336
344
|
const db = getClient();
|
|
337
345
|
let qb = db.from("v_documents").select("*", { count: "exact" }).eq("tenant_id", getTenantId()).eq("is_active", true);
|
|
@@ -358,7 +366,7 @@ function createSupabaseFormsProvider() {
|
|
|
358
366
|
async createDocument(input) {
|
|
359
367
|
const tenantId = getTenantId();
|
|
360
368
|
const isForm = !!input.templateId;
|
|
361
|
-
const { data: coreDoc, error: coreError } = await getClient().from("
|
|
369
|
+
const { data: coreDoc, error: coreError } = await getClient().from("documents").insert({
|
|
362
370
|
tenant_id: tenantId,
|
|
363
371
|
kind: input.kind ?? (isForm ? "form" : "attachment"),
|
|
364
372
|
person_id: input.personId,
|
|
@@ -373,14 +381,14 @@ function createSupabaseFormsProvider() {
|
|
|
373
381
|
if (coreError) throw new Error(coreError.message);
|
|
374
382
|
if (isForm && input.templateId) {
|
|
375
383
|
const db = getClient();
|
|
376
|
-
const { error: extError } = await db.from(
|
|
384
|
+
const { error: extError } = await db.from(T.documents).insert({
|
|
377
385
|
document_id: coreDoc.id,
|
|
378
386
|
tenant_id: tenantId,
|
|
379
387
|
template_id: input.templateId,
|
|
380
388
|
data: input.data ?? {}
|
|
381
389
|
});
|
|
382
390
|
if (extError) {
|
|
383
|
-
await getClient().from("
|
|
391
|
+
await getClient().from("documents").delete().eq("id", coreDoc.id);
|
|
384
392
|
throw new Error(extError.message);
|
|
385
393
|
}
|
|
386
394
|
}
|
|
@@ -393,23 +401,23 @@ function createSupabaseFormsProvider() {
|
|
|
393
401
|
if (input.status !== void 0) coreUpdates.status = input.status;
|
|
394
402
|
if (input.title !== void 0) coreUpdates.title = input.title;
|
|
395
403
|
if (input.notes !== void 0) coreUpdates.notes = input.notes;
|
|
396
|
-
const { error: coreError } = await getClient().from("
|
|
404
|
+
const { error: coreError } = await getClient().from("documents").update(coreUpdates).eq("id", id);
|
|
397
405
|
if (coreError) throw new Error(coreError.message);
|
|
398
406
|
if (input.data !== void 0) {
|
|
399
407
|
const db = getClient();
|
|
400
|
-
await db.from(
|
|
408
|
+
await db.from(T.documents).update({ data: input.data, updated_at: now2 }).eq("document_id", id);
|
|
401
409
|
}
|
|
402
410
|
const doc = await this.getDocumentById(id);
|
|
403
411
|
return doc;
|
|
404
412
|
},
|
|
405
413
|
async deleteDocument(id) {
|
|
406
|
-
const { error } = await getClient().from("
|
|
414
|
+
const { error } = await getClient().from("documents").update({ is_active: false, updated_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", id);
|
|
407
415
|
if (error) throw new Error(error.message);
|
|
408
416
|
},
|
|
409
417
|
// ── Files ──────────────────────────────────────────────
|
|
410
418
|
async getDocumentFiles(documentId) {
|
|
411
419
|
const db = getClient();
|
|
412
|
-
const { data, error } = await db.from(
|
|
420
|
+
const { data, error } = await db.from(T.documentFiles).select("*").eq("document_id", documentId).order("sort_order");
|
|
413
421
|
if (error) throw new Error(error.message);
|
|
414
422
|
return (data ?? []).map(mapFile);
|
|
415
423
|
},
|
|
@@ -421,7 +429,7 @@ function createSupabaseFormsProvider() {
|
|
|
421
429
|
const { error: uploadError } = await db.storage.from("documents").upload(storagePath, file, { contentType: file.type });
|
|
422
430
|
if (uploadError) throw new Error(uploadError.message);
|
|
423
431
|
const { data: urlData } = db.storage.from("documents").getPublicUrl(storagePath);
|
|
424
|
-
const { data, error } = await db.from(
|
|
432
|
+
const { data, error } = await db.from(T.documentFiles).insert({
|
|
425
433
|
tenant_id: tenantId,
|
|
426
434
|
document_id: documentId,
|
|
427
435
|
field_key: fieldKey,
|
|
@@ -435,7 +443,7 @@ function createSupabaseFormsProvider() {
|
|
|
435
443
|
},
|
|
436
444
|
async deleteFile(fileId) {
|
|
437
445
|
const db = getClient();
|
|
438
|
-
const { error } = await db.from(
|
|
446
|
+
const { error } = await db.from(T.documentFiles).delete().eq("id", fileId);
|
|
439
447
|
if (error) throw new Error(error.message);
|
|
440
448
|
}
|
|
441
449
|
};
|
|
@@ -1493,7 +1501,7 @@ function createCustomFormsPlugin(options) {
|
|
|
1493
1501
|
{ key: "isActive", label: "Active", type: "boolean", showInTable: true, defaultValue: true, inlineToggle: true }
|
|
1494
1502
|
],
|
|
1495
1503
|
data: {
|
|
1496
|
-
table:
|
|
1504
|
+
table: T.categories,
|
|
1497
1505
|
tenantScoped: true
|
|
1498
1506
|
}
|
|
1499
1507
|
},
|