@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.
@@ -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;
@@ -0,0 +1,2 @@
1
+ export { TabStoreProvider, useTabStore, useTabStoreApi, useTabStoreOptional } from './TabStoreProvider';
2
+ export type { TabStoreProviderProps } from './TabStoreProvider';
@@ -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';