@wgalleti/primevue-components 0.7.1 → 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.
Files changed (34) hide show
  1. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js +3126 -0
  2. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js.map +1 -0
  3. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs +12 -0
  4. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs.map +1 -0
  5. package/dist/components/crud/WCrudView.vue.d.ts +15 -1
  6. package/dist/components/form/WDateRange.vue.d.ts +23 -0
  7. package/dist/components/form/WFileUpload.vue.d.ts +48 -0
  8. package/dist/components/index.d.ts +2 -0
  9. package/dist/components.cjs +1 -1
  10. package/dist/components.cjs.map +1 -1
  11. package/dist/components.js +153 -20
  12. package/dist/components.js.map +1 -1
  13. package/dist/composables/defineCrudConfig.d.ts +18 -0
  14. package/dist/composables/index.d.ts +1 -0
  15. package/dist/composables.cjs +1 -1
  16. package/dist/composables.cjs.map +1 -1
  17. package/dist/composables.js +13 -9
  18. package/dist/composables.js.map +1 -1
  19. package/dist/index.cjs +1 -1
  20. package/dist/index.js +3 -3
  21. package/dist/types/manager.d.ts +5 -0
  22. package/dist/useApi-5Pr4nXAa.cjs +2 -0
  23. package/dist/useApi-5Pr4nXAa.cjs.map +1 -0
  24. package/dist/useApi-Bxrw3Sia.js +395 -0
  25. package/dist/useApi-Bxrw3Sia.js.map +1 -0
  26. package/package.json +2 -2
  27. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-B70Uk-1x.cjs +0 -12
  28. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-B70Uk-1x.cjs.map +0 -1
  29. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BVlG1in1.js +0 -3024
  30. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BVlG1in1.js.map +0 -1
  31. package/dist/useApi-B692TOWz.js +0 -383
  32. package/dist/useApi-B692TOWz.js.map +0 -1
  33. package/dist/useApi-BIlKLud-.cjs +0 -2
  34. package/dist/useApi-BIlKLud-.cjs.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { CrudManagerReturn } from '../../types/manager';
2
+ import { FieldDef } from '../../types/field';
2
3
  import { KpiItem } from '../../types/kpi';
