@wgalleti/primevue-components 0.9.4 → 0.9.6

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 (30) hide show
  1. package/bin/wpvc.mjs +0 -0
  2. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-Cc0DJRIy.cjs +12 -0
  3. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-Cc0DJRIy.cjs.map +1 -0
  4. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DVjJq8Bs.js +3632 -0
  5. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DVjJq8Bs.js.map +1 -0
  6. package/dist/components/crud/WCrudView.vue.d.ts +11 -0
  7. package/dist/components/form/WAutoCompleteFK.vue.d.ts +13 -3
  8. package/dist/components/form/WFileUpload.vue.d.ts +1 -1
  9. package/dist/components.cjs +1 -1
  10. package/dist/components.js +1 -1
  11. package/dist/composables.cjs +1 -1
  12. package/dist/composables.js +1 -1
  13. package/dist/index.cjs +1 -1
  14. package/dist/index.js +3 -3
  15. package/dist/primevue-components.css +1 -1
  16. package/dist/types/manager.d.ts +5 -0
  17. package/dist/useApi-237Q1Vdg.cjs +2 -0
  18. package/dist/useApi-237Q1Vdg.cjs.map +1 -0
  19. package/dist/useApi-BsrLTNwE.js +409 -0
  20. package/dist/useApi-BsrLTNwE.js.map +1 -0
  21. package/package.json +1 -1
  22. package/skill/references/components.md +5 -0
  23. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-CghB36QK.cjs +0 -12
  24. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-CghB36QK.cjs.map +0 -1
  25. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-KqwCnEHm.js +0 -3429
  26. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-KqwCnEHm.js.map +0 -1
  27. package/dist/useApi-6xjrf0BB.cjs +0 -2
  28. package/dist/useApi-6xjrf0BB.cjs.map +0 -1
  29. package/dist/useApi-CywGloqb.js +0 -404
  30. package/dist/useApi-CywGloqb.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { CrudManagerReturn } from '../../types/manager';
2
+ import { ColumnDef } from '../../types/column';
2
3
  import { KpiItem } from '../../types/kpi';
3
4
  type __VLS_Props = {
4
5
  crud: CrudManagerReturn<any>;
@@ -19,6 +20,10 @@ type __VLS_Props = {
19
20
  viewToggle?: boolean;
20
21
  defaultView?: 'table' | 'cards';
21
22
  cardFields?: number;
23
+ /** Cards "sem moldura": remove o chrome padrão do card (borda/sombra/padding/
24
+ * seleção) para o slot `#card` desenhar o card inteiro (ex.: um card de design
25
+ * próprio). O wrapper vira só a célula do grid. */
26
+ cardBare?: boolean;
22
27
  actionRail?: boolean;
23
28
  contextMenu?: boolean;
24
29
  showPrint?: boolean;
@@ -64,6 +69,12 @@ declare function __VLS_template(): {
64
69
  expansion?(_: {
65
70
  data: any;
66
71
  }): any;
72
+ card?(_: {
73
+ data: any;
74
+ crud: CrudManagerReturn<any>;
75
+ columns: ColumnDef[];
76
+ index: number;
77
+ }): any;
67
78
  'rail-actions'?(_: {
68
79
  selected: Record<string, unknown> | null;
69
80
  crud: CrudManagerReturn<any>;
@@ -10,13 +10,21 @@ interface DrilldownFilter {
10
10
  value: unknown;
11
11
  required?: boolean;
12
12
  }
13
+ /** Valor aceito no `v-model`: id, objeto ou — em `multiple` — lista de ids/objetos. */
14
+ type FKValue = string | number | Record<string, unknown>;
13
15
  type __VLS_Props = {
14
- modelValue: string | number | Record<string, unknown> | null;
16
+ modelValue: FKValue | FKValue[] | null;
15
17
  endpoint: string;
16
18
  endpointParams?: Record<string, string | number | boolean>;
17
19
  /** Filtro(s) em cascata resolvido(s): aplicado(s) como parâmetro na busca. Com
18
20
  * `required` (default true), a busca só ocorre quando o valor estiver preenchido. */
19
21
  drilldown?: DrilldownFilter | DrilldownFilter[];
22
+ /** Seleção múltipla: o campo vira chips e o `v-model` passa a ser uma lista
23
+ * de objetos. O modal de pesquisa ganha caixas de marcação. */
24
+ multiple?: boolean;
25
+ /** Em `multiple`, quantos chips mostrar antes de resumir o resto em `+N`
26
+ * (0 = mostrar todos). Útil em campo estreito, tipo filtro de painel. */
27
+ maxChips?: number;
20
28
  optionLabel?: string;
21
29
  optionValue?: string;
22
30
  placeholder?: string;
@@ -40,10 +48,12 @@ type __VLS_Props = {
40
48
  autofocus?: boolean;
41
49
  };
42
50
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
43
- "update:modelValue": (value: Record<string, unknown> | null) => any;
51
+ "update:modelValue": (value: Record<string, unknown> | Record<string, unknown>[] | null) => any;
44
52
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
45
- "onUpdate:modelValue"?: ((value: Record<string, unknown> | null) => any) | undefined;
53
+ "onUpdate:modelValue"?: ((value: Record<string, unknown> | Record<string, unknown>[] | null) => any) | undefined;
46
54
  }>, {
55
+ multiple: boolean;
56
+ maxChips: number;
47
57
  optionLabel: string;
48
58
  optionValue: string;
49
59
  placeholder: string;
@@ -31,10 +31,10 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
31
31
  "onUpdate:modelValue"?: ((value: File | File[] | null) => any) | undefined;
32
32
  }>, {
33
33
  modelValue: File | File[] | null;
34
+ multiple: boolean;
34
35
  disabled: boolean;
35
36
  accept: string;
36
37
  maxSize: number;
37
- multiple: boolean;
38
38
  chooseLabel: string;
39
39
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
40
40
  input: HTMLInputElement;
@@ -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-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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./WProgressFlow.vue_vue_type_script_setup_true_lang-Cc0DJRIy.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-KqwCnEHm.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-DVjJq8Bs.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-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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useApi-237Q1Vdg.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-CywGloqb.js";
1
+ import { u, a as o } from "./useApi-BsrLTNwE.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-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;
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-Cc0DJRIy.cjs"),W=require("./useApi-237Q1Vdg.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-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";
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-DVjJq8Bs.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-DVjJq8Bs.js";
4
+ import { u as ie, a as ce } from "./useApi-BsrLTNwE.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) {
@@ -1 +1 @@
1
- .w-imgcropper-preview[data-v-95684d2d]{position:relative;overflow:hidden;border-radius:8px;border:1px solid var(--p-content-border-color, #e2e8f0);background:var(--p-content-background, #f8fafc)}.w-imgcropper-preview.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-img[data-v-95684d2d]{width:100%;height:100%;object-fit:cover;display:block}.w-imgcropper-actions[data-v-95684d2d]{position:absolute;inset:auto 0 0 0;display:flex;justify-content:center;gap:4px;padding:4px;background:color-mix(in srgb,#000 45%,transparent);opacity:0;transition:opacity .15s ease}.w-imgcropper-preview:hover .w-imgcropper-actions[data-v-95684d2d],.w-imgcropper-preview:focus-within .w-imgcropper-actions[data-v-95684d2d]{opacity:1}.w-imgcropper-empty[data-v-95684d2d]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;cursor:pointer;border:none;background:transparent;color:var(--p-text-muted-color, #64748b);font-size:.85rem}.w-imgcropper-empty i[data-v-95684d2d]{font-size:1.5rem}.w-imgcropper-file[data-v-95684d2d]{display:none}.w-imgcropper-stage[data-v-95684d2d]{display:flex;flex-direction:column;gap:16px;align-items:center}.w-imgcropper-viewport[data-v-95684d2d]{position:relative;overflow:hidden;touch-action:none;cursor:grab;background:#1e1e1e;border-radius:4px}.w-imgcropper-viewport[data-v-95684d2d]:active{cursor:grabbing}.w-imgcropper-viewport.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-cropimg[data-v-95684d2d]{position:absolute;top:0;left:0;max-width:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.w-imgcropper-stencil[data-v-95684d2d]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;box-shadow:0 0 0 1px color-mix(in srgb,#fff 60%,transparent) inset}.w-imgcropper-stencil.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-zoom[data-v-95684d2d]{display:flex;align-items:center;gap:10px;width:100%;color:var(--p-text-muted-color, #64748b)}.w-imgcropper-slider[data-v-95684d2d]{flex:1}.w-crud-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-crud-header-content{min-width:0}.w-crud-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-crud-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-crud-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-crud-kpis{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem;margin-bottom:1.25rem}.w-crud-kpi{display:flex;align-items:center;gap:.75rem;padding:1rem 1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background)}.w-crud-kpi-icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);flex-shrink:0;font-size:1.125rem}.w-crud-kpi-icon--primary{background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-crud-kpi-icon--success{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-kpi-icon--warning{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-crud-kpi-icon--danger{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-crud-kpi-icon--info{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-crud-kpi-content{min-width:0}.w-crud-kpi-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em;line-height:1;margin-bottom:.25rem}.w-crud-kpi-value{font-size:1.25rem;font-weight:700;color:var(--p-text-color);letter-spacing:-.02em;line-height:1}.w-crud-table{border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);overflow:hidden}.w-crud-table .p-datatable{font-size:.8125rem}.w-crud-table .p-datatable-header{background:transparent;border-bottom:1px solid var(--p-content-border-color);padding:.75rem 1rem}.w-crud-table .p-datatable-thead>tr>th{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--p-text-muted-color);background:var(--p-content-background)}.w-crud-table .p-datatable-tbody>tr>td{padding-top:.625rem;padding-bottom:.625rem}.w-crud-table .p-datatable-paginator-bottom{border-top:1px solid var(--p-content-border-color)}.w-crud-paginator .p-paginator-content{justify-content:flex-end}.w-crud-paginator .p-paginator-current{font-size:.75rem;color:var(--p-text-muted-color);margin-right:auto!important}.w-crud-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem 0}.w-crud-toolbar-start{display:flex;align-items:center;gap:.75rem}.w-crud-toolbar-end{display:flex;align-items:center;gap:.5rem}.w-crud-actions-header .p-datatable-column-header-content{justify-content:center}.w-crud-actions{display:flex;align-items:center;justify-content:center;gap:.125rem}.w-crud-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem}.w-crud-empty-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-empty-title{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-crud-empty-text{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.25rem}.p-datatable-header-cell.text-right .p-datatable-column-header-content{justify-content:flex-end}.p-datatable-header-cell.text-center .p-datatable-column-header-content{justify-content:center}.p-dialog.w-crud-form-dialog>.p-dialog-header{padding-bottom:.5rem}.p-dialog.w-crud-form-dialog>.p-dialog-content{padding-bottom:.75rem}.w-crud-form{display:flex;flex-direction:column;gap:1.5rem}.w-crud-form-group-header{margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:1px solid var(--p-surface-200)}.dark .w-crud-form-group-header{border-bottom-color:var(--p-surface-700)}.w-crud-form-group-title{font-size:.875rem;font-weight:600;color:var(--p-text-color);margin:0}.w-crud-form-group-desc{font-size:.75rem;color:var(--p-text-muted-color);margin:.25rem 0 0}.w-crud-form-cep-error{display:block;font-size:.75rem;color:var(--p-red-500);margin-top:.25rem}.w-crud-form-cep-spinner{margin-left:.375rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-crud-form-fields{display:grid;grid-template-columns:repeat(var(--w-form-cols, 2),1fr);gap:1rem 1rem}.w-crud-form-col-full{grid-column:span var(--w-col-span, 2)}.w-crud-form-col-half{grid-column:span var(--w-col-span, 1)}@media(max-width:640px){.w-crud-form-fields{grid-template-columns:1fr}.w-crud-form-col-full,.w-crud-form-col-half,.w-crud-form-switch{grid-column:1 / -1}}.w-crud-form-field{display:flex;flex-direction:column}.w-crud-form-required{color:var(--p-red-400, #f87171);margin-left:.125rem}.w-crud-form-label{display:block;font-weight:500;margin-bottom:.375rem;color:var(--p-text-color);font-size:.75rem}.w-crud-form-color-row{display:flex;align-items:center;gap:.5rem}.w-crud-form-switch{grid-column:span var(--w-col-span, 2);display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-radius:.5rem;background:var(--p-content-hover-background)}.w-crud-form-switch-label{font-size:.875rem;font-weight:500;color:var(--p-text-color);-webkit-user-select:none;user-select:none}.w-crud-form-error{display:block;font-size:.75rem;color:var(--p-red-400, #f87171);margin-top:.25rem}.w-crud-form-footer{display:flex;justify-content:space-between;gap:.5rem;padding-top:1rem;padding-bottom:.5rem;border-top:1px solid var(--p-content-border-color);margin-top:.25rem}.w-autocompletefk{position:relative;display:flex;align-items:stretch;width:100%}.w-autocompletefk .p-autocomplete{flex:1}.w-autocompletefk .p-autocomplete-input{padding-right:2.5rem}.w-autocompletefk-trigger{position:absolute;right:0;top:0;bottom:0;width:2.5rem;display:flex;align-items:center;justify-content:center;color:var(--p-text-muted-color);cursor:pointer;border:none;background:transparent;transition:color .15s;font-size:.875rem}.w-autocompletefk-trigger:hover{color:var(--p-primary-color)}.w-autocompletefk-trigger:disabled{opacity:.4;cursor:default}.w-autocompletefk-trigger i{font-size:.875rem}.w-autocompletefk-toolbar{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.w-autocompletefk-toolbar-search{flex:1}.w-autocompletefk-toolbar-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-autocompletefk-empty{text-align:center;padding:1.5rem;color:var(--p-text-muted-color);font-size:.875rem}.w-autocompletefk-footer{display:flex;justify-content:flex-end;gap:.5rem}.w-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-page-header-content{min-width:0}.w-page-header-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-page-header-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-page-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-detail-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-detail-header-left{display:flex;align-items:center;gap:.75rem;min-width:0}.w-detail-header-icon{font-size:1.25rem;color:var(--p-primary-color)}.w-detail-header-content{min-width:0}.w-detail-header-title{font-size:1.125rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-detail-header-subtitle{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.125rem}.w-detail-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1rem;text-align:center}.w-empty-state-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-empty-state-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-empty-state-description{font-size:.8125rem;color:var(--p-text-muted-color);margin-top:.25rem;max-width:24rem}.w-info-card{padding:1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);margin-bottom:1rem}.w-info-card-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.75rem}.w-info-card-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem 1.5rem}.w-info-card-field{display:flex;flex-direction:column;gap:.125rem}.w-info-card-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em}.w-info-card-value{font-size:.875rem;font-weight:500;color:var(--p-text-color)}.w-section-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-section-header--compact{margin-bottom:.75rem}.w-section-header__main{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-section-header__icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;flex-shrink:0;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-section-header__content{min-width:0}.w-section-header__title-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-section-header__title{font-size:1rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-section-header__subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-section-header__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section{border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background);padding:1rem}.w-form-section--muted{background:color-mix(in srgb,var(--p-content-background) 88%,var(--p-primary-color) 2%)}.w-form-section--outlined{background:transparent}.w-form-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-form-section__content{min-width:0}.w-form-section__title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-form-section__description{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-form-section__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section__body{display:flex;flex-direction:column;gap:1rem}.w-action-bar{display:flex;align-items:center;gap:.75rem}.w-action-bar--between{justify-content:space-between}.w-action-bar--start{justify-content:flex-start}.w-action-bar--end{justify-content:flex-end}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-action-bar__primary{min-width:0}.w-action-bar__secondary{justify-content:flex-end}.w-kpi-grid{display:grid;gap:.75rem}.w-kpi-grid--cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.w-kpi-grid--cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.w-kpi-grid--cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.w-kpi-grid--cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.w-kpi-grid--cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.w-kpi-grid--auto{grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr))}.w-kpi-grid--dense{gap:.5rem}.w-kpi-card{display:flex;flex-direction:column;gap:.875rem;min-height:100%;padding:1rem 1.125rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-kpi-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.w-kpi-card__icon{display:flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;border-radius:.875rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);font-size:1.125rem}.w-kpi-card__content{display:flex;flex-direction:column;gap:.25rem}.w-kpi-card__label{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);font-weight:600}.w-kpi-card__value{font-size:1.5rem;font-weight:700;line-height:1.1;letter-spacing:-.02em;color:var(--p-text-color)}.w-kpi-card__hint{font-size:.8125rem;color:var(--p-text-muted-color)}.w-kpi-card__footer{margin-top:auto}.w-kpi-card__trend{display:flex;justify-content:flex-end}.w-kpi-card__trend-badge{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:999px;font-size:.75rem;font-weight:600;background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-kpi-card__trend-badge--up{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card__trend-badge--down{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card__loading{display:flex;align-items:center;gap:.875rem}.w-kpi-card__loading-content{display:flex;flex:1;flex-direction:column;gap:.5rem}.w-kpi-card--success .w-kpi-card__icon{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card--warning .w-kpi-card__icon{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-kpi-card--danger .w-kpi-card__icon{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card--info .w-kpi-card__icon{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-kpi-card--neutral .w-kpi-card__icon{background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-progress-flow{display:flex;gap:.75rem}.w-progress-flow--horizontal{align-items:stretch;flex-wrap:wrap}.w-progress-flow--vertical{flex-direction:column}.w-progress-flow__step{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-progress-flow--horizontal .w-progress-flow__step{flex:1 1 0;min-width:12rem;padding:.875rem 1rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-progress-flow__marker{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;flex-shrink:0;border-radius:999px;border:1px solid var(--p-content-border-color);color:var(--p-text-muted-color);background:transparent;font-size:.8125rem;font-weight:700}.w-progress-flow__content{min-width:0}.w-progress-flow__label{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-progress-flow__description{margin-top:.125rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-progress-flow__step--current .w-progress-flow__marker{border-color:var(--p-primary-color);background:color-mix(in srgb,var(--p-primary-color) 12%,transparent);color:var(--p-primary-color)}.w-progress-flow__step--done .w-progress-flow__marker{border-color:var(--p-green-500, #22c55e);background:color-mix(in srgb,var(--p-green-500, #22c55e) 12%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-view-toggle{display:inline-flex;align-items:center;gap:.125rem}.w-crud-toolbar--standalone{border:1px solid var(--p-content-border-color);background:var(--p-content-background);border-radius:.75rem;padding:.625rem .75rem;margin-bottom:.75rem}.w-crud-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:.75rem}.w-crud-card{display:flex;flex-direction:column;gap:.5rem;padding:1rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);cursor:default;transition:border-color .15s,box-shadow .15s}.w-crud-card:hover{border-color:color-mix(in srgb,var(--p-primary-color) 40%,var(--p-content-border-color))}.w-crud-card-body{display:flex;flex-direction:column;gap:.375rem;min-width:0}.w-crud-card-row{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;font-size:.8125rem;min-width:0}.w-crud-card-row--title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.125rem}.w-crud-card-label{font-size:.6875rem;font-weight:500;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);flex-shrink:0}.w-crud-card-value{min-width:0;text-align:right;color:var(--p-text-color)}.w-crud-card-row--title .w-crud-card-value{text-align:left}.w-crud-card-actions{display:flex;align-items:center;justify-content:flex-end;gap:.125rem;margin-top:.25rem;padding-top:.5rem;border-top:1px solid var(--p-content-border-color)}.w-crud-cards-loading{display:flex;align-items:center;justify-content:center;padding:3rem 1rem;color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-cards-wrap .w-crud-paginator{margin-top:.75rem}.w-crud-card--selected{border-color:var(--p-primary-color);box-shadow:0 0 0 1px var(--p-primary-color)}.w-crud-content--rail{display:flex;align-items:flex-start;gap:.75rem}.w-crud-content-main{min-width:0}.w-crud-content--rail .w-crud-content-main{flex:1}.w-crud-rail{position:sticky;top:1rem;display:flex;flex-direction:column;align-items:center;gap:.375rem;flex-shrink:0;width:52px;padding:.5rem 0;border:1px solid var(--p-content-border-color);border-radius:15px;background:var(--p-content-background);box-shadow:var(--p-overlay-popover-shadow, 0 6px 20px rgba(15, 23, 42, .09))}.w-crud-rail-sep{width:60%;height:1px;background:var(--p-content-border-color);margin:.125rem 0}.w-crud-ctx-danger .p-contextmenu-item-link,.w-crud-ctx-danger .p-contextmenu-item-link .p-contextmenu-item-icon{color:var(--p-red-500, #ef4444)}.w-money-input__field{text-align:right}.w-transfer{display:grid;grid-template-columns:1fr auto 1fr;gap:.75rem;align-items:stretch}.w-transfer--disabled{opacity:.6;pointer-events:none}.w-transfer__pane{display:flex;flex-direction:column;gap:.5rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);padding:.625rem;min-width:0}.w-transfer__head{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.w-transfer__title{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color)}.w-transfer__count{font-size:.6875rem;font-weight:600;color:var(--p-text-muted-color);background:var(--p-content-hover-background);border-radius:999px;padding:.0625rem .5rem}.w-transfer__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.125rem;max-height:14rem;overflow-y:auto}.w-transfer__item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.375rem .5rem;border-radius:.5rem;font-size:.8125rem;color:var(--p-text-color);cursor:pointer;transition:background-color .12s}.w-transfer__item:hover{background:var(--p-content-hover-background)}.w-transfer__item i{color:var(--p-text-muted-color);font-size:.75rem}.w-transfer__empty{padding:.75rem .5rem;text-align:center;font-size:.75rem;color:var(--p-text-muted-color)}.w-transfer__controls{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.375rem}@media(max-width:768px){.w-section-header,.w-form-section__header,.w-action-bar--stack{flex-direction:column;align-items:stretch}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{justify-content:flex-start}.w-kpi-grid--cols-2,.w-kpi-grid--cols-3,.w-kpi-grid--cols-4,.w-transfer{grid-template-columns:1fr}.w-transfer__controls{flex-direction:row}}.w-datepicker,.w-datepicker .p-iconfield{width:100%}.w-datepicker-icon{cursor:pointer;color:var(--p-text-muted-color);transition:color .15s}.w-datepicker-icon:hover{color:var(--p-primary-color)}.w-datepicker-icon-disabled{opacity:.4;cursor:default;pointer-events:none}.w-datepicker-panel{display:flex;flex-direction:column;gap:.5rem}.w-datepicker-actions{display:flex;justify-content:space-between;gap:.5rem;border-top:1px solid var(--p-content-border-color);padding-top:.5rem}
1
+ .w-imgcropper-preview[data-v-95684d2d]{position:relative;overflow:hidden;border-radius:8px;border:1px solid var(--p-content-border-color, #e2e8f0);background:var(--p-content-background, #f8fafc)}.w-imgcropper-preview.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-img[data-v-95684d2d]{width:100%;height:100%;object-fit:cover;display:block}.w-imgcropper-actions[data-v-95684d2d]{position:absolute;inset:auto 0 0 0;display:flex;justify-content:center;gap:4px;padding:4px;background:color-mix(in srgb,#000 45%,transparent);opacity:0;transition:opacity .15s ease}.w-imgcropper-preview:hover .w-imgcropper-actions[data-v-95684d2d],.w-imgcropper-preview:focus-within .w-imgcropper-actions[data-v-95684d2d]{opacity:1}.w-imgcropper-empty[data-v-95684d2d]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;cursor:pointer;border:none;background:transparent;color:var(--p-text-muted-color, #64748b);font-size:.85rem}.w-imgcropper-empty i[data-v-95684d2d]{font-size:1.5rem}.w-imgcropper-file[data-v-95684d2d]{display:none}.w-imgcropper-stage[data-v-95684d2d]{display:flex;flex-direction:column;gap:16px;align-items:center}.w-imgcropper-viewport[data-v-95684d2d]{position:relative;overflow:hidden;touch-action:none;cursor:grab;background:#1e1e1e;border-radius:4px}.w-imgcropper-viewport[data-v-95684d2d]:active{cursor:grabbing}.w-imgcropper-viewport.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-cropimg[data-v-95684d2d]{position:absolute;top:0;left:0;max-width:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.w-imgcropper-stencil[data-v-95684d2d]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;box-shadow:0 0 0 1px color-mix(in srgb,#fff 60%,transparent) inset}.w-imgcropper-stencil.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-zoom[data-v-95684d2d]{display:flex;align-items:center;gap:10px;width:100%;color:var(--p-text-muted-color, #64748b)}.w-imgcropper-slider[data-v-95684d2d]{flex:1}.w-crud-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-crud-header-content{min-width:0}.w-crud-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-crud-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-crud-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-crud-kpis{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem;margin-bottom:1.25rem}.w-crud-kpi{display:flex;align-items:center;gap:.75rem;padding:1rem 1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background)}.w-crud-kpi-icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);flex-shrink:0;font-size:1.125rem}.w-crud-kpi-icon--primary{background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-crud-kpi-icon--success{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-kpi-icon--warning{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-crud-kpi-icon--danger{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-crud-kpi-icon--info{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-crud-kpi-content{min-width:0}.w-crud-kpi-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em;line-height:1;margin-bottom:.25rem}.w-crud-kpi-value{font-size:1.25rem;font-weight:700;color:var(--p-text-color);letter-spacing:-.02em;line-height:1}.w-crud-table{border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);overflow:hidden}.w-crud-table .p-datatable{font-size:.8125rem}.w-crud-table .p-datatable-header{background:transparent;border-bottom:1px solid var(--p-content-border-color);padding:.75rem 1rem}.w-crud-table .p-datatable-thead>tr>th{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--p-text-muted-color);background:var(--p-content-background)}.w-crud-table .p-datatable-tbody>tr>td{padding-top:.625rem;padding-bottom:.625rem}.w-crud-table .p-datatable-paginator-bottom{border-top:1px solid var(--p-content-border-color)}.w-crud-paginator .p-paginator-content{justify-content:flex-end}.w-crud-paginator .p-paginator-current{font-size:.75rem;color:var(--p-text-muted-color);margin-right:auto!important}.w-crud-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem 0}.w-crud-toolbar-start{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;min-width:0;flex:1 1 auto}.w-crud-toolbar-end{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.w-crud-actions-header .p-datatable-column-header-content{justify-content:center}.w-crud-actions{display:flex;align-items:center;justify-content:center;gap:.125rem}.w-crud-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem}.w-crud-empty-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-empty-title{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-crud-empty-text{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.25rem}.p-datatable-header-cell.text-right .p-datatable-column-header-content{justify-content:flex-end}.p-datatable-header-cell.text-center .p-datatable-column-header-content{justify-content:center}.p-dialog.w-crud-form-dialog>.p-dialog-header{padding-bottom:.5rem}.p-dialog.w-crud-form-dialog>.p-dialog-content{padding-bottom:.75rem}.w-crud-form{display:flex;flex-direction:column;gap:1.5rem}.w-crud-form-group-header{margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:1px solid var(--p-surface-200)}.dark .w-crud-form-group-header{border-bottom-color:var(--p-surface-700)}.w-crud-form-group-title{font-size:.875rem;font-weight:600;color:var(--p-text-color);margin:0}.w-crud-form-group-desc{font-size:.75rem;color:var(--p-text-muted-color);margin:.25rem 0 0}.w-crud-form-cep-error{display:block;font-size:.75rem;color:var(--p-red-500);margin-top:.25rem}.w-crud-form-cep-spinner{margin-left:.375rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-crud-form-fields{display:grid;grid-template-columns:repeat(var(--w-form-cols, 2),1fr);gap:1rem 1rem}.w-crud-form-col-full{grid-column:span var(--w-col-span, 2)}.w-crud-form-col-half{grid-column:span var(--w-col-span, 1)}@media(max-width:640px){.w-crud-form-fields{grid-template-columns:1fr}.w-crud-form-col-full,.w-crud-form-col-half,.w-crud-form-switch{grid-column:1 / -1}}.w-crud-form-field{display:flex;flex-direction:column}.w-crud-form-required{color:var(--p-red-400, #f87171);margin-left:.125rem}.w-crud-form-label{display:block;font-weight:500;margin-bottom:.375rem;color:var(--p-text-color);font-size:.75rem}.w-crud-form-color-row{display:flex;align-items:center;gap:.5rem}.w-crud-form-switch{grid-column:span var(--w-col-span, 2);display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-radius:.5rem;background:var(--p-content-hover-background)}.w-crud-form-switch-label{font-size:.875rem;font-weight:500;color:var(--p-text-color);-webkit-user-select:none;user-select:none}.w-crud-form-error{display:block;font-size:.75rem;color:var(--p-red-400, #f87171);margin-top:.25rem}.w-crud-form-footer{display:flex;justify-content:space-between;gap:.5rem;padding-top:1rem;padding-bottom:.5rem;border-top:1px solid var(--p-content-border-color);margin-top:.25rem}.w-autocompletefk{position:relative;display:flex;align-items:stretch;width:100%}.w-autocompletefk .p-autocomplete{flex:1;min-width:0}.w-autocompletefk .p-autocomplete-input{padding-right:2.5rem}.w-autocompletefk .p-autocomplete-input-multiple{padding-right:2.5rem;min-width:0;max-height:7rem;overflow-y:auto}.w-autocompletefk .p-autocomplete-chip-item{max-width:var(--w-fk-chip-max, 100%);min-width:min(100%,6rem)}.w-autocompletefk .p-autocomplete-chip{max-width:100%;min-width:0}.w-autocompletefk .p-autocomplete-chip .p-chip-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-autocompletefk .p-autocomplete-input-chip{flex:1 1 2rem;min-width:2rem}.w-autocompletefk .w-autocompletefk-chip{cursor:pointer}.w-autocompletefk .p-autocomplete-chip-item:has(>.w-autocompletefk-chip-hidden){display:none}.w-autocompletefk .w-autocompletefk-chip-more{font-variant-numeric:tabular-nums}.w-autocompletefk .p-autocomplete-chip-item:has(>.w-autocompletefk-chip-more){min-width:0;flex:0 0 auto}.w-autocompletefk-clear{position:absolute;right:2.25rem;top:0;bottom:0;width:1.75rem;display:flex;align-items:center;justify-content:center;color:var(--p-text-muted-color);cursor:pointer;border:none;background:transparent;transition:color .15s;font-size:.75rem}.w-autocompletefk-clear:hover{color:var(--p-primary-color)}.w-autocompletefk-clear i{font-size:.75rem}.w-autocompletefk-has-clear .p-autocomplete-input,.w-autocompletefk-has-clear .p-autocomplete-input-multiple{padding-right:4.25rem}.w-autocompletefk-trigger{position:absolute;right:0;top:0;bottom:0;width:2.5rem;display:flex;align-items:center;justify-content:center;color:var(--p-text-muted-color);cursor:pointer;border:none;background:transparent;transition:color .15s;font-size:.875rem}.w-autocompletefk-trigger:hover{color:var(--p-primary-color)}.w-autocompletefk-trigger:disabled{opacity:.4;cursor:default}.w-autocompletefk-trigger i{font-size:.875rem}.w-autocompletefk-toolbar{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.w-autocompletefk-toolbar-search{flex:1}.w-autocompletefk-toolbar-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-autocompletefk-empty{text-align:center;padding:1.5rem;color:var(--p-text-muted-color);font-size:.875rem}.w-autocompletefk-footer{display:flex;justify-content:flex-end;gap:.5rem}.w-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-page-header-content{min-width:0}.w-page-header-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-page-header-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-page-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-detail-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-detail-header-left{display:flex;align-items:center;gap:.75rem;min-width:0}.w-detail-header-icon{font-size:1.25rem;color:var(--p-primary-color)}.w-detail-header-content{min-width:0}.w-detail-header-title{font-size:1.125rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-detail-header-subtitle{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.125rem}.w-detail-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1rem;text-align:center}.w-empty-state-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-empty-state-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-empty-state-description{font-size:.8125rem;color:var(--p-text-muted-color);margin-top:.25rem;max-width:24rem}.w-info-card{padding:1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);margin-bottom:1rem}.w-info-card-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.75rem}.w-info-card-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem 1.5rem}.w-info-card-field{display:flex;flex-direction:column;gap:.125rem}.w-info-card-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em}.w-info-card-value{font-size:.875rem;font-weight:500;color:var(--p-text-color)}.w-section-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-section-header--compact{margin-bottom:.75rem}.w-section-header__main{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-section-header__icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;flex-shrink:0;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-section-header__content{min-width:0}.w-section-header__title-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-section-header__title{font-size:1rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-section-header__subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-section-header__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section{border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background);padding:1rem}.w-form-section--muted{background:color-mix(in srgb,var(--p-content-background) 88%,var(--p-primary-color) 2%)}.w-form-section--outlined{background:transparent}.w-form-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-form-section__content{min-width:0}.w-form-section__title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-form-section__description{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-form-section__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section__body{display:flex;flex-direction:column;gap:1rem}.w-action-bar{display:flex;align-items:center;gap:.75rem}.w-action-bar--between{justify-content:space-between}.w-action-bar--start{justify-content:flex-start}.w-action-bar--end{justify-content:flex-end}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-action-bar__primary{min-width:0}.w-action-bar__secondary{justify-content:flex-end}.w-kpi-grid{display:grid;gap:.75rem}.w-kpi-grid--cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.w-kpi-grid--cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.w-kpi-grid--cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.w-kpi-grid--cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.w-kpi-grid--cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.w-kpi-grid--auto{grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr))}.w-kpi-grid--dense{gap:.5rem}.w-kpi-card{display:flex;flex-direction:column;gap:.875rem;min-height:100%;padding:1rem 1.125rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-kpi-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.w-kpi-card__icon{display:flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;border-radius:.875rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);font-size:1.125rem}.w-kpi-card__content{display:flex;flex-direction:column;gap:.25rem}.w-kpi-card__label{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);font-weight:600}.w-kpi-card__value{font-size:1.5rem;font-weight:700;line-height:1.1;letter-spacing:-.02em;color:var(--p-text-color)}.w-kpi-card__hint{font-size:.8125rem;color:var(--p-text-muted-color)}.w-kpi-card__footer{margin-top:auto}.w-kpi-card__trend{display:flex;justify-content:flex-end}.w-kpi-card__trend-badge{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:999px;font-size:.75rem;font-weight:600;background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-kpi-card__trend-badge--up{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card__trend-badge--down{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card__loading{display:flex;align-items:center;gap:.875rem}.w-kpi-card__loading-content{display:flex;flex:1;flex-direction:column;gap:.5rem}.w-kpi-card--success .w-kpi-card__icon{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card--warning .w-kpi-card__icon{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-kpi-card--danger .w-kpi-card__icon{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card--info .w-kpi-card__icon{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-kpi-card--neutral .w-kpi-card__icon{background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-progress-flow{display:flex;gap:.75rem}.w-progress-flow--horizontal{align-items:stretch;flex-wrap:wrap}.w-progress-flow--vertical{flex-direction:column}.w-progress-flow__step{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-progress-flow--horizontal .w-progress-flow__step{flex:1 1 0;min-width:12rem;padding:.875rem 1rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-progress-flow__marker{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;flex-shrink:0;border-radius:999px;border:1px solid var(--p-content-border-color);color:var(--p-text-muted-color);background:transparent;font-size:.8125rem;font-weight:700}.w-progress-flow__content{min-width:0}.w-progress-flow__label{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-progress-flow__description{margin-top:.125rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-progress-flow__step--current .w-progress-flow__marker{border-color:var(--p-primary-color);background:color-mix(in srgb,var(--p-primary-color) 12%,transparent);color:var(--p-primary-color)}.w-progress-flow__step--done .w-progress-flow__marker{border-color:var(--p-green-500, #22c55e);background:color-mix(in srgb,var(--p-green-500, #22c55e) 12%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-view-toggle{display:inline-flex;align-items:center;gap:.125rem}.w-crud-toolbar--standalone{border:1px solid var(--p-content-border-color);background:var(--p-content-background);border-radius:.75rem;padding:.625rem .75rem;margin-bottom:.75rem}.w-crud-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem;align-items:start}.w-crud-cards--bare{grid-template-columns:repeat(auto-fill,minmax(360px,1fr))}.w-crud-card-bare{min-width:0}.w-crud-card{display:flex;flex-direction:column;gap:.625rem;padding:1.25rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);cursor:default;transition:border-color .15s,box-shadow .15s}.w-crud-card:hover{border-color:color-mix(in srgb,var(--p-primary-color) 40%,var(--p-content-border-color))}.w-crud-card-body{display:flex;flex-direction:column;gap:.375rem;min-width:0}.w-crud-card-row{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;font-size:.8125rem;min-width:0}.w-crud-card-row--title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.125rem}.w-crud-card-label{font-size:.6875rem;font-weight:500;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);flex-shrink:0}.w-crud-card-value{min-width:0;text-align:right;color:var(--p-text-color)}.w-crud-card-row--title .w-crud-card-value{text-align:left}.w-crud-card-actions{display:flex;align-items:center;justify-content:flex-end;gap:.125rem;margin-top:.25rem;padding-top:.5rem;border-top:1px solid var(--p-content-border-color)}.w-crud-cards-loading{display:flex;align-items:center;justify-content:center;padding:3rem 1rem;color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-cards-wrap .w-crud-paginator{margin-top:.75rem}.w-crud-card--selected{border-color:var(--p-primary-color);box-shadow:0 0 0 1px var(--p-primary-color)}.w-crud-content--rail{display:flex;align-items:flex-start;gap:.75rem}.w-crud-content-main{min-width:0}.w-crud-content--rail .w-crud-content-main{flex:1}.w-crud-rail{position:sticky;top:1rem;display:flex;flex-direction:column;align-items:center;gap:.375rem;flex-shrink:0;width:52px;padding:.5rem 0;border:1px solid var(--p-content-border-color);border-radius:15px;background:var(--p-content-background);box-shadow:var(--p-overlay-popover-shadow, 0 6px 20px rgba(15, 23, 42, .09))}.w-crud-rail-sep{width:60%;height:1px;background:var(--p-content-border-color);margin:.125rem 0}.w-crud-ctx-danger .p-contextmenu-item-link,.w-crud-ctx-danger .p-contextmenu-item-link .p-contextmenu-item-icon{color:var(--p-red-500, #ef4444)}.w-money-input__field{text-align:right}.w-transfer{display:grid;grid-template-columns:1fr auto 1fr;gap:.75rem;align-items:stretch}.w-transfer--disabled{opacity:.6;pointer-events:none}.w-transfer__pane{display:flex;flex-direction:column;gap:.5rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);padding:.625rem;min-width:0}.w-transfer__head{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.w-transfer__title{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color)}.w-transfer__count{font-size:.6875rem;font-weight:600;color:var(--p-text-muted-color);background:var(--p-content-hover-background);border-radius:999px;padding:.0625rem .5rem}.w-transfer__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.125rem;max-height:14rem;overflow-y:auto}.w-transfer__item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.375rem .5rem;border-radius:.5rem;font-size:.8125rem;color:var(--p-text-color);cursor:pointer;transition:background-color .12s}.w-transfer__item:hover{background:var(--p-content-hover-background)}.w-transfer__item i{color:var(--p-text-muted-color);font-size:.75rem}.w-transfer__empty{padding:.75rem .5rem;text-align:center;font-size:.75rem;color:var(--p-text-muted-color)}.w-transfer__controls{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.375rem}@media(max-width:768px){.w-section-header,.w-form-section__header,.w-action-bar--stack{flex-direction:column;align-items:stretch}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{justify-content:flex-start}.w-kpi-grid--cols-2,.w-kpi-grid--cols-3,.w-kpi-grid--cols-4,.w-transfer{grid-template-columns:1fr}.w-transfer__controls{flex-direction:row}}.w-datepicker,.w-datepicker .p-iconfield{width:100%}.w-datepicker-icon{cursor:pointer;color:var(--p-text-muted-color);transition:color .15s}.w-datepicker-icon:hover{color:var(--p-primary-color)}.w-datepicker-icon-disabled{opacity:.4;cursor:default;pointer-events:none}.w-datepicker-panel{display:flex;flex-direction:column;gap:.5rem}.w-datepicker-actions{display:flex;justify-content:space-between;gap:.5rem;border-top:1px solid var(--p-content-border-color);padding-top:.5rem}
@@ -37,6 +37,11 @@ export interface CrudManagerConfig<T> {
37
37
  /** Ações aplicadas ao conjunto selecionado, exibidas na barra de lote. */
38
38
  bulkActions?: BulkAction<T>[];
39
39
  filterParams?: () => Record<string, unknown>;
40
+ /** Pré-processa os dados a cada carga da lista, ANTES de virarem `items`. Recebe
41
+ * as linhas cruas da API e devolve o que a tela vai renderizar. Ponto único e
42
+ * reaproveitável para: agrupar (ex.: por NF, com avulsos individuais), enriquecer
43
+ * com campos derivados, reestruturar, ordenar. Sem ele, `items` = dados crus. */
44
+ transformItems?: (rawItems: T[]) => T[];
40
45
  transformPayload?: (payload: Record<string, unknown>, isEditing: boolean) => Record<string, unknown>;
41
46
  createDefaults?: () => Record<string, unknown>;
42
47
  onAfterSave?: (data: T, isEditing: boolean) => void;
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("vue"),G=require("./plugin-D1YvyKXX.cjs"),je=require("./types.cjs"),D=require("./useFormKeyboardNav-D4Ow3k4Y.cjs");function _e(_,m){const g={};for(const p of Object.keys(m))JSON.stringify(_[p])!==JSON.stringify(m[p])&&(g[p]=m[p]);return g}function xe(_){const{endpoint:m,form:g,pk:p="id",searchDebounce:Y=300,partialUpdate:J=!0,refetchOnSave:V=!0,filterParams:K=void 0,createDefaults:x=void 0,transformItems:N=void 0,transformPayload:T=void 0,onAfterSave:U=void 0,onAfterDelete:I=void 0}=_,l=i.inject(G.W_DATA_PROVIDER_KEY);if(!l)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.");const f=l,q=i.inject(G.W_CONFIG_KEY),O=_.pageSize??(q==null?void 0:q.defaultPageSize)??20,z={...je.DEFAULT_CRUD_LABELS,..._.labels},S=D.useAppToast(),{confirmDelete:B}=D.useAppConfirm(),P=i.ref([]),L=i.ref([]),$=i.ref({}),c=i.ref(!1);let F=0;const b=i.ref(!1),A=i.ref(""),h=i.ref(!1),C=i.ref(!1),k=i.ref(null),w=i.reactive({});let R=null;const s=i.reactive({page:1,pageSize:O,rows:0,totalPages:0}),v=i.reactive({field:null,order:0}),M=i.reactive({});function Z(){const e={};for(const t of g)e[t.field]=t.defaultValue!==void 0?typeof t.defaultValue=="function"?t.defaultValue():t.defaultValue:null;return e}const ee=Z();for(const e of Object.keys(ee))w[e]=ee[e];const W=i.computed(()=>k.value!==null&&!C.value),ne=i.computed(()=>C.value),re=i.computed(()=>C.value?z.viewTitle??"Visualizar Registro":W.value?z.editTitle:z.createTitle),se=i.computed(()=>s.page<=1),le=i.computed(()=>s.page>=s.totalPages);let H=null;async function j(e={}){const t=++F;c.value=!0;try{const a={page:s.page,page_size:s.pageSize,...e};A.value&&(a.search=A.value),v.field&&v.order!==0&&(a.ordering=v.order===-1?`-${v.field}`:v.field),K&&Object.assign(a,K());for(const[u,n]of Object.entries(M))n!=null&&n!==""&&(a[u]=n);const o=await f.list(m,a);if(t!==F)return;P.value=N?N(o.data):o.data,L.value=[],s.rows=o.rows,$.value=o.extras??{},o.page&&(s.page=o.page),o.page_size&&(s.pageSize=o.page_size),s.totalPages=Math.ceil(s.rows/s.pageSize)||0}finally{t===F&&(c.value=!1)}}async function ce(){await j()}async function fe(){await j()}async function ue(e=200){const t={};A.value&&(t.search=A.value),v.field&&v.order!==0&&(t.ordering=v.order===-1?`-${v.field}`:v.field),K&&Object.assign(t,K());for(const[n,r]of Object.entries(M))r!=null&&r!==""&&(t[n]=r);const a=[];let o=1;const u=1e4;for(;o<=u;){const n=await f.list(m,{...t,page:o,page_size:e});a.push(...n.data);const r=n.rows??a.length;if(n.data.length===0||a.length>=r)break;o++}return a}function te(e){A.value=e,H&&clearTimeout(H),H=setTimeout(()=>{s.page=1,j()},Y)}function de(e){const t=e.target;te(t.value)}function Q(e){s.page=e,j()}function pe(){Q(1)}function ge(){Q(s.totalPages)}function ve(e){s.page=e.page+1,s.pageSize=e.rows,j()}function ye(e){v.field=e.sortField??null,v.order=e.sortOrder??0,s.page=1,j()}function X(){const e=Z();for(const t of Object.keys(e))w[t]=e[t]}function me(e,t){w[e]=t}function Pe(){if(C.value=!1,k.value=null,R=null,X(),x){const e=x();for(const[t,a]of Object.entries(e))w[t]=a}h.value=!0}function ae(e){const t={};for(const a of g){let o=e[a.field]!==void 0?e[a.field]:null;o&&(a.type==="date"||a.type==="datetime")&&typeof o=="string"&&(o=D.parseDate(o)),w[a.field]=o,t[a.field]=o}R=t}function he(e){C.value=!1,k.value=e,ae(e),h.value=!0}function we(e){C.value=!0,k.value=e,ae(e),h.value=!0}function De(e){C.value=!1,k.value=null,R=null,X();for(const t of g){if(t.field===p)continue;let a=e[t.field]!==void 0?e[t.field]:w[t.field];a&&(t.type==="date"||t.type==="datetime")&&typeof a=="string"&&(a=D.parseDate(a)),w[t.field]=a}if(x){const t=x();for(const[a,o]of Object.entries(t))w[a]=o}h.value=!0}function oe(e){const t={...e};for(const a of g){const o=t[a.field];if(a.type==="date"&&o instanceof Date?t[a.field]=D.toDateString(o):a.type==="datetime"&&o instanceof Date&&(t[a.field]=D.toDateTimeString(o)),a.type==="fk"&&o!==null&&typeof o=="object"){const u=a.optionValue||"id";t[a.field]=o[u]??o}(a.type==="mask"||a.type==="cpf_cnpj")&&typeof o=="string"&&(t[a.field]=D.stripMask(o))}return t}async function Se(){for(const e of g){if(e.validate){const t=e.validate(w[e.field]);if(t)return S.error(t),null}if(e.required){const t=w[e.field];if(t==null||t==="")return S.error(`${e.label} é obrigatório`),null}}b.value=!0;try{let e=oe(w);if(!W.value&&x){const r=x();for(const[d,y]of Object.entries(r)){const E=e[d];(E==null||E==="")&&(e[d]=y)}}if(W.value&&J&&R){const r=oe(R);if(e=_e(r,e),Object.keys(e).length===0&&!T){h.value=!1;const d=k.value;return k.value=null,R=null,d}}T&&(e=T(e,W.value));const t=g.some(r=>r.type==="image"&&e[r.field]instanceof File);let a=e,o;if(t){const r=new Set(g.filter(y=>y.type==="image").map(y=>y.field)),d=new FormData;for(const[y,E]of Object.entries(e))if(E!=null)if(E instanceof File)d.append(y,E);else{if(r.has(y))continue;d.append(y,String(E))}a=d,o={"Content-Type":"multipart/form-data"}}const u=o?{headers:o}:void 0;let n;if(W.value&&k.value){const r=k.value[p];if(n=await f.update(m,r,a,u),!V){const d=P.value.findIndex(y=>y[p]===r);d!==-1&&(P.value[d]=n.data)}S.success(z.successUpdate)}else n=await f.create(m,a,u),V||(P.value.unshift(n.data),s.rows++),S.success(z.successCreate);return h.value=!1,k.value=null,R=null,V&&await j(),U&&U(n.data,W.value),n.data}catch(e){return S.error(D.extractApiError(e,"Erro ao salvar registro")),null}finally{b.value=!1}}async function be(e,t,a){const o=e[p],u=g.find(r=>r.field===t);let n=a;(u==null?void 0:u.type)==="date"&&n instanceof Date?n=D.toDateString(n):(u==null?void 0:u.type)==="datetime"&&n instanceof Date&&(n=D.toDateTimeString(n));try{const r=await f.update(m,o,{[t]:n}),d=P.value.findIndex(y=>y[p]===o);d!==-1&&(P.value[d]={...P.value[d],...r.data}),S.success(z.successUpdate)}catch(r){S.error(D.extractApiError(r,"Erro ao salvar o campo"))}}async function ie(e){try{const t=e[p];await f.delete(m,t);const a=P.value.findIndex(o=>o[p]===t);a!==-1&&(P.value.splice(a,1),s.rows--),S.success(z.successDelete),I&&I(e)}catch(t){S.error(D.extractApiError(t,"Erro ao excluir registro"))}}function ke(e){B(()=>ie(e),z.deleteConfirmMessage)}function Oe(){L.value=[]}function ze(e,t){t==null||t===""?delete M[e]:M[e]=t,s.page=1,j()}function Fe(){for(const e of Object.keys(M))delete M[e];s.page=1,j()}return{items:P,selectedItems:L,columnFilters:M,extras:$,loading:c,saving:b,search:A,dialogVisible:h,editingItem:k,formData:w,pagination:s,sort:v,isEditing:W,isViewing:ne,viewMode:C,dialogTitle:re,isFirstPage:se,isLastPage:le,init:ce,fetchItems:j,fetchAll:ue,refresh:fe,setSearch:te,onSearch:de,onPage:ve,onSort:ye,openCreateDialog:Pe,openEditDialog:he,openViewDialog:we,openDuplicateDialog:De,save:Se,updateField:be,confirmDelete:ke,performDelete:ie,setFormField:me,resetForm:X,goToPage:Q,firstPage:pe,lastPage:ge,clearSelection:Oe,setColumnFilter:ze,clearColumnFilters:Fe,config:_}}function Ee(_){const{endpoint:m,searchDebounce:g=300,immediate:p=!1}=_,Y=i.inject(G.W_DATA_PROVIDER_KEY);if(!Y)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.");const J=Y,V=i.inject(G.W_CONFIG_KEY),K=_.pageSize??(V==null?void 0:V.defaultPageSize)??20,x=i.ref([]),N=i.ref(!1),T=i.ref(""),U=i.ref({}),I=i.reactive({}),l=i.reactive({page:1,pageSize:K,rows:0,totalPages:0}),f=i.reactive({field:null,order:0});let q=null;async function O(c={}){N.value=!0;try{const F={page:l.page,page_size:l.pageSize,...c};T.value&&(F.search=T.value),f.field&&f.order!==0&&(F.ordering=f.order===-1?`-${f.field}`:f.field);for(const[A,h]of Object.entries(I))h!=null&&h!==""&&(F[A]=h);const b=await J.list(m,F);x.value=b.data,l.rows=b.rows,b.page&&(l.page=b.page),b.page_size&&(l.pageSize=b.page_size),l.totalPages=Math.ceil(l.rows/l.pageSize)||0,U.value=b.extras??{}}finally{N.value=!1}}async function z(){await O()}function S(c){T.value=c,q&&clearTimeout(q),q=setTimeout(()=>{l.page=1,O()},g)}function B(c,F){I[c]=F,l.page=1,O()}function P(){for(const c of Object.keys(I))delete I[c];l.page=1,O()}function L(c){l.page=c.page+1,l.pageSize=c.rows,O()}function $(c){f.field=c.sortField??null,f.order=c.sortOrder??0,l.page=1,O()}return p&&O(),{items:x,loading:N,search:T,pagination:l,sort:f,extras:U,fetchItems:O,refresh:z,setSearch:S,setFilter:B,clearFilters:P,onPage:L,onSort:$}}exports.useApi=Ee;exports.useCrudManager=xe;
2
+ //# sourceMappingURL=useApi-237Q1Vdg.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApi-237Q1Vdg.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 transformItems = 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 // Contador de sequência de fetch — descarta respostas de list() fora de ordem.\n let fetchSeq = 0\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 // Sequencing: ignora respostas fora de ordem. Sem isso, dois fetch disparados\n // em sequência (ex.: setar duas datas de um período) podem resolver invertidos\n // e a resposta mais ANTIGA (menos filtrada) sobrescreve a correta.\n const seq = ++fetchSeq\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 // Uma requisição mais nova já foi disparada — descarta esta resposta.\n if (seq !== fetchSeq) return\n // Pré-processa os dados crus (agrupar/enriquecer/reestruturar) antes de virarem\n // `items`. Sem `transformItems`, usa os dados como vieram.\n items.value = transformItems ? transformItems(responseData.data) : 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 // Só a requisição mais recente controla o loading (uma resposta antiga não\n // deve desligar o spinner enquanto a nova ainda está em voo).\n if (seq === fetchSeq) 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","transformItems","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","fetchSeq","saving","search","dialogVisible","viewMode","editingItem","formData","reactive","editingOriginal","pagination","sort","columnFilters","getDefaults","defaults","f","isEditing","computed","isViewing","dialogTitle","isFirstPage","isLastPage","searchTimeout","fetchItems","params","seq","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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"}