@archbase/admin 4.0.19 → 4.0.20
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/ArchbaseNavigationProgress.d.ts +1 -0
- package/dist/ArchbaseStatefulRoutes.d.ts +23 -0
- package/dist/archbase-admin-4.0.20.tgz +0 -0
- package/dist/components/TabStoreProvider.d.ts +23 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/useArchbaseAdminStore.d.ts +15 -0
- package/dist/hooks/useArchbaseGridState.d.ts +79 -0
- package/dist/hooks/useArchbasePersistedState.d.ts +61 -0
- package/dist/hooks/useArchbaseState.d.ts +42 -0
- package/dist/hooks/useArchbaseTreeState.d.ts +81 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +2649 -2205
- package/dist/state/createTabStore.d.ts +59 -0
- package/dist/state/index.d.ts +4 -0
- package/dist/state/tabRegistryStore.d.ts +53 -0
- package/package.json +7 -7
- package/dist/archbase-admin-4.0.19.tgz +0 -0
|
@@ -2,6 +2,7 @@ import { default as React } from 'react';
|
|
|
2
2
|
interface NavigationProgressContextValue {
|
|
3
3
|
start: () => void;
|
|
4
4
|
done: () => void;
|
|
5
|
+
isNavigating: boolean;
|
|
5
6
|
}
|
|
6
7
|
export declare const useNavigationProgress: () => NavigationProgressContextValue;
|
|
7
8
|
export declare function NavigationProgressProvider({ children }: {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface StatefulRouteProps {
|
|
3
|
+
path: string;
|
|
4
|
+
element: React.ReactElement;
|
|
5
|
+
}
|
|
6
|
+
export interface ArchbaseStatefulRoutesProps {
|
|
7
|
+
/** Lista de rotas a serem renderizadas com estado persistente */
|
|
8
|
+
routes: StatefulRouteProps[];
|
|
9
|
+
/** Elemento de fallback para rotas nao encontradas */
|
|
10
|
+
fallback?: React.ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Funcao para gerar ID unico da tab a partir do pathname e search.
|
|
13
|
+
* Por padrao usa pathname + search.
|
|
14
|
+
*/
|
|
15
|
+
getTabId?: (pathname: string, search: string) => string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Componente que renderiza rotas com estado persistente por tab.
|
|
19
|
+
* Cada rota recebe um TabStoreProvider que gerencia seu estado local.
|
|
20
|
+
* Quando o usuario troca de tab, o estado e salvo no TabRegistryStore.
|
|
21
|
+
* Quando retorna a tab, o estado e restaurado automaticamente.
|
|
22
|
+
*/
|
|
23
|
+
export declare const ArchbaseStatefulRoutes: React.FC<ArchbaseStatefulRoutesProps>;
|
|
Binary file
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { TabStore, TabLocalState } from '../state/createTabStore';
|
|
3
|
+
export interface TabStoreProviderProps {
|
|
4
|
+
tabId: string;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare const TabStoreProvider: React.FC<TabStoreProviderProps>;
|
|
8
|
+
/**
|
|
9
|
+
* Hook para acessar o store local da tab com um selector
|
|
10
|
+
* @param selector Funcao que seleciona parte do estado
|
|
11
|
+
* @returns O valor selecionado do estado
|
|
12
|
+
*/
|
|
13
|
+
export declare function useTabStore<T>(selector: (state: TabLocalState) => T): T;
|
|
14
|
+
/**
|
|
15
|
+
* Hook para acessar o store completo (para casos avancados)
|
|
16
|
+
* @returns A instancia do store da tab
|
|
17
|
+
*/
|
|
18
|
+
export declare function useTabStoreApi(): TabStore;
|
|
19
|
+
/**
|
|
20
|
+
* Hook opcional que retorna o store se disponivel, ou null caso contrario
|
|
21
|
+
* Util para componentes que podem ou nao estar dentro de um TabStoreProvider
|
|
22
|
+
*/
|
|
23
|
+
export declare function useTabStoreOptional(): TabStore | null;
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1 +1,9 @@
|
|
|
1
1
|
export * from './useArchbaseAdminStore';
|
|
2
|
+
export { useArchbaseState, useArchbaseStateNamed } from './useArchbaseState';
|
|
3
|
+
export { useArchbaseGridState } from './useArchbaseGridState';
|
|
4
|
+
export type { ArchbaseGridPersistedState } from './useArchbaseGridState';
|
|
5
|
+
export { useArchbaseTreeState, useArchbaseAccordionState } from './useArchbaseTreeState';
|
|
6
|
+
export type { ArchbaseTreePersistedState } from './useArchbaseTreeState';
|
|
7
|
+
export { useArchbaseScrollRestore, // Persistir scroll automaticamente
|
|
8
|
+
useArchbaseTabActive, // Detectar quando tab fica ativa
|
|
9
|
+
useArchbaseDrawerState, } from './useArchbasePersistedState';
|
|
@@ -8,4 +8,19 @@ export interface AdminState {
|
|
|
8
8
|
setActiveTabId: (activeTabId: any) => void;
|
|
9
9
|
setCollapsed: (collapsed: boolean) => void;
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* @deprecated Use `useTabRegistryStore` de `state/tabRegistryStore` para gerenciar
|
|
13
|
+
* estado de tabs com persistencia. Este store sera removido em versoes futuras.
|
|
14
|
+
*
|
|
15
|
+
* Migracao:
|
|
16
|
+
* ```tsx
|
|
17
|
+
* // Antes
|
|
18
|
+
* const { activeTabId, setActiveTabId } = useArchbaseAdminStore();
|
|
19
|
+
*
|
|
20
|
+
* // Depois
|
|
21
|
+
* import { useTabRegistryStore } from '@archbase/admin';
|
|
22
|
+
* const activeTabId = useTabRegistryStore((s) => s.activeTabId);
|
|
23
|
+
* const setActiveTab = useTabRegistryStore((s) => s.setActiveTab);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
11
26
|
export declare const useArchbaseAdminStore: import('zustand').UseBoundStore<import('zustand').StoreApi<AdminState>>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado completo de um DataGrid que deve persistir.
|
|
3
|
+
*/
|
|
4
|
+
export interface ArchbaseGridPersistedState {
|
|
5
|
+
/** Pagina atual (0-indexed) */
|
|
6
|
+
page: number;
|
|
7
|
+
/** Registros por pagina */
|
|
8
|
+
pageSize: number;
|
|
9
|
+
/** Modelo de ordenacao */
|
|
10
|
+
sortModel: Array<{
|
|
11
|
+
field: string;
|
|
12
|
+
sort: 'asc' | 'desc';
|
|
13
|
+
}>;
|
|
14
|
+
/** Modelo de filtros por coluna */
|
|
15
|
+
filterModel: Record<string, any>;
|
|
16
|
+
/** IDs das linhas selecionadas/marcadas */
|
|
17
|
+
selectedRowIds: string[];
|
|
18
|
+
/** Larguras das colunas (colId -> width) */
|
|
19
|
+
columnWidths: Record<string, number>;
|
|
20
|
+
/** Ordem das colunas (array de colIds) */
|
|
21
|
+
columnOrder: string[];
|
|
22
|
+
/** Colunas ocultas (array de colIds) */
|
|
23
|
+
hiddenColumns: string[];
|
|
24
|
+
/** IDs das linhas expandidas (master-detail) */
|
|
25
|
+
expandedRowIds: string[];
|
|
26
|
+
/** Posicao do scroll */
|
|
27
|
+
scrollPosition: {
|
|
28
|
+
top: number;
|
|
29
|
+
left: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Hook para persistir estado completo de um DataGrid.
|
|
34
|
+
* Pode ser usado diretamente ou integrado em componentes de Grid.
|
|
35
|
+
*
|
|
36
|
+
* @param gridId Identificador unico do grid na tela
|
|
37
|
+
* @param initialState Estado inicial customizado (opcional)
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* // Uso direto
|
|
42
|
+
* const grid = useArchbaseGridState('customersGrid');
|
|
43
|
+
*
|
|
44
|
+
* <ArchbaseDataGridAG
|
|
45
|
+
* pageIndex={grid.state.page}
|
|
46
|
+
* pageSize={grid.state.pageSize}
|
|
47
|
+
* sortModel={grid.state.sortModel}
|
|
48
|
+
* onPaginationChange={(page, pageSize) => grid.update({ page, pageSize })}
|
|
49
|
+
* onSortModelChange={(sortModel) => grid.update({ sortModel })}
|
|
50
|
+
* onSelectionChange={(ids) => grid.update({ selectedRowIds: ids })}
|
|
51
|
+
* />
|
|
52
|
+
*
|
|
53
|
+
* // Ou o componente pode aceitar stateKey e fazer isso internamente
|
|
54
|
+
* <ArchbaseDataGridAG stateKey="customersGrid" />
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function useArchbaseGridState(gridId: string, initialState?: Partial<ArchbaseGridPersistedState>): {
|
|
58
|
+
/** Estado completo do grid */
|
|
59
|
+
state: ArchbaseGridPersistedState;
|
|
60
|
+
/** Atualizar multiplos campos */
|
|
61
|
+
update: (partial: Partial<ArchbaseGridPersistedState>) => void;
|
|
62
|
+
/** Resetar para estado inicial */
|
|
63
|
+
reset: () => void;
|
|
64
|
+
setPage: (page: number) => void;
|
|
65
|
+
setPageSize: (pageSize: number) => void;
|
|
66
|
+
setSortModel: (sortModel: ArchbaseGridPersistedState["sortModel"]) => void;
|
|
67
|
+
setFilterModel: (filterModel: ArchbaseGridPersistedState["filterModel"]) => void;
|
|
68
|
+
setSelectedRowIds: (selectedRowIds: string[]) => void;
|
|
69
|
+
toggleRowSelection: (rowId: string) => void;
|
|
70
|
+
selectAllRows: (rowIds: string[]) => void;
|
|
71
|
+
clearSelection: () => void;
|
|
72
|
+
isRowSelected: (rowId: string) => boolean;
|
|
73
|
+
/** Quantidade de linhas selecionadas */
|
|
74
|
+
selectedCount: number;
|
|
75
|
+
/** Se tem alguma linha selecionada */
|
|
76
|
+
hasSelection: boolean;
|
|
77
|
+
toggleRowExpansion: (rowId: string) => void;
|
|
78
|
+
isRowExpanded: (rowId: string) => boolean;
|
|
79
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Hook para persistir scroll automaticamente.
|
|
4
|
+
* Basta passar a ref - restaura e salva automaticamente.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* const scrollRef = useRef<HTMLDivElement>(null);
|
|
9
|
+
* useArchbaseScrollRestore(scrollRef);
|
|
10
|
+
*
|
|
11
|
+
* return <div ref={scrollRef} style={{ overflow: 'auto' }}>...</div>;
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function useArchbaseScrollRestore(containerRef: RefObject<HTMLElement | null>, options?: {
|
|
15
|
+
debounceMs?: number;
|
|
16
|
+
}): void;
|
|
17
|
+
/**
|
|
18
|
+
* Hook para detectar quando a tab fica ativa (visivel).
|
|
19
|
+
* Retorna boolean e opcionalmente executa callback.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* // Simples - so detecta
|
|
24
|
+
* const isActive = useArchbaseTabActive();
|
|
25
|
+
*
|
|
26
|
+
* // Com callback - refresh quando ativar
|
|
27
|
+
* const isActive = useArchbaseTabActive(() => {
|
|
28
|
+
* dataSource.refreshData();
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // Condicional
|
|
32
|
+
* if (isActive) {
|
|
33
|
+
* // Tab esta visivel
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function useArchbaseTabActive(onActivate?: () => void): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Hook para estado de modal/drawer com dado associado.
|
|
40
|
+
* Persiste entre trocas de tab.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* const drawer = useArchbaseDrawerState<VisitaDTO>('detalhes');
|
|
45
|
+
*
|
|
46
|
+
* // Abrir com dados
|
|
47
|
+
* <Button onClick={() => drawer.open(visitaSelecionada)}>Ver</Button>
|
|
48
|
+
*
|
|
49
|
+
* // No drawer
|
|
50
|
+
* <Drawer opened={drawer.isOpen} onClose={drawer.close}>
|
|
51
|
+
* {drawer.data && <Detalhes visita={drawer.data} />}
|
|
52
|
+
* </Drawer>
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function useArchbaseDrawerState<T = any>(key: string): {
|
|
56
|
+
isOpen: boolean;
|
|
57
|
+
data: T;
|
|
58
|
+
open: (itemData?: T) => void;
|
|
59
|
+
close: () => void;
|
|
60
|
+
closeAndClear: () => void;
|
|
61
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drop-in replacement para useState que persiste entre trocas de tab.
|
|
3
|
+
*
|
|
4
|
+
* Funciona EXATAMENTE como useState - mesma assinatura, mesmo comportamento.
|
|
5
|
+
* A unica diferenca: o valor persiste quando o usuario troca de tab e volta.
|
|
6
|
+
*
|
|
7
|
+
* Se usado fora de um TabStoreProvider, funciona como useState normal.
|
|
8
|
+
*
|
|
9
|
+
* @param key Chave unica para identificar este estado na tab
|
|
10
|
+
* @param initialValue Valor inicial (igual useState)
|
|
11
|
+
* @returns [value, setValue] - igual useState
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* // ANTES (useState normal - perde estado ao trocar tab)
|
|
16
|
+
* const [filtro, setFiltro] = useState('');
|
|
17
|
+
* const [pagina, setPagina] = useState(0);
|
|
18
|
+
* const [aberto, setAberto] = useState(false);
|
|
19
|
+
*
|
|
20
|
+
* // DEPOIS (useArchbaseState - persiste entre tabs)
|
|
21
|
+
* const [filtro, setFiltro] = useArchbaseState('filtro', '');
|
|
22
|
+
* const [pagina, setPagina] = useArchbaseState('pagina', 0);
|
|
23
|
+
* const [aberto, setAberto] = useArchbaseState('aberto', false);
|
|
24
|
+
*
|
|
25
|
+
* // Uso identico ao useState
|
|
26
|
+
* setFiltro('novo valor');
|
|
27
|
+
* setPagina(prev => prev + 1);
|
|
28
|
+
* setAberto(true);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function useArchbaseState<T>(key: string, initialValue: T | (() => T)): [T, (value: T | ((prev: T) => T)) => void];
|
|
32
|
+
/**
|
|
33
|
+
* Versao simplificada que usa o nome da variavel como chave.
|
|
34
|
+
* Util para migracao rapida de codigo existente.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* // Cria estado com chave 'filters' automaticamente
|
|
39
|
+
* const [filters, setFilters] = useArchbaseStateAuto({ status: null, date: null });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function useArchbaseStateNamed<T>(name: string, initialValue: T): [T, React.Dispatch<React.SetStateAction<T>>];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado de TreeView/Arvore que deve persistir.
|
|
3
|
+
*/
|
|
4
|
+
export interface ArchbaseTreePersistedState {
|
|
5
|
+
/** IDs dos nos expandidos */
|
|
6
|
+
expandedNodeIds: string[];
|
|
7
|
+
/** IDs dos nos selecionados */
|
|
8
|
+
selectedNodeIds: string[];
|
|
9
|
+
/** ID do no focado */
|
|
10
|
+
focusedNodeId: string | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Hook para persistir estado de TreeView/Arvore.
|
|
14
|
+
*
|
|
15
|
+
* @param treeId Identificador unico da arvore
|
|
16
|
+
* @param initialExpanded IDs dos nos que devem iniciar expandidos
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const tree = useArchbaseTreeState('menuTree', ['root', 'config']);
|
|
21
|
+
*
|
|
22
|
+
* <TreeView
|
|
23
|
+
* expanded={tree.state.expandedNodeIds}
|
|
24
|
+
* selected={tree.state.selectedNodeIds}
|
|
25
|
+
* onNodeToggle={(nodeId) => tree.toggleExpanded(nodeId)}
|
|
26
|
+
* onNodeSelect={(nodeId) => tree.setSelected([nodeId])}
|
|
27
|
+
* />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function useArchbaseTreeState(treeId: string, initialExpanded?: string[]): {
|
|
31
|
+
state: ArchbaseTreePersistedState;
|
|
32
|
+
reset: () => void;
|
|
33
|
+
toggleExpanded: (nodeId: string) => void;
|
|
34
|
+
expand: (nodeId: string) => void;
|
|
35
|
+
collapse: (nodeId: string) => void;
|
|
36
|
+
expandAll: (allNodeIds: string[]) => void;
|
|
37
|
+
collapseAll: () => void;
|
|
38
|
+
isExpanded: (nodeId: string) => boolean;
|
|
39
|
+
setSelected: (nodeIds: string[]) => void;
|
|
40
|
+
toggleSelected: (nodeId: string) => void;
|
|
41
|
+
clearSelection: () => void;
|
|
42
|
+
isSelected: (nodeId: string) => boolean;
|
|
43
|
+
selectedCount: number;
|
|
44
|
+
hasSelection: boolean;
|
|
45
|
+
setFocused: (nodeId: string | null) => void;
|
|
46
|
+
focusedNodeId: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Hook para persistir estado de Accordion/Paineis expansiveis.
|
|
50
|
+
*
|
|
51
|
+
* @param accordionId Identificador unico
|
|
52
|
+
* @param initialExpanded IDs dos paineis que devem iniciar expandidos
|
|
53
|
+
* @param allowMultiple Se permite multiplos paineis abertos (default: true)
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```tsx
|
|
57
|
+
* const accordion = useArchbaseAccordionState('filters', ['basic']);
|
|
58
|
+
*
|
|
59
|
+
* <Accordion
|
|
60
|
+
* multiple
|
|
61
|
+
* value={accordion.expandedIds}
|
|
62
|
+
* onChange={accordion.setExpanded}
|
|
63
|
+
* >
|
|
64
|
+
* <Accordion.Item value="basic">...</Accordion.Item>
|
|
65
|
+
* <Accordion.Item value="advanced">...</Accordion.Item>
|
|
66
|
+
* </Accordion>
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare function useArchbaseAccordionState(accordionId: string, initialExpanded?: string[], allowMultiple?: boolean): {
|
|
70
|
+
/** IDs dos paineis expandidos */
|
|
71
|
+
expandedIds: string[];
|
|
72
|
+
/** Para usar direto no Accordion.value */
|
|
73
|
+
value: string | string[];
|
|
74
|
+
/** Setar expandidos (compativel com Mantine Accordion.onChange) */
|
|
75
|
+
setExpanded: (value: string | string[] | null) => void;
|
|
76
|
+
toggle: (panelId: string) => void;
|
|
77
|
+
expand: (panelId: string) => void;
|
|
78
|
+
collapse: (panelId: string) => void;
|
|
79
|
+
collapseAll: () => void;
|
|
80
|
+
isExpanded: (panelId: string) => boolean;
|
|
81
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -35,3 +35,11 @@ export { ArchbaseMyProfileModal, defaultMyProfileModalOptions } from './Archbase
|
|
|
35
35
|
export type { ArchbaseMyProfileModalProps, MyProfileModalOptions } from './ArchbaseMyProfileModal';
|
|
36
36
|
export { NavigationProgressProvider, useNavigationProgress } from './ArchbaseNavigationProgress';
|
|
37
37
|
export * from './hooks';
|
|
38
|
+
export { ArchbaseStatefulRoutes } from './ArchbaseStatefulRoutes';
|
|
39
|
+
export type { ArchbaseStatefulRoutesProps, StatefulRouteProps } from './ArchbaseStatefulRoutes';
|
|
40
|
+
export { TabStoreProvider, useTabStore, useTabStoreApi, useTabStoreOptional } from './components/TabStoreProvider';
|
|
41
|
+
export type { TabStoreProviderProps } from './components/TabStoreProvider';
|
|
42
|
+
export { useTabRegistryStore } from './state/tabRegistryStore';
|
|
43
|
+
export type { TabSnapshot, TabRegistryState } from './state/tabRegistryStore';
|
|
44
|
+
export { createTabStore } from './state/createTabStore';
|
|
45
|
+
export type { TabStore, TabLocalState, SerializedTabState, GridState } from './state/createTabStore';
|