@wgalleti/primevue-components 0.9.2 → 0.9.4

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.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./WProgressFlow.vue_vue_type_script_setup_true_lang-CRx96kle.cjs"),e=require("vue"),m=require("primevue/button"),g={class:"w-fileupload",style:{display:"flex","flex-direction":"column",gap:"0.5rem"}},W=["accept","multiple"],v={key:0,style:{"list-style":"none",margin:"0",padding:"0",display:"flex","flex-direction":"column",gap:"0.35rem"}},k={style:{flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},B={style:{opacity:"0.6"}},x=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:p}){const o=a,s=p,d=e.ref(null),c=e.computed(()=>{const l=o.modelValue;return l?Array.isArray(l)?l:[l]:[]});function f(){var l;(l=d.value)==null||l.click()}function _(l){const n=l.target,r=Array.from(n.files||[]);n.value="";const i=[];for(const u of r){if(u.size>o.maxSize){s("error",`"${u.name}" acima do limite de ${(o.maxSize/1048576).toFixed(1)}MB.`);continue}i.push(u)}i.length&&s("update:modelValue",o.multiple?[...c.value,...i]:i[0])}function y(l){if(!o.multiple){s("update:modelValue",null);return}const n=c.value.slice();n.splice(l,1),s("update:modelValue",n.length?n:null)}function $(l){return l<1024?`${l} B`:l<1048576?`${(l/1024).toFixed(0)} KB`:`${(l/1048576).toFixed(1)} MB`}return(l,n)=>(e.openBlock(),e.createElementBlock("div",g,[e.createElementVNode("div",null,[e.createVNode(e.unref(m),{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,W),c.value.length?(e.openBlock(),e.createElementBlock("ul",v,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,(r,i)=>(e.openBlock(),e.createElementBlock("li",{key:`${r.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",k,e.toDisplayString(r.name),1),e.createElementVNode("span",B,e.toDisplayString($(r.size)),1),e.createVNode(e.unref(m),{type:"button",icon:"pi pi-times",text:"",rounded:"",size:"small",severity:"danger",disabled:a.disabled,onClick:u=>y(i)},null,8,["disabled","onClick"])]))),128))])):e.renderSlot(l.$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=t._sfc_main;exports.WAutoCompleteFK=t._sfc_main$1;exports.WCrudColumnRenderer=t._sfc_main$2;exports.WCrudFormDialog=t._sfc_main$3;exports.WCrudView=t._sfc_main$4;exports.WDatePicker=t._sfc_main$5;exports.WDateRange=t._sfc_main$6;exports.WDetailHeader=t._sfc_main$7;exports.WEmptyState=t._sfc_main$8;exports.WFormRenderer=t._sfc_main$9;exports.WFormSection=t._sfc_main$10;exports.WImageCropper=t.WImageCropper;exports.WInfoCard=t._sfc_main$11;exports.WKpiCard=t._sfc_main$12;exports.WKpiGrid=t._sfc_main$13;exports.WMoneyInput=t._sfc_main$14;exports.WPageHeader=t._sfc_main$15;exports.WProgressFlow=t._sfc_main$16;exports.WSectionHeader=t._sfc_main$17;exports.WStatusTag=t._sfc_main$18;exports.WTransferList=t._sfc_main$19;exports.WFileUpload=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./WProgressFlow.vue_vue_type_script_setup_true_lang-CghB36QK.cjs"),e=require("vue"),m=require("primevue/button"),g={class:"w-fileupload",style:{display:"flex","flex-direction":"column",gap:"0.5rem"}},W=["accept","multiple"],v={key:0,style:{"list-style":"none",margin:"0",padding:"0",display:"flex","flex-direction":"column",gap:"0.35rem"}},k={style:{flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},B={style:{opacity:"0.6"}},x=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:p}){const o=a,s=p,d=e.ref(null),c=e.computed(()=>{const l=o.modelValue;return l?Array.isArray(l)?l:[l]:[]});function f(){var l;(l=d.value)==null||l.click()}function _(l){const n=l.target,r=Array.from(n.files||[]);n.value="";const i=[];for(const u of r){if(u.size>o.maxSize){s("error",`"${u.name}" acima do limite de ${(o.maxSize/1048576).toFixed(1)}MB.`);continue}i.push(u)}i.length&&s("update:modelValue",o.multiple?[...c.value,...i]:i[0])}function y(l){if(!o.multiple){s("update:modelValue",null);return}const n=c.value.slice();n.splice(l,1),s("update:modelValue",n.length?n:null)}function $(l){return l<1024?`${l} B`:l<1048576?`${(l/1024).toFixed(0)} KB`:`${(l/1048576).toFixed(1)} MB`}return(l,n)=>(e.openBlock(),e.createElementBlock("div",g,[e.createElementVNode("div",null,[e.createVNode(e.unref(m),{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,W),c.value.length?(e.openBlock(),e.createElementBlock("ul",v,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,(r,i)=>(e.openBlock(),e.createElementBlock("li",{key:`${r.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",k,e.toDisplayString(r.name),1),e.createElementVNode("span",B,e.toDisplayString($(r.size)),1),e.createVNode(e.unref(m),{type:"button",icon:"pi pi-times",text:"",rounded:"",size:"small",severity:"danger",disabled:a.disabled,onClick:u=>y(i)},null,8,["disabled","onClick"])]))),128))])):e.renderSlot(l.$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=t._sfc_main;exports.WAutoCompleteFK=t._sfc_main$1;exports.WCrudColumnRenderer=t._sfc_main$2;exports.WCrudFormDialog=t._sfc_main$3;exports.WCrudView=t._sfc_main$4;exports.WDatePicker=t._sfc_main$5;exports.WDateRange=t._sfc_main$6;exports.WDetailHeader=t._sfc_main$7;exports.WEmptyState=t._sfc_main$8;exports.WFormRenderer=t._sfc_main$9;exports.WFormSection=t._sfc_main$10;exports.WImageCropper=t.WImageCropper;exports.WInfoCard=t._sfc_main$11;exports.WKpiCard=t._sfc_main$12;exports.WKpiGrid=t._sfc_main$13;exports.WMoneyInput=t._sfc_main$14;exports.WPageHeader=t._sfc_main$15;exports.WProgressFlow=t._sfc_main$16;exports.WSectionHeader=t._sfc_main$17;exports.WStatusTag=t._sfc_main$18;exports.WTransferList=t._sfc_main$19;exports.WFileUpload=x;
2
2
  //# sourceMappingURL=components.cjs.map
@@ -1,4 +1,4 @@
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-BZxi1797.js";
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-KqwCnEHm.js";
2
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
3
  import W from "primevue/button";
4
4
  const V = {
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useApi-Dms28942.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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useApi-6xjrf0BB.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,4 +1,4 @@
1
- import { u, a as o } from "./useApi-D8-gfJR-.js";
1
+ import { u, a as o } from "./useApi-CywGloqb.js";
2
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;
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-CRx96kle.cjs"),W=require("./useApi-Dms28942.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;
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-CghB36QK.cjs"),W=require("./useApi-6xjrf0BB.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
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, n as D, s as x } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BZxi1797.js";
3
- import { _ as k, e as N, f as O, g as V, h as q, i as H, j, k as B, l as U, m as G, o as X, p as J, q as Q, r as Z, t as ee, u as ae, v as te, w as re, x as se, y as ne } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-BZxi1797.js";
4
- import { u as ie, a as ce } from "./useApi-D8-gfJR-.js";
2
+ import { d as A, c as P, b as v, a as C, n as D, s as x } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-KqwCnEHm.js";
3
+ import { _ as k, e as N, f as O, g as V, h as q, i as H, j, k as B, l as U, m as G, o as X, p as J, q as Q, r as Z, t as ee, u as ae, v as te, w as re, x as se, y as ne } from "./WProgressFlow.vue_vue_type_script_setup_true_lang-KqwCnEHm.js";
4
+ import { u as ie, a as ce } from "./useApi-CywGloqb.js";
5
5
  import { e as le, u as de, a as fe, b as me, c as pe, f as ge } from "./useFormKeyboardNav-D4Irq5RE.js";
6
6
  import { DEFAULT_CRUD_LABELS as _e } from "./types.js";
7
7
  function F(e, a, t) {
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("vue"),Y=require("./plugin-D1YvyKXX.cjs"),ze=require("./types.cjs"),k=require("./useFormKeyboardNav-D4Ow3k4Y.cjs");function Fe(j,h){const y={};for(const v of Object.keys(h))JSON.stringify(j[v])!==JSON.stringify(h[v])&&(y[v]=h[v]);return y}function je(j){const{endpoint:h,form:y,pk:v="id",searchDebounce:U=300,partialUpdate:$=!0,refetchOnSave:E=!0,filterParams:q=void 0,createDefaults:_=void 0,transformPayload:T=void 0,onAfterSave:A=void 0,onAfterDelete:M=void 0}=j,C=i.inject(Y.W_DATA_PROVIDER_KEY);if(!C)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.");const r=C,D=i.inject(Y.W_CONFIG_KEY),W=j.pageSize??(D==null?void 0:D.defaultPageSize)??20,f={...ze.DEFAULT_CRUD_LABELS,...j.labels},O=k.useAppToast(),{confirmDelete:G}=k.useAppConfirm(),S=i.ref([]),K=i.ref([]),L=i.ref({}),N=i.ref(!1),u=i.ref(!1),m=i.ref(""),p=i.ref(!1),z=i.ref(!1),d=i.ref(null),b=i.reactive({});let V=null;const s=i.reactive({page:1,pageSize:W,rows:0,totalPages:0}),P=i.reactive({field:null,order:0}),I=i.reactive({});function Q(){const e={};for(const t of y)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))b[e]=X[e];const R=i.computed(()=>d.value!==null&&!z.value),oe=i.computed(()=>z.value),ie=i.computed(()=>z.value?f.viewTitle??"Visualizar Registro":R.value?f.editTitle:f.createTitle),ne=i.computed(()=>s.page<=1),re=i.computed(()=>s.page>=s.totalPages);let J=null;async function F(e={}){N.value=!0;try{const t={page:s.page,page_size:s.pageSize,...e};m.value&&(t.search=m.value),P.field&&P.order!==0&&(t.ordering=P.order===-1?`-${P.field}`:P.field),q&&Object.assign(t,q());for(const[o,c]of Object.entries(I))c!=null&&c!==""&&(t[o]=c);const a=await r.list(h,t);S.value=a.data,K.value=[],s.rows=a.rows,L.value=a.extras??{},a.page&&(s.page=a.page),a.page_size&&(s.pageSize=a.page_size),s.totalPages=Math.ceil(s.rows/s.pageSize)||0}finally{N.value=!1}}async function se(){await F()}async function le(){await F()}async function ce(e=200){const t={};m.value&&(t.search=m.value),P.field&&P.order!==0&&(t.ordering=P.order===-1?`-${P.field}`:P.field),q&&Object.assign(t,q());for(const[l,n]of Object.entries(I))n!=null&&n!==""&&(t[l]=n);const a=[];let o=1;const c=1e4;for(;o<=c;){const l=await r.list(h,{...t,page:o,page_size:e});a.push(...l.data);const n=l.rows??a.length;if(l.data.length===0||a.length>=n)break;o++}return a}function Z(e){m.value=e,J&&clearTimeout(J),J=setTimeout(()=>{s.page=1,F()},U)}function fe(e){const t=e.target;Z(t.value)}function B(e){s.page=e,F()}function ue(){B(1)}function de(){B(s.totalPages)}function pe(e){s.page=e.page+1,s.pageSize=e.rows,F()}function ge(e){P.field=e.sortField??null,P.order=e.sortOrder??0,s.page=1,F()}function H(){const e=Q();for(const t of Object.keys(e))b[t]=e[t]}function ve(e,t){b[e]=t}function ye(){if(z.value=!1,d.value=null,V=null,H(),_){const e=_();for(const[t,a]of Object.entries(e))b[t]=a}p.value=!0}function ee(e){const t={};for(const a of y){let o=e[a.field]!==void 0?e[a.field]:null;o&&(a.type==="date"||a.type==="datetime")&&typeof o=="string"&&(o=k.parseDate(o)),b[a.field]=o,t[a.field]=o}V=t}function me(e){z.value=!1,d.value=e,ee(e),p.value=!0}function Pe(e){z.value=!0,d.value=e,ee(e),p.value=!0}function we(e){z.value=!1,d.value=null,V=null,H();for(const t of y){if(t.field===v)continue;let a=e[t.field]!==void 0?e[t.field]:b[t.field];a&&(t.type==="date"||t.type==="datetime")&&typeof a=="string"&&(a=k.parseDate(a)),b[t.field]=a}if(_){const t=_();for(const[a,o]of Object.entries(t))b[a]=o}p.value=!0}function te(e){const t={...e};for(const a of y){const o=t[a.field];if(a.type==="date"&&o instanceof Date?t[a.field]=k.toDateString(o):a.type==="datetime"&&o instanceof Date&&(t[a.field]=k.toDateTimeString(o)),a.type==="fk"&&o!==null&&typeof o=="object"){const c=a.optionValue||"id";t[a.field]=o[c]??o}(a.type==="mask"||a.type==="cpf_cnpj")&&typeof o=="string"&&(t[a.field]=k.stripMask(o))}return t}async function he(){for(const e of y){if(e.validate){const t=e.validate(b[e.field]);if(t)return O.error(t),null}if(e.required){const t=b[e.field];if(t==null||t==="")return O.error(`${e.label} é obrigatório`),null}}u.value=!0;try{let e=te(b);if(!R.value&&_){const n=_();for(const[g,w]of Object.entries(n)){const x=e[g];(x==null||x==="")&&(e[g]=w)}}if(R.value&&$&&V){const n=te(V);if(e=Fe(n,e),Object.keys(e).length===0&&!T){p.value=!1;const g=d.value;return d.value=null,V=null,g}}T&&(e=T(e,R.value));const t=y.some(n=>n.type==="image"&&e[n.field]instanceof File);let a=e,o;if(t){const n=new Set(y.filter(w=>w.type==="image").map(w=>w.field)),g=new FormData;for(const[w,x]of Object.entries(e))if(x!=null)if(x instanceof File)g.append(w,x);else{if(n.has(w))continue;g.append(w,String(x))}a=g,o={"Content-Type":"multipart/form-data"}}const c=o?{headers:o}:void 0;let l;if(R.value&&d.value){const n=d.value[v];if(l=await r.update(h,n,a,c),!E){const g=S.value.findIndex(w=>w[v]===n);g!==-1&&(S.value[g]=l.data)}O.success(f.successUpdate)}else l=await r.create(h,a,c),E||(S.value.unshift(l.data),s.rows++),O.success(f.successCreate);return p.value=!1,d.value=null,V=null,E&&await F(),A&&A(l.data,R.value),l.data}catch(e){return O.error(k.extractApiError(e,"Erro ao salvar registro")),null}finally{u.value=!1}}async function De(e,t,a){const o=e[v],c=y.find(n=>n.field===t);let l=a;(c==null?void 0:c.type)==="date"&&l instanceof Date?l=k.toDateString(l):(c==null?void 0:c.type)==="datetime"&&l instanceof Date&&(l=k.toDateTimeString(l));try{const n=await r.update(h,o,{[t]:l}),g=S.value.findIndex(w=>w[v]===o);g!==-1&&(S.value[g]={...S.value[g],...n.data}),O.success(f.successUpdate)}catch(n){O.error(k.extractApiError(n,"Erro ao salvar o campo"))}}async function ae(e){try{const t=e[v];await r.delete(h,t);const a=S.value.findIndex(o=>o[v]===t);a!==-1&&(S.value.splice(a,1),s.rows--),O.success(f.successDelete),M&&M(e)}catch(t){O.error(k.extractApiError(t,"Erro ao excluir registro"))}}function Se(e){G(()=>ae(e),f.deleteConfirmMessage)}function be(){K.value=[]}function ke(e,t){t==null||t===""?delete I[e]:I[e]=t,s.page=1,F()}function Oe(){for(const e of Object.keys(I))delete I[e];s.page=1,F()}return{items:S,selectedItems:K,columnFilters:I,extras:L,loading:N,saving:u,search:m,dialogVisible:p,editingItem:d,formData:b,pagination:s,sort:P,isEditing:R,isViewing:oe,viewMode:z,dialogTitle:ie,isFirstPage:ne,isLastPage:re,init:se,fetchItems:F,fetchAll:ce,refresh:le,setSearch:Z,onSearch:fe,onPage:pe,onSort:ge,openCreateDialog:ye,openEditDialog:me,openViewDialog:Pe,openDuplicateDialog:we,save:he,updateField:De,confirmDelete:Se,performDelete:ae,setFormField:ve,resetForm:H,goToPage:B,firstPage:ue,lastPage:de,clearSelection:be,setColumnFilter:ke,clearColumnFilters:Oe,config:j}}function _e(j){const{endpoint:h,searchDebounce:y=300,immediate:v=!1}=j,U=i.inject(Y.W_DATA_PROVIDER_KEY);if(!U)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.");const $=U,E=i.inject(Y.W_CONFIG_KEY),q=j.pageSize??(E==null?void 0:E.defaultPageSize)??20,_=i.ref([]),T=i.ref(!1),A=i.ref(""),M=i.ref({}),C=i.reactive({}),r=i.reactive({page:1,pageSize:q,rows:0,totalPages:0}),D=i.reactive({field:null,order:0});let W=null;async function f(u={}){T.value=!0;try{const m={page:r.page,page_size:r.pageSize,...u};A.value&&(m.search=A.value),D.field&&D.order!==0&&(m.ordering=D.order===-1?`-${D.field}`:D.field);for(const[z,d]of Object.entries(C))d!=null&&d!==""&&(m[z]=d);const p=await $.list(h,m);_.value=p.data,r.rows=p.rows,p.page&&(r.page=p.page),p.page_size&&(r.pageSize=p.page_size),r.totalPages=Math.ceil(r.rows/r.pageSize)||0,M.value=p.extras??{}}finally{T.value=!1}}async function O(){await f()}function G(u){A.value=u,W&&clearTimeout(W),W=setTimeout(()=>{r.page=1,f()},y)}function S(u,m){C[u]=m,r.page=1,f()}function K(){for(const u of Object.keys(C))delete C[u];r.page=1,f()}function L(u){r.page=u.page+1,r.pageSize=u.rows,f()}function N(u){D.field=u.sortField??null,D.order=u.sortOrder??0,r.page=1,f()}return v&&f(),{items:_,loading:T,search:A,pagination:r,sort:D,extras:M,fetchItems:f,refresh:O,setSearch:G,setFilter:S,clearFilters:K,onPage:L,onSort:N}}exports.useApi=_e;exports.useCrudManager=je;
2
+ //# sourceMappingURL=useApi-6xjrf0BB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApi-6xjrf0BB.cjs","sources":["../src/composables/useCrudManager.ts","../src/composables/useApi.ts"],"sourcesContent":["import { ref, reactive, computed, inject } from 'vue'\nimport { W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\nimport type { PaginationState, SortState } from '@/types/api'\nimport type { CrudManagerConfig, CrudManagerReturn } from '@/types/manager'\nimport type { CrudLabels } from '@/types/labels'\nimport { DEFAULT_CRUD_LABELS } from '@/types/labels'\nimport { useAppToast } from './useAppToast'\nimport { useAppConfirm } from './useAppConfirm'\nimport { extractApiError } from './useApiError'\nimport { parseDate, toDateString, toDateTimeString } from '@/utils/dates'\nimport { stripMask } from '@/utils/masks'\n\n/** Shallow diff: returns only the keys whose value changed between two records. */\nfunction diffRecord(\n original: Record<string, unknown>,\n current: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(current)) {\n if (JSON.stringify(original[key]) !== JSON.stringify(current[key])) {\n out[key] = current[key]\n }\n }\n return out\n}\n\nexport function useCrudManager<T extends Record<string, unknown> = Record<string, unknown>>(\n config: CrudManagerConfig<T>,\n): CrudManagerReturn<T> {\n const {\n endpoint,\n form: formFields,\n pk = 'id',\n searchDebounce = 300,\n partialUpdate = true,\n refetchOnSave = true,\n filterParams = undefined,\n createDefaults = undefined,\n transformPayload = undefined,\n onAfterSave = undefined,\n onAfterDelete = undefined,\n } = config\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.',\n )\n }\n const provider = dataProvider\n\n const pluginConfig = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = config.pageSize ?? pluginConfig?.defaultPageSize ?? 20\n\n const labels: CrudLabels = { ...DEFAULT_CRUD_LABELS, ...config.labels }\n const toast = useAppToast()\n const { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const selectedItems = ref<T[]>([]) as import('vue').Ref<T[]>\n const extras = ref<Record<string, unknown>>({})\n const loading = ref(false)\n const saving = ref(false)\n const search = ref('')\n const dialogVisible = ref(false)\n const viewMode = ref(false)\n const editingItem = ref<T | null>(null) as import('vue').Ref<T | null>\n const formData = reactive<Record<string, unknown>>({})\n // Snapshot of the form values when an edit dialog opens — used for diff-based PATCH.\n let editingOriginal: Record<string, unknown> | null = null\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Filtros de coluna ativos (param → valor). Persistem entre páginas/ordenação.\n const columnFilters = reactive<Record<string, unknown>>({})\n\n // ---------------------------------------------------------------------------\n // Defaults\n // ---------------------------------------------------------------------------\n\n function getDefaults(): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of formFields) {\n defaults[f.field] =\n f.defaultValue !== undefined\n ? typeof f.defaultValue === 'function'\n ? (f.defaultValue as () => unknown)()\n : f.defaultValue\n : null\n }\n return defaults\n }\n\n // Initialize\n const defaults = getDefaults()\n for (const key of Object.keys(defaults)) {\n formData[key] = defaults[key]\n }\n\n // ---------------------------------------------------------------------------\n // Computed\n // ---------------------------------------------------------------------------\n\n const isEditing = computed(() => editingItem.value !== null && !viewMode.value)\n const isViewing = computed(() => viewMode.value)\n const dialogTitle = computed(() =>\n viewMode.value\n ? (labels.viewTitle ?? 'Visualizar Registro')\n : isEditing.value\n ? labels.editTitle\n : labels.createTitle,\n )\n const isFirstPage = computed(() => pagination.page <= 1)\n const isLastPage = computed(() => pagination.page >= pagination.totalPages)\n\n // ---------------------------------------------------------------------------\n // Fetch\n // ---------------------------------------------------------------------------\n\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n if (filterParams) {\n Object.assign(queryParams, filterParams())\n }\n\n // Filtros de coluna ativos (ignora vazios).\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') queryParams[key] = val\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n items.value = responseData.data\n selectedItems.value = [] // seleção anterior fica obsoleta ao recarregar\n pagination.rows = responseData.rows\n extras.value = responseData.extras ?? {}\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n } finally {\n loading.value = false\n }\n }\n\n async function init(): Promise<void> {\n await fetchItems()\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n /**\n * Fetch every record across all pages (respeitando search, sort e\n * filterParams atuais) sem alterar o estado da lista. Útil para exportações.\n */\n async function fetchAll(pageSize = 200): Promise<T[]> {\n const base: Record<string, unknown> = {}\n if (search.value) base.search = search.value\n if (sort.field && sort.order !== 0) {\n base.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n if (filterParams) Object.assign(base, filterParams())\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') base[key] = val\n }\n\n const all: T[] = []\n let page = 1\n // Hard cap para evitar loop infinito caso o backend não pagine corretamente.\n const maxPages = 10000\n while (page <= maxPages) {\n const res = await provider.list<T>(endpoint, {\n ...base,\n page,\n page_size: pageSize,\n })\n all.push(...res.data)\n const total = res.rows ?? all.length\n if (res.data.length === 0 || all.length >= total) break\n page++\n }\n return all\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function onSearch(event: Event): void {\n const target = event.target as HTMLInputElement\n setSearch(target.value)\n }\n\n // ---------------------------------------------------------------------------\n // Pagination\n // ---------------------------------------------------------------------------\n\n function goToPage(page: number): void {\n pagination.page = page\n fetchItems()\n }\n\n function firstPage(): void {\n goToPage(1)\n }\n\n function lastPage(): void {\n goToPage(pagination.totalPages)\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField?: string | null; sortOrder?: 1 | -1 | 0 | null }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Form\n // ---------------------------------------------------------------------------\n\n function resetForm(): void {\n const defs = getDefaults()\n for (const key of Object.keys(defs)) {\n formData[key] = defs[key]\n }\n }\n\n function setFormField(field: string, value: unknown): void {\n formData[field] = value\n }\n\n function openCreateDialog(): void {\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n // Apply createDefaults (e.g. parent FK) on top of field defaults\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n function loadItemIntoForm(item: T): void {\n const snapshot: Record<string, unknown> = {}\n for (const f of formFields) {\n let value = item[f.field] !== undefined ? item[f.field] : null\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n formData[f.field] = value\n snapshot[f.field] = value\n }\n editingOriginal = snapshot\n }\n\n function openEditDialog(item: T): void {\n viewMode.value = false\n editingItem.value = item\n loadItemIntoForm(item)\n dialogVisible.value = true\n }\n\n function openViewDialog(item: T): void {\n viewMode.value = true\n editingItem.value = item\n loadItemIntoForm(item)\n dialogVisible.value = true\n }\n\n function openDuplicateDialog(item: T): void {\n // Abre o diálogo em modo criação, pré-preenchido com os dados do registro\n // (exceto a chave primária).\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n for (const f of formFields) {\n if (f.field === pk) continue\n let value = item[f.field] !== undefined ? item[f.field] : formData[f.field]\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n formData[f.field] = value\n }\n // createDefaults (ex: FK do pai) sobrepõe os valores duplicados.\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n // ---------------------------------------------------------------------------\n // Save\n // ---------------------------------------------------------------------------\n\n // Apply automatic conversions (dates, FK objects, masks) to a record,\n // returning a fresh plain object suitable for the API payload.\n function convertRecord(record: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...record }\n for (const f of formFields) {\n const val = out[f.field]\n\n // Datas\n if (f.type === 'date' && val instanceof Date) {\n out[f.field] = toDateString(val)\n } else if (f.type === 'datetime' && val instanceof Date) {\n out[f.field] = toDateTimeString(val)\n }\n\n // FK — extrair o ID do objeto selecionado\n if (f.type === 'fk' && val !== null && typeof val === 'object') {\n const key = f.optionValue || 'id'\n out[f.field] = (val as Record<string, unknown>)[key] ?? val\n }\n\n // Máscaras — strip para enviar só dígitos\n if ((f.type === 'mask' || f.type === 'cpf_cnpj') && typeof val === 'string') {\n out[f.field] = stripMask(val)\n }\n }\n return out\n }\n\n async function save(): Promise<T | null> {\n // Validação\n for (const f of formFields) {\n if (f.validate) {\n const result = f.validate(formData[f.field])\n if (result) {\n toast.error(result)\n return null\n }\n }\n if (f.required) {\n const val = formData[f.field]\n if (val === null || val === undefined || val === '') {\n toast.error(`${f.label} é obrigatório`)\n return null\n }\n }\n }\n\n saving.value = true\n try {\n let payload: Record<string, unknown> = convertRecord(formData)\n\n // createDefaults é PREFILL (já aplicado ao abrir o diálogo), não um override\n // no submit: só completa chaves ausentes/nulas do payload, sem SOBRESCREVER o\n // que o usuário definiu no form. Senão um campo editável pré-preenchido (ex.:\n // a unidade da baliza) voltaria ao default mesmo depois de o usuário trocar o\n // valor. Continua cobrindo FK-pai oculta de master-detail (chave ausente).\n if (!isEditing.value && createDefaults) {\n const extra = createDefaults()\n for (const [key, value] of Object.entries(extra)) {\n const current = payload[key]\n if (current === undefined || current === null || current === '') {\n payload[key] = value\n }\n }\n }\n\n // Edição: enviar apenas os campos alterados (diff) quando partialUpdate.\n if (isEditing.value && partialUpdate && editingOriginal) {\n const originalPayload = convertRecord(editingOriginal)\n payload = diffRecord(originalPayload, payload)\n\n // Nada mudou — fecha sem chamar a API.\n if (Object.keys(payload).length === 0 && !transformPayload) {\n dialogVisible.value = false\n const current = editingItem.value\n editingItem.value = null\n editingOriginal = null\n return current\n }\n }\n\n if (transformPayload) {\n payload = transformPayload(payload, isEditing.value)\n }\n\n // Detecta se tem arquivo (image) → FormData\n const hasFile = formFields.some((f) => f.type === 'image' && payload[f.field] instanceof File)\n\n let body: Record<string, unknown> | FormData = payload\n let headers: Record<string, string> | undefined\n\n if (hasFile) {\n const imageFields = new Set(\n formFields.filter((f) => f.type === 'image').map((f) => f.field),\n )\n const fd = new FormData()\n for (const [key, val] of Object.entries(payload)) {\n if (val === null || val === undefined) continue\n if (val instanceof File) {\n fd.append(key, val)\n } else if (imageFields.has(key)) {\n // URL string de imagem inalterada — pula\n continue\n } else {\n fd.append(key, String(val))\n }\n }\n body = fd\n headers = { 'Content-Type': 'multipart/form-data' }\n }\n\n const requestConfig = headers ? { headers } : undefined\n let response\n\n if (isEditing.value && editingItem.value) {\n const itemPk = editingItem.value[pk as keyof T]\n response = await provider.update<T>(\n endpoint,\n itemPk as string | number,\n body,\n requestConfig,\n )\n if (!refetchOnSave) {\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) {\n items.value[index] = response.data\n }\n }\n toast.success(labels.successUpdate)\n } else {\n response = await provider.create<T>(endpoint, body, requestConfig)\n if (!refetchOnSave) {\n items.value.unshift(response.data)\n pagination.rows++\n }\n toast.success(labels.successCreate)\n }\n\n dialogVisible.value = false\n editingItem.value = null\n editingOriginal = null\n\n // Re-busca a página atual para refletir o estado real do backend\n // (campos derivados, ordenação, etc.) sem perder a posição da paginação,\n // busca ou filtros — todos preservados em `pagination`/`search`/`sort`.\n if (refetchOnSave) {\n await fetchItems()\n }\n\n if (onAfterSave) onAfterSave(response.data, isEditing.value)\n return response.data\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar registro'))\n return null\n } finally {\n saving.value = false\n }\n }\n\n // ---------------------------------------------------------------------------\n // Inline (cell) edit\n // ---------------------------------------------------------------------------\n\n async function updateField(item: T, field: string, value: unknown): Promise<void> {\n const itemPk = item[pk as keyof T]\n const fdef = formFields.find((f) => f.field === field)\n let v = value\n if (fdef?.type === 'date' && v instanceof Date) v = toDateString(v)\n else if (fdef?.type === 'datetime' && v instanceof Date) v = toDateTimeString(v)\n try {\n const response = await provider.update<T>(endpoint, itemPk as string | number, { [field]: v })\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) items.value[index] = { ...items.value[index], ...response.data }\n toast.success(labels.successUpdate)\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar o campo'))\n }\n }\n\n // ---------------------------------------------------------------------------\n // Delete\n // ---------------------------------------------------------------------------\n\n // Exclusão crua (sem o confirm de serviço) — para quem controla a própria\n // confirmação, ex.: WCrudView com diálogo de exclusão próprio (slot de mensagem).\n async function performDelete(item: T): Promise<void> {\n try {\n const itemPk = item[pk as keyof T]\n await provider.delete(endpoint, itemPk as string | number)\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) {\n items.value.splice(index, 1)\n pagination.rows--\n }\n toast.success(labels.successDelete)\n if (onAfterDelete) onAfterDelete(item)\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao excluir registro'))\n }\n }\n\n function confirmDelete(item: T): void {\n confirmDeleteDialog(() => performDelete(item), labels.deleteConfirmMessage)\n }\n\n function clearSelection(): void {\n selectedItems.value = []\n }\n\n function setColumnFilter(param: string, value: unknown): void {\n if (value === null || value === undefined || value === '') {\n delete columnFilters[param]\n } else {\n columnFilters[param] = value\n }\n pagination.page = 1\n fetchItems()\n }\n\n function clearColumnFilters(): void {\n for (const key of Object.keys(columnFilters)) delete columnFilters[key]\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Return\n // ---------------------------------------------------------------------------\n\n return {\n items,\n selectedItems,\n columnFilters,\n extras,\n loading,\n saving,\n search,\n dialogVisible,\n editingItem,\n formData,\n pagination,\n sort,\n isEditing,\n isViewing,\n viewMode,\n dialogTitle,\n isFirstPage,\n isLastPage,\n init,\n fetchItems,\n fetchAll,\n refresh,\n setSearch,\n onSearch,\n onPage,\n onSort,\n openCreateDialog,\n openEditDialog,\n openViewDialog,\n openDuplicateDialog,\n save,\n updateField,\n confirmDelete,\n performDelete,\n setFormField,\n resetForm,\n goToPage,\n firstPage,\n lastPage,\n clearSelection,\n setColumnFilter,\n clearColumnFilters,\n config,\n }\n}\n","import { ref, reactive, inject } from 'vue'\nimport type { PaginationState, SortState, UseApiOptions, UseApiReturn } from '@/types/api'\nimport { W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\n\nexport function useApi<T = Record<string, unknown>>(options: UseApiOptions): UseApiReturn<T> {\n const { endpoint, searchDebounce = 300, immediate = false } = options\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.',\n )\n }\n const provider = dataProvider\n\n const config = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = options.pageSize ?? config?.defaultPageSize ?? 20\n\n // State\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const loading = ref(false)\n const search = ref('')\n const extras = ref<Record<string, unknown>>({})\n const filters = reactive<Record<string, unknown>>({})\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Debounce\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n for (const [key, value] of Object.entries(filters)) {\n if (value !== null && value !== undefined && value !== '') {\n queryParams[key] = value\n }\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n\n items.value = responseData.data\n pagination.rows = responseData.rows\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n extras.value = responseData.extras ?? {}\n } finally {\n loading.value = false\n }\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function setFilter(key: string, value: unknown): void {\n filters[key] = value\n pagination.page = 1\n fetchItems()\n }\n\n function clearFilters(): void {\n for (const key of Object.keys(filters)) {\n delete filters[key]\n }\n pagination.page = 1\n fetchItems()\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField: string; sortOrder: 1 | -1 | 0 }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n if (immediate) {\n fetchItems()\n }\n\n return {\n items,\n loading,\n search,\n pagination,\n sort,\n extras,\n fetchItems,\n refresh,\n setSearch,\n setFilter,\n clearFilters,\n onPage,\n onSort,\n }\n}\n"],"names":["diffRecord","original","current","out","key","useCrudManager","config","endpoint","formFields","pk","searchDebounce","partialUpdate","refetchOnSave","filterParams","createDefaults","transformPayload","onAfterSave","onAfterDelete","dataProvider","inject","W_DATA_PROVIDER_KEY","provider","pluginConfig","W_CONFIG_KEY","defaultPageSize","labels","DEFAULT_CRUD_LABELS","toast","useAppToast","confirmDeleteDialog","useAppConfirm","items","ref","selectedItems","extras","loading","saving","search","dialogVisible","viewMode","editingItem","formData","reactive","editingOriginal","pagination","sort","columnFilters","getDefaults","defaults","f","isEditing","computed","isViewing","dialogTitle","isFirstPage","isLastPage","searchTimeout","fetchItems","params","queryParams","val","responseData","init","refresh","fetchAll","pageSize","base","all","page","maxPages","res","total","setSearch","value","onSearch","event","target","goToPage","firstPage","lastPage","onPage","onSort","resetForm","defs","setFormField","field","openCreateDialog","extra","loadItemIntoForm","item","snapshot","parseDate","openEditDialog","openViewDialog","openDuplicateDialog","convertRecord","record","toDateString","toDateTimeString","stripMask","save","result","payload","originalPayload","hasFile","body","headers","imageFields","fd","requestConfig","response","itemPk","index","i","err","extractApiError","updateField","fdef","v","performDelete","confirmDelete","clearSelection","setColumnFilter","param","clearColumnFilters","useApi","options","immediate","filters","setFilter","clearFilters"],"mappings":"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"}
@@ -0,0 +1,404 @@
1
+ import { inject as K, ref as P, reactive as R, computed as $ } from "vue";
2
+ import { W as re, a as fe } from "./plugin-BKa0eSEM.js";
3
+ import { DEFAULT_CRUD_LABELS as Ce } from "./types.js";
4
+ import { b as Ee, a as Ae, e as X, t as ne, g as se, p as le, s as Ie } from "./useFormKeyboardNav-D4Irq5RE.js";
5
+ function Re(F, h) {
6
+ const v = {};
7
+ for (const g of Object.keys(h))
8
+ JSON.stringify(F[g]) !== JSON.stringify(h[g]) && (v[g] = h[g]);
9
+ return v;
10
+ }
11
+ function Le(F) {
12
+ const {
13
+ endpoint: h,
14
+ form: v,
15
+ pk: g = "id",
16
+ searchDebounce: N = 300,
17
+ partialUpdate: Y = !0,
18
+ refetchOnSave: T = !0,
19
+ filterParams: M = void 0,
20
+ createDefaults: j = void 0,
21
+ transformPayload: _ = void 0,
22
+ onAfterSave: V = void 0,
23
+ onAfterDelete: U = void 0
24
+ } = F, C = K(re);
25
+ if (!C)
26
+ throw new Error(
27
+ "[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager."
28
+ );
29
+ const n = C, D = K(fe), W = F.pageSize ?? (D == null ? void 0 : D.defaultPageSize) ?? 20, f = { ...Ce, ...F.labels }, k = Ee(), { confirmDelete: B } = Ae(), S = P([]), q = P([]), J = P({}), L = P(!1), c = P(!1), y = P(""), d = P(!1), z = P(!1), u = P(null), b = R({});
30
+ let E = null;
31
+ const s = R({
32
+ page: 1,
33
+ pageSize: W,
34
+ rows: 0,
35
+ totalPages: 0
36
+ }), m = R({
37
+ field: null,
38
+ order: 0
39
+ }), A = R({});
40
+ function Z() {
41
+ const e = {};
42
+ for (const t of v)
43
+ e[t.field] = t.defaultValue !== void 0 ? typeof t.defaultValue == "function" ? t.defaultValue() : t.defaultValue : null;
44
+ return e;
45
+ }
46
+ const ee = Z();
47
+ for (const e of Object.keys(ee))
48
+ b[e] = ee[e];
49
+ const I = $(() => u.value !== null && !z.value), ce = $(() => z.value), ue = $(
50
+ () => z.value ? f.viewTitle ?? "Visualizar Registro" : I.value ? f.editTitle : f.createTitle
51
+ ), de = $(() => s.page <= 1), pe = $(() => s.page >= s.totalPages);
52
+ let G = null;
53
+ async function O(e = {}) {
54
+ L.value = !0;
55
+ try {
56
+ const t = {
57
+ page: s.page,
58
+ page_size: s.pageSize,
59
+ ...e
60
+ };
61
+ y.value && (t.search = y.value), m.field && m.order !== 0 && (t.ordering = m.order === -1 ? `-${m.field}` : m.field), M && Object.assign(t, M());
62
+ for (const [o, r] of Object.entries(A))
63
+ r != null && r !== "" && (t[o] = r);
64
+ const a = await n.list(h, t);
65
+ S.value = a.data, q.value = [], s.rows = a.rows, J.value = a.extras ?? {}, a.page && (s.page = a.page), a.page_size && (s.pageSize = a.page_size), s.totalPages = Math.ceil(s.rows / s.pageSize) || 0;
66
+ } finally {
67
+ L.value = !1;
68
+ }
69
+ }
70
+ async function ge() {
71
+ await O();
72
+ }
73
+ async function ve() {
74
+ await O();
75
+ }
76
+ async function ye(e = 200) {
77
+ const t = {};
78
+ y.value && (t.search = y.value), m.field && m.order !== 0 && (t.ordering = m.order === -1 ? `-${m.field}` : m.field), M && Object.assign(t, M());
79
+ for (const [l, i] of Object.entries(A))
80
+ i != null && i !== "" && (t[l] = i);
81
+ const a = [];
82
+ let o = 1;
83
+ const r = 1e4;
84
+ for (; o <= r; ) {
85
+ const l = await n.list(h, {
86
+ ...t,
87
+ page: o,
88
+ page_size: e
89
+ });
90
+ a.push(...l.data);
91
+ const i = l.rows ?? a.length;
92
+ if (l.data.length === 0 || a.length >= i) break;
93
+ o++;
94
+ }
95
+ return a;
96
+ }
97
+ function te(e) {
98
+ y.value = e, G && clearTimeout(G), G = setTimeout(() => {
99
+ s.page = 1, O();
100
+ }, N);
101
+ }
102
+ function me(e) {
103
+ const t = e.target;
104
+ te(t.value);
105
+ }
106
+ function H(e) {
107
+ s.page = e, O();
108
+ }
109
+ function we() {
110
+ H(1);
111
+ }
112
+ function Pe() {
113
+ H(s.totalPages);
114
+ }
115
+ function he(e) {
116
+ s.page = e.page + 1, s.pageSize = e.rows, O();
117
+ }
118
+ function De(e) {
119
+ m.field = e.sortField ?? null, m.order = e.sortOrder ?? 0, s.page = 1, O();
120
+ }
121
+ function Q() {
122
+ const e = Z();
123
+ for (const t of Object.keys(e))
124
+ b[t] = e[t];
125
+ }
126
+ function Se(e, t) {
127
+ b[e] = t;
128
+ }
129
+ function be() {
130
+ if (z.value = !1, u.value = null, E = null, Q(), j) {
131
+ const e = j();
132
+ for (const [t, a] of Object.entries(e))
133
+ b[t] = a;
134
+ }
135
+ d.value = !0;
136
+ }
137
+ function ae(e) {
138
+ const t = {};
139
+ for (const a of v) {
140
+ let o = e[a.field] !== void 0 ? e[a.field] : null;
141
+ o && (a.type === "date" || a.type === "datetime") && typeof o == "string" && (o = le(o)), b[a.field] = o, t[a.field] = o;
142
+ }
143
+ E = t;
144
+ }
145
+ function ke(e) {
146
+ z.value = !1, u.value = e, ae(e), d.value = !0;
147
+ }
148
+ function ze(e) {
149
+ z.value = !0, u.value = e, ae(e), d.value = !0;
150
+ }
151
+ function Oe(e) {
152
+ z.value = !1, u.value = null, E = null, Q();
153
+ for (const t of v) {
154
+ if (t.field === g) continue;
155
+ let a = e[t.field] !== void 0 ? e[t.field] : b[t.field];
156
+ a && (t.type === "date" || t.type === "datetime") && typeof a == "string" && (a = le(a)), b[t.field] = a;
157
+ }
158
+ if (j) {
159
+ const t = j();
160
+ for (const [a, o] of Object.entries(t))
161
+ b[a] = o;
162
+ }
163
+ d.value = !0;
164
+ }
165
+ function oe(e) {
166
+ const t = { ...e };
167
+ for (const a of v) {
168
+ const o = t[a.field];
169
+ if (a.type === "date" && o instanceof Date ? t[a.field] = ne(o) : a.type === "datetime" && o instanceof Date && (t[a.field] = se(o)), a.type === "fk" && o !== null && typeof o == "object") {
170
+ const r = a.optionValue || "id";
171
+ t[a.field] = o[r] ?? o;
172
+ }
173
+ (a.type === "mask" || a.type === "cpf_cnpj") && typeof o == "string" && (t[a.field] = Ie(o));
174
+ }
175
+ return t;
176
+ }
177
+ async function Fe() {
178
+ for (const e of v) {
179
+ if (e.validate) {
180
+ const t = e.validate(b[e.field]);
181
+ if (t)
182
+ return k.error(t), null;
183
+ }
184
+ if (e.required) {
185
+ const t = b[e.field];
186
+ if (t == null || t === "")
187
+ return k.error(`${e.label} é obrigatório`), null;
188
+ }
189
+ }
190
+ c.value = !0;
191
+ try {
192
+ let e = oe(b);
193
+ if (!I.value && j) {
194
+ const i = j();
195
+ for (const [p, w] of Object.entries(i)) {
196
+ const x = e[p];
197
+ (x == null || x === "") && (e[p] = w);
198
+ }
199
+ }
200
+ if (I.value && Y && E) {
201
+ const i = oe(E);
202
+ if (e = Re(i, e), Object.keys(e).length === 0 && !_) {
203
+ d.value = !1;
204
+ const p = u.value;
205
+ return u.value = null, E = null, p;
206
+ }
207
+ }
208
+ _ && (e = _(e, I.value));
209
+ const t = v.some((i) => i.type === "image" && e[i.field] instanceof File);
210
+ let a = e, o;
211
+ if (t) {
212
+ const i = new Set(
213
+ v.filter((w) => w.type === "image").map((w) => w.field)
214
+ ), p = new FormData();
215
+ for (const [w, x] of Object.entries(e))
216
+ if (x != null)
217
+ if (x instanceof File)
218
+ p.append(w, x);
219
+ else {
220
+ if (i.has(w))
221
+ continue;
222
+ p.append(w, String(x));
223
+ }
224
+ a = p, o = { "Content-Type": "multipart/form-data" };
225
+ }
226
+ const r = o ? { headers: o } : void 0;
227
+ let l;
228
+ if (I.value && u.value) {
229
+ const i = u.value[g];
230
+ if (l = await n.update(
231
+ h,
232
+ i,
233
+ a,
234
+ r
235
+ ), !T) {
236
+ const p = S.value.findIndex((w) => w[g] === i);
237
+ p !== -1 && (S.value[p] = l.data);
238
+ }
239
+ k.success(f.successUpdate);
240
+ } else
241
+ l = await n.create(h, a, r), T || (S.value.unshift(l.data), s.rows++), k.success(f.successCreate);
242
+ return d.value = !1, u.value = null, E = null, T && await O(), V && V(l.data, I.value), l.data;
243
+ } catch (e) {
244
+ return k.error(X(e, "Erro ao salvar registro")), null;
245
+ } finally {
246
+ c.value = !1;
247
+ }
248
+ }
249
+ async function je(e, t, a) {
250
+ const o = e[g], r = v.find((i) => i.field === t);
251
+ let l = a;
252
+ (r == null ? void 0 : r.type) === "date" && l instanceof Date ? l = ne(l) : (r == null ? void 0 : r.type) === "datetime" && l instanceof Date && (l = se(l));
253
+ try {
254
+ const i = await n.update(h, o, { [t]: l }), p = S.value.findIndex((w) => w[g] === o);
255
+ p !== -1 && (S.value[p] = { ...S.value[p], ...i.data }), k.success(f.successUpdate);
256
+ } catch (i) {
257
+ k.error(X(i, "Erro ao salvar o campo"));
258
+ }
259
+ }
260
+ async function ie(e) {
261
+ try {
262
+ const t = e[g];
263
+ await n.delete(h, t);
264
+ const a = S.value.findIndex((o) => o[g] === t);
265
+ a !== -1 && (S.value.splice(a, 1), s.rows--), k.success(f.successDelete), U && U(e);
266
+ } catch (t) {
267
+ k.error(X(t, "Erro ao excluir registro"));
268
+ }
269
+ }
270
+ function xe(e) {
271
+ B(() => ie(e), f.deleteConfirmMessage);
272
+ }
273
+ function Te() {
274
+ q.value = [];
275
+ }
276
+ function _e(e, t) {
277
+ t == null || t === "" ? delete A[e] : A[e] = t, s.page = 1, O();
278
+ }
279
+ function Ve() {
280
+ for (const e of Object.keys(A)) delete A[e];
281
+ s.page = 1, O();
282
+ }
283
+ return {
284
+ items: S,
285
+ selectedItems: q,
286
+ columnFilters: A,
287
+ extras: J,
288
+ loading: L,
289
+ saving: c,
290
+ search: y,
291
+ dialogVisible: d,
292
+ editingItem: u,
293
+ formData: b,
294
+ pagination: s,
295
+ sort: m,
296
+ isEditing: I,
297
+ isViewing: ce,
298
+ viewMode: z,
299
+ dialogTitle: ue,
300
+ isFirstPage: de,
301
+ isLastPage: pe,
302
+ init: ge,
303
+ fetchItems: O,
304
+ fetchAll: ye,
305
+ refresh: ve,
306
+ setSearch: te,
307
+ onSearch: me,
308
+ onPage: he,
309
+ onSort: De,
310
+ openCreateDialog: be,
311
+ openEditDialog: ke,
312
+ openViewDialog: ze,
313
+ openDuplicateDialog: Oe,
314
+ save: Fe,
315
+ updateField: je,
316
+ confirmDelete: xe,
317
+ performDelete: ie,
318
+ setFormField: Se,
319
+ resetForm: Q,
320
+ goToPage: H,
321
+ firstPage: we,
322
+ lastPage: Pe,
323
+ clearSelection: Te,
324
+ setColumnFilter: _e,
325
+ clearColumnFilters: Ve,
326
+ config: F
327
+ };
328
+ }
329
+ function $e(F) {
330
+ const { endpoint: h, searchDebounce: v = 300, immediate: g = !1 } = F, N = K(re);
331
+ if (!N)
332
+ throw new Error(
333
+ "[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi."
334
+ );
335
+ const Y = N, T = K(fe), M = F.pageSize ?? (T == null ? void 0 : T.defaultPageSize) ?? 20, j = P([]), _ = P(!1), V = P(""), U = P({}), C = R({}), n = R({
336
+ page: 1,
337
+ pageSize: M,
338
+ rows: 0,
339
+ totalPages: 0
340
+ }), D = R({
341
+ field: null,
342
+ order: 0
343
+ });
344
+ let W = null;
345
+ async function f(c = {}) {
346
+ _.value = !0;
347
+ try {
348
+ const y = {
349
+ page: n.page,
350
+ page_size: n.pageSize,
351
+ ...c
352
+ };
353
+ V.value && (y.search = V.value), D.field && D.order !== 0 && (y.ordering = D.order === -1 ? `-${D.field}` : D.field);
354
+ for (const [z, u] of Object.entries(C))
355
+ u != null && u !== "" && (y[z] = u);
356
+ const d = await Y.list(h, y);
357
+ j.value = d.data, n.rows = d.rows, d.page && (n.page = d.page), d.page_size && (n.pageSize = d.page_size), n.totalPages = Math.ceil(n.rows / n.pageSize) || 0, U.value = d.extras ?? {};
358
+ } finally {
359
+ _.value = !1;
360
+ }
361
+ }
362
+ async function k() {
363
+ await f();
364
+ }
365
+ function B(c) {
366
+ V.value = c, W && clearTimeout(W), W = setTimeout(() => {
367
+ n.page = 1, f();
368
+ }, v);
369
+ }
370
+ function S(c, y) {
371
+ C[c] = y, n.page = 1, f();
372
+ }
373
+ function q() {
374
+ for (const c of Object.keys(C))
375
+ delete C[c];
376
+ n.page = 1, f();
377
+ }
378
+ function J(c) {
379
+ n.page = c.page + 1, n.pageSize = c.rows, f();
380
+ }
381
+ function L(c) {
382
+ D.field = c.sortField ?? null, D.order = c.sortOrder ?? 0, n.page = 1, f();
383
+ }
384
+ return g && f(), {
385
+ items: j,
386
+ loading: _,
387
+ search: V,
388
+ pagination: n,
389
+ sort: D,
390
+ extras: U,
391
+ fetchItems: f,
392
+ refresh: k,
393
+ setSearch: B,
394
+ setFilter: S,
395
+ clearFilters: q,
396
+ onPage: J,
397
+ onSort: L
398
+ };
399
+ }
400
+ export {
401
+ Le as a,
402
+ $e as u
403
+ };
404
+ //# sourceMappingURL=useApi-CywGloqb.js.map