@wgalleti/primevue-components 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/bin/wpvc.mjs +209 -0
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-C9YG4BXB.cjs +12 -0
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-C9YG4BXB.cjs.map +1 -0
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-CoGaRckJ.js +3348 -0
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-CoGaRckJ.js.map +1 -0
- package/dist/components/crud/WCrudFormDialog.vue.d.ts +2 -215
- package/dist/components/crud/WCrudView.vue.d.ts +3 -9
- package/dist/components/form/WAutoCompleteFK.vue.d.ts +1 -1
- package/dist/components/form/WDatePicker.vue.d.ts +44 -0
- package/dist/components/form/WFormRenderer.vue.d.ts +2 -37
- package/dist/components/index.d.ts +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +63 -92
- package/dist/components.js.map +1 -1
- package/dist/composables/index.d.ts +3 -0
- package/dist/composables/useDateInput.d.ts +29 -0
- package/dist/composables/useFormKeyboardNav.d.ts +11 -0
- package/dist/composables.cjs +1 -1
- package/dist/composables.cjs.map +1 -1
- package/dist/composables.js +10 -8
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +53 -50
- package/dist/primevue-components.css +1 -1
- package/dist/types/field.d.ts +5 -0
- package/dist/types/manager.d.ts +3 -0
- package/dist/useApi-BDjRqSFt.cjs +2 -0
- package/dist/{useApi-5Pr4nXAa.cjs.map → useApi-BDjRqSFt.cjs.map} +1 -1
- package/dist/{useApi-Bxrw3Sia.js → useApi-CzOJADZw.js} +2 -2
- package/dist/{useApi-Bxrw3Sia.js.map → useApi-CzOJADZw.js.map} +1 -1
- package/dist/useFormKeyboardNav-D4Irq5RE.js +461 -0
- package/dist/useFormKeyboardNav-D4Irq5RE.js.map +1 -0
- package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs +3 -0
- package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs.map +1 -0
- package/package.json +7 -2
- package/skill/SKILL.md +67 -0
- package/skill/references/components.md +51 -0
- package/skill/references/crud.md +83 -0
- package/skill/references/migration.md +58 -0
- package/skill/references/setup.md +74 -0
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js +0 -3126
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-BS3zNV1Z.js.map +0 -1
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs +0 -12
- package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DlnsDNZ5.cjs.map +0 -1
- package/dist/useApi-5Pr4nXAa.cjs +0 -2
- package/dist/useApiError-BEbEk2Kq.cjs +0 -3
- package/dist/useApiError-BEbEk2Kq.cjs.map +0 -1
- package/dist/useApiError-C7rPzGrF.js +0 -375
- package/dist/useApiError-C7rPzGrF.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
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,
|
|
3
|
-
import { _ as
|
|
4
|
-
import { u as
|
|
5
|
-
import { e as
|
|
6
|
-
import { DEFAULT_CRUD_LABELS as
|
|
7
|
-
function
|
|
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-CoGaRckJ.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-CoGaRckJ.js";
|
|
4
|
+
import { u as ie, a as ce } from "./useApi-CzOJADZw.js";
|
|
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
|
+
import { DEFAULT_CRUD_LABELS as _e } from "./types.js";
|
|
7
|
+
function F(e, a, t) {
|
|
8
8
|
const r = e;
|
|
9
9
|
return Array.isArray(r.results) ? {
|
|
10
10
|
data: r.results,
|
|
@@ -26,11 +26,11 @@ function x(e, a, t) {
|
|
|
26
26
|
extras: {}
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
-
function
|
|
29
|
+
function b(e) {
|
|
30
30
|
return {
|
|
31
31
|
async list(a, t = {}) {
|
|
32
32
|
const r = await e.get(a, { params: t });
|
|
33
|
-
return
|
|
33
|
+
return F(
|
|
34
34
|
r.data,
|
|
35
35
|
Number(t.page ?? 1),
|
|
36
36
|
Number(t.page_size ?? 20)
|
|
@@ -56,7 +56,7 @@ const Y = {
|
|
|
56
56
|
throw new Error(
|
|
57
57
|
'[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.'
|
|
58
58
|
);
|
|
59
|
-
const t = a.dataProvider ??
|
|
59
|
+
const t = a.dataProvider ?? b(a.axios), r = {
|
|
60
60
|
axios: a.axios,
|
|
61
61
|
dataProvider: t,
|
|
62
62
|
defaultPageSize: a.defaultPageSize ?? 20,
|
|
@@ -65,7 +65,7 @@ const Y = {
|
|
|
65
65
|
locale: a.locale ?? "pt-BR",
|
|
66
66
|
currency: a.currency ?? "BRL"
|
|
67
67
|
};
|
|
68
|
-
a.axios && e.provide(_, a.axios), e.provide(W, t), e.provide(w, r), a.registerComponents !== !1 && (e.component("WCrudView", A), e.component("WCrudFormDialog", P), e.component("WCrudColumnRenderer", v), e.component("WAutoCompleteFK", C), e.component("WMoneyInput",
|
|
68
|
+
a.axios && e.provide(_, a.axios), e.provide(W, t), e.provide(w, r), a.registerComponents !== !1 && (e.component("WCrudView", A), e.component("WCrudFormDialog", P), e.component("WCrudColumnRenderer", v), e.component("WAutoCompleteFK", C), e.component("WMoneyInput", D), e.component("WTransferList", x));
|
|
69
69
|
}
|
|
70
70
|
};
|
|
71
71
|
function S(e) {
|
|
@@ -118,13 +118,13 @@ function E(e, a, t) {
|
|
|
118
118
|
r.has(n) || o === null || o === void 0 || o === "" || (e = e.eq(n, o));
|
|
119
119
|
return e;
|
|
120
120
|
}
|
|
121
|
-
function
|
|
121
|
+
function R(e, a, t) {
|
|
122
122
|
if (typeof a != "string" || !a.trim() || !(t != null && t.length))
|
|
123
123
|
return e;
|
|
124
124
|
const r = a.trim().replace(/,/g, "\\,"), s = t.map((n) => `${n}.ilike.%${r}%`).join(",");
|
|
125
125
|
return e.or(s);
|
|
126
126
|
}
|
|
127
|
-
function
|
|
127
|
+
function $(e, a) {
|
|
128
128
|
const t = typeof e == "string" && e ? e : a;
|
|
129
129
|
return t ? {
|
|
130
130
|
field: t.startsWith("-") ? t.slice(1) : t,
|
|
@@ -142,12 +142,12 @@ function I(e) {
|
|
|
142
142
|
return {
|
|
143
143
|
async list(t, r = {}) {
|
|
144
144
|
var p;
|
|
145
|
-
const s = m(t, e), n = Math.max(Number(r.page ?? 1), 1), o = Math.max(Number(r.page_size ?? 20), 1), i = (n - 1) * o,
|
|
145
|
+
const s = m(t, e), n = Math.max(Number(r.page ?? 1), 1), o = Math.max(Number(r.page_size ?? 20), 1), i = (n - 1) * o, u = i + o - 1;
|
|
146
146
|
let c = e.client.from(s.table).select(s.select ?? a, { count: "exact" });
|
|
147
|
-
c = E(c, r, s), c =
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
const d = await c.range(i,
|
|
147
|
+
c = E(c, r, s), c = R(c, r.search, s.searchFields);
|
|
148
|
+
const l = $(r.ordering, s.defaultOrdering);
|
|
149
|
+
l && (c = c.order(l.field, { ascending: l.ascending }));
|
|
150
|
+
const d = await c.range(i, u);
|
|
151
151
|
return d.error && f(d.error), {
|
|
152
152
|
data: z(d.data, s),
|
|
153
153
|
page: n,
|
|
@@ -161,12 +161,12 @@ function I(e) {
|
|
|
161
161
|
return i.error && f(i.error), { data: i.data };
|
|
162
162
|
},
|
|
163
163
|
async create(t, r, s) {
|
|
164
|
-
const n = m(t, e), o = g(r), i = n.mapPayload ? n.mapPayload(o, "create") : o,
|
|
165
|
-
return
|
|
164
|
+
const n = m(t, e), o = g(r), i = n.mapPayload ? n.mapPayload(o, "create") : o, u = await e.client.from(n.table).insert(i).select(n.select ?? a).single();
|
|
165
|
+
return u.error && f(u.error), { data: u.data };
|
|
166
166
|
},
|
|
167
167
|
async update(t, r, s, n) {
|
|
168
|
-
const o = m(t, e), i = o.pk ?? "id",
|
|
169
|
-
return
|
|
168
|
+
const o = m(t, e), i = o.pk ?? "id", u = g(s), c = o.mapPayload ? o.mapPayload(u, "update") : u, l = await e.client.from(o.table).update(c).eq(i, r).select(o.select ?? a).single();
|
|
169
|
+
return l.error && f(l.error), { data: l.data };
|
|
170
170
|
},
|
|
171
171
|
async delete(t, r) {
|
|
172
172
|
const s = m(t, e), n = s.pk ?? "id", o = s.softDelete === !0 ? { is_active: !1 } : typeof s.softDelete == "object" ? s.softDelete : null, i = o ? await e.client.from(s.table).update(o).eq(n, r) : await e.client.from(s.table).delete().eq(n, r);
|
|
@@ -175,43 +175,46 @@ function I(e) {
|
|
|
175
175
|
};
|
|
176
176
|
}
|
|
177
177
|
export {
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
_e as DEFAULT_CRUD_LABELS,
|
|
179
|
+
k as WActionBar,
|
|
180
180
|
C as WAutoCompleteFK,
|
|
181
181
|
v as WCrudColumnRenderer,
|
|
182
182
|
P as WCrudFormDialog,
|
|
183
183
|
A as WCrudView,
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
q as
|
|
188
|
-
H as
|
|
189
|
-
j as
|
|
190
|
-
B as
|
|
191
|
-
|
|
192
|
-
|
|
184
|
+
N as WDatePicker,
|
|
185
|
+
O as WDateRange,
|
|
186
|
+
V as WDetailHeader,
|
|
187
|
+
q as WEmptyState,
|
|
188
|
+
H as WFormRenderer,
|
|
189
|
+
j as WFormSection,
|
|
190
|
+
B as WInfoCard,
|
|
191
|
+
U as WKpiCard,
|
|
192
|
+
G as WKpiGrid,
|
|
193
|
+
D as WMoneyInput,
|
|
194
|
+
X as WPageHeader,
|
|
193
195
|
Y as WPrimeVuePlugin,
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
196
|
+
J as WProgressFlow,
|
|
197
|
+
Q as WSectionHeader,
|
|
198
|
+
Z as WStatusTag,
|
|
199
|
+
x as WTransferList,
|
|
198
200
|
_ as W_AXIOS_KEY,
|
|
199
201
|
w as W_CONFIG_KEY,
|
|
200
202
|
W as W_DATA_PROVIDER_KEY,
|
|
201
|
-
|
|
203
|
+
b as createAxiosDataProvider,
|
|
202
204
|
I as createSupabaseDataProvider,
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
205
|
+
ee as downloadCsv,
|
|
206
|
+
le as extractApiError,
|
|
207
|
+
ae as mapApiFieldToColumnDef,
|
|
208
|
+
te as mapApiFieldToFieldDef,
|
|
209
|
+
re as mapApiFieldsToColumnDefs,
|
|
210
|
+
se as mapApiFieldsToFieldDefs,
|
|
211
|
+
ne as toCsv,
|
|
212
|
+
ie as useApi,
|
|
213
|
+
de as useApiError,
|
|
214
|
+
fe as useAppConfirm,
|
|
215
|
+
me as useAppToast,
|
|
216
|
+
ce as useCrudManager,
|
|
217
|
+
pe as useDateInput,
|
|
218
|
+
ge as useFormatters
|
|
216
219
|
};
|
|
217
220
|
//# sourceMappingURL=index.js.map
|
|
@@ -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;border-left:1px solid var(--p-content-border-color);border-radius:0 var(--p-border-radius) var(--p-border-radius) 0;transition:color .15s,background-color .15s;font-size:.875rem}.w-autocompletefk-trigger:hover{color:var(--p-text-color);background:var(--p-content-hover-background)}.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}}
|
|
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}
|
package/dist/types/field.d.ts
CHANGED
|
@@ -66,6 +66,11 @@ export interface FieldDef {
|
|
|
66
66
|
decimals?: number;
|
|
67
67
|
dateFormat?: string;
|
|
68
68
|
hourFormat?: '12' | '24';
|
|
69
|
+
/** No mount: se o valor for `null`, preenche a data de hoje; senão mantém. */
|
|
70
|
+
autonow?: boolean;
|
|
71
|
+
/** Data mínima/máxima selecionável (string `YYYY-MM-DD` ou `Date`). */
|
|
72
|
+
minDate?: string | Date;
|
|
73
|
+
maxDate?: string | Date;
|
|
69
74
|
mask?: string;
|
|
70
75
|
rows?: number;
|
|
71
76
|
switchLabel?: string;
|
package/dist/types/manager.d.ts
CHANGED
|
@@ -25,6 +25,9 @@ export interface CrudManagerConfig<T> {
|
|
|
25
25
|
/** Modo de edição: 'dialog' (default — abre o form dialog) ou 'cell' (edição
|
|
26
26
|
* inline por célula, com PATCH só do campo alterado). */
|
|
27
27
|
editMode?: 'cell' | 'dialog';
|
|
28
|
+
/** Navegação por teclado no form dialog: foca o 1º campo ao abrir e o Enter
|
|
29
|
+
* pula para o próximo campo até o botão salvar (F2 abre a busca em FKs). */
|
|
30
|
+
keyboardNav?: boolean;
|
|
28
31
|
canCreate?: boolean;
|
|
29
32
|
canEdit?: boolean;
|
|
30
33
|
canDelete?: boolean;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const o=require("vue"),Y=require("./plugin-D1YvyKXX.cjs"),Oe=require("./types.cjs"),b=require("./useFormKeyboardNav-D4Ow3k4Y.cjs");function ze(j,P){const v={};for(const g of Object.keys(P))JSON.stringify(j[g])!==JSON.stringify(P[g])&&(v[g]=P[g]);return v}function Fe(j){const{endpoint:P,form:v,pk:g="id",searchDebounce:U=300,partialUpdate:$=!0,refetchOnSave:E=!0,filterParams:R=void 0,createDefaults:_=void 0,transformPayload:T=void 0,onAfterSave:x=void 0,onAfterDelete:q=void 0}=j,A=o.inject(Y.W_DATA_PROVIDER_KEY);if(!A)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.");const n=A,w=o.inject(Y.W_CONFIG_KEY),M=j.pageSize??(w==null?void 0:w.defaultPageSize)??20,f={...Oe.DEFAULT_CRUD_LABELS,...j.labels},k=b.useAppToast(),{confirmDelete:G}=b.useAppConfirm(),h=o.ref([]),W=o.ref([]),L=o.ref({}),K=o.ref(!1),u=o.ref(!1),y=o.ref(""),p=o.ref(!1),z=o.ref(!1),d=o.ref(null),D=o.reactive({});let C=null;const s=o.reactive({page:1,pageSize:M,rows:0,totalPages:0}),m=o.reactive({field:null,order:0}),V=o.reactive({});function Q(){const e={};for(const t of v)e[t.field]=t.defaultValue!==void 0?typeof t.defaultValue=="function"?t.defaultValue():t.defaultValue:null;return e}const X=Q();for(const e of Object.keys(X))D[e]=X[e];const I=o.computed(()=>d.value!==null&&!z.value),ae=o.computed(()=>z.value),ie=o.computed(()=>z.value?f.viewTitle??"Visualizar Registro":I.value?f.editTitle:f.createTitle),oe=o.computed(()=>s.page<=1),ne=o.computed(()=>s.page>=s.totalPages);let J=null;async function F(e={}){K.value=!0;try{const t={page:s.page,page_size:s.pageSize,...e};y.value&&(t.search=y.value),m.field&&m.order!==0&&(t.ordering=m.order===-1?`-${m.field}`:m.field),R&&Object.assign(t,R());for(const[i,c]of Object.entries(V))c!=null&&c!==""&&(t[i]=c);const a=await n.list(P,t);h.value=a.data,W.value=[],s.rows=a.rows,L.value=a.extras??{},a.page&&(s.page=a.page),a.page_size&&(s.pageSize=a.page_size),s.totalPages=Math.ceil(s.rows/s.pageSize)||0}finally{K.value=!1}}async function se(){await F()}async function re(){await F()}async function le(e=200){const t={};y.value&&(t.search=y.value),m.field&&m.order!==0&&(t.ordering=m.order===-1?`-${m.field}`:m.field),R&&Object.assign(t,R());for(const[l,r]of Object.entries(V))r!=null&&r!==""&&(t[l]=r);const a=[];let i=1;const c=1e4;for(;i<=c;){const l=await n.list(P,{...t,page:i,page_size:e});a.push(...l.data);const r=l.rows??a.length;if(l.data.length===0||a.length>=r)break;i++}return a}function Z(e){y.value=e,J&&clearTimeout(J),J=setTimeout(()=>{s.page=1,F()},U)}function ce(e){const t=e.target;Z(t.value)}function B(e){s.page=e,F()}function fe(){B(1)}function ue(){B(s.totalPages)}function de(e){s.page=e.page+1,s.pageSize=e.rows,F()}function pe(e){m.field=e.sortField??null,m.order=e.sortOrder??0,s.page=1,F()}function H(){const e=Q();for(const t of Object.keys(e))D[t]=e[t]}function ge(e,t){D[e]=t}function ve(){if(z.value=!1,d.value=null,C=null,H(),_){const e=_();for(const[t,a]of Object.entries(e))D[t]=a}p.value=!0}function ee(e){const t={};for(const a of v){let i=e[a.field]!==void 0?e[a.field]:null;i&&(a.type==="date"||a.type==="datetime")&&typeof i=="string"&&(i=b.parseDate(i)),D[a.field]=i,t[a.field]=i}C=t}function ye(e){z.value=!1,d.value=e,ee(e),p.value=!0}function me(e){z.value=!0,d.value=e,ee(e),p.value=!0}function Pe(e){z.value=!1,d.value=null,C=null,H();for(const t of v){if(t.field===g)continue;let a=e[t.field]!==void 0?e[t.field]:D[t.field];a&&(t.type==="date"||t.type==="datetime")&&typeof a=="string"&&(a=b.parseDate(a)),D[t.field]=a}if(_){const t=_();for(const[a,i]of Object.entries(t))D[a]=i}p.value=!0}function te(e){const t={...e};for(const a of v){const i=t[a.field];if(a.type==="date"&&i instanceof Date?t[a.field]=b.toDateString(i):a.type==="datetime"&&i instanceof Date&&(t[a.field]=b.toDateTimeString(i)),a.type==="fk"&&i!==null&&typeof i=="object"){const c=a.optionValue||"id";t[a.field]=i[c]??i}(a.type==="mask"||a.type==="cpf_cnpj")&&typeof i=="string"&&(t[a.field]=b.stripMask(i))}return t}async function we(){for(const e of v){if(e.validate){const t=e.validate(D[e.field]);if(t)return k.error(t),null}if(e.required){const t=D[e.field];if(t==null||t==="")return k.error(`${e.label} é obrigatório`),null}}u.value=!0;try{let e=te(D);if(!I.value&&_&&Object.assign(e,_()),I.value&&$&&C){const r=te(C);if(e=ze(r,e),Object.keys(e).length===0&&!T){p.value=!1;const S=d.value;return d.value=null,C=null,S}}T&&(e=T(e,I.value));const t=v.some(r=>r.type==="image"&&e[r.field]instanceof File);let a=e,i;if(t){const r=new Set(v.filter(O=>O.type==="image").map(O=>O.field)),S=new FormData;for(const[O,N]of Object.entries(e))if(N!=null)if(N instanceof File)S.append(O,N);else{if(r.has(O))continue;S.append(O,String(N))}a=S,i={"Content-Type":"multipart/form-data"}}const c=i?{headers:i}:void 0;let l;if(I.value&&d.value){const r=d.value[g];if(l=await n.update(P,r,a,c),!E){const S=h.value.findIndex(O=>O[g]===r);S!==-1&&(h.value[S]=l.data)}k.success(f.successUpdate)}else l=await n.create(P,a,c),E||(h.value.unshift(l.data),s.rows++),k.success(f.successCreate);return p.value=!1,d.value=null,C=null,E&&await F(),x&&x(l.data,I.value),l.data}catch(e){return k.error(b.extractApiError(e,"Erro ao salvar registro")),null}finally{u.value=!1}}async function he(e,t,a){const i=e[g],c=v.find(r=>r.field===t);let l=a;(c==null?void 0:c.type)==="date"&&l instanceof Date?l=b.toDateString(l):(c==null?void 0:c.type)==="datetime"&&l instanceof Date&&(l=b.toDateTimeString(l));try{const r=await n.update(P,i,{[t]:l}),S=h.value.findIndex(O=>O[g]===i);S!==-1&&(h.value[S]={...h.value[S],...r.data}),k.success(f.successUpdate)}catch(r){k.error(b.extractApiError(r,"Erro ao salvar o campo"))}}function De(e){G(async()=>{try{const t=e[g];await n.delete(P,t);const a=h.value.findIndex(i=>i[g]===t);a!==-1&&(h.value.splice(a,1),s.rows--),k.success(f.successDelete),q&&q(e)}catch(t){k.error(b.extractApiError(t,"Erro ao excluir registro"))}},f.deleteConfirmMessage)}function Se(){W.value=[]}function be(e,t){t==null||t===""?delete V[e]:V[e]=t,s.page=1,F()}function ke(){for(const e of Object.keys(V))delete V[e];s.page=1,F()}return{items:h,selectedItems:W,columnFilters:V,extras:L,loading:K,saving:u,search:y,dialogVisible:p,editingItem:d,formData:D,pagination:s,sort:m,isEditing:I,isViewing:ae,viewMode:z,dialogTitle:ie,isFirstPage:oe,isLastPage:ne,init:se,fetchItems:F,fetchAll:le,refresh:re,setSearch:Z,onSearch:ce,onPage:de,onSort:pe,openCreateDialog:ve,openEditDialog:ye,openViewDialog:me,openDuplicateDialog:Pe,save:we,updateField:he,confirmDelete:De,setFormField:ge,resetForm:H,goToPage:B,firstPage:fe,lastPage:ue,clearSelection:Se,setColumnFilter:be,clearColumnFilters:ke,config:j}}function je(j){const{endpoint:P,searchDebounce:v=300,immediate:g=!1}=j,U=o.inject(Y.W_DATA_PROVIDER_KEY);if(!U)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.");const $=U,E=o.inject(Y.W_CONFIG_KEY),R=j.pageSize??(E==null?void 0:E.defaultPageSize)??20,_=o.ref([]),T=o.ref(!1),x=o.ref(""),q=o.ref({}),A=o.reactive({}),n=o.reactive({page:1,pageSize:R,rows:0,totalPages:0}),w=o.reactive({field:null,order:0});let M=null;async function f(u={}){T.value=!0;try{const y={page:n.page,page_size:n.pageSize,...u};x.value&&(y.search=x.value),w.field&&w.order!==0&&(y.ordering=w.order===-1?`-${w.field}`:w.field);for(const[z,d]of Object.entries(A))d!=null&&d!==""&&(y[z]=d);const p=await $.list(P,y);_.value=p.data,n.rows=p.rows,p.page&&(n.page=p.page),p.page_size&&(n.pageSize=p.page_size),n.totalPages=Math.ceil(n.rows/n.pageSize)||0,q.value=p.extras??{}}finally{T.value=!1}}async function k(){await f()}function G(u){x.value=u,M&&clearTimeout(M),M=setTimeout(()=>{n.page=1,f()},v)}function h(u,y){A[u]=y,n.page=1,f()}function W(){for(const u of Object.keys(A))delete A[u];n.page=1,f()}function L(u){n.page=u.page+1,n.pageSize=u.rows,f()}function K(u){w.field=u.sortField??null,w.order=u.sortOrder??0,n.page=1,f()}return g&&f(),{items:_,loading:T,search:x,pagination:n,sort:w,extras:q,fetchItems:f,refresh:k,setSearch:G,setFilter:h,clearFilters:W,onPage:L,onSort:K}}exports.useApi=je;exports.useCrudManager=Fe;
|
|
2
|
+
//# sourceMappingURL=useApi-BDjRqSFt.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApi-5Pr4nXAa.cjs","sources":["../src/composables/useCrudManager.ts","../src/composables/useApi.ts"],"sourcesContent":["import { ref, reactive, computed, inject } from 'vue'\nimport { W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\nimport type { PaginationState, SortState } from '@/types/api'\nimport type { CrudManagerConfig, CrudManagerReturn } from '@/types/manager'\nimport type { CrudLabels } from '@/types/labels'\nimport { DEFAULT_CRUD_LABELS } from '@/types/labels'\nimport { useAppToast } from './useAppToast'\nimport { useAppConfirm } from './useAppConfirm'\nimport { extractApiError } from './useApiError'\nimport { parseDate, toDateString, toDateTimeString } from '@/utils/dates'\nimport { stripMask } from '@/utils/masks'\n\n/** Shallow diff: returns only the keys whose value changed between two records. */\nfunction diffRecord(\n original: Record<string, unknown>,\n current: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(current)) {\n if (JSON.stringify(original[key]) !== JSON.stringify(current[key])) {\n out[key] = current[key]\n }\n }\n return out\n}\n\nexport function useCrudManager<T extends Record<string, unknown> = Record<string, unknown>>(\n config: CrudManagerConfig<T>,\n): CrudManagerReturn<T> {\n const {\n endpoint,\n form: formFields,\n pk = 'id',\n searchDebounce = 300,\n partialUpdate = true,\n refetchOnSave = true,\n filterParams = undefined,\n createDefaults = undefined,\n transformPayload = undefined,\n onAfterSave = undefined,\n onAfterDelete = undefined,\n } = config\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.',\n )\n }\n const provider = dataProvider\n\n const pluginConfig = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = config.pageSize ?? pluginConfig?.defaultPageSize ?? 20\n\n const labels: CrudLabels = { ...DEFAULT_CRUD_LABELS, ...config.labels }\n const toast = useAppToast()\n const { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const selectedItems = ref<T[]>([]) as import('vue').Ref<T[]>\n const extras = ref<Record<string, unknown>>({})\n const loading = ref(false)\n const saving = ref(false)\n const search = ref('')\n const dialogVisible = ref(false)\n const viewMode = ref(false)\n const editingItem = ref<T | null>(null) as import('vue').Ref<T | null>\n const formData = reactive<Record<string, unknown>>({})\n // Snapshot of the form values when an edit dialog opens — used for diff-based PATCH.\n let editingOriginal: Record<string, unknown> | null = null\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Filtros de coluna ativos (param → valor). Persistem entre páginas/ordenação.\n const columnFilters = reactive<Record<string, unknown>>({})\n\n // ---------------------------------------------------------------------------\n // Defaults\n // ---------------------------------------------------------------------------\n\n function getDefaults(): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of formFields) {\n defaults[f.field] =\n f.defaultValue !== undefined\n ? typeof f.defaultValue === 'function'\n ? (f.defaultValue as () => unknown)()\n : f.defaultValue\n : null\n }\n return defaults\n }\n\n // Initialize\n const defaults = getDefaults()\n for (const key of Object.keys(defaults)) {\n formData[key] = defaults[key]\n }\n\n // ---------------------------------------------------------------------------\n // Computed\n // ---------------------------------------------------------------------------\n\n const isEditing = computed(() => editingItem.value !== null && !viewMode.value)\n const isViewing = computed(() => viewMode.value)\n const dialogTitle = computed(() =>\n viewMode.value\n ? (labels.viewTitle ?? 'Visualizar Registro')\n : isEditing.value\n ? labels.editTitle\n : labels.createTitle,\n )\n const isFirstPage = computed(() => pagination.page <= 1)\n const isLastPage = computed(() => pagination.page >= pagination.totalPages)\n\n // ---------------------------------------------------------------------------\n // Fetch\n // ---------------------------------------------------------------------------\n\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n if (filterParams) {\n Object.assign(queryParams, filterParams())\n }\n\n // Filtros de coluna ativos (ignora vazios).\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') queryParams[key] = val\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n items.value = responseData.data\n selectedItems.value = [] // seleção anterior fica obsoleta ao recarregar\n pagination.rows = responseData.rows\n extras.value = responseData.extras ?? {}\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n } finally {\n loading.value = false\n }\n }\n\n async function init(): Promise<void> {\n await fetchItems()\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n /**\n * Fetch every record across all pages (respeitando search, sort e\n * filterParams atuais) sem alterar o estado da lista. Útil para exportações.\n */\n async function fetchAll(pageSize = 200): Promise<T[]> {\n const base: Record<string, unknown> = {}\n if (search.value) base.search = search.value\n if (sort.field && sort.order !== 0) {\n base.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n if (filterParams) Object.assign(base, filterParams())\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') base[key] = val\n }\n\n const all: T[] = []\n let page = 1\n // Hard cap para evitar loop infinito caso o backend não pagine corretamente.\n const maxPages = 10000\n while (page <= maxPages) {\n const res = await provider.list<T>(endpoint, {\n ...base,\n page,\n page_size: pageSize,\n })\n all.push(...res.data)\n const total = res.rows ?? all.length\n if (res.data.length === 0 || all.length >= total) break\n page++\n }\n return all\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function onSearch(event: Event): void {\n const target = event.target as HTMLInputElement\n setSearch(target.value)\n }\n\n // ---------------------------------------------------------------------------\n // Pagination\n // ---------------------------------------------------------------------------\n\n function goToPage(page: number): void {\n pagination.page = page\n fetchItems()\n }\n\n function firstPage(): void {\n goToPage(1)\n }\n\n function lastPage(): void {\n goToPage(pagination.totalPages)\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField?: string | null; sortOrder?: 1 | -1 | 0 | null }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Form\n // ---------------------------------------------------------------------------\n\n function resetForm(): void {\n const defs = getDefaults()\n for (const key of Object.keys(defs)) {\n formData[key] = defs[key]\n }\n }\n\n function setFormField(field: string, value: unknown): void {\n formData[field] = value\n }\n\n function openCreateDialog(): void {\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n // Apply createDefaults (e.g. parent FK) on top of field defaults\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n function loadItemIntoForm(item: T): void {\n const snapshot: Record<string, unknown> = {}\n for (const f of formFields) {\n let value = item[f.field] !== undefined ? item[f.field] : null\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n formData[f.field] = value\n snapshot[f.field] = value\n }\n editingOriginal = snapshot\n }\n\n function openEditDialog(item: T): void {\n viewMode.value = false\n editingItem.value = item\n loadItemIntoForm(item)\n dialogVisible.value = true\n }\n\n function openViewDialog(item: T): void {\n viewMode.value = true\n editingItem.value = item\n loadItemIntoForm(item)\n dialogVisible.value = true\n }\n\n function openDuplicateDialog(item: T): void {\n // Abre o diálogo em modo criação, pré-preenchido com os dados do registro\n // (exceto a chave primária).\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n for (const f of formFields) {\n if (f.field === pk) continue\n let value = item[f.field] !== undefined ? item[f.field] : formData[f.field]\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n formData[f.field] = value\n }\n // createDefaults (ex: FK do pai) sobrepõe os valores duplicados.\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n // ---------------------------------------------------------------------------\n // Save\n // ---------------------------------------------------------------------------\n\n // Apply automatic conversions (dates, FK objects, masks) to a record,\n // returning a fresh plain object suitable for the API payload.\n function convertRecord(record: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...record }\n for (const f of formFields) {\n const val = out[f.field]\n\n // Datas\n if (f.type === 'date' && val instanceof Date) {\n out[f.field] = toDateString(val)\n } else if (f.type === 'datetime' && val instanceof Date) {\n out[f.field] = toDateTimeString(val)\n }\n\n // FK — extrair o ID do objeto selecionado\n if (f.type === 'fk' && val !== null && typeof val === 'object') {\n const key = f.optionValue || 'id'\n out[f.field] = (val as Record<string, unknown>)[key] ?? val\n }\n\n // Máscaras — strip para enviar só dígitos\n if ((f.type === 'mask' || f.type === 'cpf_cnpj') && typeof val === 'string') {\n out[f.field] = stripMask(val)\n }\n }\n return out\n }\n\n async function save(): Promise<T | null> {\n // Validação\n for (const f of formFields) {\n if (f.validate) {\n const result = f.validate(formData[f.field])\n if (result) {\n toast.error(result)\n return null\n }\n }\n if (f.required) {\n const val = formData[f.field]\n if (val === null || val === undefined || val === '') {\n toast.error(`${f.label} é obrigatório`)\n return null\n }\n }\n }\n\n saving.value = true\n try {\n let payload: Record<string, unknown> = convertRecord(formData)\n\n // Merge createDefaults into payload for new records (hidden parent FKs, etc.)\n if (!isEditing.value && createDefaults) {\n Object.assign(payload, createDefaults())\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 function confirmDelete(item: T): void {\n confirmDeleteDialog(async () => {\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 }, 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 setFormField,\n resetForm,\n goToPage,\n firstPage,\n lastPage,\n clearSelection,\n setColumnFilter,\n clearColumnFilters,\n config,\n }\n}\n","import { ref, reactive, inject } from 'vue'\nimport type { PaginationState, SortState, UseApiOptions, UseApiReturn } from '@/types/api'\nimport { W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\n\nexport function useApi<T = Record<string, unknown>>(options: UseApiOptions): UseApiReturn<T> {\n const { endpoint, searchDebounce = 300, immediate = false } = options\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.',\n )\n }\n const provider = dataProvider\n\n const config = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = options.pageSize ?? config?.defaultPageSize ?? 20\n\n // State\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const loading = ref(false)\n const search = ref('')\n const extras = ref<Record<string, unknown>>({})\n const filters = reactive<Record<string, unknown>>({})\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Debounce\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n for (const [key, value] of Object.entries(filters)) {\n if (value !== null && value !== undefined && value !== '') {\n queryParams[key] = value\n }\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n\n items.value = responseData.data\n pagination.rows = responseData.rows\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n extras.value = responseData.extras ?? {}\n } finally {\n loading.value = false\n }\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function setFilter(key: string, value: unknown): void {\n filters[key] = value\n pagination.page = 1\n fetchItems()\n }\n\n function clearFilters(): void {\n for (const key of Object.keys(filters)) {\n delete filters[key]\n }\n pagination.page = 1\n fetchItems()\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField: string; sortOrder: 1 | -1 | 0 }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n if (immediate) {\n fetchItems()\n }\n\n return {\n items,\n loading,\n search,\n pagination,\n sort,\n extras,\n fetchItems,\n refresh,\n setSearch,\n setFilter,\n clearFilters,\n onPage,\n onSort,\n }\n}\n"],"names":["diffRecord","original","current","out","key","useCrudManager","config","endpoint","formFields","pk","searchDebounce","partialUpdate","refetchOnSave","filterParams","createDefaults","transformPayload","onAfterSave","onAfterDelete","dataProvider","inject","W_DATA_PROVIDER_KEY","provider","pluginConfig","W_CONFIG_KEY","defaultPageSize","labels","DEFAULT_CRUD_LABELS","toast","useAppToast","confirmDeleteDialog","useAppConfirm","items","ref","selectedItems","extras","loading","saving","search","dialogVisible","viewMode","editingItem","formData","reactive","editingOriginal","pagination","sort","columnFilters","getDefaults","defaults","f","isEditing","computed","isViewing","dialogTitle","isFirstPage","isLastPage","searchTimeout","fetchItems","params","queryParams","val","responseData","init","refresh","fetchAll","pageSize","base","all","page","maxPages","res","total","setSearch","value","onSearch","event","target","goToPage","firstPage","lastPage","onPage","onSort","resetForm","defs","setFormField","field","openCreateDialog","extra","loadItemIntoForm","item","snapshot","parseDate","openEditDialog","openViewDialog","openDuplicateDialog","convertRecord","record","toDateString","toDateTimeString","stripMask","save","result","payload","originalPayload","hasFile","body","headers","imageFields","fd","requestConfig","response","itemPk","index","i","err","extractApiError","updateField","fdef","v","confirmDelete","clearSelection","setColumnFilter","param","clearColumnFilters","useApi","options","immediate","filters","setFilter","clearFilters"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useApi-BDjRqSFt.cjs","sources":["../src/composables/useCrudManager.ts","../src/composables/useApi.ts"],"sourcesContent":["import { ref, reactive, computed, inject } from 'vue'\nimport { W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\nimport type { PaginationState, SortState } from '@/types/api'\nimport type { CrudManagerConfig, CrudManagerReturn } from '@/types/manager'\nimport type { CrudLabels } from '@/types/labels'\nimport { DEFAULT_CRUD_LABELS } from '@/types/labels'\nimport { useAppToast } from './useAppToast'\nimport { useAppConfirm } from './useAppConfirm'\nimport { extractApiError } from './useApiError'\nimport { parseDate, toDateString, toDateTimeString } from '@/utils/dates'\nimport { stripMask } from '@/utils/masks'\n\n/** Shallow diff: returns only the keys whose value changed between two records. */\nfunction diffRecord(\n original: Record<string, unknown>,\n current: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(current)) {\n if (JSON.stringify(original[key]) !== JSON.stringify(current[key])) {\n out[key] = current[key]\n }\n }\n return out\n}\n\nexport function useCrudManager<T extends Record<string, unknown> = Record<string, unknown>>(\n config: CrudManagerConfig<T>,\n): CrudManagerReturn<T> {\n const {\n endpoint,\n form: formFields,\n pk = 'id',\n searchDebounce = 300,\n partialUpdate = true,\n refetchOnSave = true,\n filterParams = undefined,\n createDefaults = undefined,\n transformPayload = undefined,\n onAfterSave = undefined,\n onAfterDelete = undefined,\n } = config\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.',\n )\n }\n const provider = dataProvider\n\n const pluginConfig = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = config.pageSize ?? pluginConfig?.defaultPageSize ?? 20\n\n const labels: CrudLabels = { ...DEFAULT_CRUD_LABELS, ...config.labels }\n const toast = useAppToast()\n const { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const selectedItems = ref<T[]>([]) as import('vue').Ref<T[]>\n const extras = ref<Record<string, unknown>>({})\n const loading = ref(false)\n const saving = ref(false)\n const search = ref('')\n const dialogVisible = ref(false)\n const viewMode = ref(false)\n const editingItem = ref<T | null>(null) as import('vue').Ref<T | null>\n const formData = reactive<Record<string, unknown>>({})\n // Snapshot of the form values when an edit dialog opens — used for diff-based PATCH.\n let editingOriginal: Record<string, unknown> | null = null\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Filtros de coluna ativos (param → valor). Persistem entre páginas/ordenação.\n const columnFilters = reactive<Record<string, unknown>>({})\n\n // ---------------------------------------------------------------------------\n // Defaults\n // ---------------------------------------------------------------------------\n\n function getDefaults(): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of formFields) {\n defaults[f.field] =\n f.defaultValue !== undefined\n ? typeof f.defaultValue === 'function'\n ? (f.defaultValue as () => unknown)()\n : f.defaultValue\n : null\n }\n return defaults\n }\n\n // Initialize\n const defaults = getDefaults()\n for (const key of Object.keys(defaults)) {\n formData[key] = defaults[key]\n }\n\n // ---------------------------------------------------------------------------\n // Computed\n // ---------------------------------------------------------------------------\n\n const isEditing = computed(() => editingItem.value !== null && !viewMode.value)\n const isViewing = computed(() => viewMode.value)\n const dialogTitle = computed(() =>\n viewMode.value\n ? (labels.viewTitle ?? 'Visualizar Registro')\n : isEditing.value\n ? labels.editTitle\n : labels.createTitle,\n )\n const isFirstPage = computed(() => pagination.page <= 1)\n const isLastPage = computed(() => pagination.page >= pagination.totalPages)\n\n // ---------------------------------------------------------------------------\n // Fetch\n // ---------------------------------------------------------------------------\n\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n if (filterParams) {\n Object.assign(queryParams, filterParams())\n }\n\n // Filtros de coluna ativos (ignora vazios).\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') queryParams[key] = val\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n items.value = responseData.data\n selectedItems.value = [] // seleção anterior fica obsoleta ao recarregar\n pagination.rows = responseData.rows\n extras.value = responseData.extras ?? {}\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n } finally {\n loading.value = false\n }\n }\n\n async function init(): Promise<void> {\n await fetchItems()\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n /**\n * Fetch every record across all pages (respeitando search, sort e\n * filterParams atuais) sem alterar o estado da lista. Útil para exportações.\n */\n async function fetchAll(pageSize = 200): Promise<T[]> {\n const base: Record<string, unknown> = {}\n if (search.value) base.search = search.value\n if (sort.field && sort.order !== 0) {\n base.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n if (filterParams) Object.assign(base, filterParams())\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') base[key] = val\n }\n\n const all: T[] = []\n let page = 1\n // Hard cap para evitar loop infinito caso o backend não pagine corretamente.\n const maxPages = 10000\n while (page <= maxPages) {\n const res = await provider.list<T>(endpoint, {\n ...base,\n page,\n page_size: pageSize,\n })\n all.push(...res.data)\n const total = res.rows ?? all.length\n if (res.data.length === 0 || all.length >= total) break\n page++\n }\n return all\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function onSearch(event: Event): void {\n const target = event.target as HTMLInputElement\n setSearch(target.value)\n }\n\n // ---------------------------------------------------------------------------\n // Pagination\n // ---------------------------------------------------------------------------\n\n function goToPage(page: number): void {\n pagination.page = page\n fetchItems()\n }\n\n function firstPage(): void {\n goToPage(1)\n }\n\n function lastPage(): void {\n goToPage(pagination.totalPages)\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField?: string | null; sortOrder?: 1 | -1 | 0 | null }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Form\n // ---------------------------------------------------------------------------\n\n function resetForm(): void {\n const defs = getDefaults()\n for (const key of Object.keys(defs)) {\n formData[key] = defs[key]\n }\n }\n\n function setFormField(field: string, value: unknown): void {\n formData[field] = value\n }\n\n function openCreateDialog(): void {\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n // Apply createDefaults (e.g. parent FK) on top of field defaults\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n function loadItemIntoForm(item: T): void {\n const snapshot: Record<string, unknown> = {}\n for (const f of formFields) {\n let value = item[f.field] !== undefined ? item[f.field] : null\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n formData[f.field] = value\n snapshot[f.field] = value\n }\n editingOriginal = snapshot\n }\n\n function openEditDialog(item: T): void {\n viewMode.value = false\n editingItem.value = item\n loadItemIntoForm(item)\n dialogVisible.value = true\n }\n\n function openViewDialog(item: T): void {\n viewMode.value = true\n editingItem.value = item\n loadItemIntoForm(item)\n dialogVisible.value = true\n }\n\n function openDuplicateDialog(item: T): void {\n // Abre o diálogo em modo criação, pré-preenchido com os dados do registro\n // (exceto a chave primária).\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n for (const f of formFields) {\n if (f.field === pk) continue\n let value = item[f.field] !== undefined ? item[f.field] : formData[f.field]\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n formData[f.field] = value\n }\n // createDefaults (ex: FK do pai) sobrepõe os valores duplicados.\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n // ---------------------------------------------------------------------------\n // Save\n // ---------------------------------------------------------------------------\n\n // Apply automatic conversions (dates, FK objects, masks) to a record,\n // returning a fresh plain object suitable for the API payload.\n function convertRecord(record: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...record }\n for (const f of formFields) {\n const val = out[f.field]\n\n // Datas\n if (f.type === 'date' && val instanceof Date) {\n out[f.field] = toDateString(val)\n } else if (f.type === 'datetime' && val instanceof Date) {\n out[f.field] = toDateTimeString(val)\n }\n\n // FK — extrair o ID do objeto selecionado\n if (f.type === 'fk' && val !== null && typeof val === 'object') {\n const key = f.optionValue || 'id'\n out[f.field] = (val as Record<string, unknown>)[key] ?? val\n }\n\n // Máscaras — strip para enviar só dígitos\n if ((f.type === 'mask' || f.type === 'cpf_cnpj') && typeof val === 'string') {\n out[f.field] = stripMask(val)\n }\n }\n return out\n }\n\n async function save(): Promise<T | null> {\n // Validação\n for (const f of formFields) {\n if (f.validate) {\n const result = f.validate(formData[f.field])\n if (result) {\n toast.error(result)\n return null\n }\n }\n if (f.required) {\n const val = formData[f.field]\n if (val === null || val === undefined || val === '') {\n toast.error(`${f.label} é obrigatório`)\n return null\n }\n }\n }\n\n saving.value = true\n try {\n let payload: Record<string, unknown> = convertRecord(formData)\n\n // Merge createDefaults into payload for new records (hidden parent FKs, etc.)\n if (!isEditing.value && createDefaults) {\n Object.assign(payload, createDefaults())\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 function confirmDelete(item: T): void {\n confirmDeleteDialog(async () => {\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 }, 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 setFormField,\n resetForm,\n goToPage,\n firstPage,\n lastPage,\n clearSelection,\n setColumnFilter,\n clearColumnFilters,\n config,\n }\n}\n","import { ref, reactive, inject } from 'vue'\nimport type { PaginationState, SortState, UseApiOptions, UseApiReturn } from '@/types/api'\nimport { W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\n\nexport function useApi<T = Record<string, unknown>>(options: UseApiOptions): UseApiReturn<T> {\n const { endpoint, searchDebounce = 300, immediate = false } = options\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.',\n )\n }\n const provider = dataProvider\n\n const config = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = options.pageSize ?? config?.defaultPageSize ?? 20\n\n // State\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const loading = ref(false)\n const search = ref('')\n const extras = ref<Record<string, unknown>>({})\n const filters = reactive<Record<string, unknown>>({})\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Debounce\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n for (const [key, value] of Object.entries(filters)) {\n if (value !== null && value !== undefined && value !== '') {\n queryParams[key] = value\n }\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n\n items.value = responseData.data\n pagination.rows = responseData.rows\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n extras.value = responseData.extras ?? {}\n } finally {\n loading.value = false\n }\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function setFilter(key: string, value: unknown): void {\n filters[key] = value\n pagination.page = 1\n fetchItems()\n }\n\n function clearFilters(): void {\n for (const key of Object.keys(filters)) {\n delete filters[key]\n }\n pagination.page = 1\n fetchItems()\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField: string; sortOrder: 1 | -1 | 0 }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n if (immediate) {\n fetchItems()\n }\n\n return {\n items,\n loading,\n search,\n pagination,\n sort,\n extras,\n fetchItems,\n refresh,\n setSearch,\n setFilter,\n clearFilters,\n onPage,\n onSort,\n }\n}\n"],"names":["diffRecord","original","current","out","key","useCrudManager","config","endpoint","formFields","pk","searchDebounce","partialUpdate","refetchOnSave","filterParams","createDefaults","transformPayload","onAfterSave","onAfterDelete","dataProvider","inject","W_DATA_PROVIDER_KEY","provider","pluginConfig","W_CONFIG_KEY","defaultPageSize","labels","DEFAULT_CRUD_LABELS","toast","useAppToast","confirmDeleteDialog","useAppConfirm","items","ref","selectedItems","extras","loading","saving","search","dialogVisible","viewMode","editingItem","formData","reactive","editingOriginal","pagination","sort","columnFilters","getDefaults","defaults","f","isEditing","computed","isViewing","dialogTitle","isFirstPage","isLastPage","searchTimeout","fetchItems","params","queryParams","val","responseData","init","refresh","fetchAll","pageSize","base","all","page","maxPages","res","total","setSearch","value","onSearch","event","target","goToPage","firstPage","lastPage","onPage","onSort","resetForm","defs","setFormField","field","openCreateDialog","extra","loadItemIntoForm","item","snapshot","parseDate","openEditDialog","openViewDialog","openDuplicateDialog","convertRecord","record","toDateString","toDateTimeString","stripMask","save","result","payload","originalPayload","hasFile","body","headers","imageFields","fd","requestConfig","response","itemPk","index","i","err","extractApiError","updateField","fdef","v","confirmDelete","clearSelection","setColumnFilter","param","clearColumnFilters","useApi","options","immediate","filters","setFilter","clearFilters"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { inject as K, ref as m, reactive as I, computed as $ } from "vue";
|
|
2
2
|
import { W as le, a as re } from "./plugin-BKa0eSEM.js";
|
|
3
3
|
import { DEFAULT_CRUD_LABELS as Ve } from "./types.js";
|
|
4
|
-
import { b as Ce, a as Ee, e as X, t as ie,
|
|
4
|
+
import { b as Ce, a as Ee, e as X, t as ie, g as ne, p as se, s as Ae } from "./useFormKeyboardNav-D4Irq5RE.js";
|
|
5
5
|
function Ie(F, w) {
|
|
6
6
|
const g = {};
|
|
7
7
|
for (const p of Object.keys(w))
|
|
@@ -392,4 +392,4 @@ export {
|
|
|
392
392
|
qe as a,
|
|
393
393
|
Le as u
|
|
394
394
|
};
|
|
395
|
-
//# sourceMappingURL=useApi-
|
|
395
|
+
//# sourceMappingURL=useApi-CzOJADZw.js.map
|