@wgalleti/primevue-components 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DWs-ZSNZ.cjs +28 -0
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DWs-ZSNZ.cjs.map +1 -0
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DvyxNL4O.js +6544 -0
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DvyxNL4O.js.map +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/ui/WDialog.vue.d.ts +15 -0
- package/dist/components/ui/WMapSelect.vue.d.ts +7 -1
- package/dist/components/ui/WTabNav.vue.d.ts +56 -0
- package/dist/components/ui/WTabPane.d.ts +53 -0
- package/dist/components/ui/WTabViewport.vue.d.ts +14 -0
- package/dist/components.cjs +1 -1
- package/dist/components.js +28 -25
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/useRouteTabs.d.ts +2 -0
- package/dist/composables.cjs +1 -1
- package/dist/composables.cjs.map +1 -1
- package/dist/composables.js +11 -10
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +127 -120
- package/dist/index.js.map +1 -1
- package/dist/labels-B28P8JNB.js +19 -0
- package/dist/labels-B28P8JNB.js.map +1 -0
- package/dist/labels-pNskxXcl.cjs +2 -0
- package/dist/labels-pNskxXcl.cjs.map +1 -0
- package/dist/plugin-CIBvOgwG.js +14 -0
- package/dist/plugin-CIBvOgwG.js.map +1 -0
- package/dist/plugin-D2IZHyBm.cjs +2 -0
- package/dist/plugin-D2IZHyBm.cjs.map +1 -0
- package/dist/primevue-components.css +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/mapSelect.d.ts +10 -0
- package/dist/types/routeTabs.d.ts +129 -0
- package/dist/types.cjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.js +8 -20
- package/dist/types.js.map +1 -1
- package/dist/useFormKeyboardNav-BgBAe0C7.cjs +3 -0
- package/dist/useFormKeyboardNav-BgBAe0C7.cjs.map +1 -0
- package/dist/{useFormKeyboardNav-D4Irq5RE.js → useFormKeyboardNav-BrKZrHq9.js} +180 -178
- package/dist/useFormKeyboardNav-BrKZrHq9.js.map +1 -0
- package/dist/useRouteTabs-CSo1j_ji.js +762 -0
- package/dist/useRouteTabs-CSo1j_ji.js.map +1 -0
- package/dist/useRouteTabs-VGx93R83.cjs +2 -0
- package/dist/useRouteTabs-VGx93R83.cjs.map +1 -0
- package/package.json +1 -1
- package/skill/references/components.md +28 -0
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-Cx3AJma_.js +0 -6296
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-Cx3AJma_.js.map +0 -1
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DX-6iLgb.cjs +0 -36
- package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DX-6iLgb.cjs.map +0 -1
- package/dist/plugin-BKa0eSEM.js +0 -7
- package/dist/plugin-BKa0eSEM.js.map +0 -1
- package/dist/plugin-D1YvyKXX.cjs +0 -2
- package/dist/plugin-D1YvyKXX.cjs.map +0 -1
- package/dist/useApi-BM5JpPDe.js +0 -539
- package/dist/useApi-BM5JpPDe.js.map +0 -1
- package/dist/useApi-CPt3Tj4n.cjs +0 -2
- package/dist/useApi-CPt3Tj4n.cjs.map +0 -1
- package/dist/useFormKeyboardNav-D4Irq5RE.js.map +0 -1
- package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs +0 -3
- package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useApi-BM5JpPDe.js","sources":["../src/utils/formRecord.ts","../src/composables/useCrudManager.ts","../src/composables/useSubviewCrud.ts","../src/composables/useApi.ts"],"sourcesContent":["/**\n * Regras de formulário que independem de onde o registro é gravado.\n *\n * Nasceram dentro do `useCrudManager` (que grava numa API) e saíram para cá quando o\n * `useSubviewCrud` passou a precisar das mesmas: um form é um form, o destino do\n * payload é que muda. Manter uma cópia em cada manager faria as duas divergirem no\n * primeiro `FieldType` novo.\n */\nimport type { FieldDef } from '@/types/field'\nimport { parseDate, toDateString, toDateTimeString } from './dates'\nimport { stripMask } from './masks'\n\n/** Valor inicial de cada campo: `defaultValue` (avaliado, se função) ou `null`. */\nexport function getFieldDefaults(fields: FieldDef[]): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of fields) {\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/**\n * Lê um registro existente para dentro do form.\n *\n * Data vem do servidor como string e o `WDatePicker` trabalha com `Date` — por isso a\n * volta por `parseDate`. Devolve o snapshot dos valores carregados, que o chamador usa\n * como base do diff quando quiser mandar só o que mudou.\n */\nexport function loadItemIntoRecord(\n item: Record<string, unknown>,\n fields: FieldDef[],\n target: Record<string, unknown>,\n): Record<string, unknown> {\n const snapshot: Record<string, unknown> = {}\n for (const f of fields) {\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 target[f.field] = value\n snapshot[f.field] = value\n }\n return snapshot\n}\n\n/**\n * Converte o form no registro que vai ser gravado: data vira string, FK vira id, campo\n * mascarado perde a máscara. Devolve objeto novo — o form não é tocado.\n */\nexport function convertFormRecord(\n record: Record<string, unknown>,\n fields: FieldDef[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...record }\n for (const f of fields) {\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 gravar 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/**\n * Primeira mensagem de erro do form, ou `null` se está tudo certo.\n *\n * A ordem importa: o `validate` do campo vence a obrigatoriedade, para a mensagem\n * específica (\"CNPJ inválido\") aparecer no lugar da genérica.\n */\nexport function validateFormRecord(\n fields: FieldDef[],\n formData: Record<string, unknown>,\n): string | null {\n for (const f of fields) {\n if (f.validate) {\n const result = f.validate(formData[f.field])\n if (result) return result\n }\n if (f.required) {\n const val = formData[f.field]\n if (val === null || val === undefined || val === '') {\n return `${f.label} é obrigatório`\n }\n }\n }\n return null\n}\n","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 {\n convertFormRecord,\n getFieldDefaults,\n loadItemIntoRecord,\n validateFormRecord,\n} from '@/utils/formRecord'\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 fetchDetailOnEdit = false,\n filterParams = undefined,\n createDefaults = undefined,\n transformItems = undefined,\n transformPayload = undefined,\n onAfterSave = undefined,\n onAfterDelete = undefined,\n } = config\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.',\n )\n }\n const provider = dataProvider\n\n const pluginConfig = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = config.pageSize ?? pluginConfig?.defaultPageSize ?? 20\n\n const labels: CrudLabels = { ...DEFAULT_CRUD_LABELS, ...config.labels }\n const toast = useAppToast()\n const { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const selectedItems = ref<T[]>([]) as import('vue').Ref<T[]>\n const extras = ref<Record<string, unknown>>({})\n const loading = ref(false)\n // Contador de sequência de fetch — descarta respostas de list() fora de ordem.\n let fetchSeq = 0\n const saving = ref(false)\n const search = ref('')\n const dialogVisible = ref(false)\n const viewMode = ref(false)\n const editingItem = ref<T | null>(null) as import('vue').Ref<T | null>\n const formData = reactive<Record<string, unknown>>({})\n // Snapshot of the form values when an edit dialog opens — used for diff-based PATCH.\n let editingOriginal: Record<string, unknown> | null = null\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Filtros de coluna ativos (param → valor). Persistem entre páginas/ordenação.\n const columnFilters = reactive<Record<string, unknown>>({})\n\n // ---------------------------------------------------------------------------\n // Defaults\n // ---------------------------------------------------------------------------\n\n function getDefaults(): Record<string, unknown> {\n return getFieldDefaults(formFields)\n }\n\n // Initialize\n const defaults = getDefaults()\n for (const key of Object.keys(defaults)) {\n formData[key] = defaults[key]\n }\n\n // ---------------------------------------------------------------------------\n // Computed\n // ---------------------------------------------------------------------------\n\n const isEditing = computed(() => editingItem.value !== null && !viewMode.value)\n const isViewing = computed(() => viewMode.value)\n const dialogTitle = computed(() =>\n viewMode.value\n ? (labels.viewTitle ?? 'Visualizar Registro')\n : isEditing.value\n ? labels.editTitle\n : labels.createTitle,\n )\n const isFirstPage = computed(() => pagination.page <= 1)\n const isLastPage = computed(() => pagination.page >= pagination.totalPages)\n\n // ---------------------------------------------------------------------------\n // Fetch\n // ---------------------------------------------------------------------------\n\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n // Sequencing: ignora respostas fora de ordem. Sem isso, dois fetch disparados\n // em sequência (ex.: setar duas datas de um período) podem resolver invertidos\n // e a resposta mais ANTIGA (menos filtrada) sobrescreve a correta.\n const seq = ++fetchSeq\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n if (filterParams) {\n Object.assign(queryParams, filterParams())\n }\n\n // Filtros de coluna ativos (ignora vazios).\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') queryParams[key] = val\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n // Uma requisição mais nova já foi disparada — descarta esta resposta.\n if (seq !== fetchSeq) return\n // Pré-processa os dados crus (agrupar/enriquecer/reestruturar) antes de virarem\n // `items`. Sem `transformItems`, usa os dados como vieram.\n items.value = transformItems ? transformItems(responseData.data) : responseData.data\n selectedItems.value = [] // seleção anterior fica obsoleta ao recarregar\n pagination.rows = responseData.rows\n extras.value = responseData.extras ?? {}\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n } finally {\n // Só a requisição mais recente controla o loading (uma resposta antiga não\n // deve desligar o spinner enquanto a nova ainda está em voo).\n if (seq === fetchSeq) loading.value = false\n }\n }\n\n async function init(): Promise<void> {\n await fetchItems()\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n /**\n * Fetch every record across all pages (respeitando search, sort e\n * filterParams atuais) sem alterar o estado da lista. Útil para exportações.\n */\n async function fetchAll(pageSize = 200): Promise<T[]> {\n const base: Record<string, unknown> = {}\n if (search.value) base.search = search.value\n if (sort.field && sort.order !== 0) {\n base.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n if (filterParams) Object.assign(base, filterParams())\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') base[key] = val\n }\n\n const all: T[] = []\n let page = 1\n // Hard cap para evitar loop infinito caso o backend não pagine corretamente.\n const maxPages = 10000\n while (page <= maxPages) {\n const res = await provider.list<T>(endpoint, {\n ...base,\n page,\n page_size: pageSize,\n })\n all.push(...res.data)\n const total = res.rows ?? all.length\n if (res.data.length === 0 || all.length >= total) break\n page++\n }\n return all\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function onSearch(event: Event): void {\n const target = event.target as HTMLInputElement\n setSearch(target.value)\n }\n\n // ---------------------------------------------------------------------------\n // Pagination\n // ---------------------------------------------------------------------------\n\n function goToPage(page: number): void {\n pagination.page = page\n fetchItems()\n }\n\n function firstPage(): void {\n goToPage(1)\n }\n\n function lastPage(): void {\n goToPage(pagination.totalPages)\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField?: string | null; sortOrder?: 1 | -1 | 0 | null }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Form\n // ---------------------------------------------------------------------------\n\n function resetForm(): void {\n const defs = getDefaults()\n for (const key of Object.keys(defs)) {\n formData[key] = defs[key]\n }\n }\n\n function setFormField(field: string, value: unknown): void {\n formData[field] = value\n }\n\n function openCreateDialog(): void {\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n // Apply createDefaults (e.g. parent FK) on top of field defaults\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n function loadItemIntoForm(item: T): void {\n editingOriginal = loadItemIntoRecord(item, formFields, formData)\n }\n\n /**\n * Busca o registro completo na API (`fetchDetailOnEdit`). Existe porque a list\n * pode ser um serializer enxuto (campos pesados omitidos — ex.: geometria):\n * montar o form pela linha mostraria o campo vazio e, pior, um save poderia\n * gravar essa ausência por cima do valor real.\n */\n async function fetchDetail(item: T): Promise<T | null> {\n try {\n const response = await provider.get<T>(endpoint, item[pk as keyof T] as string | number)\n return response.data\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao carregar registro'))\n return null\n }\n }\n\n /**\n * Abre o diálogo com o item resolvido: síncrono no caminho comum (a linha da\n * lista já basta) e assíncrono só com `fetchDetailOnEdit` — quem chama sem a\n * opção pode seguir mexendo no formData logo após o open, como sempre pôde.\n */\n function openWithItem(item: T, open: (full: T) => void): void | Promise<void> {\n if (!fetchDetailOnEdit) return open(item)\n return fetchDetail(item).then((full) => {\n if (full) open(full)\n })\n }\n\n function openEditDialog(item: T): void | Promise<void> {\n return openWithItem(item, (full) => {\n viewMode.value = false\n editingItem.value = full\n loadItemIntoForm(full)\n dialogVisible.value = true\n })\n }\n\n function openViewDialog(item: T): void | Promise<void> {\n return openWithItem(item, (full) => {\n viewMode.value = true\n editingItem.value = full\n loadItemIntoForm(full)\n dialogVisible.value = true\n })\n }\n\n function openDuplicateDialog(rawItem: T): void | Promise<void> {\n return openWithItem(rawItem, (item) => duplicateFrom(item))\n }\n\n function duplicateFrom(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 return convertFormRecord(record, formFields)\n }\n\n async function save(): Promise<T | null> {\n const erro = validateFormRecord(formFields, formData)\n if (erro) {\n toast.error(erro)\n return null\n }\n\n saving.value = true\n try {\n let payload: Record<string, unknown> = convertRecord(formData)\n\n // createDefaults é PREFILL (já aplicado ao abrir o diálogo), não um override\n // no submit: só completa chaves ausentes/nulas do payload, sem SOBRESCREVER o\n // que o usuário definiu no form. Senão um campo editável pré-preenchido (ex.:\n // a unidade da baliza) voltaria ao default mesmo depois de o usuário trocar o\n // valor. Continua cobrindo FK-pai oculta de master-detail (chave ausente).\n if (!isEditing.value && createDefaults) {\n const extra = createDefaults()\n for (const [key, value] of Object.entries(extra)) {\n const current = payload[key]\n if (current === undefined || current === null || current === '') {\n payload[key] = value\n }\n }\n }\n\n // Edição: enviar apenas os campos alterados (diff) quando partialUpdate.\n if (isEditing.value && partialUpdate && editingOriginal) {\n const originalPayload = convertRecord(editingOriginal)\n payload = diffRecord(originalPayload, payload)\n\n // Nada mudou — fecha sem chamar a API.\n if (Object.keys(payload).length === 0 && !transformPayload) {\n dialogVisible.value = false\n const current = editingItem.value\n editingItem.value = null\n editingOriginal = null\n return current\n }\n }\n\n if (transformPayload) {\n payload = transformPayload(payload, isEditing.value)\n }\n\n // Detecta se tem arquivo (image) → FormData\n const hasFile = formFields.some((f) => f.type === 'image' && payload[f.field] instanceof File)\n\n let body: Record<string, unknown> | FormData = payload\n let headers: Record<string, string> | undefined\n\n if (hasFile) {\n const imageFields = new Set(\n formFields.filter((f) => f.type === 'image').map((f) => f.field),\n )\n const fd = new FormData()\n for (const [key, val] of Object.entries(payload)) {\n if (val === null || val === undefined) continue\n if (val instanceof File) {\n fd.append(key, val)\n } else if (imageFields.has(key)) {\n // URL string de imagem inalterada — pula\n continue\n } else {\n fd.append(key, String(val))\n }\n }\n body = fd\n headers = { 'Content-Type': 'multipart/form-data' }\n }\n\n const requestConfig = headers ? { headers } : undefined\n let response\n\n if (isEditing.value && editingItem.value) {\n const itemPk = editingItem.value[pk as keyof T]\n response = await provider.update<T>(\n endpoint,\n itemPk as string | number,\n body,\n requestConfig,\n )\n if (!refetchOnSave) {\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) {\n items.value[index] = response.data\n }\n }\n toast.success(labels.successUpdate)\n } else {\n response = await provider.create<T>(endpoint, body, requestConfig)\n if (!refetchOnSave) {\n items.value.unshift(response.data)\n pagination.rows++\n }\n toast.success(labels.successCreate)\n }\n\n dialogVisible.value = false\n editingItem.value = null\n editingOriginal = null\n\n // Re-busca a página atual para refletir o estado real do backend\n // (campos derivados, ordenação, etc.) sem perder a posição da paginação,\n // busca ou filtros — todos preservados em `pagination`/`search`/`sort`.\n if (refetchOnSave) {\n await fetchItems()\n }\n\n if (onAfterSave) onAfterSave(response.data, isEditing.value)\n return response.data\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar registro'))\n return null\n } finally {\n saving.value = false\n }\n }\n\n // ---------------------------------------------------------------------------\n // Inline (cell) edit\n // ---------------------------------------------------------------------------\n\n async function updateField(item: T, field: string, value: unknown): Promise<void> {\n const itemPk = item[pk as keyof T]\n const fdef = formFields.find((f) => f.field === field)\n let v = value\n if (fdef?.type === 'date' && v instanceof Date) v = toDateString(v)\n else if (fdef?.type === 'datetime' && v instanceof Date) v = toDateTimeString(v)\n try {\n const response = await provider.update<T>(endpoint, itemPk as string | number, { [field]: v })\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) items.value[index] = { ...items.value[index], ...response.data }\n toast.success(labels.successUpdate)\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar o campo'))\n }\n }\n\n // ---------------------------------------------------------------------------\n // Delete\n // ---------------------------------------------------------------------------\n\n // Exclusão crua (sem o confirm de serviço) — para quem controla a própria\n // confirmação, ex.: WCrudView com diálogo de exclusão próprio (slot de mensagem).\n async function performDelete(item: T): Promise<void> {\n try {\n const itemPk = item[pk as keyof T]\n await provider.delete(endpoint, itemPk as string | number)\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) {\n items.value.splice(index, 1)\n pagination.rows--\n }\n toast.success(labels.successDelete)\n if (onAfterDelete) onAfterDelete(item)\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao excluir registro'))\n }\n }\n\n function confirmDelete(item: T): void {\n confirmDeleteDialog(() => performDelete(item), labels.deleteConfirmMessage)\n }\n\n function clearSelection(): void {\n selectedItems.value = []\n }\n\n function setColumnFilter(param: string, value: unknown): void {\n if (value === null || value === undefined || value === '') {\n delete columnFilters[param]\n } else {\n columnFilters[param] = value\n }\n pagination.page = 1\n fetchItems()\n }\n\n function clearColumnFilters(): void {\n for (const key of Object.keys(columnFilters)) delete columnFilters[key]\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Return\n // ---------------------------------------------------------------------------\n\n return {\n items,\n selectedItems,\n columnFilters,\n extras,\n loading,\n saving,\n search,\n dialogVisible,\n editingItem,\n formData,\n pagination,\n sort,\n isEditing,\n isViewing,\n viewMode,\n dialogTitle,\n isFirstPage,\n isLastPage,\n init,\n fetchItems,\n fetchAll,\n refresh,\n setSearch,\n onSearch,\n onPage,\n onSort,\n openCreateDialog,\n openEditDialog,\n openViewDialog,\n openDuplicateDialog,\n save,\n updateField,\n confirmDelete,\n performDelete,\n setFormField,\n resetForm,\n goToPage,\n firstPage,\n lastPage,\n clearSelection,\n setColumnFilter,\n clearColumnFilters,\n config,\n }\n}\n","import { computed, reactive, ref } from 'vue'\nimport type { Ref } from 'vue'\nimport type { SubviewCrudConfig, SubviewCrudReturn } from '@/types/subview'\nimport type { CrudLabels } from '@/types/labels'\nimport { DEFAULT_CRUD_LABELS } from '@/types/labels'\nimport { useAppToast } from './useAppToast'\nimport { useAppConfirm } from './useAppConfirm'\nimport {\n convertFormRecord,\n getFieldDefaults,\n loadItemIntoRecord,\n validateFormRecord,\n} from '@/utils/formRecord'\n\n/**\n * O CRUD do `WCrudSubview`: mesma experiência do `useCrudManager`, sobre um array.\n *\n * Nada aqui é assíncrono e nada fala com a rede — `save` e `performDelete` devolvem o\n * array novo pelo `onChange` e acabou. O dono do estado decide o que fazer com isso\n * (num editor de documento, tipicamente marcar como sujo e gravar o documento inteiro).\n *\n * O array recebido nunca é mutado: toda operação devolve um array novo, para o\n * consumidor poder comparar referência e saber que mudou.\n */\nexport function useSubviewCrud<T extends Record<string, unknown> = Record<string, unknown>>(\n config: SubviewCrudConfig<T>,\n): SubviewCrudReturn<T> {\n const {\n rows,\n onChange,\n form: formFields,\n createDefaults = undefined,\n transformPayload = undefined,\n uniqueBy = undefined,\n uniqueMessage = 'Este item já está na lista.',\n toForm = undefined,\n onAfterSave = undefined,\n onAfterDelete = undefined,\n toast: comToast = false,\n } = config\n\n const labels: CrudLabels = { ...DEFAULT_CRUD_LABELS, ...config.labels }\n const toast = useAppToast()\n const { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n const items = computed(() => rows() ?? [])\n // Existe para o WCrudFormDialog, que espera a ref de um manager que grava na rede.\n // Aqui a gravação é síncrona, então nunca sai de `false`.\n const saving = ref(false)\n const dialogVisible = ref(false)\n const editingItem = ref<T | null>(null) as Ref<T | null>\n const editingIndex = ref(-1)\n const formData = reactive<Record<string, unknown>>({})\n\n const defaults = getFieldDefaults(formFields)\n for (const key of Object.keys(defaults)) {\n formData[key] = defaults[key]\n }\n\n const isEditing = computed(() => editingIndex.value >= 0)\n const dialogTitle = computed(() => (isEditing.value ? labels.editTitle : labels.createTitle))\n\n function resetForm(): void {\n const defs = getFieldDefaults(formFields)\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 aplicarCreateDefaults(): void {\n if (!createDefaults) return\n for (const [key, val] of Object.entries(createDefaults())) {\n formData[key] = val\n }\n }\n\n function openCreateDialog(): void {\n editingItem.value = null\n editingIndex.value = -1\n resetForm()\n aplicarCreateDefaults()\n dialogVisible.value = true\n }\n\n function carregarNoForm(item: T): void {\n loadItemIntoRecord(item, formFields, formData)\n if (!toForm) return\n for (const [key, val] of Object.entries(toForm(item))) {\n formData[key] = val\n }\n }\n\n function openEditDialog(item: T, index: number): void {\n editingItem.value = item\n editingIndex.value = index\n carregarNoForm(item)\n dialogVisible.value = true\n }\n\n function openDuplicateDialog(item: T): void {\n editingItem.value = null\n editingIndex.value = -1\n resetForm()\n carregarNoForm(item)\n // createDefaults sobrepõe o que veio da cópia (ex.: a FK do pai atual).\n aplicarCreateDefaults()\n dialogVisible.value = true\n }\n\n /** Chave de unicidade da linha, ou `undefined` quando não há o que comparar. */\n function chaveUnica(item: T): string | undefined {\n if (!uniqueBy) return undefined\n const valor = typeof uniqueBy === 'function' ? uniqueBy(item) : item[uniqueBy]\n if (valor === null || valor === undefined || valor === '') return undefined\n return String(valor)\n }\n\n function save(): T | null {\n const erro = validateFormRecord(formFields, formData)\n if (erro) {\n toast.error(erro)\n return null\n }\n\n let payload = convertFormRecord(formData, formFields)\n\n // createDefaults é prefill, não override: só completa o que ficou vazio, para não\n // desfazer a escolha do usuário num campo que nasceu preenchido.\n if (!isEditing.value && createDefaults) {\n for (const [key, value] of Object.entries(createDefaults())) {\n const atual = payload[key]\n if (atual === undefined || atual === null || atual === '') {\n payload[key] = value\n }\n }\n }\n\n if (transformPayload) {\n payload = transformPayload(payload, isEditing.value)\n }\n\n const anterior = items.value\n const indice = editingIndex.value\n const editando = indice >= 0\n // A linha editada preserva o que não está no form (id, campos derivados que o\n // servidor devolveu): o form conhece só os campos que ele mesmo edita.\n const item = (editando ? { ...anterior[indice], ...payload } : { ...payload }) as T\n\n // Duplicidade: comparada contra as OUTRAS linhas — editar a própria linha sem\n // mexer na chave não pode acusar conflito consigo mesma.\n const chave = chaveUnica(item)\n if (chave !== undefined && anterior.some((linha, i) => i !== indice && chaveUnica(linha) === chave)) {\n toast.error(uniqueMessage)\n return null\n }\n\n const proximo = editando\n ? anterior.map((linha, i) => (i === indice ? item : linha))\n : [...anterior, item]\n onChange(proximo)\n\n if (comToast) {\n toast.success(editando ? labels.successUpdate : labels.successCreate)\n }\n onAfterSave?.(item, editando)\n\n dialogVisible.value = false\n editingItem.value = null\n editingIndex.value = -1\n return item\n }\n\n function performDelete(index: number): void {\n const anterior = items.value\n const item = anterior[index]\n if (item === undefined) return\n\n onChange(anterior.filter((_, i) => i !== index))\n\n if (comToast) toast.success(labels.successDelete)\n onAfterDelete?.(item, index)\n }\n\n function confirmDelete(item: T, index: number): void {\n confirmDeleteDialog(() => performDelete(index), labels.deleteConfirmMessage)\n }\n\n return {\n items,\n saving,\n dialogVisible,\n editingItem,\n editingIndex,\n formData,\n isEditing,\n dialogTitle,\n openCreateDialog,\n openEditDialog,\n openDuplicateDialog,\n save,\n confirmDelete,\n performDelete,\n setFormField,\n resetForm,\n labels,\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":["getFieldDefaults","fields","defaults","f","loadItemIntoRecord","item","target","snapshot","value","parseDate","convertFormRecord","record","out","val","toDateString","toDateTimeString","key","stripMask","validateFormRecord","formData","result","diffRecord","original","current","useCrudManager","config","endpoint","formFields","pk","searchDebounce","partialUpdate","refetchOnSave","fetchDetailOnEdit","filterParams","createDefaults","transformItems","transformPayload","onAfterSave","onAfterDelete","dataProvider","inject","W_DATA_PROVIDER_KEY","provider","pluginConfig","W_CONFIG_KEY","defaultPageSize","labels","DEFAULT_CRUD_LABELS","toast","useAppToast","confirmDeleteDialog","useAppConfirm","items","ref","selectedItems","extras","loading","fetchSeq","saving","search","dialogVisible","viewMode","editingItem","reactive","editingOriginal","pagination","sort","columnFilters","getDefaults","isEditing","computed","isViewing","dialogTitle","isFirstPage","isLastPage","searchTimeout","fetchItems","params","seq","queryParams","responseData","init","refresh","fetchAll","pageSize","base","all","page","maxPages","res","total","setSearch","onSearch","event","goToPage","firstPage","lastPage","onPage","onSort","resetForm","defs","setFormField","field","openCreateDialog","extra","loadItemIntoForm","fetchDetail","err","extractApiError","openWithItem","open","full","openEditDialog","openViewDialog","openDuplicateDialog","rawItem","duplicateFrom","convertRecord","save","erro","payload","originalPayload","hasFile","body","headers","imageFields","fd","requestConfig","response","itemPk","index","i","updateField","fdef","performDelete","confirmDelete","clearSelection","setColumnFilter","param","clearColumnFilters","useSubviewCrud","rows","onChange","uniqueBy","uniqueMessage","toForm","comToast","editingIndex","aplicarCreateDefaults","carregarNoForm","chaveUnica","valor","atual","anterior","indice","editando","chave","linha","proximo","_","useApi","options","immediate","filters","setFilter","clearFilters"],"mappings":"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"}
|
package/dist/useApi-CPt3Tj4n.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const n=require("vue"),ne=require("./plugin-D1YvyKXX.cjs"),pe=require("./types.cjs"),O=require("./useFormKeyboardNav-D4Ow3k4Y.cjs");function ce(v){const c={};for(const o of v)c[o.field]=o.defaultValue!==void 0?typeof o.defaultValue=="function"?o.defaultValue():o.defaultValue:null;return c}function ge(v,c,o){const a={};for(const l of c){let w=v[l.field]!==void 0?v[l.field]:null;w&&(l.type==="date"||l.type==="datetime")&&typeof w=="string"&&(w=O.parseDate(w)),o[l.field]=w,a[l.field]=w}return a}function me(v,c){const o={...v};for(const a of c){const l=o[a.field];if(a.type==="date"&&l instanceof Date?o[a.field]=O.toDateString(l):a.type==="datetime"&&l instanceof Date&&(o[a.field]=O.toDateTimeString(l)),a.type==="fk"&&l!==null&&typeof l=="object"){const w=a.optionValue||"id";o[a.field]=l[w]??l}(a.type==="mask"||a.type==="cpf_cnpj")&&typeof l=="string"&&(o[a.field]=O.stripMask(l))}return o}function ye(v,c){for(const o of v){if(o.validate){const a=o.validate(c[o.field]);if(a)return a}if(o.required){const a=c[o.field];if(a==null||a==="")return`${o.label} é obrigatório`}}return null}function qe(v,c){const o={};for(const a of Object.keys(c))JSON.stringify(v[a])!==JSON.stringify(c[a])&&(o[a]=c[a]);return o}function Me(v){const{endpoint:c,form:o,pk:a="id",searchDebounce:l=300,partialUpdate:w=!0,refetchOnSave:M=!0,fetchDetailOnEdit:te=!1,filterParams:N=void 0,createDefaults:j=void 0,transformItems:L=void 0,transformPayload:G=void 0,onAfterSave:P=void 0,onAfterDelete:f=void 0}=v,_=n.inject(ne.W_DATA_PROVIDER_KEY);if(!_)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.");const b=_,E=n.inject(ne.W_CONFIG_KEY),J=v.pageSize??(E==null?void 0:E.defaultPageSize)??20,D={...pe.DEFAULT_CRUD_LABELS,...v.labels},g=O.useAppToast(),{confirmDelete:A}=O.useAppConfirm(),S=n.ref([]),K=n.ref([]),y=n.ref({}),z=n.ref(!1);let x=0;const X=n.ref(!1),I=n.ref(""),Y=n.ref(!1),$=n.ref(!1),V=n.ref(null),C=n.reactive({});let H=null;const u=n.reactive({page:1,pageSize:J,rows:0,totalPages:0}),k=n.reactive({field:null,order:0}),i=n.reactive({});function r(){return ce(o)}const U=r();for(const t of Object.keys(U))C[t]=U[t];const R=n.computed(()=>V.value!==null&&!$.value),Z=n.computed(()=>$.value),ee=n.computed(()=>$.value?D.viewTitle??"Visualizar Registro":R.value?D.editTitle:D.createTitle),oe=n.computed(()=>u.page<=1),ie=n.computed(()=>u.page>=u.totalPages);let B=null;async function h(t={}){const e=++x;z.value=!0;try{const s={page:u.page,page_size:u.pageSize,...t};I.value&&(s.search=I.value),k.field&&k.order!==0&&(s.ordering=k.order===-1?`-${k.field}`:k.field),N&&Object.assign(s,N());for(const[T,p]of Object.entries(i))p!=null&&p!==""&&(s[T]=p);const d=await b.list(c,s);if(e!==x)return;S.value=L?L(d.data):d.data,K.value=[],u.rows=d.rows,y.value=d.extras??{},d.page&&(u.page=d.page),d.page_size&&(u.pageSize=d.page_size),u.totalPages=Math.ceil(u.rows/u.pageSize)||0}finally{e===x&&(z.value=!1)}}async function ae(){await h()}async function De(){await h()}async function he(t=200){const e={};I.value&&(e.search=I.value),k.field&&k.order!==0&&(e.ordering=k.order===-1?`-${k.field}`:k.field),N&&Object.assign(e,N());for(const[p,m]of Object.entries(i))m!=null&&m!==""&&(e[p]=m);const s=[];let d=1;const T=1e4;for(;d<=T;){const p=await b.list(c,{...e,page:d,page_size:t});s.push(...p.data);const m=p.rows??s.length;if(p.data.length===0||s.length>=m)break;d++}return s}function ue(t){I.value=t,B&&clearTimeout(B),B=setTimeout(()=>{u.page=1,h()},l)}function we(t){const e=t.target;ue(e.value)}function re(t){u.page=t,h()}function Pe(){re(1)}function be(){re(u.totalPages)}function Se(t){u.page=t.page+1,u.pageSize=t.rows,h()}function ke(t){k.field=t.sortField??null,k.order=t.sortOrder??0,u.page=1,h()}function se(){const t=r();for(const e of Object.keys(t))C[e]=t[e]}function Fe(t,e){C[t]=e}function Oe(){if($.value=!1,V.value=null,H=null,se(),j){const t=j();for(const[e,s]of Object.entries(t))C[e]=s}Y.value=!0}function fe(t){H=ge(t,o,C)}async function je(t){try{return(await b.get(c,t[a])).data}catch(e){return g.error(O.extractApiError(e,"Erro ao carregar registro")),null}}function le(t,e){return te?je(t).then(s=>{s&&e(s)}):e(t)}function Ee(t){return le(t,e=>{$.value=!1,V.value=e,fe(e),Y.value=!0})}function ze(t){return le(t,e=>{$.value=!0,V.value=e,fe(e),Y.value=!0})}function Ce(t){return le(t,e=>Te(e))}function Te(t){$.value=!1,V.value=null,H=null,se();for(const e of o){if(e.field===a)continue;let s=t[e.field]!==void 0?t[e.field]:C[e.field];s&&(e.type==="date"||e.type==="datetime")&&typeof s=="string"&&(s=O.parseDate(s)),C[e.field]=s}if(j){const e=j();for(const[s,d]of Object.entries(e))C[s]=d}Y.value=!0}function de(t){return me(t,o)}async function _e(){const t=ye(o,C);if(t)return g.error(t),null;X.value=!0;try{let e=de(C);if(!R.value&&j){const F=j();for(const[q,W]of Object.entries(F)){const Q=e[q];(Q==null||Q==="")&&(e[q]=W)}}if(R.value&&w&&H){const F=de(H);if(e=qe(F,e),Object.keys(e).length===0&&!G){Y.value=!1;const q=V.value;return V.value=null,H=null,q}}G&&(e=G(e,R.value));const s=o.some(F=>F.type==="image"&&e[F.field]instanceof File);let d=e,T;if(s){const F=new Set(o.filter(W=>W.type==="image").map(W=>W.field)),q=new FormData;for(const[W,Q]of Object.entries(e))if(Q!=null)if(Q instanceof File)q.append(W,Q);else{if(F.has(W))continue;q.append(W,String(Q))}d=q,T={"Content-Type":"multipart/form-data"}}const p=T?{headers:T}:void 0;let m;if(R.value&&V.value){const F=V.value[a];if(m=await b.update(c,F,d,p),!M){const q=S.value.findIndex(W=>W[a]===F);q!==-1&&(S.value[q]=m.data)}g.success(D.successUpdate)}else m=await b.create(c,d,p),M||(S.value.unshift(m.data),u.rows++),g.success(D.successCreate);return Y.value=!1,V.value=null,H=null,M&&await h(),P&&P(m.data,R.value),m.data}catch(e){return g.error(O.extractApiError(e,"Erro ao salvar registro")),null}finally{X.value=!1}}async function Ae(t,e,s){const d=t[a],T=o.find(m=>m.field===e);let p=s;(T==null?void 0:T.type)==="date"&&p instanceof Date?p=O.toDateString(p):(T==null?void 0:T.type)==="datetime"&&p instanceof Date&&(p=O.toDateTimeString(p));try{const m=await b.update(c,d,{[e]:p}),F=S.value.findIndex(q=>q[a]===d);F!==-1&&(S.value[F]={...S.value[F],...m.data}),g.success(D.successUpdate)}catch(m){g.error(O.extractApiError(m,"Erro ao salvar o campo"))}}async function ve(t){try{const e=t[a];await b.delete(c,e);const s=S.value.findIndex(d=>d[a]===e);s!==-1&&(S.value.splice(s,1),u.rows--),g.success(D.successDelete),f&&f(t)}catch(e){g.error(O.extractApiError(e,"Erro ao excluir registro"))}}function xe(t){A(()=>ve(t),D.deleteConfirmMessage)}function Ie(){K.value=[]}function Ve(t,e){e==null||e===""?delete i[t]:i[t]=e,u.page=1,h()}function Re(){for(const t of Object.keys(i))delete i[t];u.page=1,h()}return{items:S,selectedItems:K,columnFilters:i,extras:y,loading:z,saving:X,search:I,dialogVisible:Y,editingItem:V,formData:C,pagination:u,sort:k,isEditing:R,isViewing:Z,viewMode:$,dialogTitle:ee,isFirstPage:oe,isLastPage:ie,init:ae,fetchItems:h,fetchAll:he,refresh:De,setSearch:ue,onSearch:we,onPage:Se,onSort:ke,openCreateDialog:Oe,openEditDialog:Ee,openViewDialog:ze,openDuplicateDialog:Ce,save:_e,updateField:Ae,confirmDelete:xe,performDelete:ve,setFormField:Fe,resetForm:se,goToPage:re,firstPage:Pe,lastPage:be,clearSelection:Ie,setColumnFilter:Ve,clearColumnFilters:Re,config:v}}function Ue(v){const{rows:c,onChange:o,form:a,createDefaults:l=void 0,transformPayload:w=void 0,uniqueBy:M=void 0,uniqueMessage:te="Este item já está na lista.",toForm:N=void 0,onAfterSave:j=void 0,onAfterDelete:L=void 0,toast:G=!1}=v,P={...pe.DEFAULT_CRUD_LABELS,...v.labels},f=O.useAppToast(),{confirmDelete:_}=O.useAppConfirm(),b=n.computed(()=>c()??[]),E=n.ref(!1),J=n.ref(!1),D=n.ref(null),g=n.ref(-1),A=n.reactive({}),S=ce(a);for(const i of Object.keys(S))A[i]=S[i];const K=n.computed(()=>g.value>=0),y=n.computed(()=>K.value?P.editTitle:P.createTitle);function z(){const i=ce(a);for(const r of Object.keys(i))A[r]=i[r]}function x(i,r){A[i]=r}function X(){if(l)for(const[i,r]of Object.entries(l()))A[i]=r}function I(){D.value=null,g.value=-1,z(),X(),J.value=!0}function Y(i){if(ge(i,a,A),!!N)for(const[r,U]of Object.entries(N(i)))A[r]=U}function $(i,r){D.value=i,g.value=r,Y(i),J.value=!0}function V(i){D.value=null,g.value=-1,z(),Y(i),X(),J.value=!0}function C(i){if(!M)return;const r=typeof M=="function"?M(i):i[M];if(!(r==null||r===""))return String(r)}function H(){const i=ye(a,A);if(i)return f.error(i),null;let r=me(A,a);if(!K.value&&l)for(const[B,h]of Object.entries(l())){const ae=r[B];(ae==null||ae==="")&&(r[B]=h)}w&&(r=w(r,K.value));const U=b.value,R=g.value,Z=R>=0,ee=Z?{...U[R],...r}:{...r},oe=C(ee);if(oe!==void 0&&U.some((B,h)=>h!==R&&C(B)===oe))return f.error(te),null;const ie=Z?U.map((B,h)=>h===R?ee:B):[...U,ee];return o(ie),G&&f.success(Z?P.successUpdate:P.successCreate),j==null||j(ee,Z),J.value=!1,D.value=null,g.value=-1,ee}function u(i){const r=b.value,U=r[i];U!==void 0&&(o(r.filter((R,Z)=>Z!==i)),G&&f.success(P.successDelete),L==null||L(U,i))}function k(i,r){_(()=>u(r),P.deleteConfirmMessage)}return{items:b,saving:E,dialogVisible:J,editingItem:D,editingIndex:g,formData:A,isEditing:K,dialogTitle:y,openCreateDialog:I,openEditDialog:$,openDuplicateDialog:V,save:H,confirmDelete:k,performDelete:u,setFormField:x,resetForm:z,labels:P,config:v}}function Le(v){const{endpoint:c,searchDebounce:o=300,immediate:a=!1}=v,l=n.inject(ne.W_DATA_PROVIDER_KEY);if(!l)throw new Error("[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useApi.");const w=l,M=n.inject(ne.W_CONFIG_KEY),te=v.pageSize??(M==null?void 0:M.defaultPageSize)??20,N=n.ref([]),j=n.ref(!1),L=n.ref(""),G=n.ref({}),P=n.reactive({}),f=n.reactive({page:1,pageSize:te,rows:0,totalPages:0}),_=n.reactive({field:null,order:0});let b=null;async function E(y={}){j.value=!0;try{const z={page:f.page,page_size:f.pageSize,...y};L.value&&(z.search=L.value),_.field&&_.order!==0&&(z.ordering=_.order===-1?`-${_.field}`:_.field);for(const[X,I]of Object.entries(P))I!=null&&I!==""&&(z[X]=I);const x=await w.list(c,z);N.value=x.data,f.rows=x.rows,x.page&&(f.page=x.page),x.page_size&&(f.pageSize=x.page_size),f.totalPages=Math.ceil(f.rows/f.pageSize)||0,G.value=x.extras??{}}finally{j.value=!1}}async function J(){await E()}function D(y){L.value=y,b&&clearTimeout(b),b=setTimeout(()=>{f.page=1,E()},o)}function g(y,z){P[y]=z,f.page=1,E()}function A(){for(const y of Object.keys(P))delete P[y];f.page=1,E()}function S(y){f.page=y.page+1,f.pageSize=y.rows,E()}function K(y){_.field=y.sortField??null,_.order=y.sortOrder??0,f.page=1,E()}return a&&E(),{items:N,loading:j,search:L,pagination:f,sort:_,extras:G,fetchItems:E,refresh:J,setSearch:D,setFilter:g,clearFilters:A,onPage:S,onSort:K}}exports.useApi=Le;exports.useCrudManager=Me;exports.useSubviewCrud=Ue;
|
|
2
|
-
//# sourceMappingURL=useApi-CPt3Tj4n.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useApi-CPt3Tj4n.cjs","sources":["../src/utils/formRecord.ts","../src/composables/useCrudManager.ts","../src/composables/useSubviewCrud.ts","../src/composables/useApi.ts"],"sourcesContent":["/**\n * Regras de formulário que independem de onde o registro é gravado.\n *\n * Nasceram dentro do `useCrudManager` (que grava numa API) e saíram para cá quando o\n * `useSubviewCrud` passou a precisar das mesmas: um form é um form, o destino do\n * payload é que muda. Manter uma cópia em cada manager faria as duas divergirem no\n * primeiro `FieldType` novo.\n */\nimport type { FieldDef } from '@/types/field'\nimport { parseDate, toDateString, toDateTimeString } from './dates'\nimport { stripMask } from './masks'\n\n/** Valor inicial de cada campo: `defaultValue` (avaliado, se função) ou `null`. */\nexport function getFieldDefaults(fields: FieldDef[]): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of fields) {\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/**\n * Lê um registro existente para dentro do form.\n *\n * Data vem do servidor como string e o `WDatePicker` trabalha com `Date` — por isso a\n * volta por `parseDate`. Devolve o snapshot dos valores carregados, que o chamador usa\n * como base do diff quando quiser mandar só o que mudou.\n */\nexport function loadItemIntoRecord(\n item: Record<string, unknown>,\n fields: FieldDef[],\n target: Record<string, unknown>,\n): Record<string, unknown> {\n const snapshot: Record<string, unknown> = {}\n for (const f of fields) {\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 target[f.field] = value\n snapshot[f.field] = value\n }\n return snapshot\n}\n\n/**\n * Converte o form no registro que vai ser gravado: data vira string, FK vira id, campo\n * mascarado perde a máscara. Devolve objeto novo — o form não é tocado.\n */\nexport function convertFormRecord(\n record: Record<string, unknown>,\n fields: FieldDef[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...record }\n for (const f of fields) {\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 gravar 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/**\n * Primeira mensagem de erro do form, ou `null` se está tudo certo.\n *\n * A ordem importa: o `validate` do campo vence a obrigatoriedade, para a mensagem\n * específica (\"CNPJ inválido\") aparecer no lugar da genérica.\n */\nexport function validateFormRecord(\n fields: FieldDef[],\n formData: Record<string, unknown>,\n): string | null {\n for (const f of fields) {\n if (f.validate) {\n const result = f.validate(formData[f.field])\n if (result) return result\n }\n if (f.required) {\n const val = formData[f.field]\n if (val === null || val === undefined || val === '') {\n return `${f.label} é obrigatório`\n }\n }\n }\n return null\n}\n","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 {\n convertFormRecord,\n getFieldDefaults,\n loadItemIntoRecord,\n validateFormRecord,\n} from '@/utils/formRecord'\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 fetchDetailOnEdit = false,\n filterParams = undefined,\n createDefaults = undefined,\n transformItems = undefined,\n transformPayload = undefined,\n onAfterSave = undefined,\n onAfterDelete = undefined,\n } = config\n\n const dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\n if (!dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin antes de usar useCrudManager.',\n )\n }\n const provider = dataProvider\n\n const pluginConfig = inject<WPluginConfig>(W_CONFIG_KEY)\n const defaultPageSize = config.pageSize ?? pluginConfig?.defaultPageSize ?? 20\n\n const labels: CrudLabels = { ...DEFAULT_CRUD_LABELS, ...config.labels }\n const toast = useAppToast()\n const { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const items = ref<T[]>([]) as import('vue').Ref<T[]>\n const selectedItems = ref<T[]>([]) as import('vue').Ref<T[]>\n const extras = ref<Record<string, unknown>>({})\n const loading = ref(false)\n // Contador de sequência de fetch — descarta respostas de list() fora de ordem.\n let fetchSeq = 0\n const saving = ref(false)\n const search = ref('')\n const dialogVisible = ref(false)\n const viewMode = ref(false)\n const editingItem = ref<T | null>(null) as import('vue').Ref<T | null>\n const formData = reactive<Record<string, unknown>>({})\n // Snapshot of the form values when an edit dialog opens — used for diff-based PATCH.\n let editingOriginal: Record<string, unknown> | null = null\n\n const pagination: PaginationState = reactive({\n page: 1,\n pageSize: defaultPageSize,\n rows: 0,\n totalPages: 0,\n })\n\n const sort: SortState = reactive({\n field: null,\n order: 0,\n })\n\n // Filtros de coluna ativos (param → valor). Persistem entre páginas/ordenação.\n const columnFilters = reactive<Record<string, unknown>>({})\n\n // ---------------------------------------------------------------------------\n // Defaults\n // ---------------------------------------------------------------------------\n\n function getDefaults(): Record<string, unknown> {\n return getFieldDefaults(formFields)\n }\n\n // Initialize\n const defaults = getDefaults()\n for (const key of Object.keys(defaults)) {\n formData[key] = defaults[key]\n }\n\n // ---------------------------------------------------------------------------\n // Computed\n // ---------------------------------------------------------------------------\n\n const isEditing = computed(() => editingItem.value !== null && !viewMode.value)\n const isViewing = computed(() => viewMode.value)\n const dialogTitle = computed(() =>\n viewMode.value\n ? (labels.viewTitle ?? 'Visualizar Registro')\n : isEditing.value\n ? labels.editTitle\n : labels.createTitle,\n )\n const isFirstPage = computed(() => pagination.page <= 1)\n const isLastPage = computed(() => pagination.page >= pagination.totalPages)\n\n // ---------------------------------------------------------------------------\n // Fetch\n // ---------------------------------------------------------------------------\n\n let searchTimeout: ReturnType<typeof setTimeout> | null = null\n\n async function fetchItems(params: Record<string, unknown> = {}): Promise<void> {\n // Sequencing: ignora respostas fora de ordem. Sem isso, dois fetch disparados\n // em sequência (ex.: setar duas datas de um período) podem resolver invertidos\n // e a resposta mais ANTIGA (menos filtrada) sobrescreve a correta.\n const seq = ++fetchSeq\n loading.value = true\n try {\n const queryParams: Record<string, unknown> = {\n page: pagination.page,\n page_size: pagination.pageSize,\n ...params,\n }\n\n if (search.value) {\n queryParams.search = search.value\n }\n\n if (sort.field && sort.order !== 0) {\n queryParams.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n\n if (filterParams) {\n Object.assign(queryParams, filterParams())\n }\n\n // Filtros de coluna ativos (ignora vazios).\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') queryParams[key] = val\n }\n\n const responseData = await provider.list<T>(endpoint, queryParams)\n // Uma requisição mais nova já foi disparada — descarta esta resposta.\n if (seq !== fetchSeq) return\n // Pré-processa os dados crus (agrupar/enriquecer/reestruturar) antes de virarem\n // `items`. Sem `transformItems`, usa os dados como vieram.\n items.value = transformItems ? transformItems(responseData.data) : responseData.data\n selectedItems.value = [] // seleção anterior fica obsoleta ao recarregar\n pagination.rows = responseData.rows\n extras.value = responseData.extras ?? {}\n if (responseData.page) pagination.page = responseData.page\n if (responseData.page_size) pagination.pageSize = responseData.page_size\n pagination.totalPages = Math.ceil(pagination.rows / pagination.pageSize) || 0\n } finally {\n // Só a requisição mais recente controla o loading (uma resposta antiga não\n // deve desligar o spinner enquanto a nova ainda está em voo).\n if (seq === fetchSeq) loading.value = false\n }\n }\n\n async function init(): Promise<void> {\n await fetchItems()\n }\n\n async function refresh(): Promise<void> {\n await fetchItems()\n }\n\n /**\n * Fetch every record across all pages (respeitando search, sort e\n * filterParams atuais) sem alterar o estado da lista. Útil para exportações.\n */\n async function fetchAll(pageSize = 200): Promise<T[]> {\n const base: Record<string, unknown> = {}\n if (search.value) base.search = search.value\n if (sort.field && sort.order !== 0) {\n base.ordering = sort.order === -1 ? `-${sort.field}` : sort.field\n }\n if (filterParams) Object.assign(base, filterParams())\n for (const [key, val] of Object.entries(columnFilters)) {\n if (val !== null && val !== undefined && val !== '') base[key] = val\n }\n\n const all: T[] = []\n let page = 1\n // Hard cap para evitar loop infinito caso o backend não pagine corretamente.\n const maxPages = 10000\n while (page <= maxPages) {\n const res = await provider.list<T>(endpoint, {\n ...base,\n page,\n page_size: pageSize,\n })\n all.push(...res.data)\n const total = res.rows ?? all.length\n if (res.data.length === 0 || all.length >= total) break\n page++\n }\n return all\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n\n function setSearch(value: string): void {\n search.value = value\n if (searchTimeout) clearTimeout(searchTimeout)\n searchTimeout = setTimeout(() => {\n pagination.page = 1\n fetchItems()\n }, searchDebounce)\n }\n\n function onSearch(event: Event): void {\n const target = event.target as HTMLInputElement\n setSearch(target.value)\n }\n\n // ---------------------------------------------------------------------------\n // Pagination\n // ---------------------------------------------------------------------------\n\n function goToPage(page: number): void {\n pagination.page = page\n fetchItems()\n }\n\n function firstPage(): void {\n goToPage(1)\n }\n\n function lastPage(): void {\n goToPage(pagination.totalPages)\n }\n\n function onPage(event: { page: number; rows: number }): void {\n pagination.page = event.page + 1\n pagination.pageSize = event.rows\n fetchItems()\n }\n\n function onSort(event: { sortField?: string | null; sortOrder?: 1 | -1 | 0 | null }): void {\n sort.field = event.sortField ?? null\n sort.order = event.sortOrder ?? 0\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Form\n // ---------------------------------------------------------------------------\n\n function resetForm(): void {\n const defs = getDefaults()\n for (const key of Object.keys(defs)) {\n formData[key] = defs[key]\n }\n }\n\n function setFormField(field: string, value: unknown): void {\n formData[field] = value\n }\n\n function openCreateDialog(): void {\n viewMode.value = false\n editingItem.value = null\n editingOriginal = null\n resetForm()\n // Apply createDefaults (e.g. parent FK) on top of field defaults\n if (createDefaults) {\n const extra = createDefaults()\n for (const [key, val] of Object.entries(extra)) {\n formData[key] = val\n }\n }\n dialogVisible.value = true\n }\n\n function loadItemIntoForm(item: T): void {\n editingOriginal = loadItemIntoRecord(item, formFields, formData)\n }\n\n /**\n * Busca o registro completo na API (`fetchDetailOnEdit`). Existe porque a list\n * pode ser um serializer enxuto (campos pesados omitidos — ex.: geometria):\n * montar o form pela linha mostraria o campo vazio e, pior, um save poderia\n * gravar essa ausência por cima do valor real.\n */\n async function fetchDetail(item: T): Promise<T | null> {\n try {\n const response = await provider.get<T>(endpoint, item[pk as keyof T] as string | number)\n return response.data\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao carregar registro'))\n return null\n }\n }\n\n /**\n * Abre o diálogo com o item resolvido: síncrono no caminho comum (a linha da\n * lista já basta) e assíncrono só com `fetchDetailOnEdit` — quem chama sem a\n * opção pode seguir mexendo no formData logo após o open, como sempre pôde.\n */\n function openWithItem(item: T, open: (full: T) => void): void | Promise<void> {\n if (!fetchDetailOnEdit) return open(item)\n return fetchDetail(item).then((full) => {\n if (full) open(full)\n })\n }\n\n function openEditDialog(item: T): void | Promise<void> {\n return openWithItem(item, (full) => {\n viewMode.value = false\n editingItem.value = full\n loadItemIntoForm(full)\n dialogVisible.value = true\n })\n }\n\n function openViewDialog(item: T): void | Promise<void> {\n return openWithItem(item, (full) => {\n viewMode.value = true\n editingItem.value = full\n loadItemIntoForm(full)\n dialogVisible.value = true\n })\n }\n\n function openDuplicateDialog(rawItem: T): void | Promise<void> {\n return openWithItem(rawItem, (item) => duplicateFrom(item))\n }\n\n function duplicateFrom(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 return convertFormRecord(record, formFields)\n }\n\n async function save(): Promise<T | null> {\n const erro = validateFormRecord(formFields, formData)\n if (erro) {\n toast.error(erro)\n return null\n }\n\n saving.value = true\n try {\n let payload: Record<string, unknown> = convertRecord(formData)\n\n // createDefaults é PREFILL (já aplicado ao abrir o diálogo), não um override\n // no submit: só completa chaves ausentes/nulas do payload, sem SOBRESCREVER o\n // que o usuário definiu no form. Senão um campo editável pré-preenchido (ex.:\n // a unidade da baliza) voltaria ao default mesmo depois de o usuário trocar o\n // valor. Continua cobrindo FK-pai oculta de master-detail (chave ausente).\n if (!isEditing.value && createDefaults) {\n const extra = createDefaults()\n for (const [key, value] of Object.entries(extra)) {\n const current = payload[key]\n if (current === undefined || current === null || current === '') {\n payload[key] = value\n }\n }\n }\n\n // Edição: enviar apenas os campos alterados (diff) quando partialUpdate.\n if (isEditing.value && partialUpdate && editingOriginal) {\n const originalPayload = convertRecord(editingOriginal)\n payload = diffRecord(originalPayload, payload)\n\n // Nada mudou — fecha sem chamar a API.\n if (Object.keys(payload).length === 0 && !transformPayload) {\n dialogVisible.value = false\n const current = editingItem.value\n editingItem.value = null\n editingOriginal = null\n return current\n }\n }\n\n if (transformPayload) {\n payload = transformPayload(payload, isEditing.value)\n }\n\n // Detecta se tem arquivo (image) → FormData\n const hasFile = formFields.some((f) => f.type === 'image' && payload[f.field] instanceof File)\n\n let body: Record<string, unknown> | FormData = payload\n let headers: Record<string, string> | undefined\n\n if (hasFile) {\n const imageFields = new Set(\n formFields.filter((f) => f.type === 'image').map((f) => f.field),\n )\n const fd = new FormData()\n for (const [key, val] of Object.entries(payload)) {\n if (val === null || val === undefined) continue\n if (val instanceof File) {\n fd.append(key, val)\n } else if (imageFields.has(key)) {\n // URL string de imagem inalterada — pula\n continue\n } else {\n fd.append(key, String(val))\n }\n }\n body = fd\n headers = { 'Content-Type': 'multipart/form-data' }\n }\n\n const requestConfig = headers ? { headers } : undefined\n let response\n\n if (isEditing.value && editingItem.value) {\n const itemPk = editingItem.value[pk as keyof T]\n response = await provider.update<T>(\n endpoint,\n itemPk as string | number,\n body,\n requestConfig,\n )\n if (!refetchOnSave) {\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) {\n items.value[index] = response.data\n }\n }\n toast.success(labels.successUpdate)\n } else {\n response = await provider.create<T>(endpoint, body, requestConfig)\n if (!refetchOnSave) {\n items.value.unshift(response.data)\n pagination.rows++\n }\n toast.success(labels.successCreate)\n }\n\n dialogVisible.value = false\n editingItem.value = null\n editingOriginal = null\n\n // Re-busca a página atual para refletir o estado real do backend\n // (campos derivados, ordenação, etc.) sem perder a posição da paginação,\n // busca ou filtros — todos preservados em `pagination`/`search`/`sort`.\n if (refetchOnSave) {\n await fetchItems()\n }\n\n if (onAfterSave) onAfterSave(response.data, isEditing.value)\n return response.data\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar registro'))\n return null\n } finally {\n saving.value = false\n }\n }\n\n // ---------------------------------------------------------------------------\n // Inline (cell) edit\n // ---------------------------------------------------------------------------\n\n async function updateField(item: T, field: string, value: unknown): Promise<void> {\n const itemPk = item[pk as keyof T]\n const fdef = formFields.find((f) => f.field === field)\n let v = value\n if (fdef?.type === 'date' && v instanceof Date) v = toDateString(v)\n else if (fdef?.type === 'datetime' && v instanceof Date) v = toDateTimeString(v)\n try {\n const response = await provider.update<T>(endpoint, itemPk as string | number, { [field]: v })\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) items.value[index] = { ...items.value[index], ...response.data }\n toast.success(labels.successUpdate)\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar o campo'))\n }\n }\n\n // ---------------------------------------------------------------------------\n // Delete\n // ---------------------------------------------------------------------------\n\n // Exclusão crua (sem o confirm de serviço) — para quem controla a própria\n // confirmação, ex.: WCrudView com diálogo de exclusão próprio (slot de mensagem).\n async function performDelete(item: T): Promise<void> {\n try {\n const itemPk = item[pk as keyof T]\n await provider.delete(endpoint, itemPk as string | number)\n const index = items.value.findIndex((i) => i[pk as keyof T] === itemPk)\n if (index !== -1) {\n items.value.splice(index, 1)\n pagination.rows--\n }\n toast.success(labels.successDelete)\n if (onAfterDelete) onAfterDelete(item)\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao excluir registro'))\n }\n }\n\n function confirmDelete(item: T): void {\n confirmDeleteDialog(() => performDelete(item), labels.deleteConfirmMessage)\n }\n\n function clearSelection(): void {\n selectedItems.value = []\n }\n\n function setColumnFilter(param: string, value: unknown): void {\n if (value === null || value === undefined || value === '') {\n delete columnFilters[param]\n } else {\n columnFilters[param] = value\n }\n pagination.page = 1\n fetchItems()\n }\n\n function clearColumnFilters(): void {\n for (const key of Object.keys(columnFilters)) delete columnFilters[key]\n pagination.page = 1\n fetchItems()\n }\n\n // ---------------------------------------------------------------------------\n // Return\n // ---------------------------------------------------------------------------\n\n return {\n items,\n selectedItems,\n columnFilters,\n extras,\n loading,\n saving,\n search,\n dialogVisible,\n editingItem,\n formData,\n pagination,\n sort,\n isEditing,\n isViewing,\n viewMode,\n dialogTitle,\n isFirstPage,\n isLastPage,\n init,\n fetchItems,\n fetchAll,\n refresh,\n setSearch,\n onSearch,\n onPage,\n onSort,\n openCreateDialog,\n openEditDialog,\n openViewDialog,\n openDuplicateDialog,\n save,\n updateField,\n confirmDelete,\n performDelete,\n setFormField,\n resetForm,\n goToPage,\n firstPage,\n lastPage,\n clearSelection,\n setColumnFilter,\n clearColumnFilters,\n config,\n }\n}\n","import { computed, reactive, ref } from 'vue'\nimport type { Ref } from 'vue'\nimport type { SubviewCrudConfig, SubviewCrudReturn } from '@/types/subview'\nimport type { CrudLabels } from '@/types/labels'\nimport { DEFAULT_CRUD_LABELS } from '@/types/labels'\nimport { useAppToast } from './useAppToast'\nimport { useAppConfirm } from './useAppConfirm'\nimport {\n convertFormRecord,\n getFieldDefaults,\n loadItemIntoRecord,\n validateFormRecord,\n} from '@/utils/formRecord'\n\n/**\n * O CRUD do `WCrudSubview`: mesma experiência do `useCrudManager`, sobre um array.\n *\n * Nada aqui é assíncrono e nada fala com a rede — `save` e `performDelete` devolvem o\n * array novo pelo `onChange` e acabou. O dono do estado decide o que fazer com isso\n * (num editor de documento, tipicamente marcar como sujo e gravar o documento inteiro).\n *\n * O array recebido nunca é mutado: toda operação devolve um array novo, para o\n * consumidor poder comparar referência e saber que mudou.\n */\nexport function useSubviewCrud<T extends Record<string, unknown> = Record<string, unknown>>(\n config: SubviewCrudConfig<T>,\n): SubviewCrudReturn<T> {\n const {\n rows,\n onChange,\n form: formFields,\n createDefaults = undefined,\n transformPayload = undefined,\n uniqueBy = undefined,\n uniqueMessage = 'Este item já está na lista.',\n toForm = undefined,\n onAfterSave = undefined,\n onAfterDelete = undefined,\n toast: comToast = false,\n } = config\n\n const labels: CrudLabels = { ...DEFAULT_CRUD_LABELS, ...config.labels }\n const toast = useAppToast()\n const { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n const items = computed(() => rows() ?? [])\n // Existe para o WCrudFormDialog, que espera a ref de um manager que grava na rede.\n // Aqui a gravação é síncrona, então nunca sai de `false`.\n const saving = ref(false)\n const dialogVisible = ref(false)\n const editingItem = ref<T | null>(null) as Ref<T | null>\n const editingIndex = ref(-1)\n const formData = reactive<Record<string, unknown>>({})\n\n const defaults = getFieldDefaults(formFields)\n for (const key of Object.keys(defaults)) {\n formData[key] = defaults[key]\n }\n\n const isEditing = computed(() => editingIndex.value >= 0)\n const dialogTitle = computed(() => (isEditing.value ? labels.editTitle : labels.createTitle))\n\n function resetForm(): void {\n const defs = getFieldDefaults(formFields)\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 aplicarCreateDefaults(): void {\n if (!createDefaults) return\n for (const [key, val] of Object.entries(createDefaults())) {\n formData[key] = val\n }\n }\n\n function openCreateDialog(): void {\n editingItem.value = null\n editingIndex.value = -1\n resetForm()\n aplicarCreateDefaults()\n dialogVisible.value = true\n }\n\n function carregarNoForm(item: T): void {\n loadItemIntoRecord(item, formFields, formData)\n if (!toForm) return\n for (const [key, val] of Object.entries(toForm(item))) {\n formData[key] = val\n }\n }\n\n function openEditDialog(item: T, index: number): void {\n editingItem.value = item\n editingIndex.value = index\n carregarNoForm(item)\n dialogVisible.value = true\n }\n\n function openDuplicateDialog(item: T): void {\n editingItem.value = null\n editingIndex.value = -1\n resetForm()\n carregarNoForm(item)\n // createDefaults sobrepõe o que veio da cópia (ex.: a FK do pai atual).\n aplicarCreateDefaults()\n dialogVisible.value = true\n }\n\n /** Chave de unicidade da linha, ou `undefined` quando não há o que comparar. */\n function chaveUnica(item: T): string | undefined {\n if (!uniqueBy) return undefined\n const valor = typeof uniqueBy === 'function' ? uniqueBy(item) : item[uniqueBy]\n if (valor === null || valor === undefined || valor === '') return undefined\n return String(valor)\n }\n\n function save(): T | null {\n const erro = validateFormRecord(formFields, formData)\n if (erro) {\n toast.error(erro)\n return null\n }\n\n let payload = convertFormRecord(formData, formFields)\n\n // createDefaults é prefill, não override: só completa o que ficou vazio, para não\n // desfazer a escolha do usuário num campo que nasceu preenchido.\n if (!isEditing.value && createDefaults) {\n for (const [key, value] of Object.entries(createDefaults())) {\n const atual = payload[key]\n if (atual === undefined || atual === null || atual === '') {\n payload[key] = value\n }\n }\n }\n\n if (transformPayload) {\n payload = transformPayload(payload, isEditing.value)\n }\n\n const anterior = items.value\n const indice = editingIndex.value\n const editando = indice >= 0\n // A linha editada preserva o que não está no form (id, campos derivados que o\n // servidor devolveu): o form conhece só os campos que ele mesmo edita.\n const item = (editando ? { ...anterior[indice], ...payload } : { ...payload }) as T\n\n // Duplicidade: comparada contra as OUTRAS linhas — editar a própria linha sem\n // mexer na chave não pode acusar conflito consigo mesma.\n const chave = chaveUnica(item)\n if (chave !== undefined && anterior.some((linha, i) => i !== indice && chaveUnica(linha) === chave)) {\n toast.error(uniqueMessage)\n return null\n }\n\n const proximo = editando\n ? anterior.map((linha, i) => (i === indice ? item : linha))\n : [...anterior, item]\n onChange(proximo)\n\n if (comToast) {\n toast.success(editando ? labels.successUpdate : labels.successCreate)\n }\n onAfterSave?.(item, editando)\n\n dialogVisible.value = false\n editingItem.value = null\n editingIndex.value = -1\n return item\n }\n\n function performDelete(index: number): void {\n const anterior = items.value\n const item = anterior[index]\n if (item === undefined) return\n\n onChange(anterior.filter((_, i) => i !== index))\n\n if (comToast) toast.success(labels.successDelete)\n onAfterDelete?.(item, index)\n }\n\n function confirmDelete(item: T, index: number): void {\n confirmDeleteDialog(() => performDelete(index), labels.deleteConfirmMessage)\n }\n\n return {\n items,\n saving,\n dialogVisible,\n editingItem,\n editingIndex,\n formData,\n isEditing,\n dialogTitle,\n openCreateDialog,\n openEditDialog,\n openDuplicateDialog,\n save,\n confirmDelete,\n performDelete,\n setFormField,\n resetForm,\n labels,\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":["getFieldDefaults","fields","defaults","f","loadItemIntoRecord","item","target","snapshot","value","parseDate","convertFormRecord","record","out","val","toDateString","toDateTimeString","key","stripMask","validateFormRecord","formData","result","diffRecord","original","current","useCrudManager","config","endpoint","formFields","pk","searchDebounce","partialUpdate","refetchOnSave","fetchDetailOnEdit","filterParams","createDefaults","transformItems","transformPayload","onAfterSave","onAfterDelete","dataProvider","inject","W_DATA_PROVIDER_KEY","provider","pluginConfig","W_CONFIG_KEY","defaultPageSize","labels","DEFAULT_CRUD_LABELS","toast","useAppToast","confirmDeleteDialog","useAppConfirm","items","ref","selectedItems","extras","loading","fetchSeq","saving","search","dialogVisible","viewMode","editingItem","reactive","editingOriginal","pagination","sort","columnFilters","getDefaults","isEditing","computed","isViewing","dialogTitle","isFirstPage","isLastPage","searchTimeout","fetchItems","params","seq","queryParams","responseData","init","refresh","fetchAll","pageSize","base","all","page","maxPages","res","total","setSearch","onSearch","event","goToPage","firstPage","lastPage","onPage","onSort","resetForm","defs","setFormField","field","openCreateDialog","extra","loadItemIntoForm","fetchDetail","err","extractApiError","openWithItem","open","full","openEditDialog","openViewDialog","openDuplicateDialog","rawItem","duplicateFrom","convertRecord","save","erro","payload","originalPayload","hasFile","body","headers","imageFields","fd","requestConfig","response","itemPk","index","i","updateField","fdef","v","performDelete","confirmDelete","clearSelection","setColumnFilter","param","clearColumnFilters","useSubviewCrud","rows","onChange","uniqueBy","uniqueMessage","toForm","comToast","editingIndex","aplicarCreateDefaults","carregarNoForm","chaveUnica","valor","atual","anterior","indice","editando","chave","linha","proximo","_","useApi","options","immediate","filters","setFilter","clearFilters"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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]}
|
|
@@ -1,3 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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]}
|