@wgalleti/primevue-components 0.14.0 → 0.16.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.
Files changed (57) hide show
  1. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-Bmqt_P_5.js +6508 -0
  2. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-Bmqt_P_5.js.map +1 -0
  3. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DFRhQIiG.cjs +28 -0
  4. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DFRhQIiG.cjs.map +1 -0
  5. package/dist/components/crud/WCrudView.vue.d.ts +27 -2
  6. package/dist/components/index.d.ts +2 -0
  7. package/dist/components/ui/WMapSelect.vue.d.ts +26 -1
  8. package/dist/components/ui/WTabNav.vue.d.ts +56 -0
  9. package/dist/components/ui/WTabPane.d.ts +53 -0
  10. package/dist/components/ui/WTabViewport.vue.d.ts +14 -0
  11. package/dist/components.cjs +1 -1
  12. package/dist/components.js +22 -20
  13. package/dist/composables/index.d.ts +1 -0
  14. package/dist/composables/useRouteTabs.d.ts +2 -0
  15. package/dist/composables.cjs +1 -1
  16. package/dist/composables.cjs.map +1 -1
  17. package/dist/composables.js +11 -10
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.ts +4 -4
  21. package/dist/index.js +113 -107
  22. package/dist/index.js.map +1 -1
  23. package/dist/labels-B28P8JNB.js +19 -0
  24. package/dist/labels-B28P8JNB.js.map +1 -0
  25. package/dist/labels-pNskxXcl.cjs +2 -0
  26. package/dist/labels-pNskxXcl.cjs.map +1 -0
  27. package/dist/{plugin-BKa0eSEM.js → plugin-BaBF7c-e.js} +3 -3
  28. package/dist/{plugin-BKa0eSEM.js.map → plugin-BaBF7c-e.js.map} +1 -1
  29. package/dist/primevue-components.css +1 -1
  30. package/dist/routeTabs--y12evp8.cjs +2 -0
  31. package/dist/routeTabs--y12evp8.cjs.map +1 -0
  32. package/dist/routeTabs-NnjycX9L.js +10 -0
  33. package/dist/routeTabs-NnjycX9L.js.map +1 -0
  34. package/dist/types/index.d.ts +3 -1
  35. package/dist/types/manager.d.ts +11 -3
  36. package/dist/types/mapSelect.d.ts +11 -0
  37. package/dist/types/routeTabs.d.ts +116 -0
  38. package/dist/types.cjs +1 -1
  39. package/dist/types.cjs.map +1 -1
  40. package/dist/types.js +9 -20
  41. package/dist/types.js.map +1 -1
  42. package/dist/{useFormKeyboardNav-D4Irq5RE.js → useFormKeyboardNav-CLCEo_O5.js} +2 -2
  43. package/dist/{useFormKeyboardNav-D4Irq5RE.js.map → useFormKeyboardNav-CLCEo_O5.js.map} +1 -1
  44. package/dist/useRouteTabs-63cZtRr3.js +739 -0
  45. package/dist/useRouteTabs-63cZtRr3.js.map +1 -0
  46. package/dist/useRouteTabs-Ds2QpP3I.cjs +2 -0
  47. package/dist/useRouteTabs-Ds2QpP3I.cjs.map +1 -0
  48. package/package.json +1 -1
  49. package/skill/references/components.md +28 -0
  50. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-D30LZLT8.js +0 -6224
  51. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-D30LZLT8.js.map +0 -1
  52. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-x3RaoczK.cjs +0 -36
  53. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-x3RaoczK.cjs.map +0 -1
  54. package/dist/useApi-BQJ_C2Yt.js +0 -519
  55. package/dist/useApi-BQJ_C2Yt.js.map +0 -1
  56. package/dist/useApi-DpkKD_bN.cjs +0 -2
  57. package/dist/useApi-DpkKD_bN.cjs.map +0 -1
@@ -35,6 +35,17 @@ type __VLS_Props = {
35
35
  * Opt-in: quando definida, exibe o seletor de colunas e persiste o que foi ocultado. */
36
36
  persistState?: string;
37
37
  };
38
+ /**
39
+ * Rola a tabela até a linha cujo pk é `value` — o par do `v-model:selectedRow`
40
+ * para o sentido "de fora para dentro" (selecionou no mapa/gráfico, a linha
41
+ * aparece). Só alcança a página atual: linha em outra página não é buscada — é
42
+ * do consumidor decidir o que fazer nesse caso (a lista é lazy). Com linhas de
43
+ * expansão abertas o índice DOM diverge do índice do item; aí não rola.
44
+ */
45
+ declare function scrollToRow(value: unknown): void;
46
+ type __VLS_PublicProps = {
47
+ 'selectedRow'?: Record<string, unknown> | null;
48
+ } & __VLS_Props;
38
49
  declare function __VLS_template(): {
39
50
  attrs: Partial<{}>;
40
51
  slots: Partial<Record<`column-${string}`, (_: {
@@ -88,6 +99,11 @@ declare function __VLS_template(): {
88
99
  }): any;
89
100
  };
90
101
  refs: {
102
+ tableRef: ({
103
+ $props: import('primevue/datatable').DataTableProps<any> & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
104
+ $slots: import('primevue/datatable').DataTableSlots<any>;
105
+ $emit: ((e: "page", event: import('primevue/datatable').DataTablePageEvent) => void) & ((e: "sort", event: import('primevue/datatable').DataTableSortEvent) => void) & ((e: "filter", event: import('primevue/datatable').DataTableFilterEvent) => void) & ((e: "value-change", value: any[]) => void) & ((e: "update:first", value: number) => void) & ((e: "update:rows", value: number) => void) & ((e: "update:sortField", value: string) => void) & ((e: "update:sortOrder", value: number | undefined) => void) & ((e: "update:multiSortMeta", value: import('primevue/datatable').DataTableSortMeta[] | null | undefined) => void) & ((e: "update:selection", value: any) => void) & ((e: "update:contextMenuSelection", value: any) => void) & ((e: "update:expandedRows", value: any[] | import('primevue/datatable').DataTableExpandedRows) => void) & ((e: "update:expandedRowGroups", value: any[] | import('primevue/datatable').DataTableExpandedRows) => void) & ((e: "update:filters", value: import('primevue/datatable').DataTableFilterMeta) => void) & ((e: "update:editingRows", value: any[] | import('primevue/datatable').DataTableEditingRows) => void) & ((e: "row-click", event: import('primevue/datatable').DataTableRowClickEvent<any>) => void) & ((e: "row-dblclick", event: import('primevue/datatable').DataTableRowDoubleClickEvent) => void) & ((e: "row-contextmenu", event: import('primevue/datatable').DataTableRowContextMenuEvent) => void) & ((e: "row-select", event: import('primevue/datatable').DataTableRowSelectEvent<any>) => void) & ((e: "row-select-all", event: import('primevue/datatable').DataTableRowSelectAllEvent<any>) => void) & ((e: "row-unselect-all", event: import('primevue/datatable').DataTableRowUnselectAllEvent) => void) & ((e: "row-unselect", event: import('primevue/datatable').DataTableRowUnselectEvent) => void) & ((e: "select-all-change", event: import('primevue/datatable').DataTableSelectAllChangeEvent) => void) & ((e: "column-resize-end", event: import('primevue/datatable').DataTableColumnResizeEndEvent) => void) & ((e: "column-reorder", event: import('primevue/datatable').DataTableColumnReorderEvent) => void) & ((e: "row-reorder", event: import('primevue/datatable').DataTableRowReorderEvent) => void) & ((e: "row-expand", event: import('primevue/datatable').DataTableRowExpandEvent<any>) => void) & ((e: "row-collapse", event: import('primevue/datatable').DataTableRowCollapseEvent) => void) & ((e: "rowgroup-expand", event: import('primevue/datatable').DataTableRowExpandEvent<any>) => void) & ((e: "rowgroup-collapse", event: import('primevue/datatable').DataTableRowCollapseEvent) => void) & ((e: "cell-edit-init", event: import('primevue/datatable').DataTableCellEditInitEvent<any>) => void) & ((e: "cell-edit-complete", event: import('primevue/datatable').DataTableCellEditCompleteEvent<any>) => void) & ((e: "cell-edit-cancel", event: import('primevue/datatable').DataTableCellEditCancelEvent) => void) & ((e: "row-edit-init", event: import('primevue/datatable').DataTableRowEditInitEvent<any>) => void) & ((e: "row-edit-save", event: import('primevue/datatable').DataTableRowEditSaveEvent<any>) => void) & ((e: "row-edit-cancel", event: import('primevue/datatable').DataTableRowEditCancelEvent<any>) => void) & ((e: "state-restore", event: import('primevue/datatable').DataTableStateEvent<any>) => void) & ((e: "state-save", event: import('primevue/datatable').DataTableStateEvent<any>) => void);
106
+ } & import('primevue/datatable').DataTableMethods) | null;
91
107
  chooser: ({
92
108
  $props: import('primevue/popover').PopoverProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
93
109
  $slots: import('primevue/popover').PopoverSlots;
@@ -102,14 +118,18 @@ declare function __VLS_template(): {
102
118
  rootEl: HTMLDivElement;
103
119
  };
104
120
  type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
105
- declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
121
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps, {
122
+ scrollToRow: typeof scrollToRow;
123
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
106
124
  "row-expand": (data: unknown) => any;
107
125
  "row-collapse": (data: unknown) => any;
108
126
  print: (data: Record<string, unknown>) => any;
109
- }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
127
+ "update:selectedRow": (value: Record<string, unknown> | null) => any;
128
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
110
129
  "onRow-expand"?: ((data: unknown) => any) | undefined;
111
130
  "onRow-collapse"?: ((data: unknown) => any) | undefined;
112
131
  onPrint?: ((data: Record<string, unknown>) => any) | undefined;
132
+ "onUpdate:selectedRow"?: ((value: Record<string, unknown> | null) => any) | undefined;
113
133
  }>, {
114
134
  dialogWidth: string;
115
135
  showSearch: boolean;
@@ -131,6 +151,11 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
131
151
  csvScope: "all" | "page";
132
152
  csvPageSize: number;
133
153
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
154
+ tableRef: ({
155
+ $props: import('primevue/datatable').DataTableProps<any> & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
156
+ $slots: import('primevue/datatable').DataTableSlots<any>;
157
+ $emit: ((e: "page", event: import('primevue/datatable').DataTablePageEvent) => void) & ((e: "sort", event: import('primevue/datatable').DataTableSortEvent) => void) & ((e: "filter", event: import('primevue/datatable').DataTableFilterEvent) => void) & ((e: "value-change", value: any[]) => void) & ((e: "update:first", value: number) => void) & ((e: "update:rows", value: number) => void) & ((e: "update:sortField", value: string) => void) & ((e: "update:sortOrder", value: number | undefined) => void) & ((e: "update:multiSortMeta", value: import('primevue/datatable').DataTableSortMeta[] | null | undefined) => void) & ((e: "update:selection", value: any) => void) & ((e: "update:contextMenuSelection", value: any) => void) & ((e: "update:expandedRows", value: any[] | import('primevue/datatable').DataTableExpandedRows) => void) & ((e: "update:expandedRowGroups", value: any[] | import('primevue/datatable').DataTableExpandedRows) => void) & ((e: "update:filters", value: import('primevue/datatable').DataTableFilterMeta) => void) & ((e: "update:editingRows", value: any[] | import('primevue/datatable').DataTableEditingRows) => void) & ((e: "row-click", event: import('primevue/datatable').DataTableRowClickEvent<any>) => void) & ((e: "row-dblclick", event: import('primevue/datatable').DataTableRowDoubleClickEvent) => void) & ((e: "row-contextmenu", event: import('primevue/datatable').DataTableRowContextMenuEvent) => void) & ((e: "row-select", event: import('primevue/datatable').DataTableRowSelectEvent<any>) => void) & ((e: "row-select-all", event: import('primevue/datatable').DataTableRowSelectAllEvent<any>) => void) & ((e: "row-unselect-all", event: import('primevue/datatable').DataTableRowUnselectAllEvent) => void) & ((e: "row-unselect", event: import('primevue/datatable').DataTableRowUnselectEvent) => void) & ((e: "select-all-change", event: import('primevue/datatable').DataTableSelectAllChangeEvent) => void) & ((e: "column-resize-end", event: import('primevue/datatable').DataTableColumnResizeEndEvent) => void) & ((e: "column-reorder", event: import('primevue/datatable').DataTableColumnReorderEvent) => void) & ((e: "row-reorder", event: import('primevue/datatable').DataTableRowReorderEvent) => void) & ((e: "row-expand", event: import('primevue/datatable').DataTableRowExpandEvent<any>) => void) & ((e: "row-collapse", event: import('primevue/datatable').DataTableRowCollapseEvent) => void) & ((e: "rowgroup-expand", event: import('primevue/datatable').DataTableRowExpandEvent<any>) => void) & ((e: "rowgroup-collapse", event: import('primevue/datatable').DataTableRowCollapseEvent) => void) & ((e: "cell-edit-init", event: import('primevue/datatable').DataTableCellEditInitEvent<any>) => void) & ((e: "cell-edit-complete", event: import('primevue/datatable').DataTableCellEditCompleteEvent<any>) => void) & ((e: "cell-edit-cancel", event: import('primevue/datatable').DataTableCellEditCancelEvent) => void) & ((e: "row-edit-init", event: import('primevue/datatable').DataTableRowEditInitEvent<any>) => void) & ((e: "row-edit-save", event: import('primevue/datatable').DataTableRowEditSaveEvent<any>) => void) & ((e: "row-edit-cancel", event: import('primevue/datatable').DataTableRowEditCancelEvent<any>) => void) & ((e: "state-restore", event: import('primevue/datatable').DataTableStateEvent<any>) => void) & ((e: "state-save", event: import('primevue/datatable').DataTableStateEvent<any>) => void);
158
+ } & import('primevue/datatable').DataTableMethods) | null;
134
159
  chooser: ({
135
160
  $props: import('primevue/popover').PopoverProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
136
161
  $slots: import('primevue/popover').PopoverSlots;
@@ -31,4 +31,6 @@ export { default as WMarkdownView } from './ui/WMarkdownView.vue';
31
31
  export { default as WMarkdownEditor } from './form/WMarkdownEditor.vue';
32
32
  export { default as WMarkdownToc } from './ui/WMarkdownToc.vue';
33
33
  export { default as WTabBar } from './ui/WTabBar.vue';
34
+ export { default as WTabNav } from './ui/WTabNav.vue';
35
+ export { default as WTabViewport } from './ui/WTabViewport.vue';
34
36
  export { default as WKanbanBoard } from './ui/WKanbanBoard.vue';
@@ -1,4 +1,4 @@
1
- import { MapSelectFeature, MapSelectGeometry, MapSelectId, MapSelectPolygonStyle } from '../../types/mapSelect';
1
+ import { MapSelectFeature, MapSelectGeometry, MapSelectId, MapSelectPolygonStyle, MapSelectSelectionMode, MapSelectTooltips } from '../../types/mapSelect';
2
2
  /**
3
3
  * Seleção múltipla de polígonos num mapa de satélite, com painel lateral de busca.
4
4
  *
@@ -66,12 +66,30 @@ type __VLS_Props = {
66
66
  * duplica a busca da própria tela e a área somada não tem o que somar.
67
67
  * `modelValue` continua valendo: dá para destacar um polígono de fora. */
68
68
  readonly?: boolean;
69
+ /** Tooltip dos polígonos. `'permanent'` (default) mantém o rótulo sempre
70
+ * visível; `'hover'` só o mostra sob o cursor — com muitos polígonos
71
+ * (100+), o permanente vira um nó DOM por talhão reposicionado a cada
72
+ * pan/zoom, e o `'hover'` devolve a fluidez. */
73
+ tooltips?: MapSelectTooltips;
74
+ /** Modo de seleção por clique. Sem valor, o default preserva o comportamento
75
+ * de sempre: interativo → `'multiple'`, `readonly` → `'none'`. Definido
76
+ * explicitamente, vale MESMO com `readonly` (que segue escondendo painel e
77
+ * rodapé): o clique no polígono emite `update:modelValue`. Em `'single'` o
78
+ * clique substitui a seleção (`[id]`) e clicar no selecionado desmarca. */
79
+ selectionMode?: MapSelectSelectionMode;
69
80
  /** Estilo do polígono não selecionado. */
70
81
  polygonStyle?: MapSelectPolygonStyle;
71
82
  /** Estilo do polígono selecionado. */
72
83
  polygonSelectedStyle?: MapSelectPolygonStyle;
73
84
  };
74
85
  declare function setCollapsed(value: boolean): void;
86
+ declare function fitToScope(): void;
87
+ /** Enquadra a layer de um id, com o mesmo padding do escopo. No-op se o id não
88
+ * tem layer (sem geometria, ainda não chegou, mapa fora do ar). */
89
+ declare function fitToFeature(id: MapSelectId, options?: {
90
+ padding?: [number, number];
91
+ maxZoom?: number;
92
+ }): void;
75
93
  /** O mapa costuma nascer escondido (dentro de um Dialog): sem isto o Leaflet
76
94
  * calcula 0×0 e desenha só um pedaço quando o container aparece. */
77
95
  declare function refreshSize(): void;
@@ -101,6 +119,11 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
101
119
  /** Painel flutuante recolhido? (só faz sentido no `layout="sobreposto"`.) */
102
120
  collapsed: Readonly<import('vue').Ref<boolean, boolean>>;
103
121
  setCollapsed: typeof setCollapsed;
122
+ /** Reenquadra no escopo (ou na união das features) — o fit automático só
123
+ * acontece uma vez; páginas novas de `features` não movem o mapa. */
124
+ fitToScope: typeof fitToScope;
125
+ /** Enquadra o polígono de um id (padding igual ao do escopo). No-op sem layer. */
126
+ fitToFeature: typeof fitToFeature;
104
127
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
105
128
  "update:modelValue": (ids: MapSelectId[]) => any;
106
129
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
@@ -110,6 +133,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
110
133
  disabled: boolean;
111
134
  height: string;
112
135
  readonly: boolean;
136
+ selectionMode: MapSelectSelectionMode;
113
137
  emptyMessage: string;
114
138
  features: MapSelectFeature[];
115
139
  scopeGeometry: MapSelectGeometry | null;
@@ -127,6 +151,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
127
151
  expandLabel: string;
128
152
  badgeLabel: string;
129
153
  mapErrorMessage: string;
154
+ tooltips: MapSelectTooltips;
130
155
  polygonStyle: MapSelectPolygonStyle;
131
156
  polygonSelectedStyle: MapSelectPolygonStyle;
132
157
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
@@ -0,0 +1,56 @@
1
+ import { RouteTab, RouteTabsApi } from '../../types/routeTabs';
2
+ /**
3
+ * Barra da navegação por abas (estilo browser/ERP) — o par do WTabViewport.
4
+ * Não confundir com o WTabBar (abas de seção DENTRO de uma tela): esta barra
5
+ * lista rotas abertas, fecha (X, botão do meio) e oferece menu de contexto
6
+ * com recarregar/fechar outras/fechar todas. Overflow rola na horizontal e a
7
+ * aba ativa se mantém à vista. Todo o estado vem do `useRouteTabs` via prop.
8
+ */
9
+ type __VLS_Props = {
10
+ /** Instância retornada por `useRouteTabs` — o dono do estado. */
11
+ tabs: RouteTabsApi;
12
+ ariaLabel?: string;
13
+ };
14
+ declare function __VLS_template(): {
15
+ attrs: Partial<{}>;
16
+ slots: {
17
+ tab?(_: {
18
+ tab: RouteTab;
19
+ active: boolean;
20
+ }): any;
21
+ actions?(_: {}): any;
22
+ };
23
+ refs: {
24
+ trilho: HTMLDivElement;
25
+ menu: ({
26
+ $props: import('primevue/contextmenu').ContextMenuProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
27
+ $slots: import('primevue/contextmenu').ContextMenuSlots;
28
+ $emit: ((e: "focus", event: Event) => void) & ((e: "blur", event: Event) => void) & ((e: "before-show") => void) & ((e: "before-hide") => void) & ((e: "show") => void) & ((e: "hide") => void);
29
+ } & import('primevue/contextmenu').ContextMenuMethods) | null;
30
+ };
31
+ rootEl: HTMLDivElement;
32
+ };
33
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
34
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
35
+ close: (tab: RouteTab) => any;
36
+ activate: (tab: RouteTab) => any;
37
+ reload: (tab: RouteTab) => any;
38
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
39
+ onClose?: ((tab: RouteTab) => any) | undefined;
40
+ onActivate?: ((tab: RouteTab) => any) | undefined;
41
+ onReload?: ((tab: RouteTab) => any) | undefined;
42
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
43
+ trilho: HTMLDivElement;
44
+ menu: ({
45
+ $props: import('primevue/contextmenu').ContextMenuProps & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
46
+ $slots: import('primevue/contextmenu').ContextMenuSlots;
47
+ $emit: ((e: "focus", event: Event) => void) & ((e: "blur", event: Event) => void) & ((e: "before-show") => void) & ((e: "before-hide") => void) & ((e: "show") => void) & ((e: "hide") => void);
48
+ } & import('primevue/contextmenu').ContextMenuMethods) | null;
49
+ }, HTMLDivElement>;
50
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
51
+ export default _default;
52
+ type __VLS_WithTemplateSlots<T, S> = T & {
53
+ new (): {
54
+ $slots: S;
55
+ };
56
+ };
@@ -0,0 +1,53 @@
1
+ import { PropType, Ref } from 'vue';
2
+ import { RouteTab, RouteTabsApi } from '../../types/routeTabs';
3
+ /**
4
+ * Pane de uma aba — interno do WTabViewport, não exportado no barrel.
5
+ *
6
+ * Faz os dois provides que dão à tela a ilusão de viver sozinha:
7
+ * - `routeLocationKey` (a MESMA chave que o vue-router usa): o `useRoute()` da
8
+ * tela passa a injetar o snapshot congelado da aba, então um pane oculto
9
+ * nunca reage à navegação global.
10
+ * - `W_TAB_HOST_KEY`: contexto para a tela pendurar dialogs no container da
11
+ * aba (`hostEl`), definir o título dinâmico e registrar hooks/guards.
12
+ *
13
+ * Os registros (guards/hooks) são desfeitos via `onScopeDispose` no escopo de
14
+ * QUEM registrou — assim um `reload()` (remount) não acumula guard morto.
15
+ */
16
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
17
+ tab: {
18
+ type: PropType<RouteTab>;
19
+ required: true;
20
+ };
21
+ api: {
22
+ type: PropType<RouteTabsApi>;
23
+ required: true;
24
+ };
25
+ active: {
26
+ type: BooleanConstructor;
27
+ required: true;
28
+ };
29
+ hostEl: {
30
+ type: PropType<Ref<HTMLElement | null>>;
31
+ required: true;
32
+ };
33
+ }>, () => import('vue').VNode<import('vue').RendererNode, import('vue').RendererElement, {
34
+ [key: string]: any;
35
+ }> | null, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
36
+ tab: {
37
+ type: PropType<RouteTab>;
38
+ required: true;
39
+ };
40
+ api: {
41
+ type: PropType<RouteTabsApi>;
42
+ required: true;
43
+ };
44
+ active: {
45
+ type: BooleanConstructor;
46
+ required: true;
47
+ };
48
+ hostEl: {
49
+ type: PropType<Ref<HTMLElement | null>>;
50
+ required: true;
51
+ };
52
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
53
+ export default _default;
@@ -0,0 +1,14 @@
1
+ import { RouteTabsApi } from '../../types/routeTabs';
2
+ /**
3
+ * Painéis da navegação por abas: mantém TODA aba hidratada montada num
4
+ * wrapper `v-show` (não `<KeepAlive>` — o DOM nunca sai da árvore, então um
5
+ * dialog com `appendTo` no pane sobrevive intacto à troca de aba, e fechar
6
+ * aba é só desmontar o pane). Substitui o `<RouterView>` do layout: o
7
+ * componente da rota vem já resolvido do `useRouteTabs`.
8
+ */
9
+ type __VLS_Props = {
10
+ /** Instância retornada por `useRouteTabs` — o dono do estado. */
11
+ tabs: RouteTabsApi;
12
+ };
13
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
14
+ export default _default;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("./WKanbanBoard.vue_vue_type_script_setup_true_lang-x3RaoczK.cjs");exports.WActionBar=_._sfc_main;exports.WAutoCompleteFK=_._sfc_main$1;exports.WCheckList=_._sfc_main$2;exports.WCrudColumnRenderer=_._sfc_main$3;exports.WCrudFormDialog=_._sfc_main$4;exports.WCrudSubview=_._sfc_main$5;exports.WCrudView=_._sfc_main$6;exports.WDatePicker=_._sfc_main$7;exports.WDateRange=_._sfc_main$8;exports.WDetailHeader=_._sfc_main$9;exports.WEditableTable=_._sfc_main$10;exports.WEmptyState=_._sfc_main$11;exports.WFileUpload=_._sfc_main$12;exports.WFormRenderer=_._sfc_main$13;exports.WFormSection=_._sfc_main$14;exports.WImageCropper=_.WImageCropper;exports.WInfoCard=_._sfc_main$15;exports.WKanbanBoard=_._sfc_main$16;exports.WKpiCard=_._sfc_main$17;exports.WKpiGrid=_._sfc_main$18;exports.WMapSelect=_._sfc_main$19;exports.WMarkdownEditor=_._sfc_main$20;exports.WMarkdownToc=_._sfc_main$21;exports.WMarkdownView=_._sfc_main$22;exports.WMoneyInput=_._sfc_main$23;exports.WPageHeader=_._sfc_main$24;exports.WProgressFlow=_._sfc_main$25;exports.WSectionHeader=_._sfc_main$26;exports.WStatusTag=_._sfc_main$27;exports.WStepFlow=_._sfc_main$28;exports.WStepSection=_._sfc_main$29;exports.WTabBar=_._sfc_main$30;exports.WTransferList=_._sfc_main$31;exports.WTreeSelect=_._sfc_main$32;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("./WKanbanBoard.vue_vue_type_script_setup_true_lang-DFRhQIiG.cjs");exports.WActionBar=_._sfc_main;exports.WAutoCompleteFK=_._sfc_main$1;exports.WCheckList=_._sfc_main$2;exports.WCrudColumnRenderer=_._sfc_main$3;exports.WCrudFormDialog=_._sfc_main$4;exports.WCrudSubview=_._sfc_main$5;exports.WCrudView=_._sfc_main$6;exports.WDatePicker=_._sfc_main$7;exports.WDateRange=_._sfc_main$8;exports.WDetailHeader=_._sfc_main$9;exports.WEditableTable=_._sfc_main$10;exports.WEmptyState=_._sfc_main$11;exports.WFileUpload=_._sfc_main$12;exports.WFormRenderer=_._sfc_main$13;exports.WFormSection=_._sfc_main$14;exports.WImageCropper=_.WImageCropper;exports.WInfoCard=_._sfc_main$15;exports.WKanbanBoard=_._sfc_main$16;exports.WKpiCard=_._sfc_main$17;exports.WKpiGrid=_._sfc_main$18;exports.WMapSelect=_._sfc_main$19;exports.WMarkdownEditor=_._sfc_main$20;exports.WMarkdownToc=_._sfc_main$21;exports.WMarkdownView=_._sfc_main$22;exports.WMoneyInput=_._sfc_main$23;exports.WPageHeader=_._sfc_main$24;exports.WProgressFlow=_._sfc_main$25;exports.WSectionHeader=_._sfc_main$26;exports.WStatusTag=_._sfc_main$27;exports.WStepFlow=_._sfc_main$28;exports.WStepSection=_._sfc_main$29;exports.WTabBar=_._sfc_main$30;exports.WTabNav=_._sfc_main$31;exports.WTabViewport=_._sfc_main$32;exports.WTransferList=_._sfc_main$33;exports.WTreeSelect=_._sfc_main$34;
2
2
  //# sourceMappingURL=components.cjs.map
@@ -1,38 +1,40 @@
1
- import { _ as s, a as r, b as W, c as o, d as t, e as d, f as i, g as n, h as l, i as p, j as C, k as c, l as u, m as S, n as m, W as w, o as F, p as g, q as b, r as k, s as T, t as D, u as M, v as f, w as B, x as E, y as K, z as y, A, B as H, C as I, D as P, E as R, F as h } from "./WKanbanBoard.vue_vue_type_script_setup_true_lang-D30LZLT8.js";
1
+ import { _ as s, a as W, b as r, c as o, d as t, e as d, f as i, g as n, h as p, i as l, j as C, k as c, l as u, m as w, n as S, W as m, o as b, p as F, q as T, r as g, s as k, t as D, u as M, v as f, w as B, x as E, y as H, z as K, A as v, B as y, C as A, D as I, E as P, F as R, G as V, H as h } from "./WKanbanBoard.vue_vue_type_script_setup_true_lang-Bmqt_P_5.js";
2
2
  export {
3
3
  s as WActionBar,
4
- r as WAutoCompleteFK,
5
- W as WCheckList,
4
+ W as WAutoCompleteFK,
5
+ r as WCheckList,
6
6
  o as WCrudColumnRenderer,
7
7
  t as WCrudFormDialog,
8
8
  d as WCrudSubview,
9
9
  i as WCrudView,
10
10
  n as WDatePicker,
11
- l as WDateRange,
12
- p as WDetailHeader,
11
+ p as WDateRange,
12
+ l as WDetailHeader,
13
13
  C as WEditableTable,
14
14
  c as WEmptyState,
15
15
  u as WFileUpload,
16
- S as WFormRenderer,
17
- m as WFormSection,
18
- w as WImageCropper,
19
- F as WInfoCard,
20
- g as WKanbanBoard,
21
- b as WKpiCard,
22
- k as WKpiGrid,
23
- T as WMapSelect,
16
+ w as WFormRenderer,
17
+ S as WFormSection,
18
+ m as WImageCropper,
19
+ b as WInfoCard,
20
+ F as WKanbanBoard,
21
+ T as WKpiCard,
22
+ g as WKpiGrid,
23
+ k as WMapSelect,
24
24
  D as WMarkdownEditor,
25
25
  M as WMarkdownToc,
26
26
  f as WMarkdownView,
27
27
  B as WMoneyInput,
28
28
  E as WPageHeader,
29
- K as WProgressFlow,
30
- y as WSectionHeader,
31
- A as WStatusTag,
32
- H as WStepFlow,
33
- I as WStepSection,
34
- P as WTabBar,
35
- R as WTransferList,
29
+ H as WProgressFlow,
30
+ K as WSectionHeader,
31
+ v as WStatusTag,
32
+ y as WStepFlow,
33
+ A as WStepSection,
34
+ I as WTabBar,
35
+ P as WTabNav,
36
+ R as WTabViewport,
37
+ V as WTransferList,
36
38
  h as WTreeSelect
37
39
  };
38
40
  //# sourceMappingURL=components.js.map
@@ -9,3 +9,4 @@ export { useAppToast } from './useAppToast';
9
9
  export { useAppConfirm } from './useAppConfirm';
10
10
  export { useApiError, extractApiError } from './useApiError';
11
11
  export { useFormatters } from './useFormatters';
12
+ export { useRouteTabs } from './useRouteTabs';
@@ -0,0 +1,2 @@
1
+ import { RouteTabsApi, UseRouteTabsOptions } from '../types/routeTabs';
2
+ export declare function useRouteTabs(options: UseRouteTabsOptions): RouteTabsApi;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useApi-DpkKD_bN.cjs"),e=require("./useFormKeyboardNav-D4Ow3k4Y.cjs");function s(u){return u}exports.useApi=r.useApi;exports.useCrudManager=r.useCrudManager;exports.useSubviewCrud=r.useSubviewCrud;exports.extractApiError=e.extractApiError;exports.useApiError=e.useApiError;exports.useAppConfirm=e.useAppConfirm;exports.useAppToast=e.useAppToast;exports.useDateInput=e.useDateInput;exports.useFormKeyboardNav=e.useFormKeyboardNav;exports.useFormatters=e.useFormatters;exports.defineCrudConfig=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useRouteTabs-Ds2QpP3I.cjs"),e=require("./useFormKeyboardNav-D4Ow3k4Y.cjs");function s(u){return u}exports.useApi=r.useApi;exports.useCrudManager=r.useCrudManager;exports.useRouteTabs=r.useRouteTabs;exports.useSubviewCrud=r.useSubviewCrud;exports.extractApiError=e.extractApiError;exports.useApiError=e.useApiError;exports.useAppConfirm=e.useAppConfirm;exports.useAppToast=e.useAppToast;exports.useDateInput=e.useDateInput;exports.useFormKeyboardNav=e.useFormKeyboardNav;exports.useFormatters=e.useFormatters;exports.defineCrudConfig=s;
2
2
  //# sourceMappingURL=composables.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables.cjs","sources":["../src/composables/defineCrudConfig.ts"],"sourcesContent":["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"],"names":["defineCrudConfig","config"],"mappings":"wKAkBO,SAASA,EACdC,EACsB,CACtB,OAAOA,CACT"}
1
+ {"version":3,"file":"composables.cjs","sources":["../src/composables/defineCrudConfig.ts"],"sourcesContent":["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"],"names":["defineCrudConfig","config"],"mappings":"8KAkBO,SAASA,EACdC,EACsB,CACtB,OAAOA,CACT"}
@@ -1,19 +1,20 @@
1
- import { u, a as o, b as t } from "./useApi-BQJ_C2Yt.js";
2
- import { e as i, u as n, a as f, b as d, c as m, d as A, f as C } from "./useFormKeyboardNav-D4Irq5RE.js";
3
- function e(r) {
4
- return r;
1
+ import { u, a as o, b as t, c as p } from "./useRouteTabs-63cZtRr3.js";
2
+ import { e as n, u as f, a as d, b, c as m, d as A, f as C } from "./useFormKeyboardNav-CLCEo_O5.js";
3
+ function s(e) {
4
+ return e;
5
5
  }
6
6
  export {
7
- e as defineCrudConfig,
8
- i as extractApiError,
7
+ s as defineCrudConfig,
8
+ n as extractApiError,
9
9
  u as useApi,
10
- n as useApiError,
11
- f as useAppConfirm,
12
- d as useAppToast,
10
+ f as useApiError,
11
+ d as useAppConfirm,
12
+ b as useAppToast,
13
13
  o as useCrudManager,
14
14
  m as useDateInput,
15
15
  A as useFormKeyboardNav,
16
16
  C as useFormatters,
17
- t as useSubviewCrud
17
+ t as useRouteTabs,
18
+ p as useSubviewCrud
18
19
  };
19
20
  //# sourceMappingURL=composables.js.map
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("./plugin-D1YvyKXX.cjs"),t=require("./WKanbanBoard.vue_vue_type_script_setup_true_lang-x3RaoczK.cjs"),W=require("./useApi-DpkKD_bN.cjs"),m=require("./useFormKeyboardNav-D4Ow3k4Y.cjs"),w=require("./types.cjs");function D(e,a,r){const n=e;return Array.isArray(n.results)?{data:n.results,page:n.page??a,page_size:n.page_size??r,rows:n.count??0,extras:n.extras??{}}:Array.isArray(n.data)?{data:n.data,page:n.page??a,page_size:n.page_size??r,rows:n.rows??0,extras:n.extras??{}}:{data:Array.isArray(e)?e:[],page:a,page_size:r,rows:Array.isArray(e)?e.length:0,extras:{}}}function y(e){return{async list(a,r={}){const n=await e.get(a,{params:r});return D(n.data,Number(r.page??1),Number(r.page_size??20))},async get(a,r,n){return{data:(await e.get(`${a}${r}/`,n)).data}},async create(a,r,n){return{data:(await e.post(a,r,n)).data}},async update(a,r,n,i){return{data:(await e.patch(`${a}${r}/`,n,i)).data}},async delete(a,r){await e.delete(`${a}${r}/`)}}}const F={install(e,a){if(!(a!=null&&a.axios)&&!(a!=null&&a.dataProvider))throw new Error('[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.');const r=a.dataProvider??y(a.axios),n={axios:a.axios,dataProvider:r,defaultPageSize:a.defaultPageSize??20,dateFormat:a.dateFormat??"DD/MM/YYYY",dateTimeFormat:a.dateTimeFormat??"DD/MM/YYYY HH:mm",locale:a.locale??"pt-BR",currency:a.currency??"BRL"};a.axios&&e.provide(_.W_AXIOS_KEY,a.axios),e.provide(_.W_DATA_PROVIDER_KEY,r),e.provide(_.W_CONFIG_KEY,n),a.registerComponents!==!1&&(e.component("WCrudView",t._sfc_main$6),e.component("WCrudFormDialog",t._sfc_main$4),e.component("WCrudColumnRenderer",t._sfc_main$3),e.component("WAutoCompleteFK",t._sfc_main$1),e.component("WMoneyInput",t._sfc_main$23),e.component("WTransferList",t._sfc_main$31),e.component("WTreeSelect",t._sfc_main$32))}};function S(e){return e.split("?")[0].replace(/^\/+|\/+$/g,"").replace(/^api\/v\d+\//,"")}function P(e){return typeof e=="string"?{table:e}:e}function C(e,a=400){return{response:{status:a,data:{detail:e}},message:e}}function A(e){if(e instanceof FormData)throw C("SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.");return e}function p(e){throw{response:{data:{detail:(e==null?void 0:e.message)??"Erro ao consultar Supabase",code:e==null?void 0:e.code,details:e==null?void 0:e.details,hint:e==null?void 0:e.hint}},message:(e==null?void 0:e.message)??"Erro ao consultar Supabase"}}function g(e,a){var i,s;const r=S(e),n=(i=a.resources)==null?void 0:i[r];if(n)return P(n);if((s=a.allowedTables)!=null&&s.includes(r))return{table:r};throw C(`Recurso Supabase nao registrado para o endpoint "${e}".`,404)}function v(e,a,r){const n=new Set(["page","page_size","search","ordering"]),i={...r.defaultFilters,...a};for(const[s,o]of Object.entries(i))n.has(s)||o===null||o===void 0||o===""||(e=e.eq(s,o));return e}function E(e,a,r){if(typeof a!="string"||!a.trim()||!(r!=null&&r.length))return e;const n=a.trim().replace(/,/g,"\\,"),i=r.map(s=>`${s}.ilike.%${n}%`).join(",");return e.or(i)}function b(e,a){const r=typeof e=="string"&&e?e:a;return r?{field:r.startsWith("-")?r.slice(1):r,ascending:!r.startsWith("-")}:null}function T(e,a){return e?a.mapListItem?e.map(r=>{var n;return(n=a.mapListItem)==null?void 0:n.call(a,r)}):e:[]}function R(e){const a=e.defaultSelect??"*";return{async list(r,n={}){var $;const i=g(r,e),s=Math.max(Number(n.page??1),1),o=Math.max(Number(n.page_size??20),1),c=(s-1)*o,d=c+o-1;let u=e.client.from(i.table).select(i.select??a,{count:"exact"});u=v(u,n,i),u=E(u,n.search,i.searchFields);const l=b(n.ordering,i.defaultOrdering);l&&(u=u.order(l.field,{ascending:l.ascending}));const f=await u.range(c,d);return f.error&&p(f.error),{data:T(f.data,i),page:s,page_size:o,rows:f.count??(($=f.data)==null?void 0:$.length)??0,extras:{}}},async get(r,n,i){const s=g(r,e),o=s.pk??"id",c=await e.client.from(s.table).select(s.select??a).eq(o,n).single();return c.error&&p(c.error),{data:c.data}},async create(r,n,i){const s=g(r,e),o=A(n),c=s.mapPayload?s.mapPayload(o,"create"):o,d=await e.client.from(s.table).insert(c).select(s.select??a).single();return d.error&&p(d.error),{data:d.data}},async update(r,n,i,s){const o=g(r,e),c=o.pk??"id",d=A(i),u=o.mapPayload?o.mapPayload(d,"update"):d,l=await e.client.from(o.table).update(u).eq(c,n).select(o.select??a).single();return l.error&&p(l.error),{data:l.data}},async delete(r,n){const i=g(r,e),s=i.pk??"id",o=i.softDelete===!0?{is_active:!1}:typeof i.softDelete=="object"?i.softDelete:null,c=o?await e.client.from(i.table).update(o).eq(s,n):await e.client.from(i.table).delete().eq(s,n);c.error&&p(c.error)}}}exports.W_AXIOS_KEY=_.W_AXIOS_KEY;exports.W_CONFIG_KEY=_.W_CONFIG_KEY;exports.W_DATA_PROVIDER_KEY=_.W_DATA_PROVIDER_KEY;exports.WActionBar=t._sfc_main;exports.WAutoCompleteFK=t._sfc_main$1;exports.WCheckList=t._sfc_main$2;exports.WCrudColumnRenderer=t._sfc_main$3;exports.WCrudFormDialog=t._sfc_main$4;exports.WCrudSubview=t._sfc_main$5;exports.WCrudView=t._sfc_main$6;exports.WDatePicker=t._sfc_main$7;exports.WDateRange=t._sfc_main$8;exports.WDetailHeader=t._sfc_main$9;exports.WEditableTable=t._sfc_main$10;exports.WEmptyState=t._sfc_main$11;exports.WFileUpload=t._sfc_main$12;exports.WFormRenderer=t._sfc_main$13;exports.WFormSection=t._sfc_main$14;exports.WImageCropper=t.WImageCropper;exports.WInfoCard=t._sfc_main$15;exports.WKanbanBoard=t._sfc_main$16;exports.WKpiCard=t._sfc_main$17;exports.WKpiGrid=t._sfc_main$18;exports.WMapSelect=t._sfc_main$19;exports.WMarkdownEditor=t._sfc_main$20;exports.WMarkdownToc=t._sfc_main$21;exports.WMarkdownView=t._sfc_main$22;exports.WMoneyInput=t._sfc_main$23;exports.WPageHeader=t._sfc_main$24;exports.WProgressFlow=t._sfc_main$25;exports.WSectionHeader=t._sfc_main$26;exports.WStatusTag=t._sfc_main$27;exports.WStepFlow=t._sfc_main$28;exports.WStepSection=t._sfc_main$29;exports.WTabBar=t._sfc_main$30;exports.WTransferList=t._sfc_main$31;exports.WTreeSelect=t._sfc_main$32;exports.W_STEP_FLOW_KEY=t.W_STEP_FLOW_KEY;exports.downloadCsv=t.downloadCsv;exports.mapApiFieldToColumnDef=t.mapApiFieldToColumnDef;exports.mapApiFieldToFieldDef=t.mapApiFieldToFieldDef;exports.mapApiFieldsToColumnDefs=t.mapApiFieldsToColumnDefs;exports.mapApiFieldsToFieldDefs=t.mapApiFieldsToFieldDefs;exports.toCsv=t.toCsv;exports.useApi=W.useApi;exports.useCrudManager=W.useCrudManager;exports.useSubviewCrud=W.useSubviewCrud;exports.extractApiError=m.extractApiError;exports.useApiError=m.useApiError;exports.useAppConfirm=m.useAppConfirm;exports.useAppToast=m.useAppToast;exports.useDateInput=m.useDateInput;exports.useFormatters=m.useFormatters;exports.DEFAULT_CRUD_LABELS=w.DEFAULT_CRUD_LABELS;exports.WPrimeVuePlugin=F;exports.createAxiosDataProvider=y;exports.createSupabaseDataProvider=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("./plugin-D1YvyKXX.cjs"),t=require("./WKanbanBoard.vue_vue_type_script_setup_true_lang-DFRhQIiG.cjs"),W=require("./useRouteTabs-Ds2QpP3I.cjs"),m=require("./useFormKeyboardNav-D4Ow3k4Y.cjs"),w=require("./labels-pNskxXcl.cjs"),y=require("./routeTabs--y12evp8.cjs");function C(e,a,r){const n=e;return Array.isArray(n.results)?{data:n.results,page:n.page??a,page_size:n.page_size??r,rows:n.count??0,extras:n.extras??{}}:Array.isArray(n.data)?{data:n.data,page:n.page??a,page_size:n.page_size??r,rows:n.rows??0,extras:n.extras??{}}:{data:Array.isArray(e)?e:[],page:a,page_size:r,rows:Array.isArray(e)?e.length:0,extras:{}}}function T(e){return{async list(a,r={}){const n=await e.get(a,{params:r});return C(n.data,Number(r.page??1),Number(r.page_size??20))},async get(a,r,n){return{data:(await e.get(`${a}${r}/`,n)).data}},async create(a,r,n){return{data:(await e.post(a,r,n)).data}},async update(a,r,n,s){return{data:(await e.patch(`${a}${r}/`,n,s)).data}},async delete(a,r){await e.delete(`${a}${r}/`)}}}const S={install(e,a){if(!(a!=null&&a.axios)&&!(a!=null&&a.dataProvider))throw new Error('[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.');const r=a.dataProvider??T(a.axios),n={axios:a.axios,dataProvider:r,defaultPageSize:a.defaultPageSize??20,dateFormat:a.dateFormat??"DD/MM/YYYY",dateTimeFormat:a.dateTimeFormat??"DD/MM/YYYY HH:mm",locale:a.locale??"pt-BR",currency:a.currency??"BRL"};a.axios&&e.provide(_.W_AXIOS_KEY,a.axios),e.provide(_.W_DATA_PROVIDER_KEY,r),e.provide(_.W_CONFIG_KEY,n),a.registerComponents!==!1&&(e.component("WCrudView",t._sfc_main$6),e.component("WCrudFormDialog",t._sfc_main$4),e.component("WCrudColumnRenderer",t._sfc_main$3),e.component("WAutoCompleteFK",t._sfc_main$1),e.component("WMoneyInput",t._sfc_main$23),e.component("WTransferList",t._sfc_main$33),e.component("WTreeSelect",t._sfc_main$34))}};function D(e){return e.split("?")[0].replace(/^\/+|\/+$/g,"").replace(/^api\/v\d+\//,"")}function F(e){return typeof e=="string"?{table:e}:e}function b(e,a=400){return{response:{status:a,data:{detail:e}},message:e}}function A(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 p(e){throw{response:{data:{detail:(e==null?void 0:e.message)??"Erro ao consultar Supabase",code:e==null?void 0:e.code,details:e==null?void 0:e.details,hint:e==null?void 0:e.hint}},message:(e==null?void 0:e.message)??"Erro ao consultar Supabase"}}function g(e,a){var s,i;const r=D(e),n=(s=a.resources)==null?void 0:s[r];if(n)return F(n);if((i=a.allowedTables)!=null&&i.includes(r))return{table:r};throw b(`Recurso Supabase nao registrado para o endpoint "${e}".`,404)}function v(e,a,r){const n=new Set(["page","page_size","search","ordering"]),s={...r.defaultFilters,...a};for(const[i,o]of Object.entries(s))n.has(i)||o===null||o===void 0||o===""||(e=e.eq(i,o));return e}function E(e,a,r){if(typeof a!="string"||!a.trim()||!(r!=null&&r.length))return e;const n=a.trim().replace(/,/g,"\\,"),s=r.map(i=>`${i}.ilike.%${n}%`).join(",");return e.or(s)}function P(e,a){const r=typeof e=="string"&&e?e:a;return r?{field:r.startsWith("-")?r.slice(1):r,ascending:!r.startsWith("-")}:null}function R(e,a){return e?a.mapListItem?e.map(r=>{var n;return(n=a.mapListItem)==null?void 0:n.call(a,r)}):e:[]}function K(e){const a=e.defaultSelect??"*";return{async list(r,n={}){var $;const s=g(r,e),i=Math.max(Number(n.page??1),1),o=Math.max(Number(n.page_size??20),1),c=(i-1)*o,l=c+o-1;let u=e.client.from(s.table).select(s.select??a,{count:"exact"});u=v(u,n,s),u=E(u,n.search,s.searchFields);const d=P(n.ordering,s.defaultOrdering);d&&(u=u.order(d.field,{ascending:d.ascending}));const f=await u.range(c,l);return f.error&&p(f.error),{data:R(f.data,s),page:i,page_size:o,rows:f.count??(($=f.data)==null?void 0:$.length)??0,extras:{}}},async get(r,n,s){const i=g(r,e),o=i.pk??"id",c=await e.client.from(i.table).select(i.select??a).eq(o,n).single();return c.error&&p(c.error),{data:c.data}},async create(r,n,s){const i=g(r,e),o=A(n),c=i.mapPayload?i.mapPayload(o,"create"):o,l=await e.client.from(i.table).insert(c).select(i.select??a).single();return l.error&&p(l.error),{data:l.data}},async update(r,n,s,i){const o=g(r,e),c=o.pk??"id",l=A(s),u=o.mapPayload?o.mapPayload(l,"update"):l,d=await e.client.from(o.table).update(u).eq(c,n).select(o.select??a).single();return d.error&&p(d.error),{data:d.data}},async delete(r,n){const s=g(r,e),i=s.pk??"id",o=s.softDelete===!0?{is_active:!1}:typeof s.softDelete=="object"?s.softDelete:null,c=o?await e.client.from(s.table).update(o).eq(i,n):await e.client.from(s.table).delete().eq(i,n);c.error&&p(c.error)}}}exports.W_AXIOS_KEY=_.W_AXIOS_KEY;exports.W_CONFIG_KEY=_.W_CONFIG_KEY;exports.W_DATA_PROVIDER_KEY=_.W_DATA_PROVIDER_KEY;exports.WActionBar=t._sfc_main;exports.WAutoCompleteFK=t._sfc_main$1;exports.WCheckList=t._sfc_main$2;exports.WCrudColumnRenderer=t._sfc_main$3;exports.WCrudFormDialog=t._sfc_main$4;exports.WCrudSubview=t._sfc_main$5;exports.WCrudView=t._sfc_main$6;exports.WDatePicker=t._sfc_main$7;exports.WDateRange=t._sfc_main$8;exports.WDetailHeader=t._sfc_main$9;exports.WEditableTable=t._sfc_main$10;exports.WEmptyState=t._sfc_main$11;exports.WFileUpload=t._sfc_main$12;exports.WFormRenderer=t._sfc_main$13;exports.WFormSection=t._sfc_main$14;exports.WImageCropper=t.WImageCropper;exports.WInfoCard=t._sfc_main$15;exports.WKanbanBoard=t._sfc_main$16;exports.WKpiCard=t._sfc_main$17;exports.WKpiGrid=t._sfc_main$18;exports.WMapSelect=t._sfc_main$19;exports.WMarkdownEditor=t._sfc_main$20;exports.WMarkdownToc=t._sfc_main$21;exports.WMarkdownView=t._sfc_main$22;exports.WMoneyInput=t._sfc_main$23;exports.WPageHeader=t._sfc_main$24;exports.WProgressFlow=t._sfc_main$25;exports.WSectionHeader=t._sfc_main$26;exports.WStatusTag=t._sfc_main$27;exports.WStepFlow=t._sfc_main$28;exports.WStepSection=t._sfc_main$29;exports.WTabBar=t._sfc_main$30;exports.WTabNav=t._sfc_main$31;exports.WTabViewport=t._sfc_main$32;exports.WTransferList=t._sfc_main$33;exports.WTreeSelect=t._sfc_main$34;exports.W_STEP_FLOW_KEY=t.W_STEP_FLOW_KEY;exports.downloadCsv=t.downloadCsv;exports.mapApiFieldToColumnDef=t.mapApiFieldToColumnDef;exports.mapApiFieldToFieldDef=t.mapApiFieldToFieldDef;exports.mapApiFieldsToColumnDefs=t.mapApiFieldsToColumnDefs;exports.mapApiFieldsToFieldDefs=t.mapApiFieldsToFieldDefs;exports.toCsv=t.toCsv;exports.useApi=W.useApi;exports.useCrudManager=W.useCrudManager;exports.useRouteTabs=W.useRouteTabs;exports.useSubviewCrud=W.useSubviewCrud;exports.extractApiError=m.extractApiError;exports.useApiError=m.useApiError;exports.useAppConfirm=m.useAppConfirm;exports.useAppToast=m.useAppToast;exports.useDateInput=m.useDateInput;exports.useFormatters=m.useFormatters;exports.DEFAULT_CRUD_LABELS=w.DEFAULT_CRUD_LABELS;exports.W_TAB_HOST_KEY=y.W_TAB_HOST_KEY;exports.useTabHost=y.useTabHost;exports.WPrimeVuePlugin=S;exports.createAxiosDataProvider=T;exports.createSupabaseDataProvider=K;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/data-providers/axiosDataProvider.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 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'\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.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"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","WTreeSelect","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/data-providers/axiosDataProvider.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 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'\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.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"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","WTreeSelect","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  export { WPrimeVuePlugin } from './plugin';
2
- export { WCrudView, WCrudFormDialog, WCrudColumnRenderer, WEditableTable, WCrudSubview, WAutoCompleteFK, WFormRenderer, WDatePicker, WDateRange, WFileUpload, WImageCropper, WMoneyInput, WTransferList, WTreeSelect, WStatusTag, WPageHeader, WDetailHeader, WEmptyState, WInfoCard, WKpiCard, WKpiGrid, WSectionHeader, WFormSection, WActionBar, WProgressFlow, WStepFlow, WStepSection, WCheckList, WMapSelect, WMarkdownView, WMarkdownEditor, WMarkdownToc, WTabBar, WKanbanBoard, } from './components';
3
- export { useCrudManager, useSubviewCrud, useApi, useAppToast, useAppConfirm, useApiError, extractApiError, useFormatters, useDateInput, } from './composables';
2
+ export { WCrudView, WCrudFormDialog, WCrudColumnRenderer, WEditableTable, WCrudSubview, WAutoCompleteFK, WFormRenderer, WDatePicker, WDateRange, WFileUpload, WImageCropper, WMoneyInput, WTransferList, WTreeSelect, WStatusTag, WPageHeader, WDetailHeader, WEmptyState, WInfoCard, WKpiCard, WKpiGrid, WSectionHeader, WFormSection, WActionBar, WProgressFlow, WStepFlow, WStepSection, WCheckList, WMapSelect, WMarkdownView, WMarkdownEditor, WMarkdownToc, WTabBar, WTabNav, WTabViewport, WKanbanBoard, } from './components';
3
+ export { useCrudManager, useSubviewCrud, useApi, useAppToast, useAppConfirm, useApiError, extractApiError, useFormatters, useDateInput, useRouteTabs, } from './composables';
4
4
  export type { DateValueFormat } from './composables';
5
5
  export { createAxiosDataProvider, createSupabaseDataProvider } from './data-providers';
6
- export type { PaginatedResponse, PaginationState, SortState, UseApiOptions, UseApiReturn, ColumnDef, ColumnType, FieldDef, FieldType, SelectOption, EditableColumnDef, EditableColumnEditor, EditableRow, CheckListItem, CheckListLevel, KanbanColumn, KanbanMoveEvent, MapSelectFeature, MapSelectGeometry, MapSelectId, MapSelectPolygonStyle, MapSelectPosition, RowAction, CrudLabels, KpiItem, CrudManagerConfig, CrudManagerReturn, SubviewCrudConfig, SubviewCrudReturn, WPluginOptions, WPluginConfig, DataProvider, DataProviderListParams, DataProviderListResponse, DataProviderRequestConfig, DataProviderResponse, } from './types';
6
+ export type { PaginatedResponse, PaginationState, SortState, UseApiOptions, UseApiReturn, ColumnDef, ColumnType, 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, 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, StepFlowOrientation } from './utils/stepFlow';
10
10
  export { W_STEP_FLOW_KEY } from './utils/stepFlow';
11
11
  export type { CreateSupabaseDataProviderOptions, SupabaseDataProviderClient, SupabaseResourceConfig, } from './data-providers';
12
- export { DEFAULT_CRUD_LABELS, W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types';
12
+ export { DEFAULT_CRUD_LABELS, W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY, W_TAB_HOST_KEY, useTabHost, } from './types';
13
13
  export type { ApiFieldMeta } from './utils/fieldMapper';
14
14
  export { mapApiFieldToFieldDef, mapApiFieldsToFieldDefs, mapApiFieldToColumnDef, mapApiFieldsToColumnDefs, } from './utils/fieldMapper';
15
15
  export type { ToCsvOptions } from './utils/csv';