@archbase/security-ui 4.1.1 → 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.
- package/dist/archbase-security-ui-4.2.0.tgz +0 -0
- package/dist/index.js +1620 -1109
- package/dist/securityDiagnostics/ArchbaseSecurityDiagnosticsView.d.ts +19 -1
- package/dist/securityDiagnostics/DiagnosticPrimitives.d.ts +8 -2
- package/dist/securityDiagnostics/EffectiveAccessPanel.d.ts +8 -1
- package/dist/securityDiagnostics/OverviewItemsDrawer.d.ts +18 -0
- package/dist/securityDiagnostics/SimulationPanel.d.ts +15 -1
- package/dist/securityDiagnostics/explorer/ActionNodePanel.d.ts +19 -0
- package/dist/securityDiagnostics/explorer/GroupNodePanel.d.ts +19 -0
- package/dist/securityDiagnostics/explorer/SecurityTree.d.ts +19 -0
- package/dist/securityDiagnostics/explorer/selection.d.ts +15 -0
- package/dist/securityDiagnostics/explorer/situacao.d.ts +12 -0
- package/dist/securityDiagnostics/index.d.ts +6 -0
- package/dist/securityDiagnostics/types.d.ts +44 -9
- package/package.json +6 -6
- package/dist/archbase-security-ui-4.1.1.tgz +0 -0
|
@@ -1,2 +1,20 @@
|
|
|
1
1
|
import { ArchbaseSecurityDiagnosticsViewProps } from './types';
|
|
2
|
-
|
|
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;
|
|
@@ -4,13 +4,19 @@ import { ArchbaseDiagnosticAttribute, ArchbaseDiagnosticCard, ArchbaseDiagnostic
|
|
|
4
4
|
export declare const severityColor: (severity: ArchbaseDiagnosticSeverity) => string;
|
|
5
5
|
export interface MetricCardProps {
|
|
6
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;
|
|
7
12
|
}
|
|
8
13
|
/** Cartão de métrica: valor grande, denominador, rótulo e o porquê importa. */
|
|
9
|
-
export declare const MetricCard: ({ card }: MetricCardProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare const MetricCard: ({ card, onOpen }: MetricCardProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
15
|
export interface MetricCardsProps {
|
|
11
16
|
cards: ArchbaseDiagnosticCard[];
|
|
17
|
+
onOpenCard?: (card: ArchbaseDiagnosticCard) => void;
|
|
12
18
|
}
|
|
13
|
-
export declare const MetricCards: ({ cards }: MetricCardsProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare const MetricCards: ({ cards, onOpenCard }: MetricCardsProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
20
|
export interface FlagStripProps {
|
|
15
21
|
flags: ArchbaseDiagnosticFlag[];
|
|
16
22
|
}
|
|
@@ -2,5 +2,12 @@ import { ArchbaseSecurityDiagnosticsSlots } from './types';
|
|
|
2
2
|
export interface EffectiveAccessPanelProps {
|
|
3
3
|
slots?: ArchbaseSecurityDiagnosticsSlots;
|
|
4
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;
|
|
5
12
|
}
|
|
6
|
-
export declare const EffectiveAccessPanel: ({ slots, onError }: EffectiveAccessPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
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;
|
|
@@ -2,5 +2,19 @@ import { ArchbaseSecurityDiagnosticsSlots } from './types';
|
|
|
2
2
|
export interface SimulationPanelProps {
|
|
3
3
|
slots?: ArchbaseSecurityDiagnosticsSlots;
|
|
4
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
|
+
};
|
|
5
19
|
}
|
|
6
|
-
export declare const SimulationPanel: ({ slots, onError }: SimulationPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
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;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export * from './types';
|
|
2
2
|
export * from './DiagnosticPrimitives';
|
|
3
3
|
export * from './OverviewPanel';
|
|
4
|
+
export * from './OverviewItemsDrawer';
|
|
4
5
|
export * from './EffectiveAccessPanel';
|
|
5
6
|
export * from './SimulationPanel';
|
|
6
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';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { ArchbaseAccessDecision, ArchbaseAccessOverview, ArchbaseEffectiveAccessReport, ArchbaseEffectiveCapability } from '@archbase/security';
|
|
2
|
+
import { ArchbaseAccessDecision, ArchbaseAccessOverview, ArchbaseEffectiveAccessReport, ArchbaseEffectiveCapability, ArchbaseGroupMember, ArchbaseGroupReport, ArchbaseOverviewMetric, ArchbaseReachEntry } from '@archbase/security';
|
|
3
3
|
/**
|
|
4
4
|
* Um atributo de negócio exibido no painel de identidade — rótulo e valor.
|
|
5
5
|
*
|
|
@@ -22,6 +22,14 @@ export interface ArchbaseDiagnosticCard {
|
|
|
22
22
|
of?: string;
|
|
23
23
|
label: string;
|
|
24
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;
|
|
25
33
|
}
|
|
26
34
|
/** Indicador de proteção ligada/desligada, na faixa do topo do Panorama. */
|
|
27
35
|
export interface ArchbaseDiagnosticFlag {
|
|
@@ -58,10 +66,15 @@ export interface ArchbaseSecurityDiagnosticsSlots {
|
|
|
58
66
|
/** Região livre no fim do Panorama — painel próprio, gráfico, link para relatório. */
|
|
59
67
|
afterOverview?: (overview: ArchbaseAccessOverview) => ReactNode;
|
|
60
68
|
/**
|
|
61
|
-
*
|
|
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.
|
|
62
73
|
*
|
|
63
|
-
* <p
|
|
64
|
-
*
|
|
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.
|
|
65
78
|
*/
|
|
66
79
|
renderUserSearch?: (onSelect: (userIdOrEmail: string) => void) => ReactNode;
|
|
67
80
|
/** Selos ao lado do nome — "terceirizado", "afastado", "contrato vencido". */
|
|
@@ -75,6 +88,25 @@ export interface ArchbaseSecurityDiagnosticsSlots {
|
|
|
75
88
|
header: string;
|
|
76
89
|
render: (capability: ArchbaseEffectiveCapability, report: ArchbaseEffectiveAccessReport) => ReactNode;
|
|
77
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;
|
|
78
110
|
/**
|
|
79
111
|
* Campos de negócio no formulário de simulação.
|
|
80
112
|
*
|
|
@@ -89,14 +121,17 @@ export interface ArchbaseSecurityDiagnosticsSlots {
|
|
|
89
121
|
/** Depois do veredito — a tradução do motivo técnico para a linguagem do negócio. */
|
|
90
122
|
afterDecision?: (decision: ArchbaseAccessDecision) => ReactNode;
|
|
91
123
|
}
|
|
92
|
-
/**
|
|
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
|
+
*/
|
|
93
132
|
export interface ArchbaseSecurityDiagnosticsViewProps {
|
|
94
133
|
height?: string | number;
|
|
95
134
|
width?: string | number;
|
|
96
|
-
/** Aba inicial. */
|
|
97
|
-
defaultTab?: 'overview' | 'effective' | 'simulate';
|
|
98
|
-
/** Abas a exibir. Omitido = todas. */
|
|
99
|
-
tabs?: Array<'overview' | 'effective' | 'simulate'>;
|
|
100
135
|
slots?: ArchbaseSecurityDiagnosticsSlots;
|
|
101
136
|
onError?: (message: string) => void;
|
|
102
137
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@archbase/security-ui",
|
|
3
|
-
"version": "4.
|
|
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/
|
|
44
|
-
"@archbase/
|
|
45
|
-
"@archbase/components": "4.
|
|
46
|
-
"@archbase/
|
|
47
|
-
"@archbase/security": "4.
|
|
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
|