@wgalleti/primevue-components 1.4.0 → 1.5.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/components/form/WDateRange.vue.d.ts +2 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/ui/WAttentionList.vue.d.ts +34 -0
- package/dist/components/ui/WEmptyState.vue.d.ts +21 -3
- package/dist/components/ui/WKpiCard.vue.d.ts +2 -0
- package/dist/components/ui/WTabPane.d.ts +4 -0
- package/dist/{components-BRNk60nY.cjs → components-B9N5YvzN.cjs} +7 -7
- package/dist/components-B9N5YvzN.cjs.map +1 -0
- package/dist/{components-DsMEndfN.js → components-C5a424TI.js} +1362 -1269
- package/dist/components-C5a424TI.js.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.js +2 -2
- package/dist/composables/index.d.ts +3 -0
- package/dist/composables/useAppConfirm.d.ts +1 -0
- package/dist/composables/usePendingForms.d.ts +15 -0
- package/dist/composables/usePublishedVersion.d.ts +69 -0
- package/dist/composables-BZTlY1QU.cjs +2 -0
- package/dist/composables-BZTlY1QU.cjs.map +1 -0
- package/dist/composables-Bu1oxAgP.js +763 -0
- package/dist/composables-Bu1oxAgP.js.map +1 -0
- package/dist/composables.cjs +1 -1
- package/dist/composables.js +3 -3
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +42 -41
- package/dist/index.js.map +1 -1
- package/dist/primevue-components.css +1 -1
- package/dist/routeTabs-BnVpnSeJ.cjs.map +1 -1
- package/dist/routeTabs-D6m8PuP6.js.map +1 -1
- package/dist/types/attentionList.d.ts +22 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/kpi.d.ts +9 -0
- package/dist/types/manager.d.ts +2 -0
- package/dist/types/plugin.d.ts +6 -0
- package/dist/{useFormKeyboardNav-TqhfyJIg.js → useFormKeyboardNav-DNaAWyrr.js} +29 -5
- package/dist/useFormKeyboardNav-DNaAWyrr.js.map +1 -0
- package/dist/{useFormKeyboardNav-BTGDH0gB.cjs → useFormKeyboardNav-DkUCe_b7.cjs} +3 -3
- package/dist/useFormKeyboardNav-DkUCe_b7.cjs.map +1 -0
- package/dist/vite/buildIdentity.d.ts +39 -0
- package/dist/vite/index.d.ts +2 -0
- package/dist/vite.cjs +2 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.ts +2 -0
- package/dist/vite.js +26 -0
- package/dist/vite.js.map +1 -0
- package/package.json +8 -3
- package/dist/components-BRNk60nY.cjs.map +0 -1
- package/dist/components-DsMEndfN.js.map +0 -1
- package/dist/composables-B9ywPF1T.js +0 -650
- package/dist/composables-B9ywPF1T.js.map +0 -1
- package/dist/composables-BpUFAr7n.cjs +0 -2
- package/dist/composables-BpUFAr7n.cjs.map +0 -1
- package/dist/useFormKeyboardNav-BTGDH0gB.cjs.map +0 -1
- package/dist/useFormKeyboardNav-TqhfyJIg.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composables-Bu1oxAgP.js","names":[],"sources":["../src/composables/usePendingForms.ts","../src/composables/useCrudManager.ts","../src/composables/useSubviewCrud.ts","../src/composables/defineCrudConfig.ts","../src/composables/useApi.ts","../src/composables/useRouteTabs.ts","../src/composables/usePublishedVersion.ts"],"sourcesContent":["import { getCurrentScope, onScopeDispose, toValue, watch, type MaybeRefOrGetter } from 'vue'\n\n/**\n * Registro único de formulários com alteração não salva no app.\n *\n * É a mesma lista que alimenta o aviso de saída da página (`beforeunload`) e que impede a\n * recarga automática da versão publicada (`installPublishedVersion`) — uma fonte só.\n */\nconst pendentes = new Set<string>()\nlet avisoInstalado = false\nlet sequencia = 0\n\nfunction aoSairDaPagina(evento: BeforeUnloadEvent) {\n if (pendentes.size === 0) return\n evento.preventDefault()\n // Navegadores antigos só mostram o aviso com returnValue preenchido.\n evento.returnValue = ''\n}\n\nfunction instalarAviso() {\n if (avisoInstalado || typeof window === 'undefined') return\n window.addEventListener('beforeunload', aoSairDaPagina)\n avisoInstalado = true\n}\n\n/** Lista os formulários pendentes agora (chaves registradas). */\nexport function listPendingForms(): string[] {\n return [...pendentes]\n}\n\n/** Marca ou desmarca uma chave como pendente, fora de componente. */\nexport function setPendingForm(chave: string, pendente: boolean): void {\n if (pendente) {\n pendentes.add(chave)\n instalarAviso()\n } else {\n pendentes.delete(chave)\n }\n}\n\n/**\n * Mantém a chave pendente enquanto `sujo` for verdadeiro e o escopo estiver vivo.\n *\n * ```ts\n * usePendingForm(() => crud.dialogVisible.value && crud.isDirty.value)\n * ```\n */\nexport function usePendingForm(sujo: MaybeRefOrGetter<boolean>, chave?: string): void {\n const id = chave ?? `w-form-${++sequencia}`\n watch(\n () => Boolean(toValue(sujo)),\n (valor) => setPendingForm(id, valor),\n { immediate: true },\n )\n if (getCurrentScope()) onScopeDispose(() => setPendingForm(id, false))\n}\n\n/** Só para teste: zera o registro. */\nexport function __resetPendingForms(): void {\n pendentes.clear()\n}\n","import { ref, reactive, computed, inject, watch } 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 { usePendingForm } from './usePendingForms'\nimport { useTabHost } from '@/types/routeTabs'\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, confirmDiscard } = useAppConfirm()\n // Padrão do app (plugin) para o teclado no formulário; a tela que declara vence.\n const configResolvida: CrudManagerConfig<T> = {\n ...config,\n keyboardNav: config.keyboardNav ?? pluginConfig?.keyboardNav ?? false,\n }\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 // Alteração não salva: retrato do formulário no momento em que o diálogo abre (todos os\n // `open*` preenchem o formData antes de mostrar). Alimenta o registro de pendentes — aviso\n // de saída da página e bloqueio da recarga por versão nova.\n let retratoAoAbrir = ''\n watch(\n dialogVisible,\n (aberto) => {\n if (aberto) retratoAoAbrir = JSON.stringify(formData)\n },\n { flush: 'sync' },\n )\n const isDirty = computed(\n () => dialogVisible.value && !viewMode.value && JSON.stringify(formData) !== retratoAoAbrir,\n )\n usePendingForm(isDirty)\n // Dentro de uma aba de rota, fechar a aba com o diálogo alterado pergunta antes.\n useTabHost()?.registerCloseGuard(() => !isDirty.value || confirmDiscard())\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, isEditing.value)\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 isDirty,\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: configResolvida,\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, isEditing.value)\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 (\n chave !== undefined &&\n anterior.some((linha, i) => i !== indice && chaveUnica(linha) === chave)\n ) {\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 type { CrudManagerConfig } from '@/types/manager'\n\n/**\n * Helper de autoria tipado para o config do `useCrudManager`.\n *\n * Dá inferência do tipo do registro `T` (usado em `rowActions`, `onAfterSave`,\n * `transformPayload`, etc.) e autocomplete/type-check ao montar o config,\n * sem precisar anotar `CrudManagerConfig<T>` na mão.\n *\n * @example\n * const config = defineCrudConfig<Produto>({\n * endpoint: '/produtos',\n * columns: [...],\n * form: [...],\n * onAfterSave: (p) => { p.nome }, // p é Produto\n * })\n * const crud = useCrudManager(config)\n */\nexport function defineCrudConfig<T extends Record<string, unknown> = Record<string, unknown>>(\n config: CrudManagerConfig<T>,\n): CrudManagerConfig<T> {\n return config\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","import { ref, shallowReactive, type Component } from 'vue'\nimport type { RouteLocationNormalizedLoaded } from 'vue-router'\nimport type {\n RouteTab,\n RouteTabMeta,\n RouteTabRuntime,\n RouteTabsApi,\n UseRouteTabsOptions,\n} from '@/types/routeTabs'\n\n/**\n * Estado da navegação por abas. É uma FÁBRICA: chame uma vez no boot do app,\n * guarde a instância num módulo seu e passe-a por prop para `WTabNav` e\n * `WTabViewport` (regra da suite: nenhum estado global dentro de componente).\n *\n * O composable instala um `router.afterEach`: rota que `isTabRoute` aceita\n * vira aba (ou reativa a existente — mudança só de query atualiza a aba, não\n * abre outra). O que é \"uma aba\" vem do parâmetro `mode`: `'screen'` (default,\n * uma aba por tela) ou `'module'` (uma aba por entrada de menu, com navegação\n * interna — ver `UseRouteTabsOptions`). A lista sobrevive a reload via\n * storage; as abas voltam como \"shells\" (`hydrated: false`) e só montam\n * quando ativadas — a URL do reload sempre ganha a disputa pela aba ativa.\n */\n\ninterface PersistedTab {\n key: string\n fullPath: string\n title: string\n icon?: string\n closable: boolean\n group?: string\n color?: string\n}\n\ninterface PersistedState {\n v: 1\n activeKey: string | null\n tabs: PersistedTab[]\n}\n\nfunction snapshotRoute(to: RouteLocationNormalizedLoaded): Record<string, unknown> {\n return {\n fullPath: to.fullPath,\n path: to.path,\n name: to.name,\n params: to.params,\n query: to.query,\n hash: to.hash,\n meta: to.meta,\n matched: to.matched,\n redirectedFrom: to.redirectedFrom,\n }\n}\n\n/** Props que o RouterView passaria à view (`props: true | object | fn`). */\nfunction resolveViewProps(to: RouteLocationNormalizedLoaded): Record<string, unknown> {\n const record = to.matched[to.matched.length - 1]\n const config = record?.props?.default\n if (config === true) return { ...to.params }\n if (typeof config === 'function') return config(to) ?? {}\n if (config && typeof config === 'object') return { ...config }\n return {}\n}\n\n/** Componente da view, já resolvido pelo pipeline do router (lazy incluso). */\nfunction resolveViewComponent(to: RouteLocationNormalizedLoaded): Component | null {\n const record = to.matched[to.matched.length - 1]\n const component = record?.components?.default\n // Após a navegação o router já trocou a função lazy pelo componente real;\n // se ainda for função é um estado inesperado — o pane não monta nada.\n return component && typeof component !== 'function' ? (component as Component) : null\n}\n\nexport function useRouteTabs(options: UseRouteTabsOptions): RouteTabsApi {\n const {\n router,\n mode = 'screen',\n moduleRoot,\n shouldRemount,\n resolveTabMeta = (): Partial<RouteTabMeta> => ({}),\n isTabRoute = () => true,\n storage = typeof localStorage === 'undefined' ? null : localStorage,\n storageKey = 'w-route-tabs',\n homePath = '/',\n maxTabs,\n } = options\n\n if (mode === 'module' && !moduleRoot) {\n throw new Error('[useRouteTabs] mode \"module\" exige a opção moduleRoot(route).')\n }\n\n /** Identidade da aba, derivada do modo de uso (ver `UseRouteTabsOptions.mode`). */\n const tabKey = (route: RouteLocationNormalizedLoaded): string =>\n (mode === 'module' && moduleRoot?.(route)) || route.path\n\n const tabs = ref<RouteTab[]>([])\n const activeKey = ref<string | null>(null)\n const runtimes = new Map<string, RouteTabRuntime>()\n let restored = false\n /** Chave usada no último restore — muda quando o usuário troca sem reload. */\n let restoredKey: string | null = null\n\n function resolveStorageKey(): string {\n return typeof storageKey === 'function' ? storageKey() : storageKey\n }\n\n // Síncrono de propósito: precisa estar no disco antes de um\n // `window.location.reload()` disparado logo após a mutação.\n function persist(): void {\n if (!storage) return\n const state: PersistedState = {\n v: 1,\n activeKey: activeKey.value,\n tabs: tabs.value.map(({ key, fullPath, title, icon, closable, group, color }) => ({\n key,\n fullPath,\n title,\n icon,\n closable,\n group,\n color,\n })),\n }\n try {\n storage.setItem(resolveStorageKey(), JSON.stringify(state))\n } catch {\n /* storage cheio/indisponível não pode derrubar a navegação */\n }\n }\n\n /** Recarrega os shells persistidos. Roda no primeiro afterEach e de novo\n * quando a storageKey muda (logout/login sem reload: as abas de um usuário\n * nunca vazam para o outro). */\n function restore(): void {\n restored = true\n restoredKey = resolveStorageKey()\n tabs.value = []\n activeKey.value = null\n runtimes.clear()\n if (!storage) return\n try {\n const raw = storage.getItem(resolveStorageKey())\n if (!raw) return\n const state = JSON.parse(raw) as PersistedState\n if (state?.v !== 1 || !Array.isArray(state.tabs)) return\n tabs.value = state.tabs\n .filter((t) => t && typeof t.key === 'string' && typeof t.fullPath === 'string')\n .filter((t) => stillATab(t.fullPath))\n .map((t) => ({ ...t, hydrated: false, remount: 0 }))\n } catch {\n /* estado corrompido = começar sem abas */\n }\n }\n\n /** Aba salva cuja rota sumiu, virou redirecionamento ou deixou de ser aba (a URL\n * mudou entre versões) não volta: viraria uma aba que nunca fica ativa. */\n function stillATab(fullPath: string): boolean {\n try {\n const resolved = router.resolve(fullPath)\n // Só o último registro redireciona de fato; pai de layout com `redirect` é comum.\n const last = resolved.matched[resolved.matched.length - 1]\n if (!last || last.redirect) return false\n return isTabRoute(resolved as unknown as RouteLocationNormalizedLoaded)\n } catch {\n return false\n }\n }\n\n function findTab(key: string): RouteTab | undefined {\n return tabs.value.find((t) => t.key === key)\n }\n\n /** Aba nova entra colada no fim do próprio grupo (como o menu agrupa). */\n function insertTab(tab: RouteTab): void {\n if (tab.group) {\n for (let i = tabs.value.length - 1; i >= 0; i -= 1) {\n if (tabs.value[i].group === tab.group) {\n tabs.value.splice(i + 1, 0, tab)\n return\n }\n }\n }\n tabs.value.push(tab)\n }\n\n function defaultTitleFor(to: RouteLocationNormalizedLoaded): string {\n const meta = resolveTabMeta(to)\n if (meta.title) return meta.title\n if (typeof to.name === 'string') return to.name\n return to.path\n }\n\n /** Liga (ou religa) o runtime da aba à rota recém-navegada. */\n function hydrate(tab: RouteTab, to: RouteLocationNormalizedLoaded): void {\n let runtime = runtimes.get(tab.key)\n // Modo 'module', trocou de PATH dentro da mesma aba = tela nova: o pane\n // remonta inteiro (chave inclui `remount`) com um runtime NOVO — a\n // instância que está saindo fica com o snapshot dela intacto até\n // desmontar (mutar a rota sob uma tela viva quebra o patch do Vue), e\n // título/ícone voltam aos da rota nova. Query-only continua no else — e\n // também a troca que `shouldRemount` declara ser a mesma tela (rascunho\n // que ganhou id): a view viva recebe os props novos.\n if (\n runtime &&\n mode === 'module' &&\n (runtime.route as { path: string }).path !== to.path &&\n (shouldRemount?.(runtime.route, to) ?? true)\n ) {\n runtimes.delete(tab.key)\n runtime = undefined\n tab.remount += 1\n const meta = resolveTabMeta(to)\n tab.title = meta.title ?? defaultTitleFor(to)\n if (meta.icon) tab.icon = meta.icon\n }\n if (!runtime) {\n // Shell restaurada do storage pode hidratar numa TELA diferente da\n // persistida (ex.: o menu levou à listagem e a shell guardava o\n // detalhe): título/ícone voltam aos da rota real. Hidratar no MESMO\n // path mantém o título persistido (\"NF 46032\") até a tela repor.\n if (tab.fullPath.split(/[?#]/)[0] !== to.path) {\n const meta = resolveTabMeta(to)\n tab.title = meta.title ?? defaultTitleFor(to)\n if (meta.icon) tab.icon = meta.icon\n }\n runtime = {\n component: resolveViewComponent(to),\n props: resolveViewProps(to),\n // shallow: `matched` carrega definições de componente — reatividade\n // profunda ali é peso morto; o router troca as chaves por inteiro.\n route: shallowReactive(snapshotRoute(to)) as unknown as RouteLocationNormalizedLoaded,\n closeGuards: [],\n activatedHooks: [],\n deactivatedHooks: [],\n defaultTitle: defaultTitleFor(to),\n }\n runtimes.set(tab.key, runtime)\n } else {\n // Só a aba ativa recebe a rota nova — panes ocultos ficam congelados.\n // Aqui é sempre a MESMA tela (query/hash, ou path que `shouldRemount`\n // liberou); path novo já virou runtime novo acima.\n runtime.component = resolveViewComponent(to)\n runtime.props = resolveViewProps(to)\n Object.assign(runtime.route, snapshotRoute(to))\n }\n tab.fullPath = to.fullPath\n tab.hydrated = true\n }\n\n function enforceMaxTabs(): void {\n if (!maxTabs || tabs.value.length <= maxTabs) return\n const victim = tabs.value.find((t) => t.key !== activeKey.value && t.closable)\n if (victim) void close(victim.key)\n }\n\n // Modo 'module': trocar de tela DENTRO da aba ativa descarta a instância\n // atual (remount no hydrate) — então os close guards da tela valem aqui\n // também: sair de um editor sujo para a listagem da mesma aba passa pela\n // confirmação, igual ao fechar. Troca de aba não passa por aqui: o pane\n // antigo segue vivo.\n if (mode === 'module') {\n router.beforeEach(async (to, from) => {\n if (!restored) return true\n if (!isTabRoute(to) || !isTabRoute(from)) return true\n const key = tabKey(to)\n if (key !== activeKey.value || key !== tabKey(from)) return true\n if (from.path === to.path) return true\n return await runCloseGuards(key)\n })\n }\n\n router.afterEach((to, _from, failure) => {\n // Navegação abortada (guard vetou, redirect, duplicada) não mexe nas abas.\n if (failure) return\n if (!restored || (storage && resolveStorageKey() !== restoredKey)) restore()\n if (!isTabRoute(to)) {\n activeKey.value = null\n return\n }\n const key = tabKey(to)\n let tab = findTab(key)\n if (!tab) {\n const meta = resolveTabMeta(to)\n tab = {\n key,\n fullPath: to.fullPath,\n title: meta.title ?? defaultTitleFor(to),\n icon: meta.icon,\n closable: meta.closable ?? true,\n group: meta.group,\n color: meta.color,\n hydrated: false,\n remount: 0,\n }\n insertTab(tab)\n }\n hydrate(tab, to)\n activeKey.value = key\n enforceMaxTabs()\n persist()\n })\n\n async function activate(key: string): Promise<void> {\n const tab = findTab(key)\n if (!tab || key === activeKey.value) return\n await router.push(tab.fullPath)\n }\n\n async function runCloseGuards(key: string): Promise<boolean> {\n const runtime = runtimes.get(key)\n if (!runtime) return true\n for (const guard of [...runtime.closeGuards]) {\n if (!(await guard())) return false\n }\n return true\n }\n\n function removeTab(key: string): void {\n tabs.value = tabs.value.filter((t) => t.key !== key)\n runtimes.delete(key)\n }\n\n async function close(key: string): Promise<boolean> {\n const tab = findTab(key)\n if (!tab) return true\n if (!tab.closable) return false\n if (!(await runCloseGuards(key))) return false\n const index = tabs.value.findIndex((t) => t.key === key)\n const wasActive = key === activeKey.value\n removeTab(key)\n if (wasActive) {\n // Vizinha da esquerda; sem esquerda, a nova ocupante do índice (direita).\n const next = tabs.value[index - 1] ?? tabs.value[index] ?? null\n if (next) {\n activeKey.value = null\n await router.push(next.fullPath)\n } else {\n activeKey.value = null\n await router.push(homePath)\n }\n }\n persist()\n return true\n }\n\n async function closeOthers(key: string): Promise<void> {\n for (const other of tabs.value.filter((t) => t.key !== key && t.closable)) {\n await runCloseGuards(other.key).then((ok) => ok && removeTab(other.key))\n }\n persist()\n await activate(key)\n }\n\n async function closeAll(): Promise<void> {\n let activeSurvived = false\n for (const tab of [...tabs.value]) {\n if (!tab.closable || !(await runCloseGuards(tab.key))) {\n activeSurvived ||= tab.key === activeKey.value\n continue\n }\n removeTab(tab.key)\n }\n persist()\n if (!activeSurvived && activeKey.value) {\n const next = tabs.value[0]\n activeKey.value = null\n await router.push(next ? next.fullPath : homePath)\n }\n }\n\n function reload(key: string): void {\n const tab = findTab(key)\n if (!tab?.hydrated) return\n const runtime = runtimes.get(key)\n if (runtime) {\n // A tela vai remontar: registros da instância antiga morrem com ela.\n runtime.closeGuards = []\n runtime.activatedHooks = []\n runtime.deactivatedHooks = []\n }\n tab.remount += 1\n }\n\n function setTitle(key: string, title: string | null | undefined): void {\n const tab = findTab(key)\n if (!tab) return\n tab.title = title ?? runtimes.get(key)?.defaultTitle ?? tab.title\n persist()\n }\n\n function isLive(target: RouteLocationNormalizedLoaded | string): boolean {\n const key = typeof target === 'string' ? target : tabKey(target)\n return findTab(key)?.hydrated ?? false\n }\n\n return {\n tabs,\n activeKey,\n activate,\n close,\n closeOthers,\n closeAll,\n reload,\n setTitle,\n isLive,\n runtime: (key) => runtimes.get(key),\n }\n}\n","import { listPendingForms } from './usePendingForms'\n\n/**\n * Versão publicada sem \"limpar o cache\": a aba aberta há dias descobre que o bundle dela\n * deixou de ser o publicado e recarrega no momento seguro (troca de tela ou volta à aba),\n * nunca com formulário pendente, offline ou com leitura velha do arquivo de versão.\n * Chunk removido pelo deploy vira uma recarga única por build.\n */\n\n/** O que a detecção lê de uma rota (vue-router 4 e 5 servem). */\nexport interface RouteLike {\n name?: unknown\n path: string\n fullPath?: string\n matched?: readonly unknown[]\n}\n\n/** Só o que a instalação usa do roteador — sem acoplar à versão do vue-router. */\nexport interface RouterLike {\n beforeEach: (guard: (to: RouteLike & { fullPath: string }, from: RouteLike) => boolean) => unknown\n afterEach: (hook: () => void) => unknown\n onError: (handler: (erro: unknown, to: RouteLike) => void) => unknown\n resolve: (to: string) => { href: string }\n}\n\nexport const MIN_CHECK_INTERVAL_MS = 60_000\nexport const RECENT_READ_MS = 5 * 60_000\n\nconst CHUNK_ERROR =\n /Failed to fetch dynamically imported module|Importing a module script failed|error loading dynamically imported module|Unable to preload CSS/i\n\nexport const isChunkError = (erro: unknown): boolean =>\n CHUNK_ERROR.test(String((erro as { message?: unknown })?.message ?? erro ?? ''))\n\nconst CHUNK_RELOAD_KEY = 'w-chunk-reload'\n\nexport interface PublishedVersionDeps {\n /** Identificador embutido no bundle em execução. */\n currentBuild: string\n /** Lê o arquivo de versão (sem cache). */\n fetchVersion: () => Promise<Response>\n now: () => number\n online: () => boolean\n pending: () => unknown[]\n reload: () => void\n goTo: (href: string) => void\n /** Armazenamento de sessão; `null` quando bloqueado (aí chunk ausente não recarrega). */\n storage: Pick<Storage, 'getItem' | 'setItem'> | null\n /** Avisa que há versão nova mas o formulário pendente impede a recarga. */\n warn: () => void\n}\n\nexport interface PublishedVersion {\n check: () => Promise<void>\n canReload: () => boolean\n onTabVisible: () => Promise<void>\n onRouteChange: (to: RouteLike, from: RouteLike, href: string) => boolean\n onChunkError: (href?: string) => boolean\n readonly hasNewVersion: boolean\n}\n\n/** Núcleo sem globais: tudo o que toca navegador entra por parâmetro. */\nexport function createPublishedVersion(deps: PublishedVersionDeps): PublishedVersion {\n let versaoNova = false\n let ultimaLeitura = Number.NEGATIVE_INFINITY\n let ultimaTentativa = Number.NEGATIVE_INFINITY\n let emVoo: Promise<void> | null = null\n let recarregando = false\n let avisado = false\n\n async function ler(): Promise<void> {\n try {\n const resposta = await deps.fetchVersion()\n if (resposta.status !== 200) return\n const corpo = (await resposta.json()) as { build?: unknown }\n if (typeof corpo?.build !== 'string') return\n // Recalcula sempre: depois de um rollback, a versão volta a bater.\n versaoNova = corpo.build !== deps.currentBuild\n ultimaLeitura = deps.now()\n } catch {\n // Rede, página de manutenção em HTML, JSON inválido: não é leitura.\n }\n }\n\n function check(): Promise<void> {\n if (emVoo) return emVoo\n if (deps.now() - ultimaTentativa < MIN_CHECK_INTERVAL_MS) return Promise.resolve()\n ultimaTentativa = deps.now()\n emVoo = ler().finally(() => {\n emVoo = null\n })\n return emVoo\n }\n\n function canReload(): boolean {\n return (\n versaoNova &&\n !recarregando &&\n deps.now() - ultimaLeitura < RECENT_READ_MS &&\n deps.online() &&\n deps.pending().length === 0\n )\n }\n\n return {\n check,\n canReload,\n get hasNewVersion() {\n return versaoNova\n },\n async onTabVisible() {\n await check()\n if (canReload()) {\n recarregando = true\n deps.reload()\n }\n },\n onRouteChange(to, from, href) {\n // Primeira navegação e a mesma tela mudando a própria URL não são troca de tela.\n if (\n !from.matched?.length ||\n (to.name !== undefined && to.name === from.name) ||\n to.path === from.path\n ) {\n return true\n }\n void check() // não atrasa a navegação: decide com o que já sabe\n if (!canReload()) return true\n recarregando = true\n deps.goTo(href)\n return false\n },\n onChunkError(href) {\n // Sem rede, o chunk falhou pela rede e não pelo deploy: recarregar trocaria o app\n // por a página offline do navegador e gastaria a única recarga deste build.\n if (!deps.online() || !deps.storage) return false\n try {\n if (deps.storage.getItem(CHUNK_RELOAD_KEY) === deps.currentBuild) return false\n if (deps.pending().length > 0) {\n // O mesmo erro chega pelo preload e pelo roteador: avisa uma vez.\n if (!avisado) deps.warn()\n avisado = true\n return false\n }\n deps.storage.setItem(CHUNK_RELOAD_KEY, deps.currentBuild)\n } catch {\n return false\n }\n recarregando = true\n if (href) deps.goTo(href)\n else deps.reload()\n return true\n },\n }\n}\n\nexport interface InstallPublishedVersionOptions {\n /** Identificador do build em execução (o `__BUILD_ID__` do plugin `wBuildIdentity`). */\n buildId: string\n /** Desligue no servidor de desenvolvimento (`!import.meta.env.DEV`): lá não há arquivo de versão. */\n enabled?: boolean\n /** URL do arquivo de versão. Default: `<base>version.json`. */\n versionUrl?: string\n /** Formulários pendentes. Default: o registro de `usePendingForm`. */\n pending?: () => unknown[]\n /** Aviso quando o chunk sumiu mas há formulário pendente. */\n onBlocked?: () => void\n}\n\n/**\n * Liga a detecção ao roteador e aos eventos da página. Chame antes das outras guardas\n * (a que liga overlay de carregamento, por exemplo), para não deixar overlay preso.\n */\nexport function installPublishedVersion(\n router: RouterLike,\n options: InstallPublishedVersionOptions,\n): PublishedVersion | null {\n if (options.enabled === false || typeof window === 'undefined') return null\n\n const base = (import.meta as { env?: { BASE_URL?: string } }).env?.BASE_URL ?? '/'\n const versao = createPublishedVersion({\n currentBuild: options.buildId,\n fetchVersion: () => fetch(options.versionUrl ?? `${base}version.json`, { cache: 'no-store' }),\n now: () => Date.now(),\n online: () => navigator.onLine !== false,\n pending: options.pending ?? listPendingForms,\n reload: () => window.location.reload(),\n goTo: (href) => window.location.assign(href),\n storage: (() => {\n try {\n return window.sessionStorage\n } catch {\n return null\n }\n })(),\n warn: options.onBlocked ?? (() => {}),\n })\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') void versao.onTabVisible()\n })\n window.addEventListener('pageshow', (evento) => {\n if (evento.persisted) void versao.onTabVisible()\n })\n\n // vite:preloadError chega ANTES do router.onError e não sabe o destino.\n let destino: string | undefined\n router.beforeEach((to, from) => {\n const href = router.resolve(to.fullPath).href\n const segue = versao.onRouteChange(to, from, href)\n destino = segue ? href : undefined\n return segue\n })\n router.afterEach(() => {\n destino = undefined\n })\n window.addEventListener('vite:preloadError', (evento) => {\n if (versao.onChunkError(destino)) evento.preventDefault()\n })\n router.onError((erro, to) => {\n const alvo = to?.fullPath ? router.resolve(to.fullPath).href : destino\n destino = undefined\n if (isChunkError(erro)) versao.onChunkError(alvo)\n })\n\n return versao\n}\n"],"mappings":"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"}
|
package/dist/composables.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useFormKeyboardNav-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useFormKeyboardNav-DkUCe_b7.cjs"),t=require("./composables-BZTlY1QU.cjs");exports.BREAKPOINTS=e.g,exports.MIN_CHECK_INTERVAL_MS=t.t,exports.RECENT_READ_MS=t.n,exports.createPublishedVersion=t.r,exports.defineCrudConfig=t.c,exports.extractApiError=e.r,exports.installPublishedVersion=t.i,exports.isChunkError=t.a,exports.listPendingForms=t.d,exports.setPendingForm=t.f,exports.useApi=t.s,exports.useApiError=e.i,exports.useAppConfirm=e.a,exports.useAppToast=e.o,exports.useBreakpoint=e._,exports.useCrudManager=t.u,exports.useDateInput=e.n,exports.useFormKeyboardNav=e.t,exports.useFormatters=e.f,exports.usePendingForm=t.p,exports.useRouteTabs=t.o,exports.useSubviewCrud=t.l;
|
package/dist/composables.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { _ as e, a as t, f as n, g as r, i, n as a, o, r as s, t as c } from "./useFormKeyboardNav-
|
|
2
|
-
import { a as l,
|
|
3
|
-
export { r as BREAKPOINTS,
|
|
1
|
+
import { _ as e, a as t, f as n, g as r, i, n as a, o, r as s, t as c } from "./useFormKeyboardNav-DNaAWyrr.js";
|
|
2
|
+
import { a as l, c as u, d, f, i as p, l as m, n as h, o as g, p as _, r as v, s as y, t as b, u as x } from "./composables-Bu1oxAgP.js";
|
|
3
|
+
export { r as BREAKPOINTS, b as MIN_CHECK_INTERVAL_MS, h as RECENT_READ_MS, v as createPublishedVersion, u as defineCrudConfig, s as extractApiError, p as installPublishedVersion, l as isChunkError, d as listPendingForms, f as setPendingForm, y as useApi, i as useApiError, t as useAppConfirm, o as useAppToast, e as useBreakpoint, x as useCrudManager, a as useDateInput, c as useFormKeyboardNav, n as useFormatters, _ as usePendingForm, g as useRouteTabs, m as useSubviewCrud };
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useFormKeyboardNav-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useFormKeyboardNav-DkUCe_b7.cjs"),t=require("./routeTabs-BnVpnSeJ.cjs"),n=require("./components-B9N5YvzN.cjs"),r=require("./labels-DiFDhFhQ.cjs"),i=require("./composables-BZTlY1QU.cjs");require("./types.cjs");let a=require("primevue/dialog");a=e.v(a,1);let o=require("primevue/drawer");o=e.v(o,1);function s(e,t,n){let r=e;return Array.isArray(r.results)?{data:r.results,page:r.page??t,page_size:r.page_size??n,rows:r.count??0,extras:r.extras??{}}:Array.isArray(r.data)?{data:r.data,page:r.page??t,page_size:r.page_size??n,rows:r.rows??0,extras:r.extras??{}}:{data:Array.isArray(e)?e:[],page:t,page_size:n,rows:Array.isArray(e)?e.length:0,extras:{}}}function c(e){return{async list(t,n={}){return s((await e.get(t,{params:n})).data,Number(n.page??1),Number(n.page_size??20))},async get(t,n,r){return{data:(await e.get(`${t}${n}/`,r)).data}},async create(t,n,r){return{data:(await e.post(t,n,r)).data}},async update(t,n,r,i){return{data:(await e.patch(`${t}${n}/`,r,i)).data}},async delete(t,n){await e.delete(`${t}${n}/`)}}}var l=`[data-pc-name="dialog"], [data-pc-name="drawer"]`,u=Symbol(`w-escape-stack`);function d(e){for(let t=e;t;t=t.parentElement)if(t.hidden||getComputedStyle(t).display===`none`)return!1;return!0}function f(e){let t=Number.parseInt(getComputedStyle(e.parentElement??e).zIndex,10);return Number.isNaN(t)?0:t}function p(){return Array.from(document.querySelectorAll(l)).filter(d)}function m(e){if(!e)return!0;let t=p();if(!t.includes(e))return!1;if(t.length===1)return!0;let n=t[0];for(let e of t)f(e)>=f(n)&&(n=e);return n===e}function h(e,t){let n=e.methods,r=n?.[t];if(!n||!r||r[u])return;let i=function(e){e.code===`Escape`&&!m(this.container)||r.call(this,e)};i[u]=!0,n[t]=i}function g(){typeof document>`u`||(h(a.default,`onKeyDown`),h(o.default,`onKeydown`))}var _={install(e,r){if(!r?.axios&&!r?.dataProvider)throw Error(`[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.`);let i=r.dataProvider??c(r.axios),a={axios:r.axios,dataProvider:i,defaultPageSize:r.defaultPageSize??20,dateFormat:r.dateFormat??`DD/MM/YYYY`,dateTimeFormat:r.dateTimeFormat??`DD/MM/YYYY HH:mm`,locale:r.locale??`pt-BR`,currency:r.currency??`BRL`,keyboardNav:r.keyboardNav??!1};r.axios&&e.provide(t.r,r.axios),e.provide(t.a,i),e.provide(t.i,a),r.patchDialogEscape!==!1&&g(),r.registerComponents!==!1&&(e.component(`WCrudView`,n.B),e.component(`WCrudFormDialog`,n.U),e.component(`WCrudColumnRenderer`,n.et),e.component(`WAutoCompleteFK`,n.Y),e.component(`WMoneyInput`,n.q),e.component(`WTransferList`,n.G),e.component(`WTreeSelect`,n.F))}};function v(e){return e.split(`?`)[0].replace(/^\/+|\/+$/g,``).replace(/^api\/v\d+\//,``)}function y(e){return typeof e==`string`?{table:e}:e}function b(e,t=400){return{response:{status:t,data:{detail:e}},message:e}}function x(e){if(e instanceof FormData)throw b(`SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.`);return e}function S(e){throw{response:{data:{detail:e?.message??`Erro ao consultar Supabase`,code:e?.code,details:e?.details,hint:e?.hint}},message:e?.message??`Erro ao consultar Supabase`}}function C(e,t){let n=v(e),r=t.resources?.[n];if(r)return y(r);if(t.allowedTables?.includes(n))return{table:n};throw b(`Recurso Supabase nao registrado para o endpoint "${e}".`,404)}function w(e,t,n){let r=new Set([`page`,`page_size`,`search`,`ordering`]),i={...n.defaultFilters,...t};for(let[t,n]of Object.entries(i))r.has(t)||n==null||n===``||(e=e.eq(t,n));return e}function T(e,t,n){if(typeof t!=`string`||!t.trim()||!n?.length)return e;let r=t.trim().replace(/,/g,`\\,`),i=n.map(e=>`${e}.ilike.%${r}%`).join(`,`);return e.or(i)}function E(e,t){let n=typeof e==`string`&&e?e:t;return n?{field:n.startsWith(`-`)?n.slice(1):n,ascending:!n.startsWith(`-`)}:null}function D(e,t){return e?t.mapListItem?e.map(e=>t.mapListItem?.(e)):e:[]}function O(e){let t=e.defaultSelect??`*`;return{async list(n,r={}){let i=C(n,e),a=Math.max(Number(r.page??1),1),o=Math.max(Number(r.page_size??20),1),s=(a-1)*o,c=s+o-1,l=e.client.from(i.table).select(i.select??t,{count:`exact`});l=w(l,r,i),l=T(l,r.search,i.searchFields);let u=E(r.ordering,i.defaultOrdering);u&&(l=l.order(u.field,{ascending:u.ascending}));let d=await l.range(s,c);return d.error&&S(d.error),{data:D(d.data,i),page:a,page_size:o,rows:d.count??d.data?.length??0,extras:{}}},async get(n,r,i){let a=C(n,e),o=a.pk??`id`,s=await e.client.from(a.table).select(a.select??t).eq(o,r).single();return s.error&&S(s.error),{data:s.data}},async create(n,r,i){let a=C(n,e),o=x(r),s=a.mapPayload?a.mapPayload(o,`create`):o,c=await e.client.from(a.table).insert(s).select(a.select??t).single();return c.error&&S(c.error),{data:c.data}},async update(n,r,i,a){let o=C(n,e),s=o.pk??`id`,c=x(i),l=o.mapPayload?o.mapPayload(c,`update`):c,u=await e.client.from(o.table).update(l).eq(s,r).select(o.select??t).single();return u.error&&S(u.error),{data:u.data}},async delete(t,n){let r=C(t,e),i=r.pk??`id`,a=r.softDelete===!0?{is_active:!1}:typeof r.softDelete==`object`?r.softDelete:null,o=a?await e.client.from(r.table).update(a).eq(i,n):await e.client.from(r.table).delete().eq(i,n);o.error&&S(o.error)}}}exports.BREAKPOINTS=e.g,exports.DEFAULT_CRUD_LABELS=r.t,exports.MIN_CHECK_INTERVAL_MS=i.t,exports.RECENT_READ_MS=i.n,exports.WActionBar=n.g,exports.WAttentionList=n.u,exports.WAutoCompleteFK=n.Y,exports.WChart=n.j,exports.WCheckList=n.d,exports.WCrudColumnRenderer=n.et,exports.WCrudFormDialog=n.U,exports.WCrudSubview=n.R,exports.WCrudView=n.B,exports.WDatePicker=n.J,exports.WDateRange=n.L,exports.WDetailHeader=n.D,exports.WDialog=n.a,exports.WEditableTable=n.z,exports.WEmptyState=n.O,exports.WFileUpload=n.I,exports.WFormRenderer=n.W,exports.WFormSection=n._,exports.WImageCropper=n.K,exports.WInfoCard=n.E,exports.WKanbanBoard=n.t,exports.WKpiCard=n.T,exports.WKpiGrid=n.w,exports.WMapSelect=n.l,exports.WMarkdownEditor=n.s,exports.WMarkdownToc=n.o,exports.WMarkdownView=n.c,exports.WMeter=n.S,exports.WMoneyInput=n.q,exports.WPageHeader=n.k,exports.WPrimeVuePlugin=_,exports.WProgressFlow=n.h,exports.WSectionAccordion=n.b,exports.WSectionHeader=n.y,exports.WSectionPanel=n.v,exports.WStatusTag=n.A,exports.WStepFlow=n.p,exports.WStepSection=n.f,exports.WTabBar=n.i,exports.WTabNav=n.r,exports.WTabViewport=n.n,exports.WTransferList=n.G,exports.WTreeSelect=n.F,exports.W_AXIOS_KEY=t.r,exports.W_CONFIG_KEY=t.i,exports.W_DATA_PROVIDER_KEY=t.a,exports.W_SECTION_ACCORDION_KEY=n.x,exports.W_STEP_FLOW_KEY=n.m,exports.W_TAB_HOST_KEY=t.t,exports.buildChartTheme=n.M,exports.buildPrintTheme=n.N,exports.convertFormRecord=e.s,exports.createAxiosDataProvider=c,exports.createPublishedVersion=i.r,exports.createSupabaseDataProvider=O,exports.donutOption=n.P,exports.downloadCsv=n.V,exports.extractApiError=e.r,exports.getFieldDefaults=e.c,exports.installPublishedVersion=i.i,exports.isChunkError=i.a,exports.isTopOverlay=m,exports.listPendingForms=i.d,exports.mapApiFieldToColumnDef=n.X,exports.mapApiFieldToFieldDef=n.Z,exports.mapApiFieldsToColumnDefs=n.Q,exports.mapApiFieldsToFieldDefs=n.$,exports.meterSeverity=n.C,exports.patchDialogEscapeStack=g,exports.setPendingForm=i.f,exports.toCsv=n.H,exports.useApi=i.s,exports.useApiError=e.i,exports.useAppConfirm=e.a,exports.useAppToast=e.o,exports.useBreakpoint=e._,exports.useCrudManager=i.u,exports.useDateInput=e.n,exports.useFormatters=e.f,exports.usePendingForm=i.p,exports.useRouteTabs=i.o,exports.useSubviewCrud=i.l,exports.useTabHost=t.n,exports.validateFormRecord=e.d,exports.visibleOverlays=p;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/data-providers/axiosDataProvider.ts","../src/utils/dialogEscapeStack.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import Dialog from 'primevue/dialog'\nimport Drawer from 'primevue/drawer'\n\n/**\n * Esc fecha todos os overlays empilhados (PrimeVue 4.x): cada `Dialog`/`Drawer`\n * aberto registra o próprio `keydown` no `document` e fecha no Escape sem checar\n * se é o do topo — com dois modais abertos (form do CRUD + FK inline, confirm\n * sobre dialog…), um Esc fecha os dois de uma vez.\n *\n * O patch envolve o handler de teclado do próprio componente: com mais de um\n * overlay visível, só o do topo (maior z-index da máscara; empate resolve pela\n * ordem no DOM) responde ao Esc — os demais ignoram e esperam a vez. Um overlay\n * só mantém o comportamento nativo intacto.\n *\n * Roda uma vez, no `install()` do plugin, antes de qualquer instância ser\n * criada (o Vue liga os `methods` na instanciação). Corrigido no PrimeVue 5;\n * ao migrar, remover.\n */\n\nconst OVERLAY_SELECTOR = '[data-pc-name=\"dialog\"], [data-pc-name=\"drawer\"]'\nconst PATCHED = Symbol('w-escape-stack')\n\ntype OverlayVm = { container?: HTMLElement | null }\ntype KeyHandler = ((this: OverlayVm, event: KeyboardEvent) => void) & { [PATCHED]?: true }\ntype OverlayComponent = { methods?: Record<string, KeyHandler> }\n\nfunction isVisible(el: HTMLElement): boolean {\n for (let node: HTMLElement | null = el; node; node = node.parentElement) {\n if (node.hidden || getComputedStyle(node).display === 'none') return false\n }\n return true\n}\n\nfunction zIndexOf(container: HTMLElement): number {\n // A máscara (pai do container) recebe o z-index incremental do ZIndex utils.\n const z = Number.parseInt(getComputedStyle(container.parentElement ?? container).zIndex, 10)\n return Number.isNaN(z) ? 0 : z\n}\n\n/** Overlays do PrimeVue visíveis no momento (dialogs em abas ocultas ficam fora). */\nexport function visibleOverlays(): HTMLElement[] {\n return Array.from(document.querySelectorAll<HTMLElement>(OVERLAY_SELECTOR)).filter(isVisible)\n}\n\n/**\n * `true` quando `container` é o overlay visível do topo. Sem `container`\n * (instância sem DOM) segue o nativo; um overlay oculto (aba inativa) nunca\n * é topo — o Esc é de quem está na tela.\n */\nexport function isTopOverlay(container: HTMLElement | null | undefined): boolean {\n if (!container) return true\n const abertos = visibleOverlays()\n if (!abertos.includes(container)) return false\n if (abertos.length === 1) return true\n let topo = abertos[0]\n for (const el of abertos) {\n if (zIndexOf(el) >= zIndexOf(topo)) topo = el\n }\n return topo === container\n}\n\nfunction wrapEscape(component: unknown, method: string): void {\n const methods = (component as OverlayComponent).methods\n const original = methods?.[method]\n if (!methods || !original || original[PATCHED]) return\n const patched: KeyHandler = function (this: OverlayVm, event: KeyboardEvent) {\n if (event.code === 'Escape' && !isTopOverlay(this.container)) return\n original.call(this, event)\n }\n patched[PATCHED] = true\n methods[method] = patched\n}\n\n/**\n * Aplica o patch em `Dialog` e `Drawer` do PrimeVue (idempotente). O plugin\n * chama por padrão; exposto para quem registra com `patchDialogEscape: false`\n * e quer aplicar por conta própria, ou para apps sem o plugin.\n */\nexport function patchDialogEscapeStack(): void {\n if (typeof document === 'undefined') return\n wrapEscape(Dialog, 'onKeyDown')\n wrapEscape(Drawer, 'onKeydown')\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n WTreeSelect,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\nimport { patchDialogEscapeStack } from './utils/dialogEscapeStack'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.patchDialogEscape !== false) {\n patchDialogEscapeStack()\n }\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n app.component('WTreeSelect', WTreeSelect)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/data-providers/axiosDataProvider.ts","../src/utils/dialogEscapeStack.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import Dialog from 'primevue/dialog'\nimport Drawer from 'primevue/drawer'\n\n/**\n * Esc fecha todos os overlays empilhados (PrimeVue 4.x): cada `Dialog`/`Drawer`\n * aberto registra o próprio `keydown` no `document` e fecha no Escape sem checar\n * se é o do topo — com dois modais abertos (form do CRUD + FK inline, confirm\n * sobre dialog…), um Esc fecha os dois de uma vez.\n *\n * O patch envolve o handler de teclado do próprio componente: com mais de um\n * overlay visível, só o do topo (maior z-index da máscara; empate resolve pela\n * ordem no DOM) responde ao Esc — os demais ignoram e esperam a vez. Um overlay\n * só mantém o comportamento nativo intacto.\n *\n * Roda uma vez, no `install()` do plugin, antes de qualquer instância ser\n * criada (o Vue liga os `methods` na instanciação). Corrigido no PrimeVue 5;\n * ao migrar, remover.\n */\n\nconst OVERLAY_SELECTOR = '[data-pc-name=\"dialog\"], [data-pc-name=\"drawer\"]'\nconst PATCHED = Symbol('w-escape-stack')\n\ntype OverlayVm = { container?: HTMLElement | null }\ntype KeyHandler = ((this: OverlayVm, event: KeyboardEvent) => void) & { [PATCHED]?: true }\ntype OverlayComponent = { methods?: Record<string, KeyHandler> }\n\nfunction isVisible(el: HTMLElement): boolean {\n for (let node: HTMLElement | null = el; node; node = node.parentElement) {\n if (node.hidden || getComputedStyle(node).display === 'none') return false\n }\n return true\n}\n\nfunction zIndexOf(container: HTMLElement): number {\n // A máscara (pai do container) recebe o z-index incremental do ZIndex utils.\n const z = Number.parseInt(getComputedStyle(container.parentElement ?? container).zIndex, 10)\n return Number.isNaN(z) ? 0 : z\n}\n\n/** Overlays do PrimeVue visíveis no momento (dialogs em abas ocultas ficam fora). */\nexport function visibleOverlays(): HTMLElement[] {\n return Array.from(document.querySelectorAll<HTMLElement>(OVERLAY_SELECTOR)).filter(isVisible)\n}\n\n/**\n * `true` quando `container` é o overlay visível do topo. Sem `container`\n * (instância sem DOM) segue o nativo; um overlay oculto (aba inativa) nunca\n * é topo — o Esc é de quem está na tela.\n */\nexport function isTopOverlay(container: HTMLElement | null | undefined): boolean {\n if (!container) return true\n const abertos = visibleOverlays()\n if (!abertos.includes(container)) return false\n if (abertos.length === 1) return true\n let topo = abertos[0]\n for (const el of abertos) {\n if (zIndexOf(el) >= zIndexOf(topo)) topo = el\n }\n return topo === container\n}\n\nfunction wrapEscape(component: unknown, method: string): void {\n const methods = (component as OverlayComponent).methods\n const original = methods?.[method]\n if (!methods || !original || original[PATCHED]) return\n const patched: KeyHandler = function (this: OverlayVm, event: KeyboardEvent) {\n if (event.code === 'Escape' && !isTopOverlay(this.container)) return\n original.call(this, event)\n }\n patched[PATCHED] = true\n methods[method] = patched\n}\n\n/**\n * Aplica o patch em `Dialog` e `Drawer` do PrimeVue (idempotente). O plugin\n * chama por padrão; exposto para quem registra com `patchDialogEscape: false`\n * e quer aplicar por conta própria, ou para apps sem o plugin.\n */\nexport function patchDialogEscapeStack(): void {\n if (typeof document === 'undefined') return\n wrapEscape(Dialog, 'onKeyDown')\n wrapEscape(Drawer, 'onKeydown')\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n WTreeSelect,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\nimport { patchDialogEscapeStack } from './utils/dialogEscapeStack'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n keyboardNav: options.keyboardNav ?? false,\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.patchDialogEscape !== false) {\n patchDialogEscapeStack()\n }\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n app.component('WTreeSelect', WTreeSelect)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"mappings":"+XASA,SAAS,EACP,EACA,EACA,EAC6B,CAC7B,IAAM,EAAO,EAsBb,OApBI,MAAM,QAAQ,EAAK,OAAO,EACrB,CACL,KAAM,EAAK,QACX,KAAO,EAAK,MAAmB,EAC/B,UAAY,EAAK,WAAwB,EACzC,KAAO,EAAK,OAAoB,EAChC,OAAS,EAAK,QAAsC,CAAC,CACvD,EAGE,MAAM,QAAQ,EAAK,IAAI,EAClB,CACL,KAAM,EAAK,KACX,KAAO,EAAK,MAAmB,EAC/B,UAAY,EAAK,WAAwB,EACzC,KAAO,EAAK,MAAmB,EAC/B,OAAS,EAAK,QAAsC,CAAC,CACvD,EAGK,CACL,KAAM,MAAM,QAAQ,CAAY,EAAK,EAAuB,CAAC,EAC7D,KAAM,EACN,UAAW,EACX,KAAM,MAAM,QAAQ,CAAY,EAAI,EAAa,OAAS,EAC1D,OAAQ,CAAC,CACX,CACF,CAEA,SAAgB,EAAwB,EAAoC,CAC1E,MAAO,CACL,MAAM,KACJ,EACA,EAAiC,CAAC,EACI,CAEtC,OAAO,GACL,MAFqB,EAAM,IAAI,EAAU,CAAE,QAAO,CAAC,EAAA,CAE1C,KACT,OAAO,EAAO,MAAQ,CAAC,EACvB,OAAO,EAAO,WAAa,EAAE,CAC/B,CACF,EAEA,MAAM,IACJ,EACA,EACA,EACkC,CAElC,MAAO,CAAE,MAAM,MADQ,EAAM,IAAO,GAAG,IAAW,EAAG,GAAI,CAAM,EAAA,CACvC,IAAK,CAC/B,EAEA,MAAM,OACJ,EACA,EACA,EACkC,CAElC,MAAO,CAAE,MAAM,MADQ,EAAM,KAAQ,EAAU,EAAS,CAAM,EAAA,CACtC,IAAK,CAC/B,EAEA,MAAM,OACJ,EACA,EACA,EACA,EACkC,CAElC,MAAO,CAAE,MAAM,MADQ,EAAM,MAAS,GAAG,IAAW,EAAG,GAAI,EAAS,CAAM,EAAA,CAClD,IAAK,CAC/B,EAEA,MAAM,OAAO,EAAkB,EAAoC,CACjE,MAAM,EAAM,OAAO,GAAG,IAAW,EAAG,EAAE,CACxC,CACF,CACF,CCxEA,IAAM,EAAmB,mDACnB,EAAU,OAAO,gBAAgB,EAMvC,SAAS,EAAU,EAA0B,CAC3C,IAAK,IAAI,EAA2B,EAAI,EAAM,EAAO,EAAK,cACxD,GAAI,EAAK,QAAU,iBAAiB,CAAI,CAAC,CAAC,UAAY,OAAQ,MAAO,GAEvE,MAAO,EACT,CAEA,SAAS,EAAS,EAAgC,CAEhD,IAAM,EAAI,OAAO,SAAS,iBAAiB,EAAU,eAAiB,CAAS,CAAC,CAAC,OAAQ,EAAE,EAC3F,OAAO,OAAO,MAAM,CAAC,EAAI,EAAI,CAC/B,CAGA,SAAgB,GAAiC,CAC/C,OAAO,MAAM,KAAK,SAAS,iBAA8B,CAAgB,CAAC,CAAC,CAAC,OAAO,CAAS,CAC9F,CAOA,SAAgB,EAAa,EAAoD,CAC/E,GAAI,CAAC,EAAW,MAAO,GACvB,IAAM,EAAU,EAAgB,EAChC,GAAI,CAAC,EAAQ,SAAS,CAAS,EAAG,MAAO,GACzC,GAAI,EAAQ,SAAW,EAAG,MAAO,GACjC,IAAI,EAAO,EAAQ,GACnB,IAAK,IAAM,KAAM,EACX,EAAS,CAAE,GAAK,EAAS,CAAI,IAAG,EAAO,GAE7C,OAAO,IAAS,CAClB,CAEA,SAAS,EAAW,EAAoB,EAAsB,CAC5D,IAAM,EAAW,EAA+B,QAC1C,EAAW,IAAU,GAC3B,GAAI,CAAC,GAAW,CAAC,GAAY,EAAS,GAAU,OAChD,IAAM,EAAsB,SAA2B,EAAsB,CACvE,EAAM,OAAS,UAAY,CAAC,EAAa,KAAK,SAAS,GAC3D,EAAS,KAAK,KAAM,CAAK,CAC3B,EACA,EAAQ,GAAW,GACnB,EAAQ,GAAU,CACpB,CAOA,SAAgB,GAA+B,CACzC,OAAO,SAAa,MACxB,EAAW,EAAA,QAAQ,WAAW,EAC9B,EAAW,EAAA,QAAQ,WAAW,EAChC,CCnEA,IAAa,EAA0B,CACrC,QAAQ,EAAU,EAAyB,CACzC,GAAI,CAAC,GAAS,OAAS,CAAC,GAAS,aAC/B,MAAU,MACR,yFACF,EAGF,IAAM,EAAe,EAAQ,cAAgB,EAAwB,EAAQ,KAAM,EAE7E,EAAwB,CAC5B,MAAO,EAAQ,MACf,eACA,gBAAiB,EAAQ,iBAAmB,GAC5C,WAAY,EAAQ,YAAc,aAClC,eAAgB,EAAQ,gBAAkB,mBAC1C,OAAQ,EAAQ,QAAU,QAC1B,SAAU,EAAQ,UAAY,MAC9B,YAAa,EAAQ,aAAe,EACtC,EAEI,EAAQ,OACV,EAAI,QAAQ,EAAA,EAAa,EAAQ,KAAK,EAExC,EAAI,QAAQ,EAAA,EAAqB,CAAY,EAC7C,EAAI,QAAQ,EAAA,EAAc,CAAM,EAE5B,EAAQ,oBAAsB,IAChC,EAAuB,EAGrB,EAAQ,qBAAuB,KACjC,EAAI,UAAU,YAAa,EAAA,CAAS,EACpC,EAAI,UAAU,kBAAmB,EAAA,CAAe,EAChD,EAAI,UAAU,sBAAuB,EAAA,EAAmB,EACxD,EAAI,UAAU,kBAAmB,EAAA,CAAe,EAChD,EAAI,UAAU,cAAe,EAAA,CAAW,EACxC,EAAI,UAAU,gBAAiB,EAAA,CAAa,EAC5C,EAAI,UAAU,cAAe,EAAA,CAAW,EAE5C,CACF,ECYA,SAAS,EAAkB,EAA0B,CACnD,OAAO,EACJ,MAAM,GAAG,CAAC,CAAC,EAAE,CACb,QAAQ,aAAc,EAAE,CAAC,CACzB,QAAQ,eAAgB,EAAE,CAC/B,CAEA,SAAS,EAAiB,EAAmE,CAC3F,OAAO,OAAO,GAAa,SAAW,CAAE,MAAO,CAAS,EAAI,CAC9D,CAEA,SAAS,EAAoB,EAAiB,EAAS,IAAK,CAC1D,MAAO,CACL,SAAU,CACR,SACA,KAAM,CAAE,OAAQ,CAAQ,CAC1B,EACA,SACF,CACF,CAEA,SAAS,EAAmB,EAAsE,CAChG,GAAI,aAAmB,SACrB,MAAM,EACJ,0HACF,EAGF,OAAO,CACT,CAEA,SAAS,EAAuB,EAAgD,CAC9E,KAAM,CACJ,SAAU,CACR,KAAM,CACJ,OAAQ,GAAO,SAAW,6BAC1B,KAAM,GAAO,KACb,QAAS,GAAO,QAChB,KAAM,GAAO,IACf,CACF,EACA,QAAS,GAAO,SAAW,4BAC7B,CACF,CAEA,SAAS,EACP,EACA,EACwB,CACxB,IAAM,EAAe,EAAkB,CAAQ,EACzC,EAAqB,EAAQ,YAAY,GAE/C,GAAI,EACF,OAAO,EAAiB,CAAkB,EAG5C,GAAI,EAAQ,eAAe,SAAS,CAAY,EAC9C,MAAO,CAAE,MAAO,CAAa,EAG/B,MAAM,EAAoB,oDAAoD,EAAS,IAAK,GAAG,CACjG,CAEA,SAAS,EACP,EACA,EACA,EAC0B,CAC1B,IAAM,EAAe,IAAI,IAAI,CAAC,OAAQ,YAAa,SAAU,UAAU,CAAC,EAClE,EAAU,CAAE,GAAG,EAAS,eAAgB,GAAG,CAAO,EAExD,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAO,EAC3C,EAAa,IAAI,CAAG,GAAK,GAAU,MAA+B,IAAU,KAGhF,EAAQ,EAAM,GAAG,EAAK,CAAK,GAG7B,OAAO,CACT,CAEA,SAAS,EACP,EACA,EACA,EAC0B,CAC1B,GAAI,OAAO,GAAW,UAAY,CAAC,EAAO,KAAK,GAAK,CAAC,GAAc,OACjE,OAAO,EAGT,IAAM,EAAgB,EAAO,KAAK,CAAC,CAAC,QAAQ,KAAM,KAAK,EACjD,EAAa,EAAa,IAAK,GAAU,GAAG,EAAM,UAAU,EAAc,EAAE,CAAC,CAAC,KAAK,GAAG,EAE5F,OAAO,EAAM,GAAG,CAAU,CAC5B,CAEA,SAAS,EAAc,EAAmB,EAAmB,CAC3D,IAAM,EAAQ,OAAO,GAAa,UAAY,EAAW,EAAW,EAGpE,OAFK,EAEE,CACL,MAAO,EAAM,WAAW,GAAG,EAAI,EAAM,MAAM,CAAC,EAAI,EAChD,UAAW,CAAC,EAAM,WAAW,GAAG,CAClC,EALmB,IAMrB,CAEA,SAAS,EAAW,EAAkB,EAAuC,CAI3E,OAHK,EACA,EAAS,YAEP,EAAK,IAAK,GAAS,EAAS,cAAc,CAA+B,CAAC,EAF/C,EADhB,CAAC,CAIrB,CAEA,SAAgB,EACd,EACc,CACd,IAAM,EAAgB,EAAQ,eAAiB,IAE/C,MAAO,CACL,MAAM,KACJ,EACA,EAAiC,CAAC,EACI,CACtC,IAAM,EAAW,EAAgB,EAAU,CAAO,EAC5C,EAAO,KAAK,IAAI,OAAO,EAAO,MAAQ,CAAC,EAAG,CAAC,EAC3C,EAAW,KAAK,IAAI,OAAO,EAAO,WAAa,EAAE,EAAG,CAAC,EACrD,GAAQ,EAAO,GAAK,EACpB,EAAK,EAAO,EAAW,EAEzB,EAAQ,EAAQ,OACjB,KAAK,EAAS,KAAK,CAAC,CACpB,OAAY,EAAS,QAAU,EAAe,CAAE,MAAO,OAAQ,CAAC,EAEnE,EAAQ,EAAa,EAAO,EAAQ,CAAQ,EAC5C,EAAQ,EAAY,EAAO,EAAO,OAAQ,EAAS,YAAY,EAE/D,IAAM,EAAW,EAAc,EAAO,SAAU,EAAS,eAAe,EACpE,IACF,EAAQ,EAAM,MAAM,EAAS,MAAO,CAAE,UAAW,EAAS,SAAU,CAAC,GAGvE,IAAM,EAAS,MAAM,EAAM,MAAM,EAAM,CAAE,EAGzC,OAFI,EAAO,OAAO,EAAuB,EAAO,KAAK,EAE9C,CACL,KAAM,EAAQ,EAAO,KAAM,CAAQ,EACnC,OACA,UAAW,EACX,KAAM,EAAO,OAAS,EAAO,MAAM,QAAU,EAC7C,OAAQ,CAAC,CACX,CACF,EAEA,MAAM,IACJ,EACA,EACA,EACkC,CAClC,IAAM,EAAW,EAAgB,EAAU,CAAO,EAC5C,EAAK,EAAS,IAAM,KACpB,EAAS,MAAM,EAAQ,OAC1B,KAAK,EAAS,KAAK,CAAC,CACpB,OAAU,EAAS,QAAU,CAAa,CAAC,CAC3C,GAAG,EAAI,CAAE,CAAC,CACV,OAAO,EAGV,OADI,EAAO,OAAO,EAAuB,EAAO,KAAK,EAC9C,CAAE,KAAM,EAAO,IAAU,CAClC,EAEA,MAAM,OACJ,EACA,EACA,EACkC,CAClC,IAAM,EAAW,EAAgB,EAAU,CAAO,EAC5C,EAAe,EAAmB,CAAO,EACzC,EAAgB,EAAS,WAC3B,EAAS,WAAW,EAAc,QAAQ,EAC1C,EACE,EAAS,MAAM,EAAQ,OAC1B,KAAK,EAAS,KAAK,CAAC,CACpB,OAAU,CAAa,CAAC,CACxB,OAAO,EAAS,QAAU,CAAa,CAAC,CACxC,OAAO,EAGV,OADI,EAAO,OAAO,EAAuB,EAAO,KAAK,EAC9C,CAAE,KAAM,EAAO,IAAU,CAClC,EAEA,MAAM,OACJ,EACA,EACA,EACA,EACkC,CAClC,IAAM,EAAW,EAAgB,EAAU,CAAO,EAC5C,EAAK,EAAS,IAAM,KACpB,EAAe,EAAmB,CAAO,EACzC,EAAgB,EAAS,WAC3B,EAAS,WAAW,EAAc,QAAQ,EAC1C,EACE,EAAS,MAAM,EAAQ,OAC1B,KAAK,EAAS,KAAK,CAAC,CACpB,OAAU,CAAa,CAAC,CACxB,GAAG,EAAI,CAAE,CAAC,CACV,OAAO,EAAS,QAAU,CAAa,CAAC,CACxC,OAAO,EAGV,OADI,EAAO,OAAO,EAAuB,EAAO,KAAK,EAC9C,CAAE,KAAM,EAAO,IAAU,CAClC,EAEA,MAAM,OAAO,EAAkB,EAAoC,CACjE,IAAM,EAAW,EAAgB,EAAU,CAAO,EAC5C,EAAK,EAAS,IAAM,KACpB,EACJ,EAAS,aAAe,GACpB,CAAE,UAAW,EAAM,EACnB,OAAO,EAAS,YAAe,SAC7B,EAAS,WACT,KAEF,EAAS,EACX,MAAM,EAAQ,OAAO,KAAK,EAAS,KAAK,CAAC,CAAC,OAAO,CAAiB,CAAC,CAAC,GAAG,EAAI,CAAE,EAC7E,MAAM,EAAQ,OAAO,KAAK,EAAS,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAI,CAAE,EAE5D,EAAO,OAAO,EAAuB,EAAO,KAAK,CACvD,CACF,CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { WPrimeVuePlugin } from './plugin';
|
|
2
|
-
export { WCrudView, WCrudFormDialog, WCrudColumnRenderer, WEditableTable, WCrudSubview, WAutoCompleteFK, WFormRenderer, WDatePicker, WDateRange, WFileUpload, WImageCropper, WMoneyInput, WTransferList, WTreeSelect, WChart, WStatusTag, WPageHeader, WDetailHeader, WEmptyState, WInfoCard, WKpiCard, WKpiGrid, WMeter, WSectionAccordion, WSectionHeader, WSectionPanel, WFormSection, WActionBar, WProgressFlow, WStepFlow, WStepSection, WCheckList, WMapSelect, WMarkdownView, WMarkdownEditor, WMarkdownToc, WDialog, WTabBar, WTabNav, WTabViewport, WKanbanBoard, } from './components';
|
|
3
|
-
export { useCrudManager, useSubviewCrud, useApi, useAppToast, useAppConfirm, useApiError, extractApiError, useFormatters, useDateInput, useRouteTabs, useBreakpoint, BREAKPOINTS, } from './composables';
|
|
4
|
-
export type { DateValueFormat } from './composables';
|
|
2
|
+
export { WCrudView, WCrudFormDialog, WCrudColumnRenderer, WEditableTable, WCrudSubview, WAutoCompleteFK, WFormRenderer, WDatePicker, WDateRange, WFileUpload, WImageCropper, WMoneyInput, WTransferList, WTreeSelect, WChart, WStatusTag, WPageHeader, WDetailHeader, WEmptyState, WInfoCard, WKpiCard, WKpiGrid, WMeter, WSectionAccordion, WSectionHeader, WSectionPanel, WFormSection, WActionBar, WProgressFlow, WStepFlow, WStepSection, WCheckList, WAttentionList, WMapSelect, WMarkdownView, WMarkdownEditor, WMarkdownToc, WDialog, WTabBar, WTabNav, WTabViewport, WKanbanBoard, } from './components';
|
|
3
|
+
export { useCrudManager, useSubviewCrud, useApi, useAppToast, useAppConfirm, useApiError, extractApiError, useFormatters, useDateInput, useRouteTabs, useBreakpoint, BREAKPOINTS, usePendingForm, setPendingForm, listPendingForms, createPublishedVersion, installPublishedVersion, isChunkError, MIN_CHECK_INTERVAL_MS, RECENT_READ_MS, } from './composables';
|
|
4
|
+
export type { DateValueFormat, PublishedVersion, PublishedVersionDeps, InstallPublishedVersionOptions, RouteLike, RouterLike, } from './composables';
|
|
5
5
|
export { createAxiosDataProvider, createSupabaseDataProvider } from './data-providers';
|
|
6
|
-
export type { PaginatedResponse, PaginationState, SortState, UseApiOptions, UseApiReturn, ColumnDef, ColumnFilter, ColumnType, TagSeverity, FieldDef, FieldType, SelectOption, EditableColumnDef, EditableColumnEditor, EditableRow, CheckListItem, CheckListLevel, TabItem, RouteTab, RouteTabMeta, RouteTabRuntime, RouteTabsApi, TabHostContext, UseRouteTabsOptions, KanbanColumn, KanbanMoveEvent, MapSelectFeature, MapSelectGeometry, MapSelectId, MapSelectPolygonStyle, MapSelectPosition, RowAction, CrudLabels, KpiItem, KpiItemClickEvent, CrudManagerConfig, CrudManagerReturn, SubviewCrudConfig, SubviewCrudReturn, WPluginOptions, WPluginConfig, DataProvider, DataProviderListParams, DataProviderListResponse, DataProviderRequestConfig, DataProviderResponse, } from './types';
|
|
6
|
+
export type { PaginatedResponse, PaginationState, SortState, UseApiOptions, UseApiReturn, ColumnDef, ColumnFilter, ColumnType, TagSeverity, FieldDef, FkCrudConfig, FieldType, SelectOption, EditableColumnDef, EditableColumnEditor, EditableRow, CheckListItem, CheckListLevel, AttentionItem, AttentionItemClickEvent, AttentionSeverity, TabItem, RouteTab, RouteTabMeta, RouteTabRuntime, RouteTabsApi, TabHostContext, UseRouteTabsOptions, KanbanColumn, KanbanMoveEvent, MapSelectFeature, MapSelectGeometry, MapSelectId, MapSelectPolygonStyle, MapSelectPosition, RowAction, CrudLabels, KpiItem, KpiItemClickEvent, CrudManagerConfig, CrudManagerReturn, SubviewCrudConfig, SubviewCrudReturn, WPluginOptions, WPluginConfig, DataProvider, DataProviderListParams, DataProviderListResponse, DataProviderRequestConfig, DataProviderResponse, } from './types';
|
|
7
7
|
export type { StatusMapping } from './components/ui/WStatusTag.vue';
|
|
8
8
|
export type { InfoField } from './components/ui/WInfoCard.vue';
|
|
9
9
|
export type { StepFlowContext, StepFlowLabels, StepFlowOrientation } from './utils/stepFlow';
|
|
@@ -12,6 +12,7 @@ export type { SectionAccordionContext } from './utils/sectionAccordion';
|
|
|
12
12
|
export { W_SECTION_ACCORDION_KEY } from './utils/sectionAccordion';
|
|
13
13
|
export type { CreateSupabaseDataProviderOptions, SupabaseDataProviderClient, SupabaseResourceConfig, } from './data-providers';
|
|
14
14
|
export { DEFAULT_CRUD_LABELS, W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY, W_TAB_HOST_KEY, useTabHost, } from './types';
|
|
15
|
+
export { convertFormRecord, getFieldDefaults, validateFormRecord } from './utils/formRecord';
|
|
15
16
|
export type { ApiFieldMeta } from './utils/fieldMapper';
|
|
16
17
|
export { mapApiFieldToFieldDef, mapApiFieldsToFieldDefs, mapApiFieldToColumnDef, mapApiFieldsToColumnDefs, } from './utils/fieldMapper';
|
|
17
18
|
export type { ChartSelectEvent, ChartTheme, DonutOptionInput, WChartOption } from './utils/chart';
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { _ as e, a as t,
|
|
2
|
-
import { a as
|
|
3
|
-
import { $ as
|
|
4
|
-
import { t as
|
|
5
|
-
import { a as
|
|
1
|
+
import { _ as e, a as t, c as n, d as r, f as i, g as a, i as o, n as s, o as c, r as l, s as u } from "./useFormKeyboardNav-DNaAWyrr.js";
|
|
2
|
+
import { a as d, i as f, n as ee, r as p, t as te } from "./routeTabs-D6m8PuP6.js";
|
|
3
|
+
import { $ as ne, A as m, B as h, C as re, D as g, E as _, F as v, G as y, H as ie, I as ae, J as oe, K as se, L as ce, M as le, N as ue, O as de, P as fe, Q as pe, R as b, S as x, T as S, U as C, V as w, W as T, X as E, Y as D, Z as O, _ as k, a as A, b as j, c as M, d as N, et as P, f as F, g as I, h as L, i as R, j as z, k as B, l as me, m as he, n as ge, o as _e, p as ve, q as V, r as ye, s as be, t as H, u as xe, v as Se, w as Ce, x as we, y as Te, z as Ee } from "./components-C5a424TI.js";
|
|
4
|
+
import { t as De } from "./labels-CXBhCk2N.js";
|
|
5
|
+
import { a as Oe, d as ke, f as Ae, i as je, l as Me, n as Ne, o as Pe, p as Fe, r as Ie, s as Le, t as Re, u as ze } from "./composables-Bu1oxAgP.js";
|
|
6
6
|
import "./types.js";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
7
|
+
import Be from "primevue/dialog";
|
|
8
|
+
import Ve from "primevue/drawer";
|
|
9
9
|
//#region src/data-providers/axiosDataProvider.ts
|
|
10
|
-
function
|
|
10
|
+
function He(e, t, n) {
|
|
11
11
|
let r = e;
|
|
12
12
|
return Array.isArray(r.results) ? {
|
|
13
13
|
data: r.results,
|
|
@@ -29,10 +29,10 @@ function je(e, t, n) {
|
|
|
29
29
|
extras: {}
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
-
function
|
|
32
|
+
function U(e) {
|
|
33
33
|
return {
|
|
34
34
|
async list(t, n = {}) {
|
|
35
|
-
return
|
|
35
|
+
return He((await e.get(t, { params: n })).data, Number(n.page ?? 1), Number(n.page_size ?? 20));
|
|
36
36
|
},
|
|
37
37
|
async get(t, n, r) {
|
|
38
38
|
return { data: (await e.get(`${t}${n}/`, r)).data };
|
|
@@ -50,59 +50,60 @@ function H(e) {
|
|
|
50
50
|
}
|
|
51
51
|
//#endregion
|
|
52
52
|
//#region src/utils/dialogEscapeStack.ts
|
|
53
|
-
var
|
|
54
|
-
function
|
|
53
|
+
var Ue = "[data-pc-name=\"dialog\"], [data-pc-name=\"drawer\"]", W = Symbol("w-escape-stack");
|
|
54
|
+
function We(e) {
|
|
55
55
|
for (let t = e; t; t = t.parentElement) if (t.hidden || getComputedStyle(t).display === "none") return !1;
|
|
56
56
|
return !0;
|
|
57
57
|
}
|
|
58
|
-
function
|
|
58
|
+
function G(e) {
|
|
59
59
|
let t = Number.parseInt(getComputedStyle(e.parentElement ?? e).zIndex, 10);
|
|
60
60
|
return Number.isNaN(t) ? 0 : t;
|
|
61
61
|
}
|
|
62
|
-
function
|
|
63
|
-
return Array.from(document.querySelectorAll(
|
|
62
|
+
function K() {
|
|
63
|
+
return Array.from(document.querySelectorAll(Ue)).filter(We);
|
|
64
64
|
}
|
|
65
|
-
function
|
|
65
|
+
function q(e) {
|
|
66
66
|
if (!e) return !0;
|
|
67
|
-
let t =
|
|
67
|
+
let t = K();
|
|
68
68
|
if (!t.includes(e)) return !1;
|
|
69
69
|
if (t.length === 1) return !0;
|
|
70
70
|
let n = t[0];
|
|
71
|
-
for (let e of t)
|
|
71
|
+
for (let e of t) G(e) >= G(n) && (n = e);
|
|
72
72
|
return n === e;
|
|
73
73
|
}
|
|
74
|
-
function
|
|
74
|
+
function J(e, t) {
|
|
75
75
|
let n = e.methods, r = n?.[t];
|
|
76
|
-
if (!n || !r || r[
|
|
76
|
+
if (!n || !r || r[W]) return;
|
|
77
77
|
let i = function(e) {
|
|
78
|
-
e.code === "Escape" && !
|
|
78
|
+
e.code === "Escape" && !q(this.container) || r.call(this, e);
|
|
79
79
|
};
|
|
80
|
-
i[
|
|
80
|
+
i[W] = !0, n[t] = i;
|
|
81
81
|
}
|
|
82
|
-
function
|
|
83
|
-
typeof document > "u" || (
|
|
82
|
+
function Y() {
|
|
83
|
+
typeof document > "u" || (J(Be, "onKeyDown"), J(Ve, "onKeydown"));
|
|
84
84
|
}
|
|
85
85
|
//#endregion
|
|
86
86
|
//#region src/plugin.ts
|
|
87
|
-
var
|
|
87
|
+
var Ge = { install(e, t) {
|
|
88
88
|
if (!t?.axios && !t?.dataProvider) throw Error("[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.");
|
|
89
|
-
let n = t.dataProvider ??
|
|
89
|
+
let n = t.dataProvider ?? U(t.axios), r = {
|
|
90
90
|
axios: t.axios,
|
|
91
91
|
dataProvider: n,
|
|
92
92
|
defaultPageSize: t.defaultPageSize ?? 20,
|
|
93
93
|
dateFormat: t.dateFormat ?? "DD/MM/YYYY",
|
|
94
94
|
dateTimeFormat: t.dateTimeFormat ?? "DD/MM/YYYY HH:mm",
|
|
95
95
|
locale: t.locale ?? "pt-BR",
|
|
96
|
-
currency: t.currency ?? "BRL"
|
|
96
|
+
currency: t.currency ?? "BRL",
|
|
97
|
+
keyboardNav: t.keyboardNav ?? !1
|
|
97
98
|
};
|
|
98
|
-
t.axios && e.provide(
|
|
99
|
+
t.axios && e.provide(p, t.axios), e.provide(d, n), e.provide(f, r), t.patchDialogEscape !== !1 && Y(), t.registerComponents !== !1 && (e.component("WCrudView", h), e.component("WCrudFormDialog", C), e.component("WCrudColumnRenderer", P), e.component("WAutoCompleteFK", D), e.component("WMoneyInput", V), e.component("WTransferList", y), e.component("WTreeSelect", v));
|
|
99
100
|
} };
|
|
100
101
|
//#endregion
|
|
101
102
|
//#region src/data-providers/supabaseDataProvider.ts
|
|
102
|
-
function
|
|
103
|
+
function Ke(e) {
|
|
103
104
|
return e.split("?")[0].replace(/^\/+|\/+$/g, "").replace(/^api\/v\d+\//, "");
|
|
104
105
|
}
|
|
105
|
-
function
|
|
106
|
+
function qe(e) {
|
|
106
107
|
return typeof e == "string" ? { table: e } : e;
|
|
107
108
|
}
|
|
108
109
|
function X(e, t = 400) {
|
|
@@ -130,12 +131,12 @@ function Q(e) {
|
|
|
130
131
|
};
|
|
131
132
|
}
|
|
132
133
|
function $(e, t) {
|
|
133
|
-
let n =
|
|
134
|
-
if (r) return
|
|
134
|
+
let n = Ke(e), r = t.resources?.[n];
|
|
135
|
+
if (r) return qe(r);
|
|
135
136
|
if (t.allowedTables?.includes(n)) return { table: n };
|
|
136
137
|
throw X(`Recurso Supabase nao registrado para o endpoint "${e}".`, 404);
|
|
137
138
|
}
|
|
138
|
-
function
|
|
139
|
+
function Je(e, t, n) {
|
|
139
140
|
let r = /* @__PURE__ */ new Set([
|
|
140
141
|
"page",
|
|
141
142
|
"page_size",
|
|
@@ -148,32 +149,32 @@ function Ie(e, t, n) {
|
|
|
148
149
|
for (let [t, n] of Object.entries(i)) r.has(t) || n == null || n === "" || (e = e.eq(t, n));
|
|
149
150
|
return e;
|
|
150
151
|
}
|
|
151
|
-
function
|
|
152
|
+
function Ye(e, t, n) {
|
|
152
153
|
if (typeof t != "string" || !t.trim() || !n?.length) return e;
|
|
153
154
|
let r = t.trim().replace(/,/g, "\\,"), i = n.map((e) => `${e}.ilike.%${r}%`).join(",");
|
|
154
155
|
return e.or(i);
|
|
155
156
|
}
|
|
156
|
-
function
|
|
157
|
+
function Xe(e, t) {
|
|
157
158
|
let n = typeof e == "string" && e ? e : t;
|
|
158
159
|
return n ? {
|
|
159
160
|
field: n.startsWith("-") ? n.slice(1) : n,
|
|
160
161
|
ascending: !n.startsWith("-")
|
|
161
162
|
} : null;
|
|
162
163
|
}
|
|
163
|
-
function
|
|
164
|
+
function Ze(e, t) {
|
|
164
165
|
return e ? t.mapListItem ? e.map((e) => t.mapListItem?.(e)) : e : [];
|
|
165
166
|
}
|
|
166
|
-
function
|
|
167
|
+
function Qe(e) {
|
|
167
168
|
let t = e.defaultSelect ?? "*";
|
|
168
169
|
return {
|
|
169
170
|
async list(n, r = {}) {
|
|
170
171
|
let i = $(n, e), a = Math.max(Number(r.page ?? 1), 1), o = Math.max(Number(r.page_size ?? 20), 1), s = (a - 1) * o, c = s + o - 1, l = e.client.from(i.table).select(i.select ?? t, { count: "exact" });
|
|
171
|
-
l =
|
|
172
|
-
let u =
|
|
172
|
+
l = Je(l, r, i), l = Ye(l, r.search, i.searchFields);
|
|
173
|
+
let u = Xe(r.ordering, i.defaultOrdering);
|
|
173
174
|
u && (l = l.order(u.field, { ascending: u.ascending }));
|
|
174
175
|
let d = await l.range(s, c);
|
|
175
176
|
return d.error && Q(d.error), {
|
|
176
|
-
data:
|
|
177
|
+
data: Ze(d.data, i),
|
|
177
178
|
page: a,
|
|
178
179
|
page_size: o,
|
|
179
180
|
rows: d.count ?? d.data?.length ?? 0,
|
|
@@ -199,6 +200,6 @@ function Be(e) {
|
|
|
199
200
|
};
|
|
200
201
|
}
|
|
201
202
|
//#endregion
|
|
202
|
-
export {
|
|
203
|
+
export { a as BREAKPOINTS, De as DEFAULT_CRUD_LABELS, Re as MIN_CHECK_INTERVAL_MS, Ne as RECENT_READ_MS, I as WActionBar, xe as WAttentionList, D as WAutoCompleteFK, z as WChart, N as WCheckList, P as WCrudColumnRenderer, C as WCrudFormDialog, b as WCrudSubview, h as WCrudView, oe as WDatePicker, ce as WDateRange, g as WDetailHeader, A as WDialog, Ee as WEditableTable, de as WEmptyState, ae as WFileUpload, T as WFormRenderer, k as WFormSection, se as WImageCropper, _ as WInfoCard, H as WKanbanBoard, S as WKpiCard, Ce as WKpiGrid, me as WMapSelect, be as WMarkdownEditor, _e as WMarkdownToc, M as WMarkdownView, x as WMeter, V as WMoneyInput, B as WPageHeader, Ge as WPrimeVuePlugin, L as WProgressFlow, j as WSectionAccordion, Te as WSectionHeader, Se as WSectionPanel, m as WStatusTag, ve as WStepFlow, F as WStepSection, R as WTabBar, ye as WTabNav, ge as WTabViewport, y as WTransferList, v as WTreeSelect, p as W_AXIOS_KEY, f as W_CONFIG_KEY, d as W_DATA_PROVIDER_KEY, we as W_SECTION_ACCORDION_KEY, he as W_STEP_FLOW_KEY, te as W_TAB_HOST_KEY, le as buildChartTheme, ue as buildPrintTheme, u as convertFormRecord, U as createAxiosDataProvider, Ie as createPublishedVersion, Qe as createSupabaseDataProvider, fe as donutOption, w as downloadCsv, l as extractApiError, n as getFieldDefaults, je as installPublishedVersion, Oe as isChunkError, q as isTopOverlay, ke as listPendingForms, E as mapApiFieldToColumnDef, O as mapApiFieldToFieldDef, pe as mapApiFieldsToColumnDefs, ne as mapApiFieldsToFieldDefs, re as meterSeverity, Y as patchDialogEscapeStack, Ae as setPendingForm, ie as toCsv, Le as useApi, o as useApiError, t as useAppConfirm, c as useAppToast, e as useBreakpoint, ze as useCrudManager, s as useDateInput, i as useFormatters, Fe as usePendingForm, Pe as useRouteTabs, Me as useSubviewCrud, ee as useTabHost, r as validateFormRecord, K as visibleOverlays };
|
|
203
204
|
|
|
204
205
|
//# sourceMappingURL=index.js.map
|