@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormKeyboardNav-D4Irq5RE.js","sources":["../node_modules/dayjs/plugin/customParseFormat.js","../src/utils/dates.ts","../src/utils/masks.ts","../src/composables/useFormatters.ts","../src/composables/useAppToast.ts","../src/composables/useAppConfirm.ts","../src/composables/useApiError.ts","../src/composables/useDateInput.ts","../src/composables/useFormKeyboardNav.ts"],"sourcesContent":["!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\nexport function parseDate(value: string | Date | null | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return value\n const d = dayjs(value, 'YYYY-MM-DD', true)\n return d.isValid() ? d.toDate() : dayjs(value).toDate()\n}\n\nexport function toDateString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).format('YYYY-MM-DD')\n}\n\nexport function toDateTimeString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).toISOString()\n}\n\nexport function formatDateValue(\n value: string | Date | null | undefined,\n format = 'DD/MM/YYYY',\n): string {\n if (!value) return '—'\n return dayjs(value).format(format)\n}\n\nexport function formatDateTimeValue(value: string | Date | null | undefined): string {\n if (!value) return '—'\n return dayjs(value).format('DD/MM/YYYY HH:mm')\n}\n","export function stripMask(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\nexport function formatCpf(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 11) return value\n return digits.replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4')\n}\n\nexport function formatCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 14) return value\n return digits.replace(/^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$/, '$1.$2.$3/$4-$5')\n}\n\nexport function formatCpfCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return formatCpf(value)\n if (digits.length === 14) return formatCnpj(value)\n return value\n}\n\nexport function formatTelefone(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return digits.replace(/^(\\d{2})(\\d{5})(\\d{4})$/, '($1) $2-$3')\n if (digits.length === 10) return digits.replace(/^(\\d{2})(\\d{4})(\\d{4})$/, '($1) $2-$3')\n return value\n}\n\nexport function validateCpf(value: string | null | undefined): string | null {\n if (!value) return null\n const cpf = stripMask(value)\n if (cpf.length !== 11) return 'CPF deve ter 11 dígitos.'\n if (/^(\\d)\\1{10}$/.test(cpf)) return 'CPF inválido.'\n let soma = 0\n for (let i = 0; i < 9; i++) soma += parseInt(cpf[i]) * (10 - i)\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[9]) !== d1) return 'CPF inválido.'\n soma = 0\n for (let i = 0; i < 10; i++) soma += parseInt(cpf[i]) * (11 - i)\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[10]) !== d2) return 'CPF inválido.'\n return null\n}\n\nexport function validateCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const cnpj = stripMask(value)\n if (cnpj.length !== 14) return 'CNPJ deve ter 14 dígitos.'\n if (/^(\\d)\\1{13}$/.test(cnpj)) return 'CNPJ inválido.'\n const pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n let soma = 0\n for (let i = 0; i < 12; i++) soma += parseInt(cnpj[i]) * pesos1[i]\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[12]) !== d1) return 'CNPJ inválido.'\n const pesos2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n soma = 0\n for (let i = 0; i < 13; i++) soma += parseInt(cnpj[i]) * pesos2[i]\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[13]) !== d2) return 'CNPJ inválido.'\n return null\n}\n\nexport function validateCpfCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const digits = stripMask(value)\n if (digits.length === 11) return validateCpf(value)\n if (digits.length === 14) return validateCnpj(value)\n return 'CPF deve ter 11 dígitos ou CNPJ deve ter 14 dígitos.'\n}\n","import { inject } from 'vue'\nimport { W_CONFIG_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport {\n formatDateValue,\n formatDateTimeValue,\n parseDate,\n toDateString,\n toDateTimeString,\n} from '@/utils/dates'\nimport {\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n} from '@/utils/masks'\n\nconst numberFormatters = new Map<string, Intl.NumberFormat>()\n\nfunction getNumberFormatter(locale: string, decimals: number): Intl.NumberFormat {\n const key = `${locale}-${decimals}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nfunction getCurrencyFormatter(locale: string, currency: string): Intl.NumberFormat {\n const key = `${locale}-${currency}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nexport function useFormatters() {\n const config = inject<WPluginConfig>(W_CONFIG_KEY, {\n defaultPageSize: 20,\n dateFormat: 'DD/MM/YYYY',\n dateTimeFormat: 'DD/MM/YYYY HH:mm',\n locale: 'pt-BR',\n currency: 'BRL',\n } as WPluginConfig)\n\n const locale = config?.locale ?? 'pt-BR'\n const currencyCode = config?.currency ?? 'BRL'\n\n function formatCurrency(value: number | null | undefined): string {\n if (value == null) return '—'\n return getCurrencyFormatter(locale, currencyCode).format(value)\n }\n\n function formatNumber(value: number | null | undefined, decimals = 2): string {\n if (value == null) return '—'\n return getNumberFormatter(locale, decimals).format(value)\n }\n\n function formatDate(value: string | Date | null | undefined, format?: string): string {\n return formatDateValue(value, format ?? config?.dateFormat ?? 'DD/MM/YYYY')\n }\n\n function formatDateTime(value: string | Date | null | undefined): string {\n return formatDateTimeValue(value)\n }\n\n function formatPercent(value: number | null | undefined): string {\n if (value == null) return '—'\n return `${getNumberFormatter(locale, 2).format(value)}%`\n }\n\n return {\n formatCurrency,\n formatNumber,\n formatDate,\n formatDateTime,\n formatPercent,\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n parseDate,\n toDateString,\n toDateTimeString,\n }\n}\n","import { useToast } from 'primevue/usetoast'\n\nexport function useAppToast() {\n const toast = useToast()\n\n function success(message: string, title = 'Sucesso') {\n toast.add({ severity: 'success', summary: title, detail: message, life: 3000 })\n }\n\n function error(message: string, title = 'Erro') {\n toast.add({ severity: 'error', summary: title, detail: message, life: 5000 })\n }\n\n function warn(message: string, title = 'Atenção') {\n toast.add({ severity: 'warn', summary: title, detail: message, life: 4000 })\n }\n\n function info(message: string, title = 'Info') {\n toast.add({ severity: 'info', summary: title, detail: message, life: 3000 })\n }\n\n return { success, error, warn, info }\n}\n","import { useConfirm } from 'primevue/useconfirm'\n\nexport function useAppConfirm() {\n const confirm = useConfirm()\n\n function confirmDelete(\n onAccept: () => void,\n message = 'Deseja realmente excluir este registro?',\n ) {\n confirm.require({\n message,\n header: 'Confirmar Exclusão',\n icon: 'pi pi-trash',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Excluir',\n acceptProps: {\n severity: 'danger',\n },\n accept: onAccept,\n })\n }\n\n function confirmAction(message: string, onAccept: () => void, header = 'Confirmação') {\n confirm.require({\n message,\n header,\n icon: 'pi pi-question-circle',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Confirmar',\n accept: onAccept,\n })\n }\n\n return { confirmDelete, confirmAction }\n}\n","function formatFieldName(field: string): string {\n return field.replace(/_/g, ' ').replace(/^\\w/, (c) => c.toUpperCase())\n}\n\nfunction extractMessage(detail: unknown): string | null {\n if (typeof detail === 'string') {\n return detail\n }\n\n if (Array.isArray(detail)) {\n const messages = detail.filter((item) => typeof item === 'string')\n return messages.length > 0 ? messages.join(' ') : null\n }\n\n if (typeof detail === 'object' && detail !== null) {\n const obj = detail as Record<string, unknown>\n\n if (Array.isArray(obj.non_field_errors) && obj.non_field_errors.length > 0) {\n return obj.non_field_errors.filter((item: unknown) => typeof item === 'string').join(' ')\n }\n\n const messages: string[] = []\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'non_field_errors') continue\n const label = formatFieldName(key)\n if (Array.isArray(value)) {\n const strs = value.filter((item: unknown) => typeof item === 'string')\n if (strs.length > 0) messages.push(`${label}: ${strs.join(' ')}`)\n } else if (typeof value === 'string') {\n messages.push(`${label}: ${value}`)\n }\n }\n return messages.length > 0 ? messages.join('\\n') : null\n }\n\n return null\n}\n\nexport function extractApiError(error: unknown, fallback = 'Erro inesperado'): string {\n if (!error || typeof error !== 'object') return fallback\n\n const axiosError = error as {\n response?: { data?: Record<string, unknown> }\n message?: string\n }\n const data = axiosError.response?.data\n\n if (!data || typeof data !== 'object') {\n return axiosError.message || fallback\n }\n\n const detail = data.detail ?? data\n return extractMessage(detail) || fallback\n}\n\nexport function useApiError() {\n return { extractApiError }\n}\n","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\n/**\n * Formato do valor emitido pelo WDatePicker:\n * - `'iso'` → string `YYYY-MM-DD` (ou `YYYY-MM-DDTHH:mm:ss` com hora). Ideal p/ API.\n * - `'date'` → objeto `Date` (compatível com o contrato atual do useCrudManager).\n */\nexport type DateValueFormat = 'iso' | 'date'\n\nconst DISPLAY_DATE = 'DD/MM/YYYY'\nconst DISPLAY_DATETIME = 'DD/MM/YYYY HH:mm'\nconst ISO_DATE = 'YYYY-MM-DD'\nconst ISO_DATETIME = 'YYYY-MM-DDTHH:mm:ss'\n\nexport interface UseDateInputOptions {\n /** Reativo: se o campo inclui hora (datetime). */\n showTime?: () => boolean\n /** Reativo: formato do valor emitido (default `'iso'`). */\n valueFormat?: () => DateValueFormat\n}\n\n/**\n * Lógica pura de parse/format/máscara para inputs de data em pt-BR.\n *\n * Timezone-safe: parse e format usam sempre os componentes LOCAIS via dayjs\n * (nunca `toISOString`, que converte p/ UTC e causa off-by-one em fusos negativos).\n * Sem estado reativo próprio — apenas funções; o componente cuida da reatividade.\n */\nexport function useDateInput(opts: UseDateInputOptions = {}) {\n const withTime = () => opts.showTime?.() ?? false\n const displayFormat = () => (withTime() ? DISPLAY_DATETIME : DISPLAY_DATE)\n const mask = () => (withTime() ? '##/##/#### ##:##' : '##/##/####')\n const placeholder = () => (withTime() ? 'dd/mm/aaaa hh:mm' : 'dd/mm/aaaa')\n\n /** Valor de entrada (string ISO ou Date) → `Date` local, ou `null` se inválido. */\n function toDate(value: unknown): Date | null {\n if (value == null || value === '') return null\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value\n if (typeof value === 'string') {\n // Aceita YYYY-MM-DD estrito primeiro (data pura, meia-noite local)…\n const dateOnly = dayjs(value, ISO_DATE, true)\n if (dateOnly.isValid()) return dateOnly.toDate()\n // …senão qualquer ISO datetime válido (dayjs interpreta como local).\n const any = dayjs(value)\n return any.isValid() ? any.toDate() : null\n }\n return null\n }\n\n /** `Date` → valor emitido, respeitando `valueFormat` (default string ISO). */\n function toValue(date: Date | null): string | Date | null {\n if (!date) return null\n if ((opts.valueFormat?.() ?? 'iso') === 'date') return date\n return dayjs(date).format(withTime() ? ISO_DATETIME : ISO_DATE)\n }\n\n /** `Date` → texto de exibição `DD/MM/YYYY[ HH:mm]`. */\n function toDisplay(date: Date | null): string {\n if (!date) return ''\n return dayjs(date).format(displayFormat())\n }\n\n /** Texto digitado (`30/05/1988`) → `Date`, ou `null` se incompleto/inválido. */\n function fromDisplay(text: string): Date | null {\n if (!text) return null\n const d = dayjs(text, displayFormat(), true)\n return d.isValid() ? d.toDate() : null\n }\n\n /** Hoje: date-only zera a hora; datetime mantém a hora atual. */\n function today(): Date {\n return withTime() ? new Date() : dayjs().startOf('day').toDate()\n }\n\n return { toDate, toValue, toDisplay, fromDisplay, today, mask, placeholder, displayFormat }\n}\n","import { nextTick, type Ref } from 'vue'\n\n/**\n * Navegação por teclado em formulários, estilo aplicação desktop (DevExpress):\n * - `focusFirst()` posiciona o foco no primeiro campo ativo (e seleciona o texto).\n * - `handleKeydown` faz o Enter pular para o próximo campo, até o botão de salvar.\n *\n * Sem watchers nem addEventListener manual: o `handleKeydown` é bindado via\n * `@keydown` no container (o Vue gerencia o listener) e `focusFirst` é chamado\n * no `@show` do Dialog. Shift+Tab / Tab continuam nativos.\n *\n * Regras do Enter (para não atrapalhar a semântica de cada componente):\n * - `textarea` → Enter é quebra de linha (não pula).\n * - `button` → Enter é o clique/submit nativo (não pula).\n * - overlay de dropdown aberto (Select/AutoComplete/DatePicker/MultiSelect) →\n * Enter seleciona o item; só o Enter seguinte pula o foco.\n * - marque um elemento com `data-kbd-skip` para excluí-lo da sequência (ex.: o\n * botão Cancelar, para o Enter ir direto ao Salvar).\n */\n\n// Elementos que recebem foco por tabulação.\nconst FOCUSABLE = [\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(', ')\n\n// Painéis de dropdown do PrimeVue: quando presentes, o Enter deve selecionar.\nconst OPEN_OVERLAY = [\n '.p-select-overlay',\n '.p-autocomplete-overlay',\n '.p-multiselect-overlay',\n '.p-datepicker-panel',\n '.p-cascadeselect-overlay',\n '.p-treeselect-overlay',\n].join(', ')\n\nexport interface FormKeyboardNavOptions {\n /** Liga/desliga a navegação (default: sempre ligada). */\n enabled?: () => boolean\n /** Chamado quando o Enter passa do último elemento sem próximo foco. */\n onSubmit?: () => void\n}\n\nexport function useFormKeyboardNav(\n container: Ref<HTMLElement | null>,\n options: FormKeyboardNavOptions = {},\n) {\n const isEnabled = () => (options.enabled ? options.enabled() : true)\n\n function focusables(): HTMLElement[] {\n const root = container.value\n if (!root) return []\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getClientRects().length > 0 && !el.hasAttribute('data-kbd-skip'),\n )\n }\n\n function focusFirst(): void {\n if (!isEnabled()) return\n nextTick(() => {\n const els = focusables()\n const first = els.find((el) => el.tagName !== 'BUTTON') ?? els[0]\n if (!first) return\n first.focus()\n // Seleciona o conteúdo de inputs de texto para facilitar sobrescrever.\n const input = first as HTMLInputElement\n if (typeof input.select === 'function') {\n try {\n input.select()\n } catch {\n /* nem todo input suporta select() */\n }\n }\n })\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (!isEnabled() || e.key !== 'Enter' || e.isComposing) return\n const target = e.target as HTMLElement\n if (target.tagName === 'TEXTAREA' || target.tagName === 'BUTTON') return\n // Dropdown aberto → deixa o componente tratar o Enter (selecionar item).\n if (target.getAttribute('aria-expanded') === 'true') return\n if (document.querySelector(OPEN_OVERLAY)) return\n\n e.preventDefault()\n const els = focusables()\n const i = els.indexOf(target)\n if (i === -1) return\n const next = els[i + 1]\n if (next) next.focus()\n else options.onSubmit?.()\n }\n\n return { focusFirst, handleKeydown }\n}\n"],"names":["e","t","module","this","n","r","i","o","s","a","f","h","u","d","c","l","m","M","Y","p","v","D","w","g","y","L","dayjs","customParseFormat","parseDate","value","toDateString","toDateTimeString","formatDateValue","format","formatDateTimeValue","stripMask","formatCpf","digits","formatCnpj","formatCpfCnpj","formatTelefone","validateCpf","cpf","soma","resto","d1","d2","validateCnpj","cnpj","pesos1","pesos2","validateCpfCnpj","numberFormatters","getNumberFormatter","locale","decimals","key","fmt","getCurrencyFormatter","currency","useFormatters","config","inject","W_CONFIG_KEY","currencyCode","formatCurrency","formatNumber","formatDate","formatDateTime","formatPercent","useAppToast","toast","useToast","success","message","title","error","warn","info","useAppConfirm","confirm","useConfirm","confirmDelete","onAccept","confirmAction","header","formatFieldName","field","extractMessage","detail","messages","item","obj","label","strs","extractApiError","fallback","axiosError","data","_a","useApiError","DISPLAY_DATE","DISPLAY_DATETIME","ISO_DATE","ISO_DATETIME","useDateInput","opts","withTime","displayFormat","mask","placeholder","toDate","dateOnly","any","toValue","date","toDisplay","fromDisplay","text","today","FOCUSABLE","OPEN_OVERLAY","useFormKeyboardNav","container","options","isEnabled","focusables","root","el","focusFirst","nextTick","els","first","input","handleKeydown","target","next"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";const rt=require("vue"),gt=require("./plugin-D1YvyKXX.cjs"),h=require("dayjs"),Mt=require("primevue/usetoast"),$t=require("primevue/useconfirm");function Ct(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var H={exports:{}},At=H.exports,W;function bt(){return W||(W=1,(function(t,e){(function(s,n){t.exports=n()})(At,(function(){var s={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},n=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,f=/\d/,u=/\d\d/,r=/\d\d?/,l=/\d*[^-_:/,()\s\d]+/,a={},D=function(i){return(i=+i)+(i>68?1900:2e3)},o=function(i){return function(c){this[i]=+c}},p=[/[+-]\d\d:?(\d\d)?|Z/,function(i){(this.zone||(this.zone={})).offset=(function(c){if(!c||c==="Z")return 0;var d=c.match(/([+-]|\d\d)/g),m=60*d[1]+(+d[2]||0);return m===0?0:d[0]==="+"?-m:m})(i)}],S=function(i){var c=a[i];return c&&(c.indexOf?c:c.s.concat(c.f))},X=function(i,c){var d,m=a.meridiem;if(m){for(var M=1;M<=24;M+=1)if(i.indexOf(m(M,0,c))>-1){d=M>12;break}}else d=i===(c?"pm":"PM");return d},dt={A:[l,function(i){this.afternoon=X(i,!1)}],a:[l,function(i){this.afternoon=X(i,!0)}],Q:[f,function(i){this.month=3*(i-1)+1}],S:[f,function(i){this.milliseconds=100*+i}],SS:[u,function(i){this.milliseconds=10*+i}],SSS:[/\d{3}/,function(i){this.milliseconds=+i}],s:[r,o("seconds")],ss:[r,o("seconds")],m:[r,o("minutes")],mm:[r,o("minutes")],H:[r,o("hours")],h:[r,o("hours")],HH:[r,o("hours")],hh:[r,o("hours")],D:[r,o("day")],DD:[u,o("day")],Do:[l,function(i){var c=a.ordinal,d=i.match(/\d+/);if(this.day=d[0],c)for(var m=1;m<=31;m+=1)c(m).replace(/\[|\]/g,"")===i&&(this.day=m)}],w:[r,o("week")],ww:[u,o("week")],M:[r,o("month")],MM:[u,o("month")],MMM:[l,function(i){var c=S("months"),d=(S("monthsShort")||c.map((function(m){return m.slice(0,3)}))).indexOf(i)+1;if(d<1)throw new Error;this.month=d%12||d}],MMMM:[l,function(i){var c=S("months").indexOf(i)+1;if(c<1)throw new Error;this.month=c%12||c}],Y:[/[+-]?\d+/,o("year")],YY:[u,function(i){this.year=D(i)}],YYYY:[/\d{4}/,o("year")],Z:p,ZZ:p};function mt(i){var c,d;c=i,d=a&&a.formats;for(var m=(i=c.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(E,b,g){var y=g&&g.toUpperCase();return b||d[g]||s[g]||d[y].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(F,T,L){return T||L.slice(1)}))}))).match(n),M=m.length,$=0;$<M;$+=1){var v=m[$],x=dt[v],C=x&&x[0],A=x&&x[1];m[$]=A?{regex:C,parser:A}:v.replace(/^\[|\]$/g,"")}return function(E){for(var b={},g=0,y=0;g<M;g+=1){var F=m[g];if(typeof F=="string")y+=F.length;else{var T=F.regex,L=F.parser,I=E.slice(y),j=T.exec(I)[0];L.call(b,j),E=E.replace(j,"")}}return(function(P){var N=P.afternoon;if(N!==void 0){var Y=P.hours;N?Y<12&&(P.hours+=12):Y===12&&(P.hours=0),delete P.afternoon}})(b),b}}return function(i,c,d){d.p.customParseFormat=!0,i&&i.parseTwoDigitYear&&(D=i.parseTwoDigitYear);var m=c.prototype,M=m.parse;m.parse=function($){var v=$.date,x=$.utc,C=$.args;this.$u=x;var A=C[1];if(typeof A=="string"){var E=C[2]===!0,b=C[3]===!0,g=E||b,y=C[2];b&&(y=C[2]),a=this.$locale(),!E&&y&&(a=d.Ls[y]),this.$d=(function(I,j,P,N){try{if(["x","X"].indexOf(j)>-1)return new Date((j==="X"?1e3:1)*I);var Y=mt(j)(I),V=Y.year,O=Y.month,pt=Y.day,ht=Y.hours,Dt=Y.minutes,Yt=Y.seconds,yt=Y.milliseconds,Q=Y.zone,G=Y.week,R=new Date,B=pt||(V||O?1:R.getDate()),U=V||R.getFullYear(),_=0;V&&!O||(_=O>0?O-1:R.getMonth());var k,Z=ht||0,z=Dt||0,J=Yt||0,K=yt||0;return Q?new Date(Date.UTC(U,_,B,Z,z,J,K+60*Q.offset*1e3)):P?new Date(Date.UTC(U,_,B,Z,z,J,K)):(k=new Date(U,_,B,Z,z,J,K),G&&(k=N(k).week(G).toDate()),k)}catch{return new Date("")}})(v,A,x,d),this.init(),y&&y!==!0&&(this.$L=this.locale(y).$L),g&&v!=this.format(A)&&(this.$d=new Date("")),a={}}else if(A instanceof Array)for(var F=A.length,T=1;T<=F;T+=1){C[1]=A[T-1];var L=d.apply(this,C);if(L.isValid()){this.$d=L.$d,this.$L=L.$L,this.init();break}T===F&&(this.$d=new Date(""))}else M.call(this,$)}}}))})(H)),H.exports}var Ft=bt();const nt=Ct(Ft);h.extend(nt);function ot(t){if(!t)return null;if(t instanceof Date)return t;const e=h(t,"YYYY-MM-DD",!0);return e.isValid()?e.toDate():h(t).toDate()}function it(t){return t?typeof t=="string"?t:h(t).format("YYYY-MM-DD"):null}function st(t){return t?typeof t=="string"?t:h(t).toISOString():null}function Tt(t,e="DD/MM/YYYY"){return t?h(t).format(e):"—"}function wt(t){return t?h(t).format("DD/MM/YYYY HH:mm"):"—"}function w(t){return t.replace(/\D/g,"")}function at(t){if(!t)return"—";const e=w(t);return e.length!==11?t:e.replace(/^(\d{3})(\d{3})(\d{3})(\d{2})$/,"$1.$2.$3-$4")}function ut(t){if(!t)return"—";const e=w(t);return e.length!==14?t:e.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/,"$1.$2.$3/$4-$5")}function xt(t){if(!t)return"—";const e=w(t);return e.length===11?at(t):e.length===14?ut(t):t}function Et(t){if(!t)return"—";const e=w(t);return e.length===11?e.replace(/^(\d{2})(\d{5})(\d{4})$/,"($1) $2-$3"):e.length===10?e.replace(/^(\d{2})(\d{4})(\d{4})$/,"($1) $2-$3"):t}function ft(t){if(!t)return null;const e=w(t);if(e.length!==11)return"CPF deve ter 11 dígitos.";if(/^(\d)\1{10}$/.test(e))return"CPF inválido.";let s=0;for(let r=0;r<9;r++)s+=parseInt(e[r])*(10-r);let n=s%11;const f=n<2?0:11-n;if(parseInt(e[9])!==f)return"CPF inválido.";s=0;for(let r=0;r<10;r++)s+=parseInt(e[r])*(11-r);n=s%11;const u=n<2?0:11-n;return parseInt(e[10])!==u?"CPF inválido.":null}function ct(t){if(!t)return null;const e=w(t);if(e.length!==14)return"CNPJ deve ter 14 dígitos.";if(/^(\d)\1{13}$/.test(e))return"CNPJ inválido.";const s=[5,4,3,2,9,8,7,6,5,4,3,2];let n=0;for(let a=0;a<12;a++)n+=parseInt(e[a])*s[a];let f=n%11;const u=f<2?0:11-f;if(parseInt(e[12])!==u)return"CNPJ inválido.";const r=[6,5,4,3,2,9,8,7,6,5,4,3,2];n=0;for(let a=0;a<13;a++)n+=parseInt(e[a])*r[a];f=n%11;const l=f<2?0:11-f;return parseInt(e[13])!==l?"CNPJ inválido.":null}function Lt(t){if(!t)return null;const e=w(t);return e.length===11?ft(t):e.length===14?ct(t):"CPF deve ter 11 dígitos ou CNPJ deve ter 14 dígitos."}const q=new Map;function tt(t,e){const s=`${t}-${e}`;let n=q.get(s);return n||(n=new Intl.NumberFormat(t,{minimumFractionDigits:e,maximumFractionDigits:e}),q.set(s,n)),n}function Pt(t,e){const s=`${t}-${e}`;let n=q.get(s);return n||(n=new Intl.NumberFormat(t,{style:"currency",currency:e}),q.set(s,n)),n}function St(){const t=rt.inject(gt.W_CONFIG_KEY,{defaultPageSize:20,dateFormat:"DD/MM/YYYY",dateTimeFormat:"DD/MM/YYYY HH:mm",locale:"pt-BR",currency:"BRL"}),e=(t==null?void 0:t.locale)??"pt-BR",s=(t==null?void 0:t.currency)??"BRL";function n(a){return a==null?"—":Pt(e,s).format(a)}function f(a,D=2){return a==null?"—":tt(e,D).format(a)}function u(a,D){return Tt(a,D??(t==null?void 0:t.dateFormat)??"DD/MM/YYYY")}function r(a){return wt(a)}function l(a){return a==null?"—":`${tt(e,2).format(a)}%`}return{formatCurrency:n,formatNumber:f,formatDate:u,formatDateTime:r,formatPercent:l,formatCpf:at,formatCnpj:ut,formatCpfCnpj:xt,formatTelefone:Et,validateCpf:ft,validateCnpj:ct,validateCpfCnpj:Lt,parseDate:ot,toDateString:it,toDateTimeString:st}}function jt(){const t=Mt.useToast();function e(u,r="Sucesso"){t.add({severity:"success",summary:r,detail:u,life:3e3})}function s(u,r="Erro"){t.add({severity:"error",summary:r,detail:u,life:5e3})}function n(u,r="Atenção"){t.add({severity:"warn",summary:r,detail:u,life:4e3})}function f(u,r="Info"){t.add({severity:"info",summary:r,detail:u,life:3e3})}return{success:e,error:s,warn:n,info:f}}function vt(){const t=$t.useConfirm();function e(n,f="Deseja realmente excluir este registro?"){t.require({message:f,header:"Confirmar Exclusão",icon:"pi pi-trash",rejectLabel:"Cancelar",rejectProps:{severity:"secondary",text:!0},acceptLabel:"Excluir",acceptProps:{severity:"danger"},accept:n})}function s(n,f,u="Confirmação"){t.require({message:n,header:u,icon:"pi pi-question-circle",rejectLabel:"Cancelar",rejectProps:{severity:"secondary",text:!0},acceptLabel:"Confirmar",accept:f})}return{confirmDelete:e,confirmAction:s}}function It(t){return t.replace(/_/g," ").replace(/^\w/,e=>e.toUpperCase())}function Nt(t){if(typeof t=="string")return t;if(Array.isArray(t)){const e=t.filter(s=>typeof s=="string");return e.length>0?e.join(" "):null}if(typeof t=="object"&&t!==null){const e=t;if(Array.isArray(e.non_field_errors)&&e.non_field_errors.length>0)return e.non_field_errors.filter(n=>typeof n=="string").join(" ");const s=[];for(const[n,f]of Object.entries(e)){if(n==="non_field_errors")continue;const u=It(n);if(Array.isArray(f)){const r=f.filter(l=>typeof l=="string");r.length>0&&s.push(`${u}: ${r.join(" ")}`)}else typeof f=="string"&&s.push(`${u}: ${f}`)}return s.length>0?s.join(`
|
|
2
|
+
`):null}return null}function lt(t,e="Erro inesperado"){var u;if(!t||typeof t!="object")return e;const s=t,n=(u=s.response)==null?void 0:u.data;if(!n||typeof n!="object")return s.message||e;const f=n.detail??n;return Nt(f)||e}function Ot(){return{extractApiError:lt}}h.extend(nt);const _t="DD/MM/YYYY",kt="DD/MM/YYYY HH:mm",et="YYYY-MM-DD",Ht="YYYY-MM-DDTHH:mm:ss";function qt(t={}){const e=()=>{var o;return((o=t.showTime)==null?void 0:o.call(t))??!1},s=()=>e()?kt:_t,n=()=>e()?"##/##/#### ##:##":"##/##/####",f=()=>e()?"dd/mm/aaaa hh:mm":"dd/mm/aaaa";function u(o){if(o==null||o==="")return null;if(o instanceof Date)return isNaN(o.getTime())?null:o;if(typeof o=="string"){const p=h(o,et,!0);if(p.isValid())return p.toDate();const S=h(o);return S.isValid()?S.toDate():null}return null}function r(o){var p;return o?(((p=t.valueFormat)==null?void 0:p.call(t))??"iso")==="date"?o:h(o).format(e()?Ht:et):null}function l(o){return o?h(o).format(s()):""}function a(o){if(!o)return null;const p=h(o,s(),!0);return p.isValid()?p.toDate():null}function D(){return e()?new Date:h().startOf("day").toDate()}return{toDate:u,toValue:r,toDisplay:l,fromDisplay:a,today:D,mask:n,placeholder:f,displayFormat:s}}const Vt=['input:not([type="hidden"]):not([disabled])',"textarea:not([disabled])","select:not([disabled])","button:not([disabled])",'[tabindex]:not([tabindex="-1"])','[contenteditable="true"]'].join(", "),Rt=[".p-select-overlay",".p-autocomplete-overlay",".p-multiselect-overlay",".p-datepicker-panel",".p-cascadeselect-overlay",".p-treeselect-overlay"].join(", ");function Bt(t,e={}){const s=()=>e.enabled?e.enabled():!0;function n(){const r=t.value;return r?Array.from(r.querySelectorAll(Vt)).filter(l=>l.getClientRects().length>0&&!l.hasAttribute("data-kbd-skip")):[]}function f(){s()&&rt.nextTick(()=>{const r=n(),l=r.find(D=>D.tagName!=="BUTTON")??r[0];if(!l)return;l.focus();const a=l;if(typeof a.select=="function")try{a.select()}catch{}})}function u(r){var p;if(!s()||r.key!=="Enter"||r.isComposing)return;const l=r.target;if(l.tagName==="TEXTAREA"||l.tagName==="BUTTON"||l.getAttribute("aria-expanded")==="true"||document.querySelector(Rt))return;r.preventDefault();const a=n(),D=a.indexOf(l);if(D===-1)return;const o=a[D+1];o?o.focus():(p=e.onSubmit)==null||p.call(e)}return{focusFirst:f,handleKeydown:u}}exports.extractApiError=lt;exports.parseDate=ot;exports.stripMask=w;exports.toDateString=it;exports.toDateTimeString=st;exports.useApiError=Ot;exports.useAppConfirm=vt;exports.useAppToast=jt;exports.useDateInput=qt;exports.useFormKeyboardNav=Bt;exports.useFormatters=St;
|
|
3
|
+
//# sourceMappingURL=useFormKeyboardNav-D4Ow3k4Y.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormKeyboardNav-D4Ow3k4Y.cjs","sources":["../node_modules/dayjs/plugin/customParseFormat.js","../src/utils/dates.ts","../src/utils/masks.ts","../src/composables/useFormatters.ts","../src/composables/useAppToast.ts","../src/composables/useAppConfirm.ts","../src/composables/useApiError.ts","../src/composables/useDateInput.ts","../src/composables/useFormKeyboardNav.ts"],"sourcesContent":["!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\nexport function parseDate(value: string | Date | null | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return value\n const d = dayjs(value, 'YYYY-MM-DD', true)\n return d.isValid() ? d.toDate() : dayjs(value).toDate()\n}\n\nexport function toDateString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).format('YYYY-MM-DD')\n}\n\nexport function toDateTimeString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).toISOString()\n}\n\nexport function formatDateValue(\n value: string | Date | null | undefined,\n format = 'DD/MM/YYYY',\n): string {\n if (!value) return '—'\n return dayjs(value).format(format)\n}\n\nexport function formatDateTimeValue(value: string | Date | null | undefined): string {\n if (!value) return '—'\n return dayjs(value).format('DD/MM/YYYY HH:mm')\n}\n","export function stripMask(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\nexport function formatCpf(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 11) return value\n return digits.replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4')\n}\n\nexport function formatCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 14) return value\n return digits.replace(/^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$/, '$1.$2.$3/$4-$5')\n}\n\nexport function formatCpfCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return formatCpf(value)\n if (digits.length === 14) return formatCnpj(value)\n return value\n}\n\nexport function formatTelefone(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return digits.replace(/^(\\d{2})(\\d{5})(\\d{4})$/, '($1) $2-$3')\n if (digits.length === 10) return digits.replace(/^(\\d{2})(\\d{4})(\\d{4})$/, '($1) $2-$3')\n return value\n}\n\nexport function validateCpf(value: string | null | undefined): string | null {\n if (!value) return null\n const cpf = stripMask(value)\n if (cpf.length !== 11) return 'CPF deve ter 11 dígitos.'\n if (/^(\\d)\\1{10}$/.test(cpf)) return 'CPF inválido.'\n let soma = 0\n for (let i = 0; i < 9; i++) soma += parseInt(cpf[i]) * (10 - i)\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[9]) !== d1) return 'CPF inválido.'\n soma = 0\n for (let i = 0; i < 10; i++) soma += parseInt(cpf[i]) * (11 - i)\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[10]) !== d2) return 'CPF inválido.'\n return null\n}\n\nexport function validateCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const cnpj = stripMask(value)\n if (cnpj.length !== 14) return 'CNPJ deve ter 14 dígitos.'\n if (/^(\\d)\\1{13}$/.test(cnpj)) return 'CNPJ inválido.'\n const pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n let soma = 0\n for (let i = 0; i < 12; i++) soma += parseInt(cnpj[i]) * pesos1[i]\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[12]) !== d1) return 'CNPJ inválido.'\n const pesos2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n soma = 0\n for (let i = 0; i < 13; i++) soma += parseInt(cnpj[i]) * pesos2[i]\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[13]) !== d2) return 'CNPJ inválido.'\n return null\n}\n\nexport function validateCpfCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const digits = stripMask(value)\n if (digits.length === 11) return validateCpf(value)\n if (digits.length === 14) return validateCnpj(value)\n return 'CPF deve ter 11 dígitos ou CNPJ deve ter 14 dígitos.'\n}\n","import { inject } from 'vue'\nimport { W_CONFIG_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport {\n formatDateValue,\n formatDateTimeValue,\n parseDate,\n toDateString,\n toDateTimeString,\n} from '@/utils/dates'\nimport {\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n} from '@/utils/masks'\n\nconst numberFormatters = new Map<string, Intl.NumberFormat>()\n\nfunction getNumberFormatter(locale: string, decimals: number): Intl.NumberFormat {\n const key = `${locale}-${decimals}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nfunction getCurrencyFormatter(locale: string, currency: string): Intl.NumberFormat {\n const key = `${locale}-${currency}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nexport function useFormatters() {\n const config = inject<WPluginConfig>(W_CONFIG_KEY, {\n defaultPageSize: 20,\n dateFormat: 'DD/MM/YYYY',\n dateTimeFormat: 'DD/MM/YYYY HH:mm',\n locale: 'pt-BR',\n currency: 'BRL',\n } as WPluginConfig)\n\n const locale = config?.locale ?? 'pt-BR'\n const currencyCode = config?.currency ?? 'BRL'\n\n function formatCurrency(value: number | null | undefined): string {\n if (value == null) return '—'\n return getCurrencyFormatter(locale, currencyCode).format(value)\n }\n\n function formatNumber(value: number | null | undefined, decimals = 2): string {\n if (value == null) return '—'\n return getNumberFormatter(locale, decimals).format(value)\n }\n\n function formatDate(value: string | Date | null | undefined, format?: string): string {\n return formatDateValue(value, format ?? config?.dateFormat ?? 'DD/MM/YYYY')\n }\n\n function formatDateTime(value: string | Date | null | undefined): string {\n return formatDateTimeValue(value)\n }\n\n function formatPercent(value: number | null | undefined): string {\n if (value == null) return '—'\n return `${getNumberFormatter(locale, 2).format(value)}%`\n }\n\n return {\n formatCurrency,\n formatNumber,\n formatDate,\n formatDateTime,\n formatPercent,\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n parseDate,\n toDateString,\n toDateTimeString,\n }\n}\n","import { useToast } from 'primevue/usetoast'\n\nexport function useAppToast() {\n const toast = useToast()\n\n function success(message: string, title = 'Sucesso') {\n toast.add({ severity: 'success', summary: title, detail: message, life: 3000 })\n }\n\n function error(message: string, title = 'Erro') {\n toast.add({ severity: 'error', summary: title, detail: message, life: 5000 })\n }\n\n function warn(message: string, title = 'Atenção') {\n toast.add({ severity: 'warn', summary: title, detail: message, life: 4000 })\n }\n\n function info(message: string, title = 'Info') {\n toast.add({ severity: 'info', summary: title, detail: message, life: 3000 })\n }\n\n return { success, error, warn, info }\n}\n","import { useConfirm } from 'primevue/useconfirm'\n\nexport function useAppConfirm() {\n const confirm = useConfirm()\n\n function confirmDelete(\n onAccept: () => void,\n message = 'Deseja realmente excluir este registro?',\n ) {\n confirm.require({\n message,\n header: 'Confirmar Exclusão',\n icon: 'pi pi-trash',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Excluir',\n acceptProps: {\n severity: 'danger',\n },\n accept: onAccept,\n })\n }\n\n function confirmAction(message: string, onAccept: () => void, header = 'Confirmação') {\n confirm.require({\n message,\n header,\n icon: 'pi pi-question-circle',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Confirmar',\n accept: onAccept,\n })\n }\n\n return { confirmDelete, confirmAction }\n}\n","function formatFieldName(field: string): string {\n return field.replace(/_/g, ' ').replace(/^\\w/, (c) => c.toUpperCase())\n}\n\nfunction extractMessage(detail: unknown): string | null {\n if (typeof detail === 'string') {\n return detail\n }\n\n if (Array.isArray(detail)) {\n const messages = detail.filter((item) => typeof item === 'string')\n return messages.length > 0 ? messages.join(' ') : null\n }\n\n if (typeof detail === 'object' && detail !== null) {\n const obj = detail as Record<string, unknown>\n\n if (Array.isArray(obj.non_field_errors) && obj.non_field_errors.length > 0) {\n return obj.non_field_errors.filter((item: unknown) => typeof item === 'string').join(' ')\n }\n\n const messages: string[] = []\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'non_field_errors') continue\n const label = formatFieldName(key)\n if (Array.isArray(value)) {\n const strs = value.filter((item: unknown) => typeof item === 'string')\n if (strs.length > 0) messages.push(`${label}: ${strs.join(' ')}`)\n } else if (typeof value === 'string') {\n messages.push(`${label}: ${value}`)\n }\n }\n return messages.length > 0 ? messages.join('\\n') : null\n }\n\n return null\n}\n\nexport function extractApiError(error: unknown, fallback = 'Erro inesperado'): string {\n if (!error || typeof error !== 'object') return fallback\n\n const axiosError = error as {\n response?: { data?: Record<string, unknown> }\n message?: string\n }\n const data = axiosError.response?.data\n\n if (!data || typeof data !== 'object') {\n return axiosError.message || fallback\n }\n\n const detail = data.detail ?? data\n return extractMessage(detail) || fallback\n}\n\nexport function useApiError() {\n return { extractApiError }\n}\n","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\n/**\n * Formato do valor emitido pelo WDatePicker:\n * - `'iso'` → string `YYYY-MM-DD` (ou `YYYY-MM-DDTHH:mm:ss` com hora). Ideal p/ API.\n * - `'date'` → objeto `Date` (compatível com o contrato atual do useCrudManager).\n */\nexport type DateValueFormat = 'iso' | 'date'\n\nconst DISPLAY_DATE = 'DD/MM/YYYY'\nconst DISPLAY_DATETIME = 'DD/MM/YYYY HH:mm'\nconst ISO_DATE = 'YYYY-MM-DD'\nconst ISO_DATETIME = 'YYYY-MM-DDTHH:mm:ss'\n\nexport interface UseDateInputOptions {\n /** Reativo: se o campo inclui hora (datetime). */\n showTime?: () => boolean\n /** Reativo: formato do valor emitido (default `'iso'`). */\n valueFormat?: () => DateValueFormat\n}\n\n/**\n * Lógica pura de parse/format/máscara para inputs de data em pt-BR.\n *\n * Timezone-safe: parse e format usam sempre os componentes LOCAIS via dayjs\n * (nunca `toISOString`, que converte p/ UTC e causa off-by-one em fusos negativos).\n * Sem estado reativo próprio — apenas funções; o componente cuida da reatividade.\n */\nexport function useDateInput(opts: UseDateInputOptions = {}) {\n const withTime = () => opts.showTime?.() ?? false\n const displayFormat = () => (withTime() ? DISPLAY_DATETIME : DISPLAY_DATE)\n const mask = () => (withTime() ? '##/##/#### ##:##' : '##/##/####')\n const placeholder = () => (withTime() ? 'dd/mm/aaaa hh:mm' : 'dd/mm/aaaa')\n\n /** Valor de entrada (string ISO ou Date) → `Date` local, ou `null` se inválido. */\n function toDate(value: unknown): Date | null {\n if (value == null || value === '') return null\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value\n if (typeof value === 'string') {\n // Aceita YYYY-MM-DD estrito primeiro (data pura, meia-noite local)…\n const dateOnly = dayjs(value, ISO_DATE, true)\n if (dateOnly.isValid()) return dateOnly.toDate()\n // …senão qualquer ISO datetime válido (dayjs interpreta como local).\n const any = dayjs(value)\n return any.isValid() ? any.toDate() : null\n }\n return null\n }\n\n /** `Date` → valor emitido, respeitando `valueFormat` (default string ISO). */\n function toValue(date: Date | null): string | Date | null {\n if (!date) return null\n if ((opts.valueFormat?.() ?? 'iso') === 'date') return date\n return dayjs(date).format(withTime() ? ISO_DATETIME : ISO_DATE)\n }\n\n /** `Date` → texto de exibição `DD/MM/YYYY[ HH:mm]`. */\n function toDisplay(date: Date | null): string {\n if (!date) return ''\n return dayjs(date).format(displayFormat())\n }\n\n /** Texto digitado (`30/05/1988`) → `Date`, ou `null` se incompleto/inválido. */\n function fromDisplay(text: string): Date | null {\n if (!text) return null\n const d = dayjs(text, displayFormat(), true)\n return d.isValid() ? d.toDate() : null\n }\n\n /** Hoje: date-only zera a hora; datetime mantém a hora atual. */\n function today(): Date {\n return withTime() ? new Date() : dayjs().startOf('day').toDate()\n }\n\n return { toDate, toValue, toDisplay, fromDisplay, today, mask, placeholder, displayFormat }\n}\n","import { nextTick, type Ref } from 'vue'\n\n/**\n * Navegação por teclado em formulários, estilo aplicação desktop (DevExpress):\n * - `focusFirst()` posiciona o foco no primeiro campo ativo (e seleciona o texto).\n * - `handleKeydown` faz o Enter pular para o próximo campo, até o botão de salvar.\n *\n * Sem watchers nem addEventListener manual: o `handleKeydown` é bindado via\n * `@keydown` no container (o Vue gerencia o listener) e `focusFirst` é chamado\n * no `@show` do Dialog. Shift+Tab / Tab continuam nativos.\n *\n * Regras do Enter (para não atrapalhar a semântica de cada componente):\n * - `textarea` → Enter é quebra de linha (não pula).\n * - `button` → Enter é o clique/submit nativo (não pula).\n * - overlay de dropdown aberto (Select/AutoComplete/DatePicker/MultiSelect) →\n * Enter seleciona o item; só o Enter seguinte pula o foco.\n * - marque um elemento com `data-kbd-skip` para excluí-lo da sequência (ex.: o\n * botão Cancelar, para o Enter ir direto ao Salvar).\n */\n\n// Elementos que recebem foco por tabulação.\nconst FOCUSABLE = [\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(', ')\n\n// Painéis de dropdown do PrimeVue: quando presentes, o Enter deve selecionar.\nconst OPEN_OVERLAY = [\n '.p-select-overlay',\n '.p-autocomplete-overlay',\n '.p-multiselect-overlay',\n '.p-datepicker-panel',\n '.p-cascadeselect-overlay',\n '.p-treeselect-overlay',\n].join(', ')\n\nexport interface FormKeyboardNavOptions {\n /** Liga/desliga a navegação (default: sempre ligada). */\n enabled?: () => boolean\n /** Chamado quando o Enter passa do último elemento sem próximo foco. */\n onSubmit?: () => void\n}\n\nexport function useFormKeyboardNav(\n container: Ref<HTMLElement | null>,\n options: FormKeyboardNavOptions = {},\n) {\n const isEnabled = () => (options.enabled ? options.enabled() : true)\n\n function focusables(): HTMLElement[] {\n const root = container.value\n if (!root) return []\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getClientRects().length > 0 && !el.hasAttribute('data-kbd-skip'),\n )\n }\n\n function focusFirst(): void {\n if (!isEnabled()) return\n nextTick(() => {\n const els = focusables()\n const first = els.find((el) => el.tagName !== 'BUTTON') ?? els[0]\n if (!first) return\n first.focus()\n // Seleciona o conteúdo de inputs de texto para facilitar sobrescrever.\n const input = first as HTMLInputElement\n if (typeof input.select === 'function') {\n try {\n input.select()\n } catch {\n /* nem todo input suporta select() */\n }\n }\n })\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (!isEnabled() || e.key !== 'Enter' || e.isComposing) return\n const target = e.target as HTMLElement\n if (target.tagName === 'TEXTAREA' || target.tagName === 'BUTTON') return\n // Dropdown aberto → deixa o componente tratar o Enter (selecionar item).\n if (target.getAttribute('aria-expanded') === 'true') return\n if (document.querySelector(OPEN_OVERLAY)) return\n\n e.preventDefault()\n const els = focusables()\n const i = els.indexOf(target)\n if (i === -1) return\n const next = els[i + 1]\n if (next) next.focus()\n else options.onSubmit?.()\n }\n\n return { focusFirst, handleKeydown }\n}\n"],"names":["e","t","module","this","n","r","i","o","s","a","f","h","u","d","c","l","m","M","Y","p","v","D","w","g","y","L","dayjs","customParseFormat","parseDate","value","toDateString","toDateTimeString","formatDateValue","format","formatDateTimeValue","stripMask","formatCpf","digits","formatCnpj","formatCpfCnpj","formatTelefone","validateCpf","cpf","soma","resto","d1","d2","validateCnpj","cnpj","pesos1","pesos2","validateCpfCnpj","numberFormatters","getNumberFormatter","locale","decimals","key","fmt","getCurrencyFormatter","currency","useFormatters","config","inject","W_CONFIG_KEY","currencyCode","formatCurrency","formatNumber","formatDate","formatDateTime","formatPercent","useAppToast","toast","useToast","success","message","title","error","warn","info","useAppConfirm","confirm","useConfirm","confirmDelete","onAccept","confirmAction","header","formatFieldName","field","extractMessage","detail","messages","item","obj","label","strs","extractApiError","fallback","axiosError","data","_a","useApiError","DISPLAY_DATE","DISPLAY_DATETIME","ISO_DATE","ISO_DATETIME","useDateInput","opts","withTime","displayFormat","mask","placeholder","toDate","dateOnly","any","toValue","date","toDisplay","fromDisplay","text","today","FOCUSABLE","OPEN_OVERLAY","useFormKeyboardNav","container","options","isEnabled","focusables","root","el","focusFirst","nextTick","els","first","input","handleKeydown","target","next"],"mappings":"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","x_google_ignoreList":[0]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wgalleti/primevue-components",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -8,8 +8,13 @@
|
|
|
8
8
|
"registry": "https://registry.npmjs.org/"
|
|
9
9
|
},
|
|
10
10
|
"packageManager": "yarn@1.22.22",
|
|
11
|
+
"bin": {
|
|
12
|
+
"wpvc": "bin/wpvc.mjs"
|
|
13
|
+
},
|
|
11
14
|
"files": [
|
|
12
|
-
"dist"
|
|
15
|
+
"dist",
|
|
16
|
+
"bin",
|
|
17
|
+
"skill"
|
|
13
18
|
],
|
|
14
19
|
"main": "./dist/index.cjs",
|
|
15
20
|
"module": "./dist/index.js",
|
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wpvc
|
|
3
|
+
description: "Use when working in an app that consumes @wgalleti/primevue-components (Vue 3 + PrimeVue 4) — first-time setup, building CRUD screens/forms with useCrudManager + FieldDef, using the W* components (WCrudView, WFormRenderer, WDatePicker, WAutoCompleteFK, WMoneyInput...), or migrating ad-hoc date/form/table code to the library. Trigger on tasks like 'add a CRUD', 'novo cadastro', 'formulário', 'campo de data', 'substituir DatePicker'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# wPrimeVueComponents (wpvc)
|
|
7
|
+
|
|
8
|
+
Biblioteca interna de componentes **Vue 3 + PrimeVue 4** para CRUD, formulários e UI padronizada em pt-BR. O objetivo é escrever telas por **configuração** (`ColumnDef`/`FieldDef`), não por composição manual de inputs.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Setup inicial da lib num app novo (plugin, dataProvider, CSS).
|
|
13
|
+
- Criar uma tela de CRUD, um formulário, ou um campo específico (data, FK, moeda).
|
|
14
|
+
- Migrar código ad-hoc (DatePicker solto, tabela manual, helpers copiados) para os componentes W*.
|
|
15
|
+
|
|
16
|
+
## Regra de ouro
|
|
17
|
+
|
|
18
|
+
1. **Não componha inputs à mão.** Descreva a tela com `useCrudManager({ endpoint, columns, form })` + `<WCrudView>`, ou `FieldDef[]` + `<WFormRenderer>`.
|
|
19
|
+
2. **axios/dataProvider vêm do plugin** (injetados). Nunca crie instância axios dentro da tela nem importe axios direto.
|
|
20
|
+
3. **Endpoints são strings**; a resposta paginada esperada é `{ data, page, page_size, rows }`.
|
|
21
|
+
4. **Datas**: use `WDatePicker` (v-model string `YYYY-MM-DD`). Nunca `parseDate`/`toISOString` à mão.
|
|
22
|
+
5. Antes de inventar prop, confirme a API nos tipos publicados: `node_modules/@wgalleti/primevue-components/dist/*.d.ts` (`FieldDef`, `ColumnDef`, `CrudManagerConfig`, props dos componentes).
|
|
23
|
+
|
|
24
|
+
## Fluxo rápido
|
|
25
|
+
|
|
26
|
+
**Setup** (uma vez por projeto) → `references/setup.md`. Ou rode `npx @wgalleti/primevue-components init`.
|
|
27
|
+
|
|
28
|
+
**CRUD completo** (tabela + form + toast + confirm):
|
|
29
|
+
|
|
30
|
+
```vue
|
|
31
|
+
<script setup lang="ts">
|
|
32
|
+
import { useCrudManager, WCrudView } from '@wgalleti/primevue-components'
|
|
33
|
+
import type { ColumnDef, FieldDef } from '@wgalleti/primevue-components'
|
|
34
|
+
|
|
35
|
+
const columns: ColumnDef[] = [
|
|
36
|
+
{ field: 'nome', header: 'Nome' },
|
|
37
|
+
{ field: 'preco', header: 'Preço', type: 'currency' },
|
|
38
|
+
{ field: 'data', header: 'Data', type: 'date' },
|
|
39
|
+
]
|
|
40
|
+
const form: FieldDef[] = [
|
|
41
|
+
{ field: 'nome', label: 'Nome', required: true },
|
|
42
|
+
{ field: 'preco', label: 'Preço', type: 'currency', colSpan: 0.5 },
|
|
43
|
+
{ field: 'data', label: 'Data', type: 'date', autonow: true, colSpan: 0.5 },
|
|
44
|
+
]
|
|
45
|
+
const crud = useCrudManager({ endpoint: '/api/v1/produtos/', columns, form })
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<template>
|
|
49
|
+
<WCrudView :crud="crud" title="Produtos" />
|
|
50
|
+
</template>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Detalhes de `useCrudManager`, `ColumnDef`, `FieldDef` (todos os tipos e props): `references/crud.md`.
|
|
54
|
+
|
|
55
|
+
**Formulário standalone** (sem dialog, dentro de Card/Dialog seu): `WFormRenderer` com `FieldDef[]` — ver `references/crud.md`.
|
|
56
|
+
|
|
57
|
+
**Campos específicos e componentes W*** (WDatePicker, WAutoCompleteFK, WMoneyInput, WTransferList, UI): `references/components.md`.
|
|
58
|
+
|
|
59
|
+
**Migrar código existente** (DatePicker→WDatePicker, tabela manual→WCrudView, apagar helpers copiados): `references/migration.md`.
|
|
60
|
+
|
|
61
|
+
## Gotchas (leia antes de debugar)
|
|
62
|
+
|
|
63
|
+
- Registre o `WPrimeVuePlugin` **depois** de `PrimeVue`, `ToastService` e `ConfirmationService` — os componentes usam Toast/Confirm.
|
|
64
|
+
- O `axios` passado ao plugin deve já ter `baseURL` e auth configurados.
|
|
65
|
+
- Importe o CSS **uma vez**: `import '@wgalleti/primevue-components/style.css'`.
|
|
66
|
+
- "No PrimeVue Toast provided" / inject quebrado em **monorepo com a lib aliased pra source**: adicione `resolve.dedupe: ['vue', 'primevue']` no `vite.config`. (Instalação normal via npm não precisa.)
|
|
67
|
+
- Resposta da API precisa ser `{ data, page, page_size, rows }`. Erros no formato DRF (`{ detail }`, `{ campo: [erros] }`).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Componentes W* (uso standalone)
|
|
2
|
+
|
|
3
|
+
Todos têm defaults sensatos e slots para override. Props completas nos `.d.ts` / `docs/`.
|
|
4
|
+
|
|
5
|
+
## WDatePicker — data pt-BR
|
|
6
|
+
|
|
7
|
+
`v-model` é **string `YYYY-MM-DD`** (ideal p/ API DRF). Exibe `DD/MM/YYYY`.
|
|
8
|
+
|
|
9
|
+
```vue
|
|
10
|
+
<WDatePicker v-model="data" /> <!-- emit: '2026-07-22' -->
|
|
11
|
+
<WDatePicker v-model="dataHora" show-time /> <!-- emit: '2026-07-22T09:30:00' -->
|
|
12
|
+
<WDatePicker v-model="d" autonow /> <!-- null → hoje no mount -->
|
|
13
|
+
<WDatePicker v-model="d" min-date="2024-01-01" max-date="2024-12-31" />
|
|
14
|
+
<WDatePicker v-model="dt" value-format="date" /> <!-- emite Date em vez de string -->
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- Digitação direta com máscara: `30051988` vira `30/05/1988`.
|
|
18
|
+
- Ícone de calendário abre o seletor (**Hoje** / **Limpar**).
|
|
19
|
+
- **F2** preenche a data de hoje.
|
|
20
|
+
- Timezone-safe (usa dayjs local; não tem o bug de `toISOString` em UTC).
|
|
21
|
+
- Props: `valueFormat` (`'iso'` | `'date'`), `showTime`, `autonow`, `minDate`, `maxDate`, `disabled`, `showClear`, `placeholder`, `invalid`, `inputId`.
|
|
22
|
+
|
|
23
|
+
## WAutoCompleteFK — seletor de FK com busca
|
|
24
|
+
|
|
25
|
+
Autocomplete inline + modal de pesquisa (tabela paginada, CRUD embutido opcional).
|
|
26
|
+
|
|
27
|
+
```vue
|
|
28
|
+
<WAutoCompleteFK
|
|
29
|
+
v-model="categoria"
|
|
30
|
+
endpoint="/api/v1/categorias/"
|
|
31
|
+
option-label="nome"
|
|
32
|
+
/>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- **F2** abre o modal de busca (foco na pesquisa). Enter vazio → grid; Espaço marca; Enter confirma. Enter com texto → pesquisa; próximo Enter → grid.
|
|
36
|
+
- Cascata (filtra por outro campo): prop `drilldown` no componente standalone; via `FieldDef { type: 'fk' }` o mesmo se declara com **`dependsOn`**.
|
|
37
|
+
- `canCreate`/`canEdit`/`canDelete` + `crudFields`/`crudColumns` habilitam CRUD dentro do modal.
|
|
38
|
+
|
|
39
|
+
## Outros de formulário
|
|
40
|
+
|
|
41
|
+
- **WMoneyInput** — entrada de moeda preenchida da direita (estilo POS/calculadora). Também disponível via `FieldDef { type: 'currency', fillFromRight: true }`.
|
|
42
|
+
- **WTransferList** — dupla lista (disponíveis ↔ selecionados). Via `FieldDef { type: 'transfer' }`.
|
|
43
|
+
- **WDateRange** — intervalo de datas (`v-model` = `[início, fim]` como `Date[]`).
|
|
44
|
+
|
|
45
|
+
## UI (layout/apresentação)
|
|
46
|
+
|
|
47
|
+
`WPageHeader`, `WDetailHeader`, `WSectionHeader`, `WFormSection`, `WActionBar`, `WEmptyState`, `WStatusTag` (mapeia status→cor/label), `WInfoCard`, `WKpiCard`/`WKpiGrid`, `WProgressFlow`. Use-os para padronizar cabeçalhos, KPIs e estados vazios em vez de montar com Tailwind cru.
|
|
48
|
+
|
|
49
|
+
## Composables úteis
|
|
50
|
+
|
|
51
|
+
`useCrudManager`, `useFormatters` (moeda/data/CPF/CNPJ/tel BR), `useDateInput` (parse/format/máscara de data, sem watchers), `useAppToast`, `useAppConfirm`, `useApiError`/`extractApiError`, `useApi`.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# CRUD e Formulários — useCrudManager, WCrudView, WFormRenderer
|
|
2
|
+
|
|
3
|
+
Fonte da verdade dos tipos: `CrudManagerConfig`, `ColumnDef`, `FieldDef` (em `@wgalleti/primevue-components` — os `.d.ts` estão em `node_modules`). Consulte antes de inventar prop.
|
|
4
|
+
|
|
5
|
+
## useCrudManager + WCrudView
|
|
6
|
+
|
|
7
|
+
`useCrudManager(config)` centraliza **todas** as interações de dados (lista, paginação, busca, ordenação, create/update/delete, toasts, confirm). Retorna um objeto `crud` que você passa para `<WCrudView :crud="crud">`.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
const crud = useCrudManager<Produto>({
|
|
11
|
+
endpoint: '/api/v1/produtos/', // string; usa o dataProvider injetado
|
|
12
|
+
columns, // ColumnDef[] — a tabela
|
|
13
|
+
form, // FieldDef[] — o formulário do dialog
|
|
14
|
+
pageSize: 10, // opcional
|
|
15
|
+
// --- opt-in de config (todos aditivos) ---
|
|
16
|
+
keyboardNav: true, // foco no 1º campo + Enter pula p/ próximo (estilo desktop)
|
|
17
|
+
editMode: 'cell', // edição inline por célula (default: 'dialog')
|
|
18
|
+
selectionMode: 'multiple', // seleção múltipla → habilita bulkActions
|
|
19
|
+
// outros: pk, formColumns, searchDebounce, partialUpdate, refetchOnSave,
|
|
20
|
+
// canCreate/canEdit/canDelete, rowActions, bulkActions, filterParams,
|
|
21
|
+
// transformPayload, createDefaults, onAfterSave, onAfterDelete, labels.
|
|
22
|
+
// Confirme no tipo CrudManagerConfig.
|
|
23
|
+
})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Retornos úteis do `crud` (além de alimentar o WCrudView): `selectedItems`, `clearSelection`, `columnFilters`, `setColumnFilter`, `clearColumnFilters`, `updateField`, `refresh`, `fetchAll`. Confirme no tipo `CrudManagerReturn`.
|
|
27
|
+
|
|
28
|
+
`<WCrudView>` aceita `title`, `subtitle`, `dialog-width`, e **slots** para sobrescrever qualquer seção (toolbar, ações de linha, etc.).
|
|
29
|
+
|
|
30
|
+
## ColumnDef (tabela)
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
{ field: 'preco', header: 'Preço', type: 'currency', align: 'right', sortable: true, style: 'width: 8rem' }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`type`: `text | boolean | date | datetime | number | currency | image | custom`. Sem `type` → texto cru. Para célula custom, use `type: 'custom'` + slot, ou `WCrudColumnRenderer`.
|
|
37
|
+
|
|
38
|
+
Outros campos: `format(value, row) => string` (render próprio), `visible`, `decimals`, `tagValue`/`tagSeverity` (renderiza como tag), e **`filter`** — filtro declarativo por coluna que aparece na barra de filtros e vai como parâmetro no `list`:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
{ field: 'status', header: 'Status', filter: { type: 'select', options: [
|
|
42
|
+
{ label: 'Ativo', value: 'A' }, { label: 'Inativo', value: 'I' },
|
|
43
|
+
] } }
|
|
44
|
+
```
|
|
45
|
+
`filter.type`: `text | select | boolean | numeric`. Sem `param`, usa o `field`.
|
|
46
|
+
|
|
47
|
+
## FieldDef (formulário)
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
{
|
|
51
|
+
field: 'categoria', label: 'Categoria', type: 'fk',
|
|
52
|
+
endpoint: '/api/v1/categorias/', optionLabel: 'nome',
|
|
53
|
+
required: true, colSpan: 0.5,
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Campos comuns: `field`, `label`, `type`, `required`, `colSpan` (`'full'` | `0.5` | inteiro), `defaultValue`, `disabled` (bool | fn), `visible` (bool | fn), `placeholder`, `validate(v) => string|null`, `autofocus`.
|
|
58
|
+
|
|
59
|
+
`type` (FieldType): `text · email · password · number · currency · date · datetime · select · autocomplete · fk · switch · textarea · color · cpf_cnpj · mask · image · cep · transfer`.
|
|
60
|
+
|
|
61
|
+
Props por tipo:
|
|
62
|
+
- **select/autocomplete/transfer**: `options` (array ou `Ref`), `optionLabel`, `optionValue`, `showClear`, `searchFields`.
|
|
63
|
+
- **fk**: `endpoint`, `endpointParams`, `dependsOn` (cascata/drill-down), `blockedPlaceholder`, `crudFields`/`crudColumns` (CRUD dentro do modal).
|
|
64
|
+
- **number/currency**: `min`, `max`, `minFractionDigits`, `maxFractionDigits`, `prefix`, `suffix`, `fillFromRight` (moeda estilo POS), `decimals`.
|
|
65
|
+
- **date/datetime**: `autonow` (preenche hoje no mount se null), `minDate`, `maxDate`, `dateFormat`, `hourFormat`.
|
|
66
|
+
- **mask**: `mask`. **textarea**: `rows`. **cep**: `cepFields` (auto-preenche endereço via ViaCEP).
|
|
67
|
+
- **fieldGroup**: `{ id, title, description?, order?, columns? }` agrupa campos numa seção titulada.
|
|
68
|
+
|
|
69
|
+
## WFormRenderer (form standalone, sem dialog)
|
|
70
|
+
|
|
71
|
+
Para telas complexas (Cards, dialogs próprios) use `WFormRenderer` diretamente:
|
|
72
|
+
|
|
73
|
+
```vue
|
|
74
|
+
<WFormRenderer
|
|
75
|
+
:fields="meusCampos"
|
|
76
|
+
:form-data="form"
|
|
77
|
+
:is-editing="false"
|
|
78
|
+
:columns="2"
|
|
79
|
+
@update:field="(f, v) => (form[f] = v)"
|
|
80
|
+
/>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Schemas de `FieldDef[]` devem ser **centralizados** em arquivos (ex.: `src/schemas/**`), reaproveitados entre o WCrudView e o WFormRenderer.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Migração — trocar código ad-hoc pelos componentes W*
|
|
2
|
+
|
|
3
|
+
Regra: cada trecho migrado deve **remover** código copiado (helpers de data, tabela manual, adaptadores de valor), não só adicionar.
|
|
4
|
+
|
|
5
|
+
## 1. DatePicker solto → WDatePicker
|
|
6
|
+
|
|
7
|
+
O padrão mais comum: `PrimeVue DatePicker` com adaptador string↔Date copiado em vários arquivos (`parseDate` / `formatValue` via `toISOString`). Isso tem **bug de timezone** (off-by-one em fuso negativo).
|
|
8
|
+
|
|
9
|
+
**Antes:**
|
|
10
|
+
```vue
|
|
11
|
+
<DatePicker
|
|
12
|
+
:model-value="parseDate(form.data_emissao)"
|
|
13
|
+
date-format="dd/mm/yy"
|
|
14
|
+
show-button-bar
|
|
15
|
+
@update:model-value="(d) => (form.data_emissao = formatValue(d))"
|
|
16
|
+
/>
|
|
17
|
+
```
|
|
18
|
+
```js
|
|
19
|
+
// helper copiado em ~N arquivos
|
|
20
|
+
const parseDate = (s) => (s ? new Date(`${s}T00:00:00`) : null)
|
|
21
|
+
const formatValue = (d) => (d ? d.toISOString().split('T')[0] : null) // ⚠️ UTC
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Depois:**
|
|
25
|
+
```vue
|
|
26
|
+
<WDatePicker v-model="form.data_emissao" />
|
|
27
|
+
```
|
|
28
|
+
- `v-model` já é `YYYY-MM-DD`. **Apague** `parseDate`/`formatValue` do arquivo.
|
|
29
|
+
- Datetime: `show-time`. Range (De/Até): `WDateRange`.
|
|
30
|
+
|
|
31
|
+
## 2. Tabela + dialog manual → useCrudManager + WCrudView
|
|
32
|
+
|
|
33
|
+
Telas que fazem `axios.get` + `<DataTable>` + dialog de form na mão viram configuração:
|
|
34
|
+
|
|
35
|
+
**Depois:**
|
|
36
|
+
```ts
|
|
37
|
+
const crud = useCrudManager({ endpoint: '/api/v1/notas/', columns, form })
|
|
38
|
+
```
|
|
39
|
+
```vue
|
|
40
|
+
<WCrudView :crud="crud" title="Notas Fiscais" />
|
|
41
|
+
```
|
|
42
|
+
Remova: fetch/paginação/busca manuais, estado de dialog, chamadas de create/update/delete, toasts e confirm — tudo passa a vir do composable.
|
|
43
|
+
|
|
44
|
+
## 3. Form dentro de Card/Dialog próprio → WFormRenderer
|
|
45
|
+
|
|
46
|
+
Mantém seu layout, troca os inputs manuais por `FieldDef[]` + `<WFormRenderer>`. Centralize o schema em `src/schemas/**` e reaproveite.
|
|
47
|
+
|
|
48
|
+
## 4. Validação de data/obrigatório
|
|
49
|
+
|
|
50
|
+
Não valide data na mão. Use `FieldDef.required` + `validate(v)`; o `WDatePicker`/`WFormRenderer` já tratam estado inválido e o `*` de obrigatório.
|
|
51
|
+
|
|
52
|
+
## Checklist por tela migrada
|
|
53
|
+
|
|
54
|
+
- [ ] Removidos os helpers de data copiados do arquivo.
|
|
55
|
+
- [ ] `v-model` das datas é string `YYYY-MM-DD` (ou `Date` só se a API exigir — raro).
|
|
56
|
+
- [ ] Fetch/CRUD manual substituído por `useCrudManager` quando for tabela+form.
|
|
57
|
+
- [ ] Schema de `FieldDef[]` centralizado, não inline duplicado.
|
|
58
|
+
- [ ] `yarn build` / `type-check` do app passam.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Setup — @wgalleti/primevue-components
|
|
2
|
+
|
|
3
|
+
Automatize com `npx @wgalleti/primevue-components init` (registra o plugin, importa o CSS, copia esta skill). Ou siga manualmente:
|
|
4
|
+
|
|
5
|
+
## 1. Dependências
|
|
6
|
+
|
|
7
|
+
Peers (o app precisa ter): `vue ^3.4`, `primevue ^4`, `axios ^1`, `dayjs ^1.11`.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
yarn add @wgalleti/primevue-components@git+https://github.com/wgalleti/wPrimeVueComponents.git
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Fixar versão: sufixo `#v0.8.1`.
|
|
14
|
+
|
|
15
|
+
## 2. main.ts
|
|
16
|
+
|
|
17
|
+
Ordem importa — o plugin da lib vai **por último**:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { createApp } from 'vue'
|
|
21
|
+
import PrimeVue from 'primevue/config'
|
|
22
|
+
import ToastService from 'primevue/toastservice'
|
|
23
|
+
import ConfirmationService from 'primevue/confirmationservice'
|
|
24
|
+
import { WPrimeVuePlugin } from '@wgalleti/primevue-components'
|
|
25
|
+
import '@wgalleti/primevue-components/style.css'
|
|
26
|
+
import api from './plugins/axios' // sua instância axios (baseURL + auth já configurados)
|
|
27
|
+
import App from './App.vue'
|
|
28
|
+
|
|
29
|
+
const app = createApp(App)
|
|
30
|
+
|
|
31
|
+
app.use(PrimeVue /*, { unstyled: true, ... } conforme seu tema */)
|
|
32
|
+
app.use(ToastService)
|
|
33
|
+
app.use(ConfirmationService)
|
|
34
|
+
|
|
35
|
+
app.use(WPrimeVuePlugin, {
|
|
36
|
+
axios: api, // cria um dataProvider Axios automaticamente
|
|
37
|
+
defaultPageSize: 20, // opcional
|
|
38
|
+
dateFormat: 'DD/MM/YYYY', // opcional
|
|
39
|
+
dateTimeFormat: 'DD/MM/YYYY HH:mm', // opcional
|
|
40
|
+
locale: 'pt-BR', // opcional
|
|
41
|
+
currency: 'BRL', // opcional
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
app.mount('#app')
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Alternativa: Supabase (sem REST)
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { createSupabaseDataProvider, WPrimeVuePlugin } from '@wgalleti/primevue-components'
|
|
51
|
+
import { supabase } from './plugins/supabase'
|
|
52
|
+
|
|
53
|
+
const dataProvider = createSupabaseDataProvider({
|
|
54
|
+
client: supabase,
|
|
55
|
+
resources: {
|
|
56
|
+
produtos: { table: 'produtos', searchFields: ['nome'], defaultOrdering: 'nome', softDelete: true },
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
app.use(WPrimeVuePlugin, { dataProvider })
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 3. Contrato da API
|
|
63
|
+
|
|
64
|
+
- Lista paginada: `{ data: T[], page: number, page_size: number, rows: number }`.
|
|
65
|
+
- Erros DRF: `{ detail: string }`, `{ campo: [erros] }`, ou string.
|
|
66
|
+
- Datas: `DateField` recebe/retorna `YYYY-MM-DD`; `DateTimeField` aceita ISO-8601 (`2026-07-22T09:49:00`, com ou sem `Z`/offset).
|
|
67
|
+
|
|
68
|
+
## 4. Verificação
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { WCrudView, useCrudManager } from '@wgalleti/primevue-components'
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Se os tipos e o CSS resolverem, está pronto.
|