3
4
  type __VLS_Props = {
4
5
  crud: CrudManagerReturn<any>;
@@ -26,6 +27,9 @@ type __VLS_Props = {
26
27
  csvFilename?: string;
27
28
  csvScope?: 'all' | 'page';
28
29
  csvPageSize?: number;
30
+ /** Chave de persistência do estado de coluna (visibilidade) em localStorage.
31
+ * Opt-in: quando definida, exibe o seletor de colunas e persiste o que foi ocultado. */
32
+ persistState?: string;
29
33
  };
30
34
  declare function __VLS_template(): {
31
35
  attrs: Partial<{}>;
@@ -36,7 +40,7 @@ declare function __VLS_template(): {
36
40
  data: any;
37
41
  value: any;
38
42
  }) => any>> & Partial<Record<`field-${string}`, (_: {
39
- field: import('../..').FieldDef;
43
+ field: FieldDef;
40
44
  formData: Record<string, unknown>;
41
45
  isEditing: boolean;
42
46
  setFormField: (f: string, v: unknown) => void;
@@ -76,6 +80,11 @@ declare function __VLS_template(): {
76
80
  }): any;
77
81
  };
78
82
  refs: {
83
+ chooser: ({
84
+ $props: import('primevue/popover').PopoverProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
85
+ $slots: import('primevue/popover').PopoverSlots;
86
+ $emit: ((e: "show") => void) & ((e: "hide") => void);
87
+ } & import('primevue/popover').PopoverMethods) | null;
79
88
  cm: ({
80
89
  $props: import('primevue/contextmenu').ContextMenuProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
81
90
  $slots: import('primevue/contextmenu').ContextMenuSlots;
@@ -114,6 +123,11 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
114
123
  csvScope: "all" | "page";
115
124
  csvPageSize: number;
116
125
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
126
+ chooser: ({
127
+ $props: import('primevue/popover').PopoverProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
128
+ $slots: import('primevue/popover').PopoverSlots;
129
+ $emit: ((e: "show") => void) & ((e: "hide") => void);
130
+ } & import('primevue/popover').PopoverMethods) | null;
117
131
  cm: ({
118
132
  $props: import('primevue/contextmenu').ContextMenuProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
119
133
  $slots: import('primevue/contextmenu').ContextMenuSlots;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Seletor de intervalo de datas (período). Wrapper fino do DatePicker em modo
3
+ * range com padrões pt-BR. O `v-model` guarda `[início, fim]` como `Date[]`.
4
+ */
5
+ type __VLS_Props = {
6
+ modelValue?: Date[] | null;
7
+ placeholder?: string;
8
+ minDate?: Date;
9
+ maxDate?: Date;
10
+ showButtonBar?: boolean;
11
+ disabled?: boolean;
12
+ };
13
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
14
+ "update:modelValue": (value: Date[] | null) => any;
15
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
16
+ "onUpdate:modelValue"?: ((value: Date[] | null) => any) | undefined;
17
+ }>, {
18
+ modelValue: Date[] | null;
19
+ placeholder: string;
20
+ disabled: boolean;
21
+ showButtonBar: boolean;
22
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
23
+ export default _default;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Upload de arquivo(s) genérico (single ou multiple), sem dependência pesada.
3
+ * O `v-model` guarda `File` (single) ou `File[]` (multiple). Valida tamanho por
4
+ * arquivo e emite `error` para os que excederem.
5
+ */
6
+ type __VLS_Props = {
7
+ modelValue?: File | File[] | null;
8
+ multiple?: boolean;
9
+ accept?: string;
10
+ /** Tamanho máximo por arquivo em bytes (default 10MB). */
11
+ maxSize?: number;
12
+ disabled?: boolean;
13
+ chooseLabel?: string;
14
+ };
15
+ declare function __VLS_template(): {
16
+ attrs: Partial<{}>;
17
+ slots: {
18
+ empty?(_: {}): any;
19
+ };
20
+ refs: {
21
+ input: HTMLInputElement;
22
+ };
23
+ rootEl: HTMLDivElement;
24
+ };
25
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
26
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
27
+ error: (message: string) => any;
28
+ "update:modelValue": (value: File | File[] | null) => any;
29
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
30
+ onError?: ((message: string) => any) | undefined;
31
+ "onUpdate:modelValue"?: ((value: File | File[] | null) => any) | undefined;
32
+ }>, {
33
+ modelValue: File | File[] | null;
34
+ disabled: boolean;
35
+ accept: string;
36
+ maxSize: number;
37
+ multiple: boolean;
38
+ chooseLabel: string;
39
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
40
+ input: HTMLInputElement;
41
+ }, HTMLDivElement>;
42
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
43
+ export default _default;
44
+ type __VLS_WithTemplateSlots<T, S> = T & {
45
+ new (): {
46
+ $slots: S;
47
+ };
48
+ };
@@ -4,6 +4,8 @@ export { default as WCrudColumnRenderer } from './crud/WCrudColumnRenderer.vue';
4
4
  export { default as WAutoCompleteFK } from './form/WAutoCompleteFK.vue';
5
5
  export { default as WFormRenderer } from './form/WFormRenderer.vue';
6
6
  export { default as WImageCropper } from './form/WImageCropper.vue';
7
+ export { default as WDateRange } from './form/WDateRange.vue';
8
+ export { default as WFileUpload } from './form/WFileUpload.vue';
7
9
  export { default as WMoneyInput } from './form/WMoneyInput.vue';
8
10
  export { default as WTransferList } from './form/WTransferList.vue';
9
11
  export { default as WStatusTag } from './ui/WStatusTag.vue';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("./WProgressFlow.vue_vue_type_script_setup_true_lang-B70Uk-1x.cjs");exports.WActionBar=_._sfc_main;exports.WAutoCompleteFK=_._sfc_main$1;exports.WCrudColumnRenderer=_._sfc_main$2;exports.WCrudFormDialog=_._sfc_main$3;exports.WCrudView=_._sfc_main$4;exports.WDetailHeader=_._sfc_main$5;exports.WEmptyState=_._sfc_main$6;exports.WFormRenderer=_._sfc_main$7;exports.WFormSection=_._sfc_main$8;exports.WImageCropper=_.WImageCropper;exports.WInfoCard=_._sfc_main$9;exports.WKpiCard=_._sfc_main$10;exports.WKpiGrid=_._sfc_main$11;exports.WMoneyInput=_._sfc_main$12;exports.WPageHeader=_._sfc_main$13;exports.WProgressFlow=_._sfc_main$14;exports.WSectionHeader=_._sfc_main$15;exports.WStatusTag=_._sfc_main$16;exports.WTransferList=_._sfc_main$17;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs"),e=require("vue"),$=require("primevue/datepicker"),p=require("primevue/button"),v=e.defineComponent({__name:"WDateRange",props:{modelValue:{default:null},placeholder:{default:"Selecione o período"},minDate:{},maxDate:{},showButtonBar:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(a,{emit:m}){const o=m;function r(d){o("update:modelValue",d??null)}return(d,u)=>(e.openBlock(),e.createBlock(e.unref($),{"model-value":a.modelValue??void 0,"selection-mode":"range",placeholder:a.placeholder,"min-date":a.minDate,"max-date":a.maxDate,"show-button-bar":a.showButtonBar,disabled:a.disabled,"date-format":"dd/mm/yy",fluid:"","onUpdate:modelValue":r},null,8,["model-value","placeholder","min-date","max-date","show-button-bar","disabled"]))}}),W={class:"w-fileupload",style:{display:"flex","flex-direction":"column",gap:"0.5rem"}},B=["accept","multiple"],h={key:0,style:{"list-style":"none",margin:"0",padding:"0",display:"flex","flex-direction":"column",gap:"0.35rem"}},x={style:{flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},V={style:{opacity:"0.6"}},b=e.defineComponent({__name:"WFileUpload",props:{modelValue:{default:null},multiple:{type:Boolean,default:!1},accept:{default:void 0},maxSize:{default:10485760},disabled:{type:Boolean,default:!1},chooseLabel:{default:"Selecionar arquivo"}},emits:["update:modelValue","error"],setup(a,{emit:m}){const o=a,r=m,d=e.ref(null),u=e.computed(()=>{const t=o.modelValue;return t?Array.isArray(t)?t:[t]:[]});function f(){var t;(t=d.value)==null||t.click()}function _(t){const n=t.target,s=Array.from(n.files||[]);n.value="";const i=[];for(const c of s){if(c.size>o.maxSize){r("error",`"${c.name}" acima do limite de ${(o.maxSize/1048576).toFixed(1)}MB.`);continue}i.push(c)}i.length&&r("update:modelValue",o.multiple?[...u.value,...i]:i[0])}function y(t){if(!o.multiple){r("update:modelValue",null);return}const n=u.value.slice();n.splice(t,1),r("update:modelValue",n.length?n:null)}function g(t){return t<1024?`${t} B`:t<1048576?`${(t/1024).toFixed(0)} KB`:`${(t/1048576).toFixed(1)} MB`}return(t,n)=>(e.openBlock(),e.createElementBlock("div",W,[e.createElementVNode("div",null,[e.createVNode(e.unref(p),{type:"button",label:a.chooseLabel,icon:"pi pi-upload",outlined:"",size:"small",disabled:a.disabled,onClick:f},null,8,["label","disabled"])]),e.createElementVNode("input",{ref_key:"input",ref:d,type:"file",accept:a.accept,multiple:a.multiple,style:{display:"none"},onChange:_},null,40,B),u.value.length?(e.openBlock(),e.createElementBlock("ul",h,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,(s,i)=>(e.openBlock(),e.createElementBlock("li",{key:`${s.name}-${i}`,style:{display:"flex","align-items":"center",gap:"0.5rem","font-size":"0.85rem"}},[n[0]||(n[0]=e.createElementVNode("i",{class:"pi pi-file",style:{opacity:"0.6"}},null,-1)),e.createElementVNode("span",x,e.toDisplayString(s.name),1),e.createElementVNode("span",V,e.toDisplayString(g(s.size)),1),e.createVNode(e.unref(p),{type:"button",icon:"pi pi-times",text:"",rounded:"",size:"small",severity:"danger",disabled:a.disabled,onClick:c=>y(i)},null,8,["disabled","onClick"])]))),128))])):e.renderSlot(t.$slots,"empty",{},()=>[n[1]||(n[1]=e.createElementVNode("span",{style:{"font-size":"0.8rem",opacity:"0.6"}},"Nenhum arquivo selecionado",-1))],void 0,1)]))}});exports.WActionBar=l._sfc_main;exports.WAutoCompleteFK=l._sfc_main$1;exports.WCrudColumnRenderer=l._sfc_main$2;exports.WCrudFormDialog=l._sfc_main$3;exports.WCrudView=l._sfc_main$4;exports.WDetailHeader=l._sfc_main$5;exports.WEmptyState=l._sfc_main$6;exports.WFormRenderer=l._sfc_main$7;exports.WFormSection=l._sfc_main$8;exports.WImageCropper=l.WImageCropper;exports.WInfoCard=l._sfc_main$9;exports.WKpiCard=l._sfc_main$10;exports.WKpiGrid=l._sfc_main$11;exports.WMoneyInput=l._sfc_main$12;exports.WPageHeader=l._sfc_main$13;exports.WProgressFlow=l._sfc_main$14;exports.WSectionHeader=l._sfc_main$15;exports.WStatusTag=l._sfc_main$16;exports.WTransferList=l._sfc_main$17;exports.WDateRange=v;exports.WFileUpload=b;
2
2
  //# sourceMappingURL=components.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"components.cjs","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","e","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,23 +1,156 @@
1
- import { _ as r, a as s, b as W, c as o, d as t, e as d, f as i, g as n, h as m, W as p, i as C, j as u, k as g, l, m as F, n as c, o as f, p as S, q as H } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BVlG1in1.js";
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 = {
35
+ class: "w-fileupload",
36
+ style: { display: "flex", "flex-direction": "column", gap: "0.5rem" }
37
+ }, $ = ["accept", "multiple"], A = {
38
+ key: 0,
39
+ 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({
41
+ __name: "WFileUpload",
42
+ props: {
43
+ modelValue: { default: null },
44
+ multiple: { type: Boolean, default: !1 },
45
+ accept: { default: void 0 },
46
+ maxSize: { default: 10485760 },
47
+ disabled: { type: Boolean, default: !1 },
48
+ chooseLabel: { default: "Selecionar arquivo" }
49
+ },
50
+ 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;
54
+ return e ? Array.isArray(e) ? e : [e] : [];
55
+ });
56
+ function v() {
57
+ var e;
58
+ (e = d.value) == null || e.click();
59
+ }
60
+ 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.`);
67
+ continue;
68
+ }
69
+ o.push(m);
70
+ }
71
+ o.length && n("update:modelValue", a.multiple ? [...r.value, ...o] : o[0]);
72
+ }
73
+ function b(e) {
74
+ if (!a.multiple) {
75
+ n("update:modelValue", null);
76
+ return;
77
+ }
78
+ const t = r.value.slice();
79
+ t.splice(e, 1), n("update:modelValue", t.length ? t : null);
80
+ }
81
+ function B(e) {
82
+ return e < 1024 ? `${e} B` : e < 1048576 ? `${(e / 1024).toFixed(0)} KB` : `${(e / 1048576).toFixed(1)} MB`;
83
+ }
84
+ return (e, t) => (u(), c("div", D, [
85
+ i("div", null, [
86
+ y(f(g), {
87
+ type: "button",
88
+ label: l.chooseLabel,
89
+ icon: "pi pi-upload",
90
+ outlined: "",
91
+ size: "small",
92
+ disabled: l.disabled,
93
+ onClick: v
94
+ }, null, 8, ["label", "disabled"])
95
+ ]),
96
+ i("input", {
97
+ ref_key: "input",
98
+ ref: d,
99
+ type: "file",
100
+ accept: l.accept,
101
+ multiple: l.multiple,
102
+ style: { display: "none" },
103
+ onChange: x
104
+ }, 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}`,
108
+ style: { display: "flex", "align-items": "center", gap: "0.5rem", "font-size": "0.85rem" }
109
+ }, [
110
+ t[0] || (t[0] = i("i", {
111
+ class: "pi pi-file",
112
+ style: { opacity: "0.6" }
113
+ }, null, -1)),
114
+ i("span", K, W(s.name), 1),
115
+ i("span", L, W(B(s.size)), 1),
116
+ y(f(g), {
117
+ type: "button",
118
+ icon: "pi pi-times",
119
+ text: "",
120
+ rounded: "",
121
+ size: "small",
122
+ severity: "danger",
123
+ disabled: l.disabled,
124
+ onClick: (m) => b(o)
125
+ }, null, 8, ["disabled", "onClick"])
126
+ ]))), 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))
129
+ ], void 0, 1)
130
+ ]));
131
+ }
132
+ });
2
133
  export {
3
- r as WActionBar,
4
- s as WAutoCompleteFK,
5
- W as WCrudColumnRenderer,
6
- o as WCrudFormDialog,
7
- t as WCrudView,
8
- d as WDetailHeader,
9
- i as WEmptyState,
10
- n as WFormRenderer,
11
- m as WFormSection,
12
- p as WImageCropper,
13
- C as WInfoCard,
14
- u as WKpiCard,
15
- g as WKpiGrid,
16
- l as WMoneyInput,
17
- F as WPageHeader,
18
- c as WProgressFlow,
19
- f as WSectionHeader,
20
- S as WStatusTag,
21
- H as WTransferList
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,
154
+ ie as WTransferList
22
155
  };
23
156
  //# sourceMappingURL=components.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
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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"}
@@ -0,0 +1,18 @@
1
+ import { CrudManagerConfig } from '../types/manager';
2
+ /**
3
+ * Helper de autoria tipado para o config do `useCrudManager`.
4
+ *
5
+ * Dá inferência do tipo do registro `T` (usado em `rowActions`, `onAfterSave`,
6
+ * `transformPayload`, etc.) e autocomplete/type-check ao montar o config,
7
+ * sem precisar anotar `CrudManagerConfig<T>` na mão.
8
+ *
9
+ * @example
10
+ * const config = defineCrudConfig<Produto>({
11
+ * endpoint: '/produtos',
12
+ * columns: [...],
13
+ * form: [...],
14
+ * onAfterSave: (p) => { p.nome }, // p é Produto
15
+ * })
16
+ * const crud = useCrudManager(config)
17
+ */
18
+ export declare function defineCrudConfig<T extends Record<string, unknown> = Record<string, unknown>>(config: CrudManagerConfig<T>): CrudManagerConfig<T>;
@@ -1,4 +1,5 @@
1
1
  export { useCrudManager } from './useCrudManager';
2
+ export { defineCrudConfig } from './defineCrudConfig';
2
3
  export { useApi } from './useApi';
3
4
  export { useAppToast } from './useAppToast';
4
5
  export { useAppConfirm } from './useAppConfirm';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useApi-BIlKLud-.cjs"),r=require("./useApiError-BEbEk2Kq.cjs");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;
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;
2
2
  //# sourceMappingURL=composables.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
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,12 +1,16 @@
1
- import { u as a, a as e } from "./useApi-B692TOWz.js";
2
- import { e as p, u, a as t, b as A, c as i } from "./useApiError-C7rPzGrF.js";
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";
3
+ function e(r) {
4
+ return r;
5
+ }
3
6
  export {
4
- p as extractApiError,
5
- a as useApi,
6
- u as useApiError,
7
- t as useAppConfirm,
8
- A as useAppToast,
9
- e as useCrudManager,
10
- i as useFormatters
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,
14
+ A as useFormatters
11
15
  };
12
16
  //# sourceMappingURL=composables.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"composables.js","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":";;AAkBO,SAASA,EACdC,GACsB;AACtB,SAAOA;AACT;"}
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-B70Uk-1x.cjs"),W=require("./useApi-BIlKLud-.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-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;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { b as _, W, a as w } from "./plugin-BKa0eSEM.js";
2
- import { d as A, c as P, b as v, a as C, l as F, q as b } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BVlG1in1.js";
3
- import { _ as N, e as O, f as V, g as k, h as q, i as H, j, k as B, m as U, n as G, o as X, p as J, r as Q, s as Z, t as ee, u as ae, v as te, w as re } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BVlG1in1.js";
4
- import { u as ne, a as oe } from "./useApi-B692TOWz.js";
2
+ import { d as A, c as P, b as v, a as C, l as F, q as b } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js";
3
+ import { _ as N, e as O, f as V, g as k, h as q, i as H, j, k as B, m as U, n as G, o as X, p as J, r as Q, s as Z, t as ee, u as ae, v as te, w as re } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js";
4
+ import { u as ne, a as oe } from "./useApi-Bxrw3Sia.js";
5
5
  import { e as ce, u as le, a as ue, b as de, c as fe } from "./useApiError-C7rPzGrF.js";
6
6
  import { DEFAULT_CRUD_LABELS as pe } from "./types.js";
7
7
  function x(e, a, t) {
@@ -22,6 +22,9 @@ export interface CrudManagerConfig<T> {
22
22
  * search or filter position. Defaults to `true`. Set `false` to keep the
23
23
  * optimistic in-place update instead. */
24
24
  refetchOnSave?: boolean;
25
+ /** Modo de edição: 'dialog' (default — abre o form dialog) ou 'cell' (edição
26
+ * inline por célula, com PATCH só do campo alterado). */
27
+ editMode?: 'cell' | 'dialog';
25
28
  canCreate?: boolean;
26
29
  canEdit?: boolean;
27
30
  canDelete?: boolean;
@@ -77,6 +80,8 @@ export interface CrudManagerReturn<T> {
77
80
  openViewDialog(item: T): void;
78
81
  openDuplicateDialog(item: T): void;
79
82
  save(): Promise<T | null>;
83
+ /** Salva um único campo de um item (edição inline por célula) via PATCH. */
84
+ updateField(item: T, field: string, value: unknown): Promise<void>;
80
85
  confirmDelete(item: T): void;
81
86
  setFormField(field: string, value: unknown): void;
82
87
  resetForm(): void;
@@ -0,0 +1,2 @@
1
+ "use strict";const o=require("vue"),Y=require("./plugin-D1YvyKXX.cjs"),Oe=require("./types.cjs"),b=require("./useApiError-BEbEk2Kq.cjs");function ze(j,P){const v={};for(const g of Object.keys(P))JSON.stringify(j[g])!==JSON.stringify(P[g])&&(v[g]=P[g]);return v}function Fe(j){const{endpoint:P,form:v,pk:g="id",searchDebounce:L=300,partialUpdate:$=!0,refetchOnSave:E=!0,filterParams:R=void 0,createDefaults:_=void 0,transformPayload:A=void 0,onAfterSave:T=void 0,onAfterDelete:q=void 0}=j,x=o.inject(Y.W_DATA_PROVIDER_KEY);if(!x)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.");const n=x,w=o.inject(Y.W_CONFIG_KEY),M=j.pageSize??(w==null?void 0:w.defaultPageSize)??20,f={...Oe.DEFAULT_CRUD_LABELS,...j.labels},k=b.useAppToast(),{confirmDelete:G}=b.useAppConfirm(),h=o.ref([]),W=o.ref([]),N=o.ref({}),U=o.ref(!1),u=o.ref(!1),y=o.ref(""),p=o.ref(!1),z=o.ref(!1),d=o.ref(null),D=o.reactive({});let C=null;const r=o.reactive({page:1,pageSize:M,rows:0,totalPages:0}),m=o.reactive({field:null,order:0}),V=o.reactive({});function Q(){const e={};for(const t of v)e[t.field]=t.defaultValue!==void 0?typeof t.defaultValue=="function"?t.defaultValue():t.defaultValue:null;return e}const X=Q();for(const e of Object.keys(X))D[e]=X[e];const I=o.computed(()=>d.value!==null&&!z.value),ae=o.computed(()=>z.value),ie=o.computed(()=>z.value?f.viewTitle??"Visualizar Registro":I.value?f.editTitle:f.createTitle),oe=o.computed(()=>r.page<=1),ne=o.computed(()=>r.page>=r.totalPages);let J=null;async function F(e={}){U.value=!0;try{const t={page:r.page,page_size:r.pageSize,...e};y.value&&(t.search=y.value),m.field&&m.order!==0&&(t.ordering=m.order===-1?`-${m.field}`:m.field),R&&Object.assign(t,R());for(const[i,c]of Object.entries(V))c!=null&&c!==""&&(t[i]=c);const a=await n.list(P,t);h.value=a.data,W.value=[],r.rows=a.rows,N.value=a.extras??{},a.page&&(r.page=a.page),a.page_size&&(r.pageSize=a.page_size),r.totalPages=Math.ceil(r.rows/r.pageSize)||0}finally{U.value=!1}}async function re(){await F()}async function se(){await F()}async function le(e=200){const t={};y.value&&(t.search=y.value),m.field&&m.order!==0&&(t.ordering=m.order===-1?`-${m.field}`:m.field),R&&Object.assign(t,R());for(const[l,s]of Object.entries(V))s!=null&&s!==""&&(t[l]=s);const a=[];let i=1;const c=1e4;for(;i<=c;){const l=await n.list(P,{...t,page:i,page_size:e});a.push(...l.data);const s=l.rows??a.length;if(l.data.length===0||a.length>=s)break;i++}return a}function Z(e){y.value=e,J&&clearTimeout(J),J=setTimeout(()=>{r.page=1,F()},L)}function ce(e){const t=e.target;Z(t.value)}function B(e){r.page=e,F()}function fe(){B(1)}function ue(){B(r.totalPages)}function de(e){r.page=e.page+1,r.pageSize=e.rows,F()}function pe(e){m.field=e.sortField??null,m.order=e.sortOrder??0,r.page=1,F()}function H(){const e=Q();for(const t of Object.keys(e))D[t]=e[t]}function ge(e,t){D[e]=t}function ve(){if(z.value=!1,d.value=null,C=null,H(),_){const e=_();for(const[t,a]of Object.entries(e))D[t]=a}p.value=!0}function ee(e){const t={};for(const a of v){let i=e[a.field]!==void 0?e[a.field]:null;i&&(a.type==="date"||a.type==="datetime")&&typeof i=="string"&&(i=b.parseDate(i)),D[a.field]=i,t[a.field]=i}C=t}function ye(e){z.value=!1,d.value=e,ee(e),p.value=!0}function me(e){z.value=!0,d.value=e,ee(e),p.value=!0}function Pe(e){z.value=!1,d.value=null,C=null,H();for(const t of v){if(t.field===g)continue;let a=e[t.field]!==void 0?e[t.field]:D[t.field];a&&(t.type==="date"||t.type==="datetime")&&typeof a=="string"&&(a=b.parseDate(a)),D[t.field]=a}if(_){const t=_();for(const[a,i]of Object.entries(t))D[a]=i}p.value=!0}function te(e){const t={...e};for(const a of v){const i=t[a.field];if(a.type==="date"&&i instanceof Date?t[a.field]=b.toDateString(i):a.type==="datetime"&&i instanceof Date&&(t[a.field]=b.toDateTimeString(i)),a.type==="fk"&&i!==null&&typeof i=="object"){const c=a.optionValue||"id";t[a.field]=i[c]??i}(a.type==="mask"||a.type==="cpf_cnpj")&&typeof i=="string"&&(t[a.field]=b.stripMask(i))}return t}async function we(){for(const e of v){if(e.validate){const t=e.validate(D[e.field]);if(t)return k.error(t),null}if(e.required){const t=D[e.field];if(t==null||t==="")return k.error(`${e.label} é obrigatório`),null}}u.value=!0;try{let e=te(D);if(!I.value&&_&&Object.assign(e,_()),I.value&&$&&C){const s=te(C);if(e=ze(s,e),Object.keys(e).length===0&&!A){p.value=!1;const S=d.value;return d.value=null,C=null,S}}A&&(e=A(e,I.value));const t=v.some(s=>s.type==="image"&&e[s.field]instanceof File);let a=e,i;if(t){const s=new Set(v.filter(O=>O.type==="image").map(O=>O.field)),S=new FormData;for(const[O,K]of Object.entries(e))if(K!=null)if(K instanceof File)S.append(O,K);else{if(s.has(O))continue;S.append(O,String(K))}a=S,i={"Content-Type":"multipart/form-data"}}const c=i?{headers:i}:void 0;let l;if(I.value&&d.value){const s=d.value[g];if(l=await n.update(P,s,a,c),!E){const S=h.value.findIndex(O=>O[g]===s);S!==-1&&(h.value[S]=l.data)}k.success(f.successUpdate)}else l=await n.create(P,a,c),E||(h.value.unshift(l.data),r.rows++),k.success(f.successCreate);return p.value=!1,d.value=null,C=null,E&&await F(),T&&T(l.data,I.value),l.data}catch(e){return k.error(b.extractApiError(e,"Erro ao salvar registro")),null}finally{u.value=!1}}async function he(e,t,a){const i=e[g],c=v.find(s=>s.field===t);let l=a;(c==null?void 0:c.type)==="date"&&l instanceof Date?l=b.toDateString(l):(c==null?void 0:c.type)==="datetime"&&l instanceof Date&&(l=b.toDateTimeString(l));try{const s=await n.update(P,i,{[t]:l}),S=h.value.findIndex(O=>O[g]===i);S!==-1&&(h.value[S]={...h.value[S],...s.data}),k.success(f.successUpdate)}catch(s){k.error(b.extractApiError(s,"Erro ao salvar o campo"))}}function De(e){G(async()=>{try{const t=e[g];await n.delete(P,t);const a=h.value.findIndex(i=>i[g]===t);a!==-1&&(h.value.splice(a,1),r.rows--),k.success(f.successDelete),q&&q(e)}catch(t){k.error(b.extractApiError(t,"Erro ao excluir registro"))}},f.deleteConfirmMessage)}function Se(){W.value=[]}function be(e,t){t==null||t===""?delete V[e]:V[e]=t,r.page=1,F()}function ke(){for(const e of Object.keys(V))delete V[e];r.page=1,F()}return{items:h,selectedItems:W,columnFilters:V,extras:N,loading:U,saving:u,search:y,dialogVisible:p,editingItem:d,formData:D,pagination:r,sort:m,isEditing:I,isViewing:ae,viewMode:z,dialogTitle:ie,isFirstPage:oe,isLastPage:ne,init:re,fetchItems:F,fetchAll:le,refresh:se,setSearch:Z,onSearch:ce,onPage:de,onSort:pe,openCreateDialog:ve,openEditDialog:ye,openViewDialog:me,openDuplicateDialog:Pe,save:we,updateField:he,confirmDelete:De,setFormField:ge,resetForm:H,goToPage:B,firstPage:fe,lastPage:ue,clearSelection:Se,setColumnFilter:be,clearColumnFilters:ke,config:j}}function je(j){const{endpoint:P,searchDebounce:v=300,immediate:g=!1}=j,L=o.inject(Y.W_DATA_PROVIDER_KEY);if(!L)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.");const $=L,E=o.inject(Y.W_CONFIG_KEY),R=j.pageSize??(E==null?void 0:E.defaultPageSize)??20,_=o.ref([]),A=o.ref(!1),T=o.ref(""),q=o.ref({}),x=o.reactive({}),n=o.reactive({page:1,pageSize:R,rows:0,totalPages:0}),w=o.reactive({field:null,order:0});let M=null;async function f(u={}){A.value=!0;try{const y={page:n.page,page_size:n.pageSize,...u};T.value&&(y.search=T.value),w.field&&w.order!==0&&(y.ordering=w.order===-1?`-${w.field}`:w.field);for(const[z,d]of Object.entries(x))d!=null&&d!==""&&(y[z]=d);const p=await $.list(P,y);_.value=p.data,n.rows=p.rows,p.page&&(n.page=p.page),p.page_size&&(n.pageSize=p.page_size),n.totalPages=Math.ceil(n.rows/n.pageSize)||0,q.value=p.extras??{}}finally{A.value=!1}}async function k(){await f()}function G(u){T.value=u,M&&clearTimeout(M),M=setTimeout(()=>{n.page=1,f()},v)}function h(u,y){x[u]=y,n.page=1,f()}function W(){for(const u of Object.keys(x))delete x[u];n.page=1,f()}function N(u){n.page=u.page+1,n.pageSize=u.rows,f()}function U(u){w.field=u.sortField??null,w.order=u.sortOrder??0,n.page=1,f()}return g&&f(),{items:_,loading:A,search:T,pagination:n,sort:w,extras:q,fetchItems:f,refresh:k,setSearch:G,setFilter:h,clearFilters:W,onPage:N,onSort:U}}exports.useApi=je;exports.useCrudManager=Fe;
2
+ //# sourceMappingURL=useApi-5Pr4nXAa.cjs.map