@studiolxd/brand 48.1.0 → 49.0.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/CHANGELOG.md +137 -0
- package/dist/_shared/untrustedtext.js +27 -26
- package/dist/_types/atoms/TypingIndicator/TypingIndicator.d.ts +29 -2
- package/dist/_types/messages/BrandMessages.d.ts +25 -1
- package/dist/_types/messages/index.d.ts +1 -1
- package/dist/_types/molecules/AssistantMessage/AssistantMessage.d.ts +15 -1
- package/dist/_types/molecules/ConversationList/ConversationList.d.ts +42 -8
- package/dist/_types/molecules/MessageComposer/MessageComposer.d.ts +24 -1
- package/dist/_types/organisms/AnnotationThread/AnnotationThread.d.ts +52 -7
- package/dist/_types/organisms/ConversationThread/ConversationThread.d.ts +26 -3
- package/dist/_types/templates/ChatShell/ChatShell.d.ts +22 -4
- package/dist/_types/templates/ConnectorAuth/ConnectorAuthShell.d.ts +6 -1
- package/dist/_types/templates/ConnectorAuth/ConnectorConsentPage.d.ts +52 -18
- package/dist/_types/templates/ConnectorAuth/ConnectorExternalSignInPage.d.ts +57 -17
- package/dist/_types/templates/ConnectorAuth/ConnectorRejectionPage.d.ts +59 -15
- package/dist/_types/templates/ConnectorAuth/ConnectorRequestSummary.d.ts +43 -12
- package/dist/_types/templates/ConnectorAuth/ConnectorSignInPage.d.ts +46 -12
- package/dist/_types/templates/ConnectorAuth/UntrustedText.d.ts +31 -4
- package/dist/annotation-thread.js +49 -46
- package/dist/assistant-message.js +12 -9
- package/dist/chat-shell.js +50 -49
- package/dist/connector-consent-page.js +58 -68
- package/dist/connector-external-sign-in-page.js +22 -28
- package/dist/connector-rejection-page.js +31 -62
- package/dist/connector-request-summary.js +22 -20
- package/dist/connector-sign-in-page.js +21 -25
- package/dist/conversation-list.js +56 -55
- package/dist/conversation-thread.js +33 -31
- package/dist/message-composer.js +38 -37
- package/dist/typing-indicator.js +12 -9
- package/package.json +1 -1
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
|
|
3
3
|
import { ConnectorRequestSummary, type ConnectorScope } from './ConnectorRequestSummary';
|
|
4
|
+
/**
|
|
5
|
+
* El cromo de la pantalla de consentimiento, y **solo el cromo**: cómo se
|
|
6
|
+
* titula y cómo se llama la salida que no concede nada.
|
|
7
|
+
*
|
|
8
|
+
* Todo lo demás de esta pantalla se queda fuera del catálogo y pasa a ser prop
|
|
9
|
+
* obligatoria, porque **afirma algo**: la frase que cuenta qué se pide
|
|
10
|
+
* (`intro`), el aviso de a dónde sale el acceso (`redirectNotice`), qué se
|
|
11
|
+
* concede (`scopeReadLabel`/`scopeWriteLabel`) y el rótulo del botón que
|
|
12
|
+
* concede (`approveLabel`). Es la misma línea que ya separa
|
|
13
|
+
* `confirmDialog.cancel` —cromo— de `ConfirmDialog.confirmLabel` —obligatoria,
|
|
14
|
+
* porque nombra la consecuencia—.
|
|
15
|
+
*/
|
|
16
|
+
export interface ConnectorConsentMessages {
|
|
17
|
+
/** Título de la pantalla. */
|
|
18
|
+
title: string;
|
|
19
|
+
/**
|
|
20
|
+
* Rótulo del botón que no concede nada. Es cromo por la misma razón que
|
|
21
|
+
* «Cancelar»: describe lo único que hace —no seguir— y no hay consecuencia
|
|
22
|
+
* que nombrar.
|
|
23
|
+
*/
|
|
24
|
+
deny: string;
|
|
25
|
+
}
|
|
4
26
|
export interface ConnectorConsentPageProps extends ConnectorAuthChromeProps {
|
|
5
27
|
/** El nombre con el que la herramienta se registró. **Dato de fuera**: ver `ConnectorRequestSummary`. */
|
|
6
28
|
clientName: string;
|
|
@@ -55,15 +77,17 @@ export interface ConnectorConsentPageProps extends ConnectorAuthChromeProps {
|
|
|
55
77
|
* abrir la página.
|
|
56
78
|
*/
|
|
57
79
|
initialFocus?: 'none' | 'deny';
|
|
58
|
-
/** Título de la pantalla.
|
|
80
|
+
/** Título de la pantalla. **Sin default**: sin él, sale de `connectorConsent.title`. */
|
|
59
81
|
title?: ReactNode;
|
|
60
82
|
/**
|
|
61
83
|
* La frase de la cabecera. Recibe las tres piezas ya compuestas —la
|
|
62
84
|
* herramienta y la cuenta en negrita, el permiso en texto corriente— porque
|
|
63
85
|
* el orden cambia con el idioma (en alemán la cuenta va antes del permiso).
|
|
64
|
-
*
|
|
86
|
+
*
|
|
87
|
+
* **Obligatoria y sin default**: es la frase que cuenta qué se está
|
|
88
|
+
* consintiendo, y el sistema de diseño no puede escribirla por el producto.
|
|
65
89
|
*/
|
|
66
|
-
intro
|
|
90
|
+
intro: (parts: {
|
|
67
91
|
client: ReactNode;
|
|
68
92
|
what: ReactNode;
|
|
69
93
|
email: ReactNode;
|
|
@@ -72,27 +96,37 @@ export interface ConnectorConsentPageProps extends ConnectorAuthChromeProps {
|
|
|
72
96
|
* El aviso de a dónde se enviará el acceso, bajo la ficha. Recibe el host ya
|
|
73
97
|
* en negrita. Va a tamaño de cuerpo, no de nota al pie: es la señal que
|
|
74
98
|
* convierte una suplantación en visible y no puede leerse como letra
|
|
75
|
-
* pequeña.
|
|
99
|
+
* pequeña.
|
|
100
|
+
*
|
|
101
|
+
* **Obligatoria y sin default**: afirma a dónde sale el acceso y qué hacer
|
|
102
|
+
* si no se reconoce el destino. Un texto de catálogo la dejaría diciendo lo
|
|
103
|
+
* mismo en todas partes sin que nada fallara.
|
|
76
104
|
*/
|
|
77
|
-
redirectNotice
|
|
105
|
+
redirectNotice: (parts: {
|
|
78
106
|
host: ReactNode;
|
|
79
107
|
}) => ReactNode;
|
|
80
|
-
/**
|
|
81
|
-
|
|
82
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Etiqueta del botón que concede.
|
|
110
|
+
*
|
|
111
|
+
* **Obligatoria y sin default, y fuera del catálogo**: es donde se toma la
|
|
112
|
+
* decisión, y tiene que nombrar la consecuencia. Mismo caso —y misma
|
|
113
|
+
* respuesta— que `ConfirmDialog.confirmLabel`.
|
|
114
|
+
*/
|
|
115
|
+
approveLabel: string;
|
|
116
|
+
/** Etiqueta del botón que deniega. **Sin default**: sin ella, sale de `connectorConsent.deny`. */
|
|
83
117
|
denyLabel?: string;
|
|
84
|
-
/** Alcance en texto, para la frase y para la ficha. Default castellano. */
|
|
85
|
-
scopeReadLabel?: string;
|
|
86
|
-
/** Ídem, lectura y escritura. Default castellano. */
|
|
87
|
-
scopeWriteLabel?: string;
|
|
88
|
-
/** Etiqueta del desplegador de un valor de fuera recortado. Default castellano: «Ver el valor completo». */
|
|
89
|
-
expandLabel?: string;
|
|
90
|
-
/** Etiqueta del desplegador abierto. Default castellano: «Ver menos». */
|
|
91
|
-
collapseLabel?: string;
|
|
92
118
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
119
|
+
* Qué se concede con `mcp:read`, para la frase y para la ficha.
|
|
120
|
+
* **Obligatoria y sin default**: ver `ConnectorRequestSummary`.
|
|
95
121
|
*/
|
|
122
|
+
scopeReadLabel: string;
|
|
123
|
+
/** Ídem, lectura y escritura. **Obligatoria y sin default**. */
|
|
124
|
+
scopeWriteLabel: string;
|
|
125
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.expand`). */
|
|
126
|
+
expandLabel?: string;
|
|
127
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.collapse`). */
|
|
128
|
+
collapseLabel?: string;
|
|
129
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.quotes`), aquí y en la ficha. */
|
|
96
130
|
valueQuotes?: [string, string];
|
|
97
131
|
/** Rótulos de la ficha. Ver `ConnectorRequestSummary`. */
|
|
98
132
|
summaryLabels?: Pick<React.ComponentProps<typeof ConnectorRequestSummary>, 'clientLabel' | 'productLabel' | 'accountLabel' | 'scopeLabel' | 'redirectLabel'>;
|
|
@@ -1,13 +1,38 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
|
|
3
|
+
/**
|
|
4
|
+
* El cromo de la pantalla del conector ajeno: el título, el rótulo del único
|
|
5
|
+
* campo y la plantilla del botón.
|
|
6
|
+
*
|
|
7
|
+
* `submit` es una **función** por la misma razón que
|
|
8
|
+
* `typingIndicator.typing(name)`: la frase tiene dos mitades que no se deciden
|
|
9
|
+
* en el mismo sitio. «Iniciar sesión con …» es cromo —el verbo y el orden son
|
|
10
|
+
* del idioma—, pero **cómo se llama la instalación** es contenido del
|
|
11
|
+
* producto y entra por `platformName`, que es obligatoria.
|
|
12
|
+
*
|
|
13
|
+
* Fuera del catálogo se quedan las dos frases que afirman algo: la que cuenta
|
|
14
|
+
* qué se está autorizando (`intro`) y la que confirma a dónde se entra
|
|
15
|
+
* (`signingInTo`).
|
|
16
|
+
*/
|
|
17
|
+
export interface ConnectorExternalSignInMessages {
|
|
18
|
+
/** Título de la pantalla. */
|
|
19
|
+
title: string;
|
|
20
|
+
/** Etiqueta del campo de organización. */
|
|
21
|
+
organization: string;
|
|
22
|
+
/** Plantilla del botón. Recibe el nombre de la instalación. */
|
|
23
|
+
submit: (platform: string) => string;
|
|
24
|
+
}
|
|
3
25
|
export interface ConnectorExternalSignInPageProps extends ConnectorAuthChromeProps {
|
|
4
26
|
/**
|
|
5
27
|
* Cómo se llama la instalación de la que es el conector, para la frase y
|
|
6
|
-
* para el botón.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
28
|
+
* para el botón.
|
|
29
|
+
*
|
|
30
|
+
* **Obligatoria y sin default**: nombra al producto —hoy «tu Moodle», que es
|
|
31
|
+
* el único conector de esta forma—, y un nombre de producto no lo pone el
|
|
32
|
+
* sistema de diseño. Es una **cadena** porque el catálogo la interpola
|
|
33
|
+
* dentro del rótulo del botón (`connectorExternalSignIn.submit`).
|
|
9
34
|
*/
|
|
10
|
-
platformName
|
|
35
|
+
platformName: string;
|
|
11
36
|
/**
|
|
12
37
|
* La organización a la que se va a entrar, **ya resuelta**: el conector vive
|
|
13
38
|
* en un subdominio y el servidor la saca del `resource` de la petición. Con
|
|
@@ -31,28 +56,43 @@ export interface ConnectorExternalSignInPageProps extends ConnectorAuthChromePro
|
|
|
31
56
|
hiddenFields?: Record<string, string>;
|
|
32
57
|
/** Un fallo del intento anterior —«no hay ninguna conexión para esa organización»—, sobre el formulario. */
|
|
33
58
|
error?: ReactNode;
|
|
34
|
-
/** Título de la pantalla.
|
|
59
|
+
/** Título de la pantalla. **Sin default**: sin él, sale de `connectorExternalSignIn.title`. */
|
|
35
60
|
title?: ReactNode;
|
|
36
|
-
/**
|
|
37
|
-
|
|
61
|
+
/**
|
|
62
|
+
* La frase de la cabecera. Recibe el nombre de la instalación.
|
|
63
|
+
*
|
|
64
|
+
* **Obligatoria y sin default**: cuenta qué se está autorizando y con qué
|
|
65
|
+
* cuenta hay que identificarse. El sistema de diseño no puede afirmarlo por
|
|
66
|
+
* el producto.
|
|
67
|
+
*/
|
|
68
|
+
intro: (parts: {
|
|
38
69
|
platform: ReactNode;
|
|
39
70
|
}) => ReactNode;
|
|
40
|
-
/**
|
|
41
|
-
|
|
71
|
+
/**
|
|
72
|
+
* La frase que confirma a dónde se entra, con `organization`.
|
|
73
|
+
*
|
|
74
|
+
* **Obligatoria y sin default**, por lo mismo que `intro`: afirma a dónde va
|
|
75
|
+
* la sesión, que es el dato que convierte una suplantación en visible.
|
|
76
|
+
*/
|
|
77
|
+
signingInTo: (parts: {
|
|
42
78
|
organization: ReactNode;
|
|
43
79
|
}) => ReactNode;
|
|
44
80
|
/**
|
|
45
|
-
*
|
|
46
|
-
* viene de la petición, así que es dato de fuera y se pinta como tal.
|
|
47
|
-
* castellano: `['«', '»']`.
|
|
81
|
+
* Reenvío puro a `UntrustedText` (`untrustedText.quotes`): la organización
|
|
82
|
+
* viene de la petición, así que es dato de fuera y se pinta como tal.
|
|
48
83
|
*/
|
|
49
84
|
valueQuotes?: [string, string];
|
|
50
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* Etiqueta del campo de organización. **Sin default**: sin ella, sale de
|
|
87
|
+
* `connectorExternalSignIn.organization`, y solo se lee cuando hay que
|
|
88
|
+
* escribir la organización.
|
|
89
|
+
*/
|
|
51
90
|
organizationLabel?: string;
|
|
52
|
-
/**
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Plantilla del rótulo de la acción, que recibe el nombre de la instalación.
|
|
93
|
+
* **Sin default**: sin ella, sale de `connectorExternalSignIn.submit`.
|
|
94
|
+
*/
|
|
95
|
+
submitLabel?: (platform: string) => string;
|
|
56
96
|
/**
|
|
57
97
|
* Debajo del formulario: lo que no es del sistema de diseño. Es la ranura
|
|
58
98
|
* donde el producto cuelga su andamio de desarrollo —pegar una clave de MCP,
|
|
@@ -5,17 +5,42 @@ import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
|
|
|
5
5
|
* autorización devuelve hoy en crudo —`invalid_client`,
|
|
6
6
|
* `invalid_redirect_uri`, `access_denied`, `invalid_request`,
|
|
7
7
|
* `login_required`—, uno por uno y con el nombre que entiende quien los lee.
|
|
8
|
+
*
|
|
9
|
+
* **Es un vocabulario, no una prop.** Desde la v49 los cuatro textos del
|
|
10
|
+
* rechazo los pasa el producto (`title`, `description`, `hint`, `retryLabel`),
|
|
11
|
+
* así que el tipo ya no elige nada dentro del componente: está aquí para que
|
|
12
|
+
* la aplicación teclee el motivo contra él al sacar del catálogo los cuatro
|
|
13
|
+
* textos, y para que la lista de motivos siga siendo una sola y esté escrita
|
|
14
|
+
* en el sistema.
|
|
8
15
|
*/
|
|
9
16
|
export type ConnectorRejectionReason = 'invalid-client' | 'invalid-redirect-uri' | 'invalid-request' | 'access-denied' | 'session-expired';
|
|
17
|
+
/**
|
|
18
|
+
* El único texto del rechazo que es cromo: el rótulo del código técnico.
|
|
19
|
+
*
|
|
20
|
+
* Los otros cuatro —qué pasó, qué se puede hacer y cómo se llama la salida—
|
|
21
|
+
* **afirman algo sobre una comprobación de seguridad** («no se ha enviado nada
|
|
22
|
+
* a ninguna parte», «si no la reconoces, no vuelvas a intentarlo») y son props
|
|
23
|
+
* obligatorias: el sistema de diseño no puede decidir qué se le cuenta a
|
|
24
|
+
* alguien sobre un acceso que no se ha concedido.
|
|
25
|
+
*/
|
|
26
|
+
export interface ConnectorRejectionMessages {
|
|
27
|
+
/** Rótulo del código técnico, bajo la explicación. */
|
|
28
|
+
code: string;
|
|
29
|
+
}
|
|
10
30
|
export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Qué ha pasado.
|
|
33
|
+
*
|
|
34
|
+
* **Obligatorio y sin default**: los cinco motivos afirman cada uno algo
|
|
35
|
+
* sobre una comprobación de seguridad —qué se ha enviado y qué no—, y eso lo
|
|
36
|
+
* escribe quien conoce el servidor de autorización, no un catálogo de cromo.
|
|
37
|
+
* El vocabulario de los cinco está en `ConnectorRejectionReason`.
|
|
38
|
+
*/
|
|
39
|
+
title: ReactNode;
|
|
40
|
+
/** La frase bajo el título. **Obligatoria y sin default**, por lo mismo. */
|
|
41
|
+
description: ReactNode;
|
|
42
|
+
/** Qué se puede hacer, en la columna de la derecha. **Obligatoria y sin default**, por lo mismo. */
|
|
43
|
+
hint: ReactNode;
|
|
19
44
|
/**
|
|
20
45
|
* El código técnico tal cual lo devuelve el servidor (`invalid_client`…),
|
|
21
46
|
* bajo la explicación. No es para quien lee la pantalla: es para que pueda
|
|
@@ -23,14 +48,25 @@ export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
|
|
|
23
48
|
* palabras. Sin él, no se pinta.
|
|
24
49
|
*/
|
|
25
50
|
code?: string;
|
|
26
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* Rótulo del código. **Sin default**: sin él, sale de
|
|
53
|
+
* `connectorRejection.code` del `BrandMessagesProvider`, y solo se lee
|
|
54
|
+
* cuando hay `code`.
|
|
55
|
+
*/
|
|
27
56
|
codeLabel?: string;
|
|
28
57
|
/** La salida, como enlace: la vuelta a la herramienta o al acceso. */
|
|
29
58
|
retryHref?: string;
|
|
30
59
|
/** La salida, en modo React (sin `retryHref`). */
|
|
31
60
|
onRetry?: () => void;
|
|
32
|
-
/**
|
|
33
|
-
|
|
61
|
+
/**
|
|
62
|
+
* Etiqueta de la salida.
|
|
63
|
+
*
|
|
64
|
+
* **Obligatoria y sin default**: nombra a dónde lleva —volver a la
|
|
65
|
+
* herramienta, volver a intentarlo, iniciar sesión—, y de los cinco motivos
|
|
66
|
+
* salen tres salidas distintas. Se pide aunque la salida se monte entera con
|
|
67
|
+
* `retryAction`: un rótulo que se traduce solo a veces acaba sin traducir.
|
|
68
|
+
*/
|
|
69
|
+
retryLabel: string;
|
|
34
70
|
/**
|
|
35
71
|
* La salida entera, ya montada, cuando no basta con un botón (el `Link` del
|
|
36
72
|
* router, dos acciones). Manda sobre `retryHref` / `onRetry`.
|
|
@@ -43,14 +79,22 @@ export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
|
|
|
43
79
|
* **Una sola plantilla para los cinco rechazos**, que hoy son cinco respuestas
|
|
44
80
|
* JSON en crudo sin ninguna pantalla detrás.
|
|
45
81
|
*
|
|
46
|
-
* Son cinco
|
|
47
|
-
*
|
|
82
|
+
* Son cinco motivos y una sola plantilla porque lo único que cambia entre
|
|
83
|
+
* ellos es el texto — y ese texto lo pasa el producto: `title`, `description`,
|
|
84
|
+
* `hint` y `retryLabel` son **obligatorias y sin default** desde la v49,
|
|
85
|
+
* porque cada una afirma algo sobre una comprobación de seguridad y eso no lo
|
|
86
|
+
* decide el sistema de diseño (ver `ConnectorRejectionMessages`). El
|
|
87
|
+
* vocabulario de los cinco sigue escrito aquí, en
|
|
88
|
+
* `ConnectorRejectionReason`, para que la aplicación teclee contra él al sacar
|
|
89
|
+
* los cuatro textos de su catálogo.
|
|
90
|
+
*
|
|
91
|
+
* La maqueta es idéntica en los cinco —la explicación a la izquierda, qué
|
|
48
92
|
* hacer y la salida a la derecha—, y sobre todo lo es la postura: **ninguna
|
|
49
93
|
* ofrece reintentar en el sitio**. Ni un botón que repita la petición ni un
|
|
50
94
|
* formulario que la arregle; la conexión se empieza donde se empezó, en la
|
|
51
95
|
* herramienta. Un rechazo de autorización que se pueda reintentar a golpes
|
|
52
96
|
* desde la propia pantalla de rechazo es un fallo de seguridad, no una
|
|
53
|
-
* comodidad, y por eso la salida
|
|
97
|
+
* comodidad, y por eso la salida se llama «volver» y no «reintentar».
|
|
54
98
|
*
|
|
55
99
|
* Los cinco se agrupan en tres causas, y el texto de cada uno lo dice sin
|
|
56
100
|
* jerga:
|
|
@@ -66,4 +110,4 @@ export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
|
|
|
66
110
|
* hecho su trabajo —y en `access-denied`, ni siquiera eso: es lo que se ha
|
|
67
111
|
* pedido—. La página lo cuenta como cuenta cualquier otra cosa.
|
|
68
112
|
*/
|
|
69
|
-
export declare function ConnectorRejectionPage({
|
|
113
|
+
export declare function ConnectorRejectionPage({ title, description, hint, code, codeLabel, retryHref, onRetry, retryLabel, retryAction, aside, header, footer, preferences, preferencesLabel, id, shell, }: ConnectorRejectionPageProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import './ConnectorRequestSummary.css';
|
|
3
|
+
/**
|
|
4
|
+
* Los cinco rótulos de la ficha. Son cromo: nombran **qué dato** va en cada
|
|
5
|
+
* fila —herramienta, producto, cuenta, permiso, destino—, que es el vocabulario
|
|
6
|
+
* cerrado de una petición de OAuth y dice lo mismo en los cinco productos de
|
|
7
|
+
* la suite.
|
|
8
|
+
*
|
|
9
|
+
* Lo que **no** está aquí es qué se concede (`scopeReadLabel`,
|
|
10
|
+
* `scopeWriteLabel`): eso afirma qué va a poder hacer la herramienta con los
|
|
11
|
+
* datos de quien lo lea, y el sistema de diseño no puede decidirlo. Son props
|
|
12
|
+
* obligatorias y sin default — ver `ConnectorRequestSummaryProps`.
|
|
13
|
+
*/
|
|
14
|
+
export interface ConnectorRequestSummaryMessages {
|
|
15
|
+
/** Rótulo de la herramienta. */
|
|
16
|
+
client: string;
|
|
17
|
+
/** Rótulo del producto. */
|
|
18
|
+
product: string;
|
|
19
|
+
/** Rótulo de la cuenta. */
|
|
20
|
+
account: string;
|
|
21
|
+
/** Rótulo del permiso. */
|
|
22
|
+
scope: string;
|
|
23
|
+
/** Rótulo del destino. */
|
|
24
|
+
redirect: string;
|
|
25
|
+
}
|
|
3
26
|
/** Qué se le concede al conector: leer, o leer y modificar. Son los dos únicos alcances que emite el servidor de autorización (`mcp:read` y `mcp:write`). */
|
|
4
27
|
export type ConnectorScope = 'read' | 'write';
|
|
5
28
|
export interface ConnectorRequestSummaryProps {
|
|
@@ -31,25 +54,33 @@ export interface ConnectorRequestSummaryProps {
|
|
|
31
54
|
* lo impone el registro.
|
|
32
55
|
*/
|
|
33
56
|
redirectHost?: ReactNode;
|
|
34
|
-
/** Rótulo de la herramienta.
|
|
57
|
+
/** Rótulo de la herramienta. **Sin default**: sin él, sale de `connectorRequestSummary.client`. */
|
|
35
58
|
clientLabel?: string;
|
|
36
|
-
/** Rótulo del producto.
|
|
59
|
+
/** Rótulo del producto. **Sin default**: `connectorRequestSummary.product`, y solo con `productName`. */
|
|
37
60
|
productLabel?: string;
|
|
38
|
-
/** Rótulo de la cuenta.
|
|
61
|
+
/** Rótulo de la cuenta. **Sin default**: `connectorRequestSummary.account`, y solo con `accountEmail`. */
|
|
39
62
|
accountLabel?: string;
|
|
40
|
-
/** Rótulo del permiso.
|
|
63
|
+
/** Rótulo del permiso. **Sin default**: `connectorRequestSummary.scope`, y solo con `scope`. */
|
|
41
64
|
scopeLabel?: string;
|
|
42
|
-
/** Rótulo del destino.
|
|
65
|
+
/** Rótulo del destino. **Sin default**: `connectorRequestSummary.redirect`, y solo con `redirectHost`. */
|
|
43
66
|
redirectLabel?: string;
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Qué se concede con `mcp:read`, en texto.
|
|
69
|
+
*
|
|
70
|
+
* **Obligatoria y sin default, y fuera del catálogo**: es una afirmación
|
|
71
|
+
* sobre lo que la herramienta va a poder hacer con los datos de quien lee la
|
|
72
|
+
* pantalla, y eso lo sabe el servidor de autorización —que es quien emite el
|
|
73
|
+
* alcance— y no un catálogo de cromo. Un texto común aquí diría lo mismo en
|
|
74
|
+
* los cinco productos sin que nada fallara, que es exactamente el riesgo.
|
|
75
|
+
*/
|
|
76
|
+
scopeReadLabel: ReactNode;
|
|
77
|
+
/** Ídem para `mcp:write`. **Obligatoria y sin default**, por lo mismo. */
|
|
78
|
+
scopeWriteLabel: ReactNode;
|
|
79
|
+
/** Reenvío puro a `UntrustedText`, que lee `untrustedText.expand` por su cuenta. */
|
|
49
80
|
expandLabel?: string;
|
|
50
|
-
/**
|
|
81
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.collapse`). */
|
|
51
82
|
collapseLabel?: string;
|
|
52
|
-
/**
|
|
83
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.quotes`). */
|
|
53
84
|
valueQuotes?: [string, string];
|
|
54
85
|
/** Se añade DESPUÉS de las clases propias. */
|
|
55
86
|
className?: string;
|
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
|
|
3
3
|
import { ConnectorRequestSummary, type ConnectorScope } from './ConnectorRequestSummary';
|
|
4
|
+
/**
|
|
5
|
+
* El cromo de la pantalla de identificarse dentro del flujo del conector.
|
|
6
|
+
*
|
|
7
|
+
* Aquí **no se concede nada** —la única acción es iniciar sesión—, así que el
|
|
8
|
+
* título y el rótulo de la acción sí son cromo: describen lo que hace el
|
|
9
|
+
* control, no una consecuencia sobre los datos de nadie. La frase que cuenta
|
|
10
|
+
* qué pide la herramienta (`intro`) y qué se pedirá (`scopeReadLabel` /
|
|
11
|
+
* `scopeWriteLabel`) siguen fuera, obligatorias.
|
|
12
|
+
*/
|
|
13
|
+
export interface ConnectorSignInMessages {
|
|
14
|
+
/** Título de la pantalla. */
|
|
15
|
+
title: string;
|
|
16
|
+
/** Rótulo de la acción de identificarse. */
|
|
17
|
+
signIn: string;
|
|
18
|
+
/**
|
|
19
|
+
* Cómo se nombra el producto en la frase cuando la pantalla no recibe
|
|
20
|
+
* `productName` («este producto»). Es un relleno genérico, no el nombre de
|
|
21
|
+
* nada: el nombre de verdad viaja en `productName`.
|
|
22
|
+
*/
|
|
23
|
+
fallbackProduct: string;
|
|
24
|
+
}
|
|
4
25
|
export interface ConnectorSignInPageProps extends ConnectorAuthChromeProps {
|
|
5
26
|
/** El nombre con el que la herramienta se registró. **Dato de fuera**: ver `ConnectorRequestSummary`. */
|
|
6
27
|
clientName: string;
|
|
@@ -22,29 +43,42 @@ export interface ConnectorSignInPageProps extends ConnectorAuthChromeProps {
|
|
|
22
43
|
action?: string;
|
|
23
44
|
/** Los parámetros de OAuth que tienen que sobrevivir al acceso, como `<input type="hidden">`. */
|
|
24
45
|
hiddenFields?: Record<string, string>;
|
|
25
|
-
/** Título de la pantalla.
|
|
46
|
+
/** Título de la pantalla. **Sin default**: sin él, sale de `connectorSignIn.title`. */
|
|
26
47
|
title?: ReactNode;
|
|
27
48
|
/**
|
|
28
49
|
* La frase de la cabecera. Recibe la herramienta y el producto ya
|
|
29
|
-
* compuestos.
|
|
50
|
+
* compuestos.
|
|
51
|
+
*
|
|
52
|
+
* **Obligatoria y sin default**: cuenta qué herramienta hay detrás y para
|
|
53
|
+
* qué se está tecleando una contraseña. Eso no lo escribe un catálogo de
|
|
54
|
+
* cromo.
|
|
30
55
|
*/
|
|
31
|
-
intro
|
|
56
|
+
intro: (parts: {
|
|
32
57
|
client: ReactNode;
|
|
33
58
|
product: ReactNode;
|
|
34
59
|
}) => ReactNode;
|
|
35
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Cómo se nombra el producto en la frase cuando no se pasa `productName`.
|
|
62
|
+
* **Sin default**: sin ella, sale de `connectorSignIn.fallbackProduct`, y
|
|
63
|
+
* solo se lee cuando falta `productName`.
|
|
64
|
+
*/
|
|
36
65
|
fallbackProductName?: ReactNode;
|
|
37
|
-
/** Etiqueta de la acción.
|
|
66
|
+
/** Etiqueta de la acción. **Sin default**: sin ella, sale de `connectorSignIn.signIn`. */
|
|
38
67
|
signInLabel?: string;
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Qué se pedirá con `mcp:read`. **Obligatoria y sin default**: ver
|
|
70
|
+
* `ConnectorRequestSummary`. Solo se pinta si hay `scope`, pero se pide
|
|
71
|
+
* siempre — un alcance que se muestra a veces no puede depender de que
|
|
72
|
+
* alguien se acordara de traducirlo.
|
|
73
|
+
*/
|
|
74
|
+
scopeReadLabel: string;
|
|
75
|
+
/** Ídem, lectura y escritura. **Obligatoria y sin default**. */
|
|
76
|
+
scopeWriteLabel: string;
|
|
77
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.expand`). */
|
|
44
78
|
expandLabel?: string;
|
|
45
|
-
/**
|
|
79
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.collapse`). */
|
|
46
80
|
collapseLabel?: string;
|
|
47
|
-
/**
|
|
81
|
+
/** Reenvío puro a `UntrustedText` (`untrustedText.quotes`). */
|
|
48
82
|
valueQuotes?: [string, string];
|
|
49
83
|
/** Rótulos de la ficha. Ver `ConnectorRequestSummary`. */
|
|
50
84
|
summaryLabels?: Pick<React.ComponentProps<typeof ConnectorRequestSummary>, 'clientLabel' | 'productLabel' | 'scopeLabel' | 'redirectLabel'>;
|
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import './UntrustedText.css';
|
|
3
|
+
/**
|
|
4
|
+
* El cromo con el que se enmarca un dato de fuera: el desplegador de un valor
|
|
5
|
+
* recortado y las comillas que dicen dónde empieza y dónde acaba el texto
|
|
6
|
+
* ajeno.
|
|
7
|
+
*
|
|
8
|
+
* **Los tres son cromo y ninguno afirma nada**, así que van al catálogo: «Ver
|
|
9
|
+
* el valor completo» describe lo único que hace ese desplegador, y las
|
|
10
|
+
* comillas son puntuación del idioma (`['„', '“']` en alemán), no una decisión
|
|
11
|
+
* del producto. Lo que sí es de fuera —el valor— entra por `value` y nunca
|
|
12
|
+
* pasa por aquí.
|
|
13
|
+
*/
|
|
14
|
+
export interface UntrustedTextMessages {
|
|
15
|
+
/** Etiqueta del desplegador cerrado. */
|
|
16
|
+
expand: string;
|
|
17
|
+
/** Etiqueta del desplegador abierto. */
|
|
18
|
+
collapse: string;
|
|
19
|
+
/** Las comillas que enmarcan el valor, apertura y cierre. */
|
|
20
|
+
quotes: [string, string];
|
|
21
|
+
}
|
|
3
22
|
export interface UntrustedTextProps {
|
|
4
23
|
/**
|
|
5
24
|
* El valor. Si es una cadena recibe el tratamiento entero —marcado de
|
|
@@ -16,13 +35,21 @@ export interface UntrustedTextProps {
|
|
|
16
35
|
* quiera verlo entero lo despliega en la ficha.
|
|
17
36
|
*/
|
|
18
37
|
expandable?: boolean;
|
|
19
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* Etiqueta del desplegador cerrado. **Sin default**: sin ella, sale de
|
|
40
|
+
* `untrustedText.expand` del `BrandMessagesProvider`, y solo se lee cuando
|
|
41
|
+
* el valor se recorta con `expandable`.
|
|
42
|
+
*/
|
|
20
43
|
expandLabel?: string;
|
|
21
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Etiqueta del desplegador abierto. **Sin default**: sin ella, sale de
|
|
46
|
+
* `untrustedText.collapse`, en el mismo caso.
|
|
47
|
+
*/
|
|
22
48
|
collapseLabel?: string;
|
|
23
49
|
/**
|
|
24
|
-
* Las comillas que enmarcan el valor.
|
|
25
|
-
*
|
|
50
|
+
* Las comillas que enmarcan el valor. **Sin default**: sin ellas, salen de
|
|
51
|
+
* `untrustedText.quotes`. Cambian con el idioma (`['„', '“']` en alemán), y
|
|
52
|
+
* por eso están en el catálogo y no cableadas.
|
|
26
53
|
*/
|
|
27
54
|
quotes?: [string, string];
|
|
28
55
|
/** Se añade DESPUÉS de las clases propias. */
|