@archbase/security-ui 4.1.0 → 4.2.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 (39) hide show
  1. package/dist/ApiTokenModal.d.ts +17 -0
  2. package/dist/ArchbaseApiTokenView.d.ts +6 -0
  3. package/dist/ArchbaseDualListSelector.d.ts +15 -0
  4. package/dist/ArchbaseSecurityView.d.ts +4 -0
  5. package/dist/GroupModal.d.ts +17 -0
  6. package/dist/PermissionsSelectorModal.d.ts +7 -0
  7. package/dist/ProfileModal.d.ts +17 -0
  8. package/dist/RenderProfileUserItem.d.ts +9 -0
  9. package/dist/UserModal.d.ts +57 -0
  10. package/dist/archbase-security-ui-4.2.0.tgz +0 -0
  11. package/dist/index.d.ts +18 -0
  12. package/dist/index.js +1721 -1247
  13. package/dist/securityDiagnostics/ArchbaseSecurityDiagnosticsView.d.ts +20 -0
  14. package/dist/securityDiagnostics/DiagnosticPrimitives.d.ts +40 -0
  15. package/dist/securityDiagnostics/EffectiveAccessPanel.d.ts +13 -0
  16. package/dist/securityDiagnostics/OverviewItemsDrawer.d.ts +18 -0
  17. package/dist/securityDiagnostics/OverviewPanel.d.ts +6 -0
  18. package/dist/securityDiagnostics/SimulationPanel.d.ts +20 -0
  19. package/dist/securityDiagnostics/explorer/ActionNodePanel.d.ts +19 -0
  20. package/dist/securityDiagnostics/explorer/GroupNodePanel.d.ts +19 -0
  21. package/dist/securityDiagnostics/explorer/SecurityTree.d.ts +19 -0
  22. package/dist/securityDiagnostics/explorer/selection.d.ts +15 -0
  23. package/dist/securityDiagnostics/explorer/situacao.d.ts +12 -0
  24. package/dist/securityDiagnostics/index.d.ts +12 -0
  25. package/dist/securityDiagnostics/types.d.ts +137 -0
  26. package/dist/securityView/SecurityGridPanel.d.ts +22 -0
  27. package/dist/securityView/SecurityRowActions.d.ts +15 -0
  28. package/dist/securityView/SecurityToolbarActions.d.ts +7 -0
  29. package/dist/securityView/UserItem.d.ts +7 -0
  30. package/dist/securityView/columns.d.ts +8 -0
  31. package/dist/securityView/index.d.ts +8 -0
  32. package/dist/securityView/noUserAvatar.d.ts +7 -0
  33. package/dist/securityView/types.d.ts +35 -0
  34. package/dist/securityView/useSecurityEntityActions.d.ts +32 -0
  35. package/package.json +6 -6
  36. package/dist/archbase-security-ui-4.1.0.tgz +0 -0
  37. package/dist/index.cjs +0 -10
  38. package/dist/index.cjs.map +0 -1
  39. package/dist/index.js.map +0 -1
@@ -0,0 +1,20 @@
1
+ import { ArchbaseSecurityDiagnosticsViewProps } from './types';
2
+ /**
3
+ * A segurança do tenant como um diretório navegável — o <b>leitor</b>.
4
+ *
5
+ * <p>Deliberadamente separada da {@link ArchbaseSecurityView}, que é o <b>editor</b>: aquela tem uma
6
+ * aba por tabela e serve para mudar o estado; esta responde perguntas e não escreve nada. Misturá-las
7
+ * produziria uma tela com dois motivos para mudar.
8
+ *
9
+ * <p><b>Por que árvore, e não abas.</b> As três abas anteriores — panorama, efetivo e simulação —
10
+ * respondiam três perguntas sem se conversarem: descobrir uma permissão inerte no panorama não
11
+ * levava a lugar nenhum, e simular exigia digitar de cabeça o nome do recurso. Uma árvore de
12
+ * objetos, no espírito de um AD, dá <b>uma</b> navegação: seleciona-se o objeto e se vê tudo sobre
13
+ * ele, incluindo o caminho para o próximo.
14
+ *
15
+ * <p>Panorama e Simular continuam existindo — como nós da mesma árvore, não como abas paralelas. É
16
+ * o que permite a simulação receber sujeito e capacidade por clique, em vez de digitação: <b>escolher
17
+ * substitui lembrar</b>, e errar uma letra deixa de produzir um "não pode" indistinguível de uma
18
+ * negação real.
19
+ */
20
+ export declare const ArchbaseSecurityDiagnosticsView: ({ height, width, slots, onError, }: ArchbaseSecurityDiagnosticsViewProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,40 @@
1
+ import { ReactNode } from 'react';
2
+ import { ArchbaseDiagnosticAttribute, ArchbaseDiagnosticCard, ArchbaseDiagnosticFlag, ArchbaseDiagnosticSeverity } from './types';
3
+ /** Cor semântica — separada do acento visual do tema, de propósito. */
4
+ export declare const severityColor: (severity: ArchbaseDiagnosticSeverity) => string;
5
+ export interface MetricCardProps {
6
+ card: ArchbaseDiagnosticCard;
7
+ /**
8
+ * Abre o detalhe do card. Ausente quando a métrica não tem lista por trás — e aí o cartão não
9
+ * fica clicável, para não prometer uma navegação que não existe.
10
+ */
11
+ onOpen?: (card: ArchbaseDiagnosticCard) => void;
12
+ }
13
+ /** Cartão de métrica: valor grande, denominador, rótulo e o porquê importa. */
14
+ export declare const MetricCard: ({ card, onOpen }: MetricCardProps) => import("react/jsx-runtime").JSX.Element;
15
+ export interface MetricCardsProps {
16
+ cards: ArchbaseDiagnosticCard[];
17
+ onOpenCard?: (card: ArchbaseDiagnosticCard) => void;
18
+ }
19
+ export declare const MetricCards: ({ cards, onOpenCard }: MetricCardsProps) => import("react/jsx-runtime").JSX.Element;
20
+ export interface FlagStripProps {
21
+ flags: ArchbaseDiagnosticFlag[];
22
+ }
23
+ /**
24
+ * Faixa de proteções.
25
+ *
26
+ * <p>Vem antes dos números na tela porque contagem alta de permissões não significa nada se o
27
+ * portão correspondente está inerte — e essa é a pergunta que o operador não sabe fazer.
28
+ */
29
+ export declare const FlagStrip: ({ flags }: FlagStripProps) => import("react/jsx-runtime").JSX.Element;
30
+ export interface AttributeListProps {
31
+ attributes: ArchbaseDiagnosticAttribute[];
32
+ }
33
+ /** Lista rótulo/valor — o layout onde entram perfil, grupos, nível e os atributos de negócio. */
34
+ export declare const AttributeList: ({ attributes }: AttributeListProps) => import("react/jsx-runtime").JSX.Element;
35
+ export interface SectionProps {
36
+ title: string;
37
+ hint?: string;
38
+ children: ReactNode;
39
+ }
40
+ export declare const Section: ({ title, hint, children }: SectionProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import { ArchbaseSecurityDiagnosticsSlots } from './types';
2
+ export interface EffectiveAccessPanelProps {
3
+ slots?: ArchbaseSecurityDiagnosticsSlots;
4
+ onError?: (message: string) => void;
5
+ /**
6
+ * Pessoa escolhida fora do painel — na árvore do explorador.
7
+ *
8
+ * Quando presente, o painel consulta sozinho e a caixa de busca some: escolher na árvore já é a
9
+ * busca, e deixar as duas na tela faria a pessoa se perguntar qual das duas vale.
10
+ */
11
+ userId?: string;
12
+ }
13
+ export declare const EffectiveAccessPanel: ({ slots, onError, userId }: EffectiveAccessPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import { ArchbaseDiagnosticCard } from './types';
2
+ export interface OverviewItemsDrawerProps {
3
+ /** O cartão clicado. `null` mantém o painel fechado. */
4
+ card: ArchbaseDiagnosticCard | null;
5
+ onClose: () => void;
6
+ }
7
+ /**
8
+ * A lista por trás de um número do Panorama.
9
+ *
10
+ * <p>Um cartão diz "29 ações inativas". Sozinho, isso informa que existe um problema e não permite
11
+ * fazer nada a respeito — para agir é preciso saber <b>quais</b> são, e por quê. Este painel é o que
12
+ * transforma o Panorama de tela de leitura em ponto de partida de trabalho.
13
+ *
14
+ * <p>É um só para as seis métricas, e não seis listas: o backend devolve a mesma forma
15
+ * ({@code label} / {@code detail} / {@code reason}) para permissões, usuários, ações e recursos.
16
+ * Seis telas divergiriam com o tempo; esta acompanha qualquer métrica nova sem alteração.
17
+ */
18
+ export declare const OverviewItemsDrawer: ({ card, onClose }: OverviewItemsDrawerProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { ArchbaseSecurityDiagnosticsSlots } from './types';
2
+ export interface OverviewPanelProps {
3
+ slots?: ArchbaseSecurityDiagnosticsSlots;
4
+ onError?: (message: string) => void;
5
+ }
6
+ export declare const OverviewPanel: ({ slots, onError }: OverviewPanelProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,20 @@
1
+ import { ArchbaseSecurityDiagnosticsSlots } from './types';
2
+ export interface SimulationPanelProps {
3
+ slots?: ArchbaseSecurityDiagnosticsSlots;
4
+ onError?: (message: string) => void;
5
+ /**
6
+ * Sujeito e capacidade escolhidos na árvore.
7
+ *
8
+ * <p><b>Escolher substitui lembrar.</b> Digitar {@code tms.ordemservico} de cabeça é a origem do
9
+ * falso negativo: errar uma letra devolve "não pode", indistinguível de uma negação real. Com a
10
+ * escolha vinda da árvore, a resposta passa a significar o que diz.
11
+ *
12
+ * <p>Os campos continuam editáveis — a árvore preenche, não tranca.
13
+ */
14
+ initial?: {
15
+ userId?: string;
16
+ resource?: string;
17
+ action?: string;
18
+ };
19
+ }
20
+ export declare const SimulationPanel: ({ slots, onError, initial }: SimulationPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { ArchbaseSecurityDiagnosticsSlots } from '../types';
2
+ export interface ActionNodePanelProps {
3
+ id: string;
4
+ label: string;
5
+ slots?: ArchbaseSecurityDiagnosticsSlots;
6
+ onSelectUser?: (userId: string, label: string) => void;
7
+ onSimulate?: () => void;
8
+ }
9
+ /**
10
+ * Quem alcança esta capacidade — a consulta reversa.
11
+ *
12
+ * <p><b>A pergunta que antes não tinha resposta.</b> "Quem consegue aprovar custo?" só se
13
+ * respondia abrindo grupo por grupo no admin e cruzando na cabeça, com resultado que dependia de
14
+ * quem cruzou.
15
+ *
16
+ * <p>Administrador aparece na lista com a via marcada. Ele alcança sem concessão nenhuma, e
17
+ * omiti-lo daria a resposta errada justamente para as contas que mais importam numa auditoria.
18
+ */
19
+ export declare const ActionNodePanel: ({ id, label, slots, onSelectUser, onSimulate }: ActionNodePanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { ArchbaseSecurityDiagnosticsSlots } from '../types';
2
+ export interface GroupNodePanelProps {
3
+ id: string;
4
+ slots?: ArchbaseSecurityDiagnosticsSlots;
5
+ /** `PROFILE` troca o endpoint e o texto; a forma da resposta é a mesma de propósito. */
6
+ kind: 'GROUP' | 'PROFILE';
7
+ onSelectUser?: (userId: string, label: string) => void;
8
+ }
9
+ /**
10
+ * O que uma via concede, e quem está nela.
11
+ *
12
+ * <p><b>Os dois juntos porque separados enganam.</b> Ver o que o grupo concede não diz o que seus
13
+ * membros podem: cada um acumula o perfil, os outros grupos e as concessões diretas. Um grupo com
14
+ * três capacidades pode ter um membro que faz tudo, por outra via — e é o total que decide o acesso.
15
+ *
16
+ * <p>Grupo e perfil compartilham este painel de propósito: para quem lê, é a mesma pergunta, muda só
17
+ * a via. Duas telas obrigariam a aprender duas coisas para uma ideia.
18
+ */
19
+ export declare const GroupNodePanel: ({ id, kind, slots, onSelectUser }: GroupNodePanelProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,19 @@
1
+ import { ExplorerSelection } from './selection';
2
+ export interface SecurityTreeProps {
3
+ selected: ExplorerSelection | null;
4
+ onSelect: (selecao: ExplorerSelection) => void;
5
+ }
6
+ /**
7
+ * A árvore de objetos de segurança.
8
+ *
9
+ * <p><b>Carrega por demanda, ramo a ramo.</b> Um tenant real tem centenas de recursos e ações;
10
+ * montar a árvore inteira numa carga obriga o servidor a materializar o catálogo para exibir cinco
11
+ * linhas, e trava o navegador ao renderizar. Cada ramo busca ao abrir, e a busca vai para o
12
+ * servidor — filtrar no cliente exigiria ter carregado tudo antes, que é o problema que a
13
+ * paginação existe para evitar.
14
+ *
15
+ * <p>O marcador colorido no nó vem do servidor e é o que leva o olho até onde há problema. Sem ele,
16
+ * achar um recurso com ação desativada entre uma centena exige abrir ramo por ramo — e ninguém faz
17
+ * isso.
18
+ */
19
+ export declare const SecurityTree: ({ selected, onSelect }: SecurityTreeProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { ArchbaseTreeNodeKind } from '@archbase/security';
2
+ /**
3
+ * O que está selecionado na árvore.
4
+ *
5
+ * <p>Os dois primeiros não são objetos do catálogo: são as duas ferramentas que antes eram abas
6
+ * próprias. Tratá-los como nós da mesma árvore é o que faz a tela ter <b>uma</b> navegação em vez
7
+ * de duas — e é o que permite a simulação receber o sujeito e a capacidade por clique, em vez de
8
+ * digitação.
9
+ */
10
+ export type ExplorerSelectionKind = ArchbaseTreeNodeKind | 'OVERVIEW' | 'SIMULATE';
11
+ export interface ExplorerSelection {
12
+ kind: ExplorerSelectionKind;
13
+ id: string;
14
+ label: string;
15
+ }
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from 'react';
2
+ /**
3
+ * A situação de uma concessão, em linguagem de quem opera.
4
+ *
5
+ * <p>O backend fala {@code EFFECTIVE}, {@code INERT} e {@code DENIED} — vocabulário do modelo. Quem
6
+ * lê a tela quer saber se a permissão <b>vale</b>. "Inerte" não é palavra que alguém use para
7
+ * decidir o que fazer; "não vale" é.
8
+ *
9
+ * <p>A tradução fica num lugar só de propósito: repetida em cada painel, uma tela acabaria dizendo
10
+ * "inerte" e outra "não vale" para a mesma coisa.
11
+ */
12
+ export declare const situacaoBadge: (situacao?: string | null) => ReactNode;
@@ -0,0 +1,12 @@
1
+ export * from './types';
2
+ export * from './DiagnosticPrimitives';
3
+ export * from './OverviewPanel';
4
+ export * from './OverviewItemsDrawer';
5
+ export * from './EffectiveAccessPanel';
6
+ export * from './SimulationPanel';
7
+ export * from './ArchbaseSecurityDiagnosticsView';
8
+ export * from './explorer/SecurityTree';
9
+ export * from './explorer/GroupNodePanel';
10
+ export * from './explorer/ActionNodePanel';
11
+ export * from './explorer/selection';
12
+ export * from './explorer/situacao';
@@ -0,0 +1,137 @@
1
+ import { ReactNode } from 'react';
2
+ import { ArchbaseAccessDecision, ArchbaseAccessOverview, ArchbaseEffectiveAccessReport, ArchbaseEffectiveCapability, ArchbaseGroupMember, ArchbaseGroupReport, ArchbaseOverviewMetric, ArchbaseReachEntry } from '@archbase/security';
3
+ /**
4
+ * Um atributo de negócio exibido no painel de identidade — rótulo e valor.
5
+ *
6
+ * <p>Existe para o caso mais comum de composição: a aplicação sabe o departamento, o centro
7
+ * de custo, a matrícula; o framework não sabe e não deveria saber. Entregando <b>dado</b> em
8
+ * vez de JSX, o atributo sai no mesmo layout de "Perfil / Grupos / Nível" — sem cada projeto
9
+ * inventar a própria formatação de rótulo.
10
+ */
11
+ export interface ArchbaseDiagnosticAttribute {
12
+ label: string;
13
+ value: ReactNode;
14
+ }
15
+ /** Severidade de um cartão ou indicador. Separada do acento visual, de propósito. */
16
+ export type ArchbaseDiagnosticSeverity = 'critical' | 'warning' | 'ok' | 'neutral';
17
+ /** Cartão de métrica no Panorama, no mesmo formato dos que o framework desenha. */
18
+ export interface ArchbaseDiagnosticCard {
19
+ severity: ArchbaseDiagnosticSeverity;
20
+ value: ReactNode;
21
+ /** Denominador ou unidade — "de 61 usuários". */
22
+ of?: string;
23
+ label: string;
24
+ description?: string;
25
+ /**
26
+ * A métrica cujos itens este cartão representa.
27
+ *
28
+ * Presente, o cartão fica clicável e abre a lista do que forma o número — que é o que permite
29
+ * agir: "29 ações inativas" não diz quais. Ausente (caso dos cartões de negócio injetados por
30
+ * slot, que o framework não sabe detalhar), o cartão continua só de leitura.
31
+ */
32
+ metric?: ArchbaseOverviewMetric;
33
+ }
34
+ /** Indicador de proteção ligada/desligada, na faixa do topo do Panorama. */
35
+ export interface ArchbaseDiagnosticFlag {
36
+ key: string;
37
+ label: string;
38
+ value: string;
39
+ severity: ArchbaseDiagnosticSeverity;
40
+ description?: string;
41
+ }
42
+ /**
43
+ * Pontos de inserção da view — os <b>slots</b>.
44
+ *
45
+ * <p><b>Três verbos, três significados.</b> A regra vale para toda a view e é o que evita que
46
+ * a extensão vire colcha de retalhos:
47
+ *
48
+ * <ul>
49
+ * <li>{@code before<X>} / {@code after<X>} — <b>insere</b> um nó antes ou depois da região
50
+ * X, que continua desenhada pelo framework. É a convenção que a
51
+ * {@code ArchbaseSecurityView} já usa em {@code beforeDefaultUserActions}.</li>
52
+ * <li>{@code additional<X>} — <b>acrescenta dado</b> a uma coleção que o framework desenha.
53
+ * A aplicação entrega o dado, não o JSX, e a coerência visual se mantém sozinha.</li>
54
+ * <li>{@code render<X>} — <b>substitui</b> a região inteira. Válvula de escape, para quando
55
+ * o que o framework desenha não serve.</li>
56
+ * </ul>
57
+ *
58
+ * <p>Prefira {@code additional} ao {@code render} sempre que couber: é o que mantém as telas
59
+ * de todos os produtos parecidas entre si.
60
+ */
61
+ export interface ArchbaseSecurityDiagnosticsSlots {
62
+ /** Indicadores de proteção da própria aplicação, ao lado dos do framework. */
63
+ additionalFlags?: (overview: ArchbaseAccessOverview) => ArchbaseDiagnosticFlag[];
64
+ /** Cartões de métrica de negócio, na mesma grade e linguagem visual. */
65
+ additionalOverviewCards?: (overview: ArchbaseAccessOverview) => ArchbaseDiagnosticCard[];
66
+ /** Região livre no fim do Panorama — painel próprio, gráfico, link para relatório. */
67
+ afterOverview?: (overview: ArchbaseAccessOverview) => ReactNode;
68
+ /**
69
+ * Uma segunda porta de entrada para chegar a uma pessoa, acima da árvore.
70
+ *
71
+ * <p>É por aqui que entra "buscar pessoa por departamento": o framework identifica alguém por id
72
+ * ou e-mail e não tem como saber o que é departamento.
73
+ *
74
+ * <p><b>Mudou de lugar, não de propósito.</b> Quando a tela era um formulário, este slot
75
+ * substituía a caixa de busca. Agora a árvore é a navegação, e o que a aplicação oferece aparece
76
+ * ao lado dela — as duas convivem, porque quem sabe o e-mail usa a árvore e quem sabe só o
77
+ * departamento usa isto.
78
+ */
79
+ renderUserSearch?: (onSelect: (userIdOrEmail: string) => void) => ReactNode;
80
+ /** Selos ao lado do nome — "terceirizado", "afastado", "contrato vencido". */
81
+ afterUserBadges?: (report: ArchbaseEffectiveAccessReport) => ReactNode;
82
+ /** Atributos de negócio no painel de identidade. O lugar dos departamentos. */
83
+ userAttributes?: (report: ArchbaseEffectiveAccessReport) => ArchbaseDiagnosticAttribute[];
84
+ /** Entre os contadores e a tabela de capacidades. */
85
+ afterEffectiveTally?: (report: ArchbaseEffectiveAccessReport) => ReactNode;
86
+ /** Colunas extras na tabela, com o cabeçalho e o conteúdo por linha. */
87
+ additionalCapabilityColumns?: Array<{
88
+ header: string;
89
+ render: (capability: ArchbaseEffectiveCapability, report: ArchbaseEffectiveAccessReport) => ReactNode;
90
+ }>;
91
+ /**
92
+ * Colunas extras na tabela de membros — o lugar do departamento, do centro de custo.
93
+ *
94
+ * <p>Mesma convenção da tabela de capacidades: a aplicação entrega cabeçalho e conteúdo por
95
+ * linha, e o framework desenha.
96
+ */
97
+ additionalMemberColumns?: Array<{
98
+ header: string;
99
+ render: (member: ArchbaseGroupMember, report: ArchbaseGroupReport) => ReactNode;
100
+ }>;
101
+ /** Região livre no fim do painel de grupo ou perfil. */
102
+ afterGroupMembers?: (report: ArchbaseGroupReport) => ReactNode;
103
+ /**
104
+ * Região livre depois da lista de quem alcança uma capacidade.
105
+ *
106
+ * <p>O lugar de um "exportar para auditoria" ou de um aviso próprio da aplicação sobre aquela
107
+ * capacidade.
108
+ */
109
+ afterReachList?: (actionId: string, entries: ArchbaseReachEntry[]) => ReactNode;
110
+ /**
111
+ * Campos de negócio no formulário de simulação.
112
+ *
113
+ * <p><b>Limite:</b> o que for coletado aqui só chega ao servidor se a aplicação mapear para
114
+ * {@code companyId} ou {@code projectId} pelo {@code onScopeChange} — o avaliador não
115
+ * conhece outra dimensão de escopo.
116
+ */
117
+ afterSimulationFields?: (onScopeChange: (scope: {
118
+ companyId?: string;
119
+ projectId?: string;
120
+ }) => void) => ReactNode;
121
+ /** Depois do veredito — a tradução do motivo técnico para a linguagem do negócio. */
122
+ afterDecision?: (decision: ArchbaseAccessDecision) => ReactNode;
123
+ }
124
+ /**
125
+ * Props da view de diagnóstico.
126
+ *
127
+ * <p>Não há mais {@code defaultTab} nem {@code tabs}: a tela deixou de ser um conjunto de abas
128
+ * paralelas e virou um explorador de árvore. Panorama e Simular continuam existindo, como nós — e
129
+ * restringir quais nós aparecem seria esconder objetos de segurança de quem está auditando, que é o
130
+ * oposto do que a tela existe para fazer.
131
+ */
132
+ export interface ArchbaseSecurityDiagnosticsViewProps {
133
+ height?: string | number;
134
+ width?: string | number;
135
+ slots?: ArchbaseSecurityDiagnosticsSlots;
136
+ onError?: (message: string) => void;
137
+ }
@@ -0,0 +1,22 @@
1
+ import { default as React, ReactNode } from 'react';
2
+ import { ArchbaseDataGridRef } from '@archbase/components';
3
+ import { IArchbaseDataSourceBase } from '@archbase/data';
4
+ export interface SecurityGridPanelProps<T extends object> {
5
+ /** Aba visível. A escondida permanece montada. */
6
+ active: boolean;
7
+ printTitle: string;
8
+ gridRef: React.MutableRefObject<ArchbaseDataGridRef | null>;
9
+ dataSource: IArchbaseDataSourceBase<T>;
10
+ isLoading: boolean;
11
+ error?: string;
12
+ getRowId: (row: T) => string;
13
+ striped?: boolean;
14
+ /** Recursos e tokens de acesso não têm ações por linha. */
15
+ enableRowActions?: boolean;
16
+ toolbarLeftContent?: ReactNode;
17
+ renderRowActions?: (row: T) => ReactNode;
18
+ actionsColumnWidth?: number;
19
+ /** As colunas, no formato declarativo do grid. */
20
+ children: ReactNode;
21
+ }
22
+ export declare function SecurityGridPanel<T extends object>({ active, printTitle, gridRef, dataSource, isLoading, error, getRowId, striped, enableRowActions, toolbarLeftContent, renderRowActions, actionsColumnWidth, children, }: SecurityGridPanelProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { ReactNode } from 'react';
2
+ import { TranslateFn } from './columns';
3
+ export interface SecurityRowActionsProps<T> {
4
+ row: T;
5
+ onView: (row: T) => void;
6
+ onEdit: (row: T) => void;
7
+ onRemove: (row: T) => void;
8
+ onEditPermissions: () => void;
9
+ /** Slot: entra antes das ações padrão. */
10
+ before?: (row: T) => ReactNode;
11
+ /** Slot: entra depois das ações padrão. */
12
+ after?: (row: T) => ReactNode;
13
+ t: TranslateFn;
14
+ }
15
+ export declare function SecurityRowActions<T>({ row, onView, onEdit, onRemove, onEditPermissions, before, after, t, }: SecurityRowActionsProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { TranslateFn } from './columns';
2
+ export interface SecurityToolbarActionsProps {
3
+ onAdd: () => void;
4
+ onEditPermissions: () => void;
5
+ t: TranslateFn;
6
+ }
7
+ export declare const SecurityToolbarActions: ({ onAdd, onEditPermissions, t }: SecurityToolbarActionsProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { ArchbaseListCustomItemProps } from '@archbase/components';
2
+ import { UserDto } from '@archbase/security';
3
+ export declare const renderGroups: (user: UserDto) => import("react/jsx-runtime").JSX.Element | null;
4
+ export declare const renderProfile: (user: UserDto) => import("react/jsx-runtime").JSX.Element | null;
5
+ export interface UserItemProps extends ArchbaseListCustomItemProps<UserDto, string> {
6
+ }
7
+ export declare const UserItem: (props: UserItemProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ /** A função de tradução do {@code useArchbaseTranslation}. */
2
+ /** Assinatura do `t` devolvido por useArchbaseTranslation. */
3
+ export type TranslateFn = (chave: string, opcoes?: any) => string | object;
4
+ export declare const buildAccessTokenColumns: (t: TranslateFn) => import("react/jsx-runtime").JSX.Element;
5
+ export declare const buildUserColumns: (t: TranslateFn) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const buildGroupColumns: (t: TranslateFn) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const buildProfileColumns: (t: TranslateFn) => import("react/jsx-runtime").JSX.Element;
8
+ export declare const buildResourceColumns: (t: TranslateFn) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ export * from './noUserAvatar';
2
+ export * from './types';
3
+ export * from './UserItem';
4
+ export * from './columns';
5
+ export * from './SecurityGridPanel';
6
+ export * from './useSecurityEntityActions';
7
+ export * from './SecurityRowActions';
8
+ export * from './SecurityToolbarActions';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Avatar exibido quando o usuário não tem imagem.
3
+ *
4
+ * Mora em arquivo próprio porque são ~2 KB de base64 no meio do código: dentro da view
5
+ * ele empurrava a lógica para baixo da dobra em qualquer editor.
6
+ */
7
+ export declare const NO_USER = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABMCAMAAAD5ogFjAAABj1BMVEUAAADMzMzLy8vAwMDLy8vLy8vLy8vMzMzKysrR0dHPz8/MzMzNzc3KysrMzMzKysrLy8vLy8vLy8vJycnR0dHMzMzPz8/Ozs7MzMxPT0/Nzc1UVFTJyclTU1PMzMzKysrMzMzJycldXV1iYmLMzMzIyMhNTU1NTU3MzMzLy8vNzc3MzMxVVVXLy8vMzMzLy8vLy8tNTU3MzMzOzs5QUFDLy8vKyspRUVFRUVHMzMxZWVlycnLLy8tUVFTJycnKyspZWVlXV1dhYWHGxsZMTExQUFBPT0/Ozs7Ly8vPz89SUlJSUlLMzMxVVVVWVlZVVVXKysptbW1bW1t6enpmZmbLy8tKSkrQ0NDOzs5FRUXNzc1NTU3S0tLU1NRHR0dSUlKzs7ORkZF4eHhPT0/Jycm9vb26urp8fHxYWFisrKylpaWdnZ11dXVubm5fX1+8vLy3t7ehoaFkZGRVVVXBwcG/v7+vr6+ZmZmUlJSNjY2GhoZzc3NcXFzGxsbDw8Ofn5+WlpaBgYGwsLCpqalqampaWRCJAAAAVXRSTlMA+YUG1M7Df1AQ8urbdWdiXjo2HQkE+/vu4qqIcV1bRDEpIRwXFO/q2ZiObWJZSiv+9uTe3cq8s6qkgX55b1pWR0YVDfvJyLCcmZWTi2lZVz82LRcUQGGNCgAAA9pJREFUWMPll2db2zAQgJ0AgUIYDSl7tZRZ6N57793akizZCSSEEJKw9yi0/eHtEwgid5IxfOX9mnvenM93J8s4tZw5391Q3/Hu0mj3lTMnllys+hi6HqBCCCIEDVwPDVddPEEqXW9qiEOoeQAlDqlpGz1eYo2VYSFsE2ELcSPY6FvTV1njUFMDdVqCff48DWGgAdhOuMtPie8JrUaWq+3I5zs76Jg+cG50e3seVxPTF6S63svT0URNn1BSqffUEhvHE/ofgn8x9aZLKJpcja/sZnO57Pp0yqbIVKv2VDUBD93amedsn0QuA1U2eazynG8BceRPnrnWAczdmAERtLoHe6IhAaJWLWaVwNLLBPxXxQskCjogZse1ICz2G+TkDKNGbAb5THELwzaXQB2bzpZ6zt0GD5acZ5bKNA4LGSorET2BDz/NLDVT0FQywGW34GT81YhYForKo4dbCHjsVMLSEJuxgWnUkMAKkTmmE7E52ExhuX2vBGDzj+lFa7AKzRHUQ1K0qheNQZETPHj3FQSKfulF0zCYlpcVpyyAlseypcOdojC6uThxdQLt94mYTpRI2WjvduyL3kqRbGxXk1A+iYJFmywRhEyCIuEZwUXqq7Hxb+M60QYOtlsaZa3BT7PazuZxisP3VkA3/MX79a8QHH5574iWtfbZ2RDRUBDVA5HPzsbvvw6LaMZraLGodu9YdEzPhsRrBCIq985FLDKpto8mKY4WD+VWQymlXWVjpydshaiuILpcEKGxjSkfLE4VwaSqIOq5aioQ40w1IMRUEUEjgrctXkaqEZFDi1lccL1fGd5s94RKRLMMJZSTHrBGcEfiMxJ3Ne5HeYhg7CX03vgsVUZGiuesLBJqSrzUcNxgFBxHMGA2gVeRAjFkFOkJmCqSebekqzeTyrDmQ182IV8NEJtQNtytc+irBn5rwUHLqMJEvSGJlitCCCr2BsVRNFzyGdklcEQcHwAZop58SRmqEt2aZ3iJpChMuyJqlPC1CQRs51RDm08RdIAAhpzD6dCpvPpjNJ2hh5NyhvCFb5DIq0F83NKd/VY2LlWkXHFXjlTTfU1qlzNLC+OTs8Tev0JElHfZQkpkaT0GNEiVWJ8oqIjm8vdQ2GR7bAFrsGphbZHYQnthC5orm8y1fOCy9Fhy2NDyANVYr3IfGB6MXOM+Rdc+GZ48venLxG8+M46g9y734bl7wTiazlZ+hKZ1xPBFb/sA99D0t/cafrnQ3sq50sJb2+FTefOz804/50DC+++MPDeOTe+XD68GeJGXA6/ff4bJ+OfHt2edj+7ff9T59Ptz47TyD0dpv5fjoIC3AAAAAElFTkSuQmCC";
@@ -0,0 +1,35 @@
1
+ import { ReactNode } from 'react';
2
+ import { ArchbaseDataSource } from '@archbase/data';
3
+ import { GroupDto, ProfileDto, UserDto } from '@archbase/security';
4
+ import { GroupModalOptions } from '../GroupModal';
5
+ import { ProfileModalOptions } from '../ProfileModal';
6
+ import { UserModalOptions } from '../UserModal';
7
+ /**
8
+ * Pontos de inserção da view — os <b>slots</b>.
9
+ *
10
+ * <p>A convenção é {@code before<Região>} / {@code after<Região>}: a aplicação devolve o
11
+ * nó a inserir e o framework decide onde ele cai. É o que permite compor informação de
12
+ * negócio (departamento, centro de custo, contrato) numa tela que o framework desenha,
13
+ * sem que o framework precise conhecer esses conceitos.
14
+ */
15
+ export interface ArchbaseSecurityProps {
16
+ beforeDefaultUserActions?: (row: UserDto) => ReactNode;
17
+ afterDefaultUserActions?: (row: UserDto) => ReactNode;
18
+ beforeDefaultProfileActions?: (row: ProfileDto) => ReactNode;
19
+ afterDefaultProfileActions?: (row: ProfileDto) => ReactNode;
20
+ beforeDefaultGroupActions?: (row: GroupDto) => ReactNode;
21
+ afterDefaultGroupActions?: (row: GroupDto) => ReactNode;
22
+ userActionsColumnWidth?: number;
23
+ profileActionsColumnWidth?: number;
24
+ groupActionsColumnWidth?: number;
25
+ }
26
+ export interface ArchbaseSecurityManagerProps {
27
+ height?: any;
28
+ width?: any;
29
+ dataSourceUsers?: ArchbaseDataSource<UserDto, string>;
30
+ createEntitiesWithId?: boolean;
31
+ userModalOptions?: UserModalOptions;
32
+ groupModalOptions?: GroupModalOptions;
33
+ profileModalOptions?: ProfileModalOptions;
34
+ options?: ArchbaseSecurityProps;
35
+ }
@@ -0,0 +1,32 @@
1
+ import { IArchbaseDataSourceBase } from '@archbase/data';
2
+ import { TranslateFn } from './columns';
3
+ export interface SecurityEntityActionsParams<T> {
4
+ dataSource: IArchbaseDataSourceBase<T>;
5
+ /** Discriminador usado para saber qual modal abrir. */
6
+ securityType: string;
7
+ /** Fábrica do registro novo — {@code UserDto.newInstance()} e afins. */
8
+ newInstance: () => T;
9
+ /** Quando falso, o id do registro novo é apagado antes de inserir. */
10
+ createEntitiesWithId: boolean;
11
+ /**
12
+ * Chave da mensagem de confirmação de remoção, já com o artigo e o substantivo:
13
+ * {@code 'archbase:Deseja remover o usuário '}. O nome do registro é concatenado.
14
+ */
15
+ removeMessageKey: string;
16
+ setOpenedModal: (valor: string) => void;
17
+ setOpenedPermissionsModal: (valor: string) => void;
18
+ validationContext?: {
19
+ clearAll: () => void;
20
+ };
21
+ t: TranslateFn;
22
+ }
23
+ export interface SecurityEntityActions<T> {
24
+ handleAdd: () => void;
25
+ handleViewRow: (row: any) => void;
26
+ handleEditRow: (row: any) => void;
27
+ handleRemoveRow: (row: any) => void;
28
+ handleSaveModal: () => Promise<void>;
29
+ handleCancelModal: () => void;
30
+ handleOpenPermissionsModal: () => void;
31
+ }
32
+ export declare function useSecurityEntityActions<T>({ dataSource, securityType, newInstance, createEntitiesWithId, removeMessageKey, setOpenedModal, setOpenedPermissionsModal, validationContext, t, }: SecurityEntityActionsParams<T>): SecurityEntityActions<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@archbase/security-ui",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "Security UI components for Archbase React - Forms, Modals, and Views",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -40,11 +40,11 @@
40
40
  "inversify-react": "^1.1.0",
41
41
  "rxjs": "^7.8.2",
42
42
  "uuid": "^9.0.1",
43
- "@archbase/core": "4.1.0",
44
- "@archbase/data": "4.1.0",
45
- "@archbase/components": "4.1.0",
46
- "@archbase/layout": "4.1.0",
47
- "@archbase/security": "4.1.0"
43
+ "@archbase/core": "4.2.0",
44
+ "@archbase/data": "4.2.0",
45
+ "@archbase/components": "4.2.0",
46
+ "@archbase/layout": "4.2.0",
47
+ "@archbase/security": "4.2.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/react": "^19.0.6",
Binary file