@wgalleti/primevue-components 0.8.0 → 0.8.2

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 (52) hide show
  1. package/README.md +17 -0
  2. package/bin/wpvc.mjs +209 -0
  3. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-C9YG4BXB.cjs +12 -0
  4. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-C9YG4BXB.cjs.map +1 -0
  5. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-CoGaRckJ.js +3348 -0
  6. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-CoGaRckJ.js.map +1 -0
  7. package/dist/components/crud/WCrudFormDialog.vue.d.ts +2 -215
  8. package/dist/components/crud/WCrudView.vue.d.ts +3 -9
  9. package/dist/components/form/WAutoCompleteFK.vue.d.ts +1 -1
  10. package/dist/components/form/WDatePicker.vue.d.ts +44 -0
  11. package/dist/components/form/WFormRenderer.vue.d.ts +2 -37
  12. package/dist/components/index.d.ts +1 -0
  13. package/dist/components.cjs +1 -1
  14. package/dist/components.cjs.map +1 -1
  15. package/dist/components.js +63 -92
  16. package/dist/components.js.map +1 -1
  17. package/dist/composables/index.d.ts +3 -0
  18. package/dist/composables/useDateInput.d.ts +29 -0
  19. package/dist/composables/useFormKeyboardNav.d.ts +11 -0
  20. package/dist/composables.cjs +1 -1
  21. package/dist/composables.cjs.map +1 -1
  22. package/dist/composables.js +10 -8
  23. package/dist/index.cjs +1 -1
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.ts +3 -2
  26. package/dist/index.js +53 -50
  27. package/dist/primevue-components.css +1 -1
  28. package/dist/types/field.d.ts +5 -0
  29. package/dist/types/manager.d.ts +3 -0
  30. package/dist/useApi-BDjRqSFt.cjs +2 -0
  31. package/dist/{useApi-5Pr4nXAa.cjs.map → useApi-BDjRqSFt.cjs.map} +1 -1
  32. package/dist/{useApi-Bxrw3Sia.js → useApi-CzOJADZw.js} +2 -2
  33. package/dist/{useApi-Bxrw3Sia.js.map → useApi-CzOJADZw.js.map} +1 -1
  34. package/dist/useFormKeyboardNav-D4Irq5RE.js +461 -0
  35. package/dist/useFormKeyboardNav-D4Irq5RE.js.map +1 -0
  36. package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs +3 -0
  37. package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs.map +1 -0
  38. package/package.json +7 -2
  39. package/skill/SKILL.md +67 -0
  40. package/skill/references/components.md +51 -0
  41. package/skill/references/crud.md +83 -0
  42. package/skill/references/migration.md +58 -0
  43. package/skill/references/setup.md +74 -0
  44. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js +0 -3126
  45. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js.map +0 -1
  46. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs +0 -12
  47. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs.map +0 -1
  48. package/dist/useApi-5Pr4nXAa.cjs +0 -2
  49. package/dist/useApiError-BEbEk2Kq.cjs +0 -3
  50. package/dist/useApiError-BEbEk2Kq.cjs.map +0 -1
  51. package/dist/useApiError-C7rPzGrF.js +0 -375
  52. package/dist/useApiError-C7rPzGrF.js.map +0 -1
@@ -1,43 +1,13 @@
1
- import { _ as N, a as P, b as T, c as j, d as G, e as J, f as O, g as Q, h as X, W as Y, i as Z, j as _, k as ee, l as le, m as te, n as ae, o as oe, p as ne, q as ie } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js";
2
- import { defineComponent as h, openBlock as u, createBlock as V, unref as f, ref as k, computed as C, createElementBlock as c, createElementVNode as i, createVNode as y, Fragment as S, renderList as w, toDisplayString as W, renderSlot as F } from "vue";
3
- import z from "primevue/datepicker";
4
- import g from "primevue/button";
5
- const E = /* @__PURE__ */ h({
6
- __name: "WDateRange",
7
- props: {
8
- modelValue: { default: null },
9
- placeholder: { default: "Selecione o período" },
10
- minDate: {},
11
- maxDate: {},
12
- showButtonBar: { type: Boolean, default: !0 },
13
- disabled: { type: Boolean, default: !1 }
14
- },
15
- emits: ["update:modelValue"],
16
- setup(l, { emit: p }) {
17
- const a = p;
18
- function n(d) {
19
- a("update:modelValue", d ?? null);
20
- }
21
- return (d, r) => (u(), V(f(z), {
22
- "model-value": l.modelValue ?? void 0,
23
- "selection-mode": "range",
24
- placeholder: l.placeholder,
25
- "min-date": l.minDate,
26
- "max-date": l.maxDate,
27
- "show-button-bar": l.showButtonBar,
28
- disabled: l.disabled,
29
- "date-format": "dd/mm/yy",
30
- fluid: "",
31
- "onUpdate:modelValue": n
32
- }, null, 8, ["model-value", "placeholder", "min-date", "max-date", "show-button-bar", "disabled"]));
33
- }
34
- }), D = {
1
+ import { _ as I, a as M, b as N, c as P, d as R, e as _, f as T, g as U, h as j, i as G, j as J, W as O, k as Q, l as X, m as Y, n as Z, o as ee, p as le, q as te, r as ae, s as ie } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-CoGaRckJ.js";
2
+ import { defineComponent as k, ref as F, computed as S, openBlock as u, createElementBlock as p, createElementVNode as i, createVNode as m, unref as f, Fragment as b, renderList as z, toDisplayString as y, renderSlot as B } from "vue";
3
+ import W from "primevue/button";
4
+ const V = {
35
5
  class: "w-fileupload",
36
6
  style: { display: "flex", "flex-direction": "column", gap: "0.5rem" }
37
- }, $ = ["accept", "multiple"], A = {
7
+ }, $ = ["accept", "multiple"], w = {
38
8
  key: 0,
39
9
  style: { "list-style": "none", margin: "0", padding: "0", display: "flex", "flex-direction": "column", gap: "0.35rem" }
40
- }, K = { style: { flex: "1", overflow: "hidden", "text-overflow": "ellipsis", "white-space": "nowrap" } }, L = { style: { opacity: "0.6" } }, H = /* @__PURE__ */ h({
10
+ }, A = { style: { flex: "1", overflow: "hidden", "text-overflow": "ellipsis", "white-space": "nowrap" } }, D = { style: { opacity: "0.6" } }, q = /* @__PURE__ */ k({
41
11
  __name: "WFileUpload",
42
12
  props: {
43
13
  modelValue: { default: null },
@@ -48,109 +18,110 @@ const E = /* @__PURE__ */ h({
48
18
  chooseLabel: { default: "Selecionar arquivo" }
49
19
  },
50
20
  emits: ["update:modelValue", "error"],
51
- setup(l, { emit: p }) {
52
- const a = l, n = p, d = k(null), r = C(() => {
53
- const e = a.modelValue;
21
+ setup(a, { emit: g }) {
22
+ const n = a, s = g, c = F(null), r = S(() => {
23
+ const e = n.modelValue;
54
24
  return e ? Array.isArray(e) ? e : [e] : [];
55
25
  });
56
26
  function v() {
57
27
  var e;
58
- (e = d.value) == null || e.click();
28
+ (e = c.value) == null || e.click();
59
29
  }
60
30
  function x(e) {
61
- const t = e.target, s = Array.from(t.files || []);
62
- t.value = "";
63
- const o = [];
64
- for (const m of s) {
65
- if (m.size > a.maxSize) {
66
- n("error", `"${m.name}" acima do limite de ${(a.maxSize / 1048576).toFixed(1)}MB.`);
31
+ const l = e.target, o = Array.from(l.files || []);
32
+ l.value = "";
33
+ const t = [];
34
+ for (const d of o) {
35
+ if (d.size > n.maxSize) {
36
+ s("error", `"${d.name}" acima do limite de ${(n.maxSize / 1048576).toFixed(1)}MB.`);
67
37
  continue;
68
38
  }
69
- o.push(m);
39
+ t.push(d);
70
40
  }
71
- o.length && n("update:modelValue", a.multiple ? [...r.value, ...o] : o[0]);
41
+ t.length && s("update:modelValue", n.multiple ? [...r.value, ...t] : t[0]);
72
42
  }
73
- function b(e) {
74
- if (!a.multiple) {
75
- n("update:modelValue", null);
43
+ function h(e) {
44
+ if (!n.multiple) {
45
+ s("update:modelValue", null);
76
46
  return;
77
47
  }
78
- const t = r.value.slice();
79
- t.splice(e, 1), n("update:modelValue", t.length ? t : null);
48
+ const l = r.value.slice();
49
+ l.splice(e, 1), s("update:modelValue", l.length ? l : null);
80
50
  }
81
- function B(e) {
51
+ function C(e) {
82
52
  return e < 1024 ? `${e} B` : e < 1048576 ? `${(e / 1024).toFixed(0)} KB` : `${(e / 1048576).toFixed(1)} MB`;
83
53
  }
84
- return (e, t) => (u(), c("div", D, [
54
+ return (e, l) => (u(), p("div", V, [
85
55
  i("div", null, [
86
- y(f(g), {
56
+ m(f(W), {
87
57
  type: "button",
88
- label: l.chooseLabel,
58
+ label: a.chooseLabel,
89
59
  icon: "pi pi-upload",
90
60
  outlined: "",
91
61
  size: "small",
92
- disabled: l.disabled,
62
+ disabled: a.disabled,
93
63
  onClick: v
94
64
  }, null, 8, ["label", "disabled"])
95
65
  ]),
96
66
  i("input", {
97
67
  ref_key: "input",
98
- ref: d,
68
+ ref: c,
99
69
  type: "file",
100
- accept: l.accept,
101
- multiple: l.multiple,
70
+ accept: a.accept,
71
+ multiple: a.multiple,
102
72
  style: { display: "none" },
103
73
  onChange: x
104
74
  }, null, 40, $),
105
- r.value.length ? (u(), c("ul", A, [
106
- (u(!0), c(S, null, w(r.value, (s, o) => (u(), c("li", {
107
- key: `${s.name}-${o}`,
75
+ r.value.length ? (u(), p("ul", w, [
76
+ (u(!0), p(b, null, z(r.value, (o, t) => (u(), p("li", {
77
+ key: `${o.name}-${t}`,
108
78
  style: { display: "flex", "align-items": "center", gap: "0.5rem", "font-size": "0.85rem" }
109
79
  }, [
110
- t[0] || (t[0] = i("i", {
80
+ l[0] || (l[0] = i("i", {
111
81
  class: "pi pi-file",
112
82
  style: { opacity: "0.6" }
113
83
  }, null, -1)),
114
- i("span", K, W(s.name), 1),
115
- i("span", L, W(B(s.size)), 1),
116
- y(f(g), {
84
+ i("span", A, y(o.name), 1),
85
+ i("span", D, y(C(o.size)), 1),
86
+ m(f(W), {
117
87
  type: "button",
118
88
  icon: "pi pi-times",
119
89
  text: "",
120
90
  rounded: "",
121
91
  size: "small",
122
92
  severity: "danger",
123
- disabled: l.disabled,
124
- onClick: (m) => b(o)
93
+ disabled: a.disabled,
94
+ onClick: (d) => h(t)
125
95
  }, null, 8, ["disabled", "onClick"])
126
96
  ]))), 128))
127
- ])) : F(e.$slots, "empty", {}, () => [
128
- t[1] || (t[1] = i("span", { style: { "font-size": "0.8rem", opacity: "0.6" } }, "Nenhum arquivo selecionado", -1))
97
+ ])) : B(e.$slots, "empty", {}, () => [
98
+ l[1] || (l[1] = i("span", { style: { "font-size": "0.8rem", opacity: "0.6" } }, "Nenhum arquivo selecionado", -1))
129
99
  ], void 0, 1)
130
100
  ]));
131
101
  }
132
102
  });
133
103
  export {
134
- N as WActionBar,
135
- P as WAutoCompleteFK,
136
- T as WCrudColumnRenderer,
137
- j as WCrudFormDialog,
138
- G as WCrudView,
139
- E as WDateRange,
140
- J as WDetailHeader,
141
- O as WEmptyState,
142
- H as WFileUpload,
143
- Q as WFormRenderer,
144
- X as WFormSection,
145
- Y as WImageCropper,
146
- Z as WInfoCard,
147
- _ as WKpiCard,
148
- ee as WKpiGrid,
149
- le as WMoneyInput,
150
- te as WPageHeader,
151
- ae as WProgressFlow,
152
- oe as WSectionHeader,
153
- ne as WStatusTag,
104
+ I as WActionBar,
105
+ M as WAutoCompleteFK,
106
+ N as WCrudColumnRenderer,
107
+ P as WCrudFormDialog,
108
+ R as WCrudView,
109
+ _ as WDatePicker,
110
+ T as WDateRange,
111
+ U as WDetailHeader,
112
+ j as WEmptyState,
113
+ q as WFileUpload,
114
+ G as WFormRenderer,
115
+ J as WFormSection,
116
+ O as WImageCropper,
117
+ Q as WInfoCard,
118
+ X as WKpiCard,
119
+ Y as WKpiGrid,
120
+ Z as WMoneyInput,
121
+ ee as WPageHeader,
122
+ le as WProgressFlow,
123
+ te as WSectionHeader,
124
+ ae as WStatusTag,
154
125
  ie as WTransferList
155
126
  };
156
127
  //# sourceMappingURL=components.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":["../src/components/form/WDateRange.vue","../src/components/form/WFileUpload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport DatePicker from 'primevue/datepicker'\n\n/**\n * Seletor de intervalo de datas (período). Wrapper fino do DatePicker em modo\n * range com padrões pt-BR. O `v-model` guarda `[início, fim]` como `Date[]`.\n */\nwithDefaults(\n defineProps<{\n modelValue?: Date[] | null\n placeholder?: string\n minDate?: Date\n maxDate?: Date\n showButtonBar?: boolean\n disabled?: boolean\n }>(),\n {\n modelValue: null,\n placeholder: 'Selecione o período',\n showButtonBar: true,\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: Date[] | null] }>()\n\nfunction onUpdate(v: unknown) {\n emit('update:modelValue', (v as Date[] | null) ?? null)\n}\n</script>\n\n<template>\n <DatePicker\n :model-value=\"modelValue ?? undefined\"\n selection-mode=\"range\"\n :placeholder=\"placeholder\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :show-button-bar=\"showButtonBar\"\n :disabled=\"disabled\"\n date-format=\"dd/mm/yy\"\n fluid\n @update:model-value=\"onUpdate\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport Button from 'primevue/button'\n\n/**\n * Upload de arquivo(s) genérico (single ou multiple), sem dependência pesada.\n * O `v-model` guarda `File` (single) ou `File[]` (multiple). Valida tamanho por\n * arquivo e emite `error` para os que excederem.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: File | File[] | null\n multiple?: boolean\n accept?: string\n /** Tamanho máximo por arquivo em bytes (default 10MB). */\n maxSize?: number\n disabled?: boolean\n chooseLabel?: string\n }>(),\n {\n modelValue: null,\n multiple: false,\n accept: undefined,\n maxSize: 10_485_760,\n disabled: false,\n chooseLabel: 'Selecionar arquivo',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: File | File[] | null]\n error: [message: string]\n}>()\n\nconst input = ref<HTMLInputElement | null>(null)\nconst files = computed<File[]>(() => {\n const v = props.modelValue\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n})\n\nfunction open() {\n input.value?.click()\n}\n\nfunction onChange(e: Event) {\n const el = e.target as HTMLInputElement\n const picked = Array.from(el.files || [])\n el.value = ''\n const valid: File[] = []\n for (const f of picked) {\n if (f.size > props.maxSize) {\n emit('error', `\"${f.name}\" acima do limite de ${(props.maxSize / 1_048_576).toFixed(1)}MB.`)\n continue\n }\n valid.push(f)\n }\n if (!valid.length) return\n emit('update:modelValue', props.multiple ? [...files.value, ...valid] : valid[0])\n}\n\nfunction removeAt(i: number) {\n if (!props.multiple) {\n emit('update:modelValue', null)\n return\n }\n const next = files.value.slice()\n next.splice(i, 1)\n emit('update:modelValue', next.length ? next : null)\n}\n\nfunction fmtSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1_048_576) return `${(bytes / 1024).toFixed(0)} KB`\n return `${(bytes / 1_048_576).toFixed(1)} MB`\n}\n</script>\n\n<template>\n <div class=\"w-fileupload\" style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <Button\n type=\"button\"\n :label=\"chooseLabel\"\n icon=\"pi pi-upload\"\n outlined\n size=\"small\"\n :disabled=\"disabled\"\n @click=\"open\"\n />\n </div>\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n style=\"display: none\"\n @change=\"onChange\"\n />\n <ul\n v-if=\"files.length\"\n style=\"\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n \"\n >\n <li\n v-for=\"(f, i) in files\"\n :key=\"`${f.name}-${i}`\"\n style=\"display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem\"\n >\n <i class=\"pi pi-file\" style=\"opacity: 0.6\" />\n <span style=\"flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap\">\n {{ f.name }}\n </span>\n <span style=\"opacity: 0.6\">{{ fmtSize(f.size) }}</span>\n <Button\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n size=\"small\"\n severity=\"danger\"\n :disabled=\"disabled\"\n @click=\"removeAt(i)\"\n />\n </li>\n </ul>\n <slot v-else name=\"empty\">\n <span style=\"font-size: 0.8rem; opacity: 0.6\">Nenhum arquivo selecionado</span>\n </slot>\n </div>\n</template>\n"],"names":["emit","__emit","onUpdate","v","_createBlock","_unref","DatePicker","__props","props","input","ref","files","computed","open","_a","onChange","el","picked","valid","f","removeAt","i","next","fmtSize","bytes","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_createVNode","Button","_hoisted_3","_Fragment","_renderList","_hoisted_4","_toDisplayString","_hoisted_5","$event","_renderSlot","_ctx","_cache"],"mappings":"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"}
1
+ {"version":3,"file":"components.js","sources":["../src/components/form/WFileUpload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport Button from 'primevue/button'\n\n/**\n * Upload de arquivo(s) genérico (single ou multiple), sem dependência pesada.\n * O `v-model` guarda `File` (single) ou `File[]` (multiple). Valida tamanho por\n * arquivo e emite `error` para os que excederem.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: File | File[] | null\n multiple?: boolean\n accept?: string\n /** Tamanho máximo por arquivo em bytes (default 10MB). */\n maxSize?: number\n disabled?: boolean\n chooseLabel?: string\n }>(),\n {\n modelValue: null,\n multiple: false,\n accept: undefined,\n maxSize: 10_485_760,\n disabled: false,\n chooseLabel: 'Selecionar arquivo',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: File | File[] | null]\n error: [message: string]\n}>()\n\nconst input = ref<HTMLInputElement | null>(null)\nconst files = computed<File[]>(() => {\n const v = props.modelValue\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n})\n\nfunction open() {\n input.value?.click()\n}\n\nfunction onChange(e: Event) {\n const el = e.target as HTMLInputElement\n const picked = Array.from(el.files || [])\n el.value = ''\n const valid: File[] = []\n for (const f of picked) {\n if (f.size > props.maxSize) {\n emit('error', `\"${f.name}\" acima do limite de ${(props.maxSize / 1_048_576).toFixed(1)}MB.`)\n continue\n }\n valid.push(f)\n }\n if (!valid.length) return\n emit('update:modelValue', props.multiple ? [...files.value, ...valid] : valid[0])\n}\n\nfunction removeAt(i: number) {\n if (!props.multiple) {\n emit('update:modelValue', null)\n return\n }\n const next = files.value.slice()\n next.splice(i, 1)\n emit('update:modelValue', next.length ? next : null)\n}\n\nfunction fmtSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1_048_576) return `${(bytes / 1024).toFixed(0)} KB`\n return `${(bytes / 1_048_576).toFixed(1)} MB`\n}\n</script>\n\n<template>\n <div class=\"w-fileupload\" style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <Button\n type=\"button\"\n :label=\"chooseLabel\"\n icon=\"pi pi-upload\"\n outlined\n size=\"small\"\n :disabled=\"disabled\"\n @click=\"open\"\n />\n </div>\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n style=\"display: none\"\n @change=\"onChange\"\n />\n <ul\n v-if=\"files.length\"\n style=\"\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n \"\n >\n <li\n v-for=\"(f, i) in files\"\n :key=\"`${f.name}-${i}`\"\n style=\"display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem\"\n >\n <i class=\"pi pi-file\" style=\"opacity: 0.6\" />\n <span style=\"flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap\">\n {{ f.name }}\n </span>\n <span style=\"opacity: 0.6\">{{ fmtSize(f.size) }}</span>\n <Button\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n size=\"small\"\n severity=\"danger\"\n :disabled=\"disabled\"\n @click=\"removeAt(i)\"\n />\n </li>\n </ul>\n <slot v-else name=\"empty\">\n <span style=\"font-size: 0.8rem; opacity: 0.6\">Nenhum arquivo selecionado</span>\n </slot>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","input","ref","files","computed","v","open","_a","onChange","el","picked","valid","f","removeAt","i","next","fmtSize","bytes","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_createVNode","_unref","Button","_hoisted_3","_Fragment","_renderList","_hoisted_4","_toDisplayString","_hoisted_5","$event","_renderSlot","_ctx","_cache"],"mappings":"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"}
@@ -1,5 +1,8 @@
1
1
  export { useCrudManager } from './useCrudManager';
2
2
  export { defineCrudConfig } from './defineCrudConfig';
3
+ export { useFormKeyboardNav } from './useFormKeyboardNav';
4
+ export { useDateInput } from './useDateInput';
5
+ export type { DateValueFormat } from './useDateInput';
3
6
  export { useApi } from './useApi';
4
7
  export { useAppToast } from './useAppToast';
5
8
  export { useAppConfirm } from './useAppConfirm';
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Formato do valor emitido pelo WDatePicker:
3
+ * - `'iso'` → string `YYYY-MM-DD` (ou `YYYY-MM-DDTHH:mm:ss` com hora). Ideal p/ API.
4
+ * - `'date'` → objeto `Date` (compatível com o contrato atual do useCrudManager).
5
+ */
6
+ export type DateValueFormat = 'iso' | 'date';
7
+ export interface UseDateInputOptions {
8
+ /** Reativo: se o campo inclui hora (datetime). */
9
+ showTime?: () => boolean;
10
+ /** Reativo: formato do valor emitido (default `'iso'`). */
11
+ valueFormat?: () => DateValueFormat;
12
+ }
13
+ /**
14
+ * Lógica pura de parse/format/máscara para inputs de data em pt-BR.
15
+ *
16
+ * Timezone-safe: parse e format usam sempre os componentes LOCAIS via dayjs
17
+ * (nunca `toISOString`, que converte p/ UTC e causa off-by-one em fusos negativos).
18
+ * Sem estado reativo próprio — apenas funções; o componente cuida da reatividade.
19
+ */
20
+ export declare function useDateInput(opts?: UseDateInputOptions): {
21
+ toDate: (value: unknown) => Date | null;
22
+ toValue: (date: Date | null) => string | Date | null;
23
+ toDisplay: (date: Date | null) => string;
24
+ fromDisplay: (text: string) => Date | null;
25
+ today: () => Date;
26
+ mask: () => "##/##/#### ##:##" | "##/##/####";
27
+ placeholder: () => "dd/mm/aaaa hh:mm" | "dd/mm/aaaa";
28
+ displayFormat: () => "DD/MM/YYYY" | "DD/MM/YYYY HH:mm";
29
+ };
@@ -0,0 +1,11 @@
1
+ import { Ref } from 'vue';
2
+ export interface FormKeyboardNavOptions {
3
+ /** Liga/desliga a navegação (default: sempre ligada). */
4
+ enabled?: () => boolean;
5
+ /** Chamado quando o Enter passa do último elemento sem próximo foco. */
6
+ onSubmit?: () => void;
7
+ }
8
+ export declare function useFormKeyboardNav(container: Ref<HTMLElement | null>, options?: FormKeyboardNavOptions): {
9
+ focusFirst: () => void;
10
+ handleKeydown: (e: KeyboardEvent) => void;
11
+ };
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useApi-5Pr4nXAa.cjs"),r=require("./useApiError-BEbEk2Kq.cjs");function s(u){return u}exports.useApi=e.useApi;exports.useCrudManager=e.useCrudManager;exports.extractApiError=r.extractApiError;exports.useApiError=r.useApiError;exports.useAppConfirm=r.useAppConfirm;exports.useAppToast=r.useAppToast;exports.useFormatters=r.useFormatters;exports.defineCrudConfig=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useApi-BDjRqSFt.cjs"),e=require("./useFormKeyboardNav-D4Ow3k4Y.cjs");function s(u){return u}exports.useApi=r.useApi;exports.useCrudManager=r.useCrudManager;exports.extractApiError=e.extractApiError;exports.useApiError=e.useApiError;exports.useAppConfirm=e.useAppConfirm;exports.useAppToast=e.useAppToast;exports.useDateInput=e.useDateInput;exports.useFormKeyboardNav=e.useFormKeyboardNav;exports.useFormatters=e.useFormatters;exports.defineCrudConfig=s;
2
2
  //# sourceMappingURL=composables.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables.cjs","sources":["../src/composables/defineCrudConfig.ts"],"sourcesContent":["import type { CrudManagerConfig } from '@/types/manager'\n\n/**\n * Helper de autoria tipado para o config do `useCrudManager`.\n *\n * Dá inferência do tipo do registro `T` (usado em `rowActions`, `onAfterSave`,\n * `transformPayload`, etc.) e autocomplete/type-check ao montar o config,\n * sem precisar anotar `CrudManagerConfig<T>` na mão.\n *\n * @example\n * const config = defineCrudConfig<Produto>({\n * endpoint: '/produtos',\n * columns: [...],\n * form: [...],\n * onAfterSave: (p) => { p.nome }, // p é Produto\n * })\n * const crud = useCrudManager(config)\n */\nexport function defineCrudConfig<T extends Record<string, unknown> = Record<string, unknown>>(\n config: CrudManagerConfig<T>,\n): CrudManagerConfig<T> {\n return config\n}\n"],"names":["defineCrudConfig","config"],"mappings":"iKAkBO,SAASA,EACdC,EACsB,CACtB,OAAOA,CACT"}
1
+ {"version":3,"file":"composables.cjs","sources":["../src/composables/defineCrudConfig.ts"],"sourcesContent":["import type { CrudManagerConfig } from '@/types/manager'\n\n/**\n * Helper de autoria tipado para o config do `useCrudManager`.\n *\n * Dá inferência do tipo do registro `T` (usado em `rowActions`, `onAfterSave`,\n * `transformPayload`, etc.) e autocomplete/type-check ao montar o config,\n * sem precisar anotar `CrudManagerConfig<T>` na mão.\n *\n * @example\n * const config = defineCrudConfig<Produto>({\n * endpoint: '/produtos',\n * columns: [...],\n * form: [...],\n * onAfterSave: (p) => { p.nome }, // p é Produto\n * })\n * const crud = useCrudManager(config)\n */\nexport function defineCrudConfig<T extends Record<string, unknown> = Record<string, unknown>>(\n config: CrudManagerConfig<T>,\n): CrudManagerConfig<T> {\n return config\n}\n"],"names":["defineCrudConfig","config"],"mappings":"wKAkBO,SAASA,EACdC,EACsB,CACtB,OAAOA,CACT"}
@@ -1,16 +1,18 @@
1
- import { u as o, a as u } from "./useApi-Bxrw3Sia.js";
2
- import { e as t, u as i, a as n, b as f, c as A } from "./useApiError-C7rPzGrF.js";
1
+ import { u, a as o } from "./useApi-CzOJADZw.js";
2
+ import { e as p, u as n, a as f, b as i, c as d, d as m, f as A } from "./useFormKeyboardNav-D4Irq5RE.js";
3
3
  function e(r) {
4
4
  return r;
5
5
  }
6
6
  export {
7
7
  e as defineCrudConfig,
8
- t as extractApiError,
9
- o as useApi,
10
- i as useApiError,
11
- n as useAppConfirm,
12
- f as useAppToast,
13
- u as useCrudManager,
8
+ p as extractApiError,
9
+ u as useApi,
10
+ n as useApiError,
11
+ f as useAppConfirm,
12
+ i as useAppToast,
13
+ o as useCrudManager,
14
+ d as useDateInput,
15
+ m as useFormKeyboardNav,
14
16
  A as useFormatters
15
17
  };
16
18
  //# sourceMappingURL=composables.js.map
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./plugin-D1YvyKXX.cjs"),n=require("./WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs"),W=require("./useApi-5Pr4nXAa.cjs"),g=require("./useApiError-BEbEk2Kq.cjs"),C=require("./types.cjs");function D(e,a,t){const r=e;return Array.isArray(r.results)?{data:r.results,page:r.page??a,page_size:r.page_size??t,rows:r.count??0,extras:r.extras??{}}:Array.isArray(r.data)?{data:r.data,page:r.page??a,page_size:r.page_size??t,rows:r.rows??0,extras:r.extras??{}}:{data:Array.isArray(e)?e:[],page:a,page_size:t,rows:Array.isArray(e)?e.length:0,extras:{}}}function P(e){return{async list(a,t={}){const r=await e.get(a,{params:t});return D(r.data,Number(t.page??1),Number(t.page_size??20))},async get(a,t,r){return{data:(await e.get(`${a}${t}/`,r)).data}},async create(a,t,r){return{data:(await e.post(a,t,r)).data}},async update(a,t,r,s){return{data:(await e.patch(`${a}${t}/`,r,s)).data}},async delete(a,t){await e.delete(`${a}${t}/`)}}}const F={install(e,a){if(!(a!=null&&a.axios)&&!(a!=null&&a.dataProvider))throw new Error('[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.');const t=a.dataProvider??P(a.axios),r={axios:a.axios,dataProvider:t,defaultPageSize:a.defaultPageSize??20,dateFormat:a.dateFormat??"DD/MM/YYYY",dateTimeFormat:a.dateTimeFormat??"DD/MM/YYYY HH:mm",locale:a.locale??"pt-BR",currency:a.currency??"BRL"};a.axios&&e.provide(m.W_AXIOS_KEY,a.axios),e.provide(m.W_DATA_PROVIDER_KEY,t),e.provide(m.W_CONFIG_KEY,r),a.registerComponents!==!1&&(e.component("WCrudView",n._sfc_main$4),e.component("WCrudFormDialog",n._sfc_main$3),e.component("WCrudColumnRenderer",n._sfc_main$2),e.component("WAutoCompleteFK",n._sfc_main$1),e.component("WMoneyInput",n._sfc_main$12),e.component("WTransferList",n._sfc_main$17))}};function v(e){return e.split("?")[0].replace(/^\/+|\/+$/g,"").replace(/^api\/v\d+\//,"")}function w(e){return typeof e=="string"?{table:e}:e}function $(e,a=400){return{response:{status:a,data:{detail:e}},message:e}}function y(e){if(e instanceof FormData)throw $("SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.");return e}function _(e){throw{response:{data:{detail:(e==null?void 0:e.message)??"Erro ao consultar Supabase",code:e==null?void 0:e.code,details:e==null?void 0:e.details,hint:e==null?void 0:e.hint}},message:(e==null?void 0:e.message)??"Erro ao consultar Supabase"}}function p(e,a){var s,i;const t=v(e),r=(s=a.resources)==null?void 0:s[t];if(r)return w(r);if((i=a.allowedTables)!=null&&i.includes(t))return{table:t};throw $(`Recurso Supabase nao registrado para o endpoint "${e}".`,404)}function E(e,a,t){const r=new Set(["page","page_size","search","ordering"]),s={...t.defaultFilters,...a};for(const[i,o]of Object.entries(s))r.has(i)||o===null||o===void 0||o===""||(e=e.eq(i,o));return e}function S(e,a,t){if(typeof a!="string"||!a.trim()||!(t!=null&&t.length))return e;const r=a.trim().replace(/,/g,"\\,"),s=t.map(i=>`${i}.ilike.%${r}%`).join(",");return e.or(s)}function T(e,a){const t=typeof e=="string"&&e?e:a;return t?{field:t.startsWith("-")?t.slice(1):t,ascending:!t.startsWith("-")}:null}function b(e,a){return e?a.mapListItem?e.map(t=>{var r;return(r=a.mapListItem)==null?void 0:r.call(a,t)}):e:[]}function R(e){const a=e.defaultSelect??"*";return{async list(t,r={}){var A;const s=p(t,e),i=Math.max(Number(r.page??1),1),o=Math.max(Number(r.page_size??20),1),c=(i-1)*o,l=c+o-1;let u=e.client.from(s.table).select(s.select??a,{count:"exact"});u=E(u,r,s),u=S(u,r.search,s.searchFields);const d=T(r.ordering,s.defaultOrdering);d&&(u=u.order(d.field,{ascending:d.ascending}));const f=await u.range(c,l);return f.error&&_(f.error),{data:b(f.data,s),page:i,page_size:o,rows:f.count??((A=f.data)==null?void 0:A.length)??0,extras:{}}},async get(t,r,s){const i=p(t,e),o=i.pk??"id",c=await e.client.from(i.table).select(i.select??a).eq(o,r).single();return c.error&&_(c.error),{data:c.data}},async create(t,r,s){const i=p(t,e),o=y(r),c=i.mapPayload?i.mapPayload(o,"create"):o,l=await e.client.from(i.table).insert(c).select(i.select??a).single();return l.error&&_(l.error),{data:l.data}},async update(t,r,s,i){const o=p(t,e),c=o.pk??"id",l=y(s),u=o.mapPayload?o.mapPayload(l,"update"):l,d=await e.client.from(o.table).update(u).eq(c,r).select(o.select??a).single();return d.error&&_(d.error),{data:d.data}},async delete(t,r){const s=p(t,e),i=s.pk??"id",o=s.softDelete===!0?{is_active:!1}:typeof s.softDelete=="object"?s.softDelete:null,c=o?await e.client.from(s.table).update(o).eq(i,r):await e.client.from(s.table).delete().eq(i,r);c.error&&_(c.error)}}}exports.W_AXIOS_KEY=m.W_AXIOS_KEY;exports.W_CONFIG_KEY=m.W_CONFIG_KEY;exports.W_DATA_PROVIDER_KEY=m.W_DATA_PROVIDER_KEY;exports.WActionBar=n._sfc_main;exports.WAutoCompleteFK=n._sfc_main$1;exports.WCrudColumnRenderer=n._sfc_main$2;exports.WCrudFormDialog=n._sfc_main$3;exports.WCrudView=n._sfc_main$4;exports.WDetailHeader=n._sfc_main$5;exports.WEmptyState=n._sfc_main$6;exports.WFormRenderer=n._sfc_main$7;exports.WFormSection=n._sfc_main$8;exports.WInfoCard=n._sfc_main$9;exports.WKpiCard=n._sfc_main$10;exports.WKpiGrid=n._sfc_main$11;exports.WMoneyInput=n._sfc_main$12;exports.WPageHeader=n._sfc_main$13;exports.WProgressFlow=n._sfc_main$14;exports.WSectionHeader=n._sfc_main$15;exports.WStatusTag=n._sfc_main$16;exports.WTransferList=n._sfc_main$17;exports.downloadCsv=n.downloadCsv;exports.mapApiFieldToColumnDef=n.mapApiFieldToColumnDef;exports.mapApiFieldToFieldDef=n.mapApiFieldToFieldDef;exports.mapApiFieldsToColumnDefs=n.mapApiFieldsToColumnDefs;exports.mapApiFieldsToFieldDefs=n.mapApiFieldsToFieldDefs;exports.toCsv=n.toCsv;exports.useApi=W.useApi;exports.useCrudManager=W.useCrudManager;exports.extractApiError=g.extractApiError;exports.useApiError=g.useApiError;exports.useAppConfirm=g.useAppConfirm;exports.useAppToast=g.useAppToast;exports.useFormatters=g.useFormatters;exports.DEFAULT_CRUD_LABELS=C.DEFAULT_CRUD_LABELS;exports.WPrimeVuePlugin=F;exports.createAxiosDataProvider=P;exports.createSupabaseDataProvider=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./plugin-D1YvyKXX.cjs"),n=require("./WProgressFlow.vue_vue_type_script_setup_true_lang-C9YG4BXB.cjs"),W=require("./useApi-BDjRqSFt.cjs"),f=require("./useFormKeyboardNav-D4Ow3k4Y.cjs"),P=require("./types.cjs");function F(e,a,t){const r=e;return Array.isArray(r.results)?{data:r.results,page:r.page??a,page_size:r.page_size??t,rows:r.count??0,extras:r.extras??{}}:Array.isArray(r.data)?{data:r.data,page:r.page??a,page_size:r.page_size??t,rows:r.rows??0,extras:r.extras??{}}:{data:Array.isArray(e)?e:[],page:a,page_size:t,rows:Array.isArray(e)?e.length:0,extras:{}}}function D(e){return{async list(a,t={}){const r=await e.get(a,{params:t});return F(r.data,Number(t.page??1),Number(t.page_size??20))},async get(a,t,r){return{data:(await e.get(`${a}${t}/`,r)).data}},async create(a,t,r){return{data:(await e.post(a,t,r)).data}},async update(a,t,r,s){return{data:(await e.patch(`${a}${t}/`,r,s)).data}},async delete(a,t){await e.delete(`${a}${t}/`)}}}const C={install(e,a){if(!(a!=null&&a.axios)&&!(a!=null&&a.dataProvider))throw new Error('[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.');const t=a.dataProvider??D(a.axios),r={axios:a.axios,dataProvider:t,defaultPageSize:a.defaultPageSize??20,dateFormat:a.dateFormat??"DD/MM/YYYY",dateTimeFormat:a.dateTimeFormat??"DD/MM/YYYY HH:mm",locale:a.locale??"pt-BR",currency:a.currency??"BRL"};a.axios&&e.provide(m.W_AXIOS_KEY,a.axios),e.provide(m.W_DATA_PROVIDER_KEY,t),e.provide(m.W_CONFIG_KEY,r),a.registerComponents!==!1&&(e.component("WCrudView",n._sfc_main$4),e.component("WCrudFormDialog",n._sfc_main$3),e.component("WCrudColumnRenderer",n._sfc_main$2),e.component("WAutoCompleteFK",n._sfc_main$1),e.component("WMoneyInput",n._sfc_main$14),e.component("WTransferList",n._sfc_main$19))}};function v(e){return e.split("?")[0].replace(/^\/+|\/+$/g,"").replace(/^api\/v\d+\//,"")}function w(e){return typeof e=="string"?{table:e}:e}function $(e,a=400){return{response:{status:a,data:{detail:e}},message:e}}function y(e){if(e instanceof FormData)throw $("SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.");return e}function p(e){throw{response:{data:{detail:(e==null?void 0:e.message)??"Erro ao consultar Supabase",code:e==null?void 0:e.code,details:e==null?void 0:e.details,hint:e==null?void 0:e.hint}},message:(e==null?void 0:e.message)??"Erro ao consultar Supabase"}}function g(e,a){var s,i;const t=v(e),r=(s=a.resources)==null?void 0:s[t];if(r)return w(r);if((i=a.allowedTables)!=null&&i.includes(t))return{table:t};throw $(`Recurso Supabase nao registrado para o endpoint "${e}".`,404)}function E(e,a,t){const r=new Set(["page","page_size","search","ordering"]),s={...t.defaultFilters,...a};for(const[i,o]of Object.entries(s))r.has(i)||o===null||o===void 0||o===""||(e=e.eq(i,o));return e}function S(e,a,t){if(typeof a!="string"||!a.trim()||!(t!=null&&t.length))return e;const r=a.trim().replace(/,/g,"\\,"),s=t.map(i=>`${i}.ilike.%${r}%`).join(",");return e.or(s)}function T(e,a){const t=typeof e=="string"&&e?e:a;return t?{field:t.startsWith("-")?t.slice(1):t,ascending:!t.startsWith("-")}:null}function b(e,a){return e?a.mapListItem?e.map(t=>{var r;return(r=a.mapListItem)==null?void 0:r.call(a,t)}):e:[]}function R(e){const a=e.defaultSelect??"*";return{async list(t,r={}){var A;const s=g(t,e),i=Math.max(Number(r.page??1),1),o=Math.max(Number(r.page_size??20),1),c=(i-1)*o,l=c+o-1;let u=e.client.from(s.table).select(s.select??a,{count:"exact"});u=E(u,r,s),u=S(u,r.search,s.searchFields);const d=T(r.ordering,s.defaultOrdering);d&&(u=u.order(d.field,{ascending:d.ascending}));const _=await u.range(c,l);return _.error&&p(_.error),{data:b(_.data,s),page:i,page_size:o,rows:_.count??((A=_.data)==null?void 0:A.length)??0,extras:{}}},async get(t,r,s){const i=g(t,e),o=i.pk??"id",c=await e.client.from(i.table).select(i.select??a).eq(o,r).single();return c.error&&p(c.error),{data:c.data}},async create(t,r,s){const i=g(t,e),o=y(r),c=i.mapPayload?i.mapPayload(o,"create"):o,l=await e.client.from(i.table).insert(c).select(i.select??a).single();return l.error&&p(l.error),{data:l.data}},async update(t,r,s,i){const o=g(t,e),c=o.pk??"id",l=y(s),u=o.mapPayload?o.mapPayload(l,"update"):l,d=await e.client.from(o.table).update(u).eq(c,r).select(o.select??a).single();return d.error&&p(d.error),{data:d.data}},async delete(t,r){const s=g(t,e),i=s.pk??"id",o=s.softDelete===!0?{is_active:!1}:typeof s.softDelete=="object"?s.softDelete:null,c=o?await e.client.from(s.table).update(o).eq(i,r):await e.client.from(s.table).delete().eq(i,r);c.error&&p(c.error)}}}exports.W_AXIOS_KEY=m.W_AXIOS_KEY;exports.W_CONFIG_KEY=m.W_CONFIG_KEY;exports.W_DATA_PROVIDER_KEY=m.W_DATA_PROVIDER_KEY;exports.WActionBar=n._sfc_main;exports.WAutoCompleteFK=n._sfc_main$1;exports.WCrudColumnRenderer=n._sfc_main$2;exports.WCrudFormDialog=n._sfc_main$3;exports.WCrudView=n._sfc_main$4;exports.WDatePicker=n._sfc_main$5;exports.WDateRange=n._sfc_main$6;exports.WDetailHeader=n._sfc_main$7;exports.WEmptyState=n._sfc_main$8;exports.WFormRenderer=n._sfc_main$9;exports.WFormSection=n._sfc_main$10;exports.WInfoCard=n._sfc_main$11;exports.WKpiCard=n._sfc_main$12;exports.WKpiGrid=n._sfc_main$13;exports.WMoneyInput=n._sfc_main$14;exports.WPageHeader=n._sfc_main$15;exports.WProgressFlow=n._sfc_main$16;exports.WSectionHeader=n._sfc_main$17;exports.WStatusTag=n._sfc_main$18;exports.WTransferList=n._sfc_main$19;exports.downloadCsv=n.downloadCsv;exports.mapApiFieldToColumnDef=n.mapApiFieldToColumnDef;exports.mapApiFieldToFieldDef=n.mapApiFieldToFieldDef;exports.mapApiFieldsToColumnDefs=n.mapApiFieldsToColumnDefs;exports.mapApiFieldsToFieldDefs=n.mapApiFieldsToFieldDefs;exports.toCsv=n.toCsv;exports.useApi=W.useApi;exports.useCrudManager=W.useCrudManager;exports.extractApiError=f.extractApiError;exports.useApiError=f.useApiError;exports.useAppConfirm=f.useAppConfirm;exports.useAppToast=f.useAppToast;exports.useDateInput=f.useDateInput;exports.useFormatters=f.useFormatters;exports.DEFAULT_CRUD_LABELS=P.DEFAULT_CRUD_LABELS;exports.WPrimeVuePlugin=C;exports.createAxiosDataProvider=D;exports.createSupabaseDataProvider=R;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/data-providers/axiosDataProvider.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/data-providers/axiosDataProvider.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { WPrimeVuePlugin } from './plugin';
2
- export { WCrudView, WCrudFormDialog, WCrudColumnRenderer, WAutoCompleteFK, WFormRenderer, WMoneyInput, WTransferList, WStatusTag, WPageHeader, WDetailHeader, WEmptyState, WInfoCard, WKpiCard, WKpiGrid, WSectionHeader, WFormSection, WActionBar, WProgressFlow, } from './components';
3
- export { useCrudManager, useApi, useAppToast, useAppConfirm, useApiError, extractApiError, useFormatters, } from './composables';
2
+ export { WCrudView, WCrudFormDialog, WCrudColumnRenderer, WAutoCompleteFK, WFormRenderer, WDatePicker, WDateRange, WMoneyInput, WTransferList, WStatusTag, WPageHeader, WDetailHeader, WEmptyState, WInfoCard, WKpiCard, WKpiGrid, WSectionHeader, WFormSection, WActionBar, WProgressFlow, } from './components';
3
+ export { useCrudManager, useApi, useAppToast, useAppConfirm, useApiError, extractApiError, useFormatters, useDateInput, } from './composables';
4
+ export type { DateValueFormat } from './composables';
4
5
  export { createAxiosDataProvider, createSupabaseDataProvider } from './data-providers';
5
6
  export type { PaginatedResponse, PaginationState, SortState, UseApiOptions, UseApiReturn, ColumnDef, ColumnType, FieldDef, FieldType, SelectOption, RowAction, CrudLabels, KpiItem, CrudManagerConfig, CrudManagerReturn, WPluginOptions, WPluginConfig, DataProvider, DataProviderListParams, DataProviderListResponse, DataProviderRequestConfig, DataProviderResponse, } from './types';
6
7
  export type { StatusMapping } from './components/ui/WStatusTag.vue';