pixelon 0.4.3 → 0.5.1
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/components/molecules/chat/StructuredContent/components/LocationField/usePlaces.d.ts +11 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/ReactiveCrud.d.ts +1 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/TranscriptSection.d.ts +10 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/types.d.ts +40 -1
- package/dist/components/molecules/chat/StructuredContent/components/ServicesMap/types.d.ts +9 -0
- package/dist/components/molecules/chat/StructuredContent/components/index.d.ts +0 -1
- package/dist/components/organisms/chat/Chat/hooks/useAutoScroll.d.ts +8 -1
- package/dist/components/templates/lumi/Crud/helpers/confirmSummary.d.ts +13 -0
- package/dist/components/templates/lumi/Crud/types.d.ts +6 -0
- package/dist/core/chat/ChatConfigContext.d.ts +25 -0
- package/dist/core/i18n/separadores.d.ts +12 -0
- package/dist/index.esm.js +293 -44
- package/dist/index.js +293 -44
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/package.json +1 -1
- package/src/styles/index.scss +1 -0
package/dist/components/molecules/chat/StructuredContent/components/LocationField/usePlaces.d.ts
CHANGED
|
@@ -11,6 +11,17 @@ export declare function usePlaceSuggestions(query: string, enabled: boolean): {
|
|
|
11
11
|
} | null>;
|
|
12
12
|
clear: () => void;
|
|
13
13
|
};
|
|
14
|
+
/** SPEC-131 T6 — la dirección formateada de Google repite tramos.
|
|
15
|
+
*
|
|
16
|
+
* Medido: el `formattedAddress` de una calle de El Poblado vuelve como
|
|
17
|
+
* «Cl 10 #43-20, El Poblado, Medellín, El Poblado, Medellín, Antioquia», porque el nombre del
|
|
18
|
+
* lugar ya trae el barrio y la ciudad que luego añade la parte administrativa. Esa cadena se
|
|
19
|
+
* guarda tal cual y aparece en el chat, en la ficha, en la tabla y en Conversaciones.
|
|
20
|
+
*
|
|
21
|
+
* Se comparan los tramos sin tildes ni mayúsculas, que es donde estaba el otro caso visto
|
|
22
|
+
* («Itagüí, Itagüi»), y se conserva el primero de cada uno: el orden de una dirección va de lo
|
|
23
|
+
* particular a lo general, así que el que sobra siempre es el segundo. */
|
|
24
|
+
export declare function limpiarDireccion(address: string): string;
|
|
14
25
|
/**
|
|
15
26
|
* Traduce una coordenada a una dirección legible.
|
|
16
27
|
* Requiere Geocoding habilitado en la clave del navegador; si no lo está, devuelve null y el
|
package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/ReactiveCrud.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export interface ReactiveCrudProps {
|
|
|
14
14
|
onCreateClose?: () => void;
|
|
15
15
|
}
|
|
16
16
|
export declare function matchesVisibleWhen(a: RowActionDef, row: Record<string, unknown>): boolean;
|
|
17
|
+
export declare function laQueTocaAhora(actions: RowActionDef[], row: Record<string, unknown>): RowActionDef | undefined;
|
|
17
18
|
export declare function matchesDisabledWhen(a: RowActionDef, row: Record<string, unknown>): boolean;
|
|
18
19
|
export declare function disabledReasonFor(a: RowActionDef, row: Record<string, unknown>): string | undefined;
|
|
19
20
|
export declare function matchesDoneWhen(a: RowActionDef, row: Record<string, unknown>): boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChatEventBus } from '../../../../../../core/eventBus/chatEventBus';
|
|
2
|
+
import type { ReactiveCrudTranscript } from './types';
|
|
3
|
+
export interface TranscriptSectionProps {
|
|
4
|
+
transcript: ReactiveCrudTranscript;
|
|
5
|
+
/** Valores del registro (fila + detalle): de ahí sale el id de la conversación. */
|
|
6
|
+
values: Record<string, unknown>;
|
|
7
|
+
eventBus?: ChatEventBus;
|
|
8
|
+
}
|
|
9
|
+
export declare function TranscriptSection({ transcript, values, eventBus }: TranscriptSectionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
export default TranscriptSection;
|
|
@@ -114,8 +114,28 @@ export interface RowActionDef {
|
|
|
114
114
|
* SPEC-113: es el respaldo — una condición con `reason` propio manda sobre este. */
|
|
115
115
|
disabledReason?: string;
|
|
116
116
|
/** SPEC-007: muestra un ✓ al final cuando `String(row[field])` está en `in` (ej. inspección ya
|
|
117
|
-
* registrada). Indicador de "hecho"; no bloquea reejecutar la acción.
|
|
117
|
+
* registrada). Indicador de "hecho"; no bloquea reejecutar la acción.
|
|
118
|
+
*
|
|
119
|
+
* SPEC-129 T6: y es lo que decide qué queda escrito en una tarjeta ya gastada. Ahí solo se
|
|
120
|
+
* muestra lo que CUMPLE esta condición, porque es lo único que consta que se hizo: si el paso se
|
|
121
|
+
* cerró por otro camino —el barrido liberó la grúa, la operadora canceló— no hay nada que marcar
|
|
122
|
+
* y la tarjeta se queda con su frase, sin inventar un ✓. */
|
|
118
123
|
doneWhen?: RowActionVisibleWhen;
|
|
124
|
+
/** SPEC-129 T6: cómo se llama esto una vez hecho. «Registrar inspección» → «Inspección
|
|
125
|
+
* registrada». En una tarjeta gastada el botón ya no es una oferta sino un acta, y un acta se
|
|
126
|
+
* escribe en pasado. Sin esto se cae a `label`, que sigue leyéndose bien con el ✓ al lado. */
|
|
127
|
+
doneLabel?: string;
|
|
128
|
+
/** SPEC-127 T4: cuándo esta acción es LA QUE TOCA AHORA. La que cumple va primera y destacada;
|
|
129
|
+
* el resto pasa a un segundo plano, disponible pero sin competir.
|
|
130
|
+
*
|
|
131
|
+
* No es lo mismo que `intent: 'primary'`, que describe la acción SIEMPRE («asignar es una acción
|
|
132
|
+
* importante»). Esto describe el MOMENTO: el mensaje que acompaña la tarjeta dice «Confírmalo
|
|
133
|
+
* para que la grúa salga», y entonces confirmar el pago es lo único que se le está pidiendo,
|
|
134
|
+
* aunque a su alrededor quepan siete cosas más.
|
|
135
|
+
*
|
|
136
|
+
* Si ninguna acción la cumple —o dos la cumplen— la tarjeta se comporta como antes: ninguna se
|
|
137
|
+
* destaca. Es preferible no señalar nada que señalar mal. */
|
|
138
|
+
ahoraToca?: RowActionVisibleWhen | RowActionVisibleWhen[];
|
|
119
139
|
endpoint: EndpointRef;
|
|
120
140
|
/** SPEC-002: varias llamadas en orden (ej. inspección = register-inspection foto + video). Si
|
|
121
141
|
* se define, tiene prioridad sobre `endpoint`; todos comparten el mismo contexto del form. */
|
|
@@ -142,6 +162,23 @@ export interface ReactiveCrudDetail {
|
|
|
142
162
|
/** Campo de la fila para el título del drawer (ej. 'service_number'). */
|
|
143
163
|
titleField?: string;
|
|
144
164
|
}
|
|
165
|
+
export interface ReactiveCrudTranscript {
|
|
166
|
+
/** Campo de la fila con el id de la conversación (ej. 'origin_chat_id'). */
|
|
167
|
+
chatIdField: string;
|
|
168
|
+
/** Endpoint que devuelve `{ lines, total, from_user }`; recibe `{ [param]: <chatIdField> }`. */
|
|
169
|
+
get: EndpointRef;
|
|
170
|
+
/** Clave del cuerpo donde viaja el id (default 'chat_id'). */
|
|
171
|
+
param?: string;
|
|
172
|
+
/** Título de la sección. Ej: 'Conversación con el cliente'. */
|
|
173
|
+
title?: string;
|
|
174
|
+
/** Qué decir cuando la otra parte no ha escrito nada. Es una respuesta, no un hueco. */
|
|
175
|
+
silentText?: string;
|
|
176
|
+
/** Con qué nombre se pinta cada lado. */
|
|
177
|
+
labels?: {
|
|
178
|
+
user?: string;
|
|
179
|
+
assistant?: string;
|
|
180
|
+
};
|
|
181
|
+
}
|
|
145
182
|
export interface ReactiveCrudConfig {
|
|
146
183
|
title?: string;
|
|
147
184
|
/** Campo id de la fila (getRowKey de LumiCrud es obligatorio). */
|
|
@@ -154,6 +191,8 @@ export interface ReactiveCrudConfig {
|
|
|
154
191
|
};
|
|
155
192
|
/** Vista "Ver" con campos + galería de archivos. */
|
|
156
193
|
detail?: ReactiveCrudDetail;
|
|
194
|
+
/** SPEC-128 T5 — conversación en solo lectura dentro de «Ver». Ver `ReactiveCrudTranscript`. */
|
|
195
|
+
transcript?: ReactiveCrudTranscript;
|
|
157
196
|
rowActions?: RowActionDef[];
|
|
158
197
|
filters?: FilterFieldConfig[];
|
|
159
198
|
/** SPEC-014 — con qué filtros NACE la tabla. `filters` (arriba) dice qué se PUEDE filtrar; esto,
|
|
@@ -15,6 +15,12 @@ export interface ServicesMapConfig {
|
|
|
15
15
|
data: {
|
|
16
16
|
list: EndpointRef;
|
|
17
17
|
};
|
|
18
|
+
/** SPEC-131 T6 — qué pide el mapa cuando nadie acota nada.
|
|
19
|
+
*
|
|
20
|
+
* Un mapa de seguimiento sin filtro devuelve el historial entero, y eso es lo que recibía quien
|
|
21
|
+
* preguntaba «¿ya viene mi grúa?». El `filter` de la instancia PISA esto: cuando quien emite el
|
|
22
|
+
* componente sí sabe qué acotar, manda él. */
|
|
23
|
+
defaultFilter?: Record<string, unknown>;
|
|
18
24
|
mapping: ServicesMapMapping;
|
|
19
25
|
/** Icono para todos los puntos cuando la fila no trae uno. */
|
|
20
26
|
defaultIcon?: string;
|
|
@@ -48,6 +54,9 @@ export interface ServicesMapConfig {
|
|
|
48
54
|
emptyText?: string;
|
|
49
55
|
/** Aviso de las filas que no se pudieron ubicar. `{n}` se reemplaza por el número. */
|
|
50
56
|
missingText?: string;
|
|
57
|
+
/** SPEC-127 — el mismo aviso cuando falta UNA sola. Sin esto se lee «1 servicios sin
|
|
58
|
+
* ubicación registrada». Opcional: sin él se usa `missingText` para cualquier número. */
|
|
59
|
+
missingTextOne?: string;
|
|
51
60
|
outsideText?: string;
|
|
52
61
|
loadingText?: string;
|
|
53
62
|
};
|
|
@@ -22,7 +22,6 @@ export { ServicesMap } from './ServicesMap/ServicesMap';
|
|
|
22
22
|
export { ServicesMapChat } from './ServicesMap/ServicesMapChat';
|
|
23
23
|
export type { ServicesMapConfig } from './ServicesMap/types';
|
|
24
24
|
export { ServiceShortcuts } from './ServiceShortcuts/ServiceShortcuts';
|
|
25
|
-
export { ServiceShortcutsChat } from './ServiceShortcuts/ServiceShortcutsChat';
|
|
26
25
|
export { ChatNavigator } from './ChatNavigator/ChatNavigator';
|
|
27
26
|
export { ChatNavigatorChat } from './ChatNavigator/ChatNavigatorChat';
|
|
28
27
|
export type { ChatNavigatorConfig, ChatNavigatorItem, ChatNavigatorEndpoint } from './ChatNavigator/types';
|
|
@@ -14,9 +14,16 @@ export interface UseAutoScrollOptions {
|
|
|
14
14
|
* desconectarlo), dos envíos seguidos dejaban dos observadores compitiendo por mover el scroll,
|
|
15
15
|
* y ninguno se limpiaba al desmontar.
|
|
16
16
|
*/
|
|
17
|
+
/** SPEC-131 T3 — cuánto espacio hay que reservar al final para que el objetivo pueda subir arriba.
|
|
18
|
+
*
|
|
19
|
+
* Lo que falte y nada más: si desde el objetivo hasta el final ya hay una pantalla de contenido,
|
|
20
|
+
* no hace falta reservar nada. Reservar `clientHeight` a ciegas mete una pantalla de blanco al
|
|
21
|
+
* final, y con el scroll topado eso deja la conversación entera por encima del borde superior. */
|
|
22
|
+
export declare function reservaNecesaria(clientHeight: number, scrollHeight: number, targetTop: number): number;
|
|
17
23
|
export declare const useAutoScroll: ({ messagesEndRef, messagesContainerRef, }: UseAutoScrollOptions) => {
|
|
18
24
|
scrollToLastUserMessage: () => void;
|
|
19
25
|
pinLastUserMessage: () => void;
|
|
20
26
|
scrollToProactive: () => void;
|
|
21
|
-
scrollToBottom: () => void;
|
|
27
|
+
scrollToBottom: (suave?: boolean) => void;
|
|
28
|
+
aterrizarAlFinal: () => void;
|
|
22
29
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface LineaResumen {
|
|
2
|
+
label: string;
|
|
3
|
+
valor: string;
|
|
4
|
+
}
|
|
5
|
+
interface CampoResumible {
|
|
6
|
+
name: string;
|
|
7
|
+
label?: string;
|
|
8
|
+
moleculeType?: string;
|
|
9
|
+
uiProps?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
/** Lo que se va a enviar, en el orden del formulario y sin los campos vacíos. */
|
|
12
|
+
export declare function resumenParaConfirmar(campos: ReadonlyArray<CampoResumible>, datos: Record<string, unknown> | null | undefined): LineaResumen[];
|
|
13
|
+
export {};
|
|
@@ -51,6 +51,12 @@ export interface RenderFieldConfig {
|
|
|
51
51
|
formatValue?: (value: unknown, row: unknown) => React.ReactNode;
|
|
52
52
|
/** Función para parsear el valor antes de submit */
|
|
53
53
|
parseValue?: (value: unknown) => unknown;
|
|
54
|
+
/** SPEC-131 T7 — cuántas columnas ocupa el campo en el formulario.
|
|
55
|
+
*
|
|
56
|
+
* En un grid las celdas de una fila comparten altura, así que un campo que se despliega —el de
|
|
57
|
+
* ubicación, que abre un mapa de verificación al elegir la dirección— deja a su hermana con
|
|
58
|
+
* cientos de píxeles de blanco al lado. Los campos que crecen ocupan la fila entera. */
|
|
59
|
+
gridSpan?: number;
|
|
54
60
|
}
|
|
55
61
|
/**
|
|
56
62
|
* Estado de paginación
|
|
@@ -19,6 +19,17 @@ export interface ChatConfig {
|
|
|
19
19
|
* sola es preferible a un panel que se apaga por una conexión mala; el backend sigue rechazando
|
|
20
20
|
* lo que no toca. */
|
|
21
21
|
chatIsForeign?: boolean;
|
|
22
|
+
/** SPEC-128 — DE QUIÉN es esta conversación (el agente que la atiende).
|
|
23
|
+
*
|
|
24
|
+
* `chatIsForeign` dice «esto es de otro»; esto dice **de quién**. No es lo mismo, y hasta ahora
|
|
25
|
+
* solo existía lo primero: la operadora abría la conversación del solicitante y sus componentes
|
|
26
|
+
* se pintaban con el rol de ELLA, así que veía «Gestionar servicios» donde al cliente se le
|
|
27
|
+
* ofreció «Solicitar una grúa». Un mensaje del pasado no es una pregunta sobre quién mira: es el
|
|
28
|
+
* registro de lo que se dijo, y para pintarlo bien hay que saber a quién se le dijo.
|
|
29
|
+
*
|
|
30
|
+
* El host lo pone porque es quien sabe qué conversación está abriendo. Opcional: sin él, los
|
|
31
|
+
* componentes se comportan como antes (deciden por quien mira). */
|
|
32
|
+
chatAgentName?: string;
|
|
22
33
|
/** IANA timezone identifier (e.g. "America/Bogota") */
|
|
23
34
|
timezone: string;
|
|
24
35
|
/** BCP 47 locale string (e.g. "es-CO") */
|
|
@@ -59,6 +70,20 @@ export interface ChatConfig {
|
|
|
59
70
|
* Se tipa como bag genérico para no acoplar `core` a los tipos del componente.
|
|
60
71
|
*/
|
|
61
72
|
resolveModuleConfig?: (module: string) => Record<string, unknown> | undefined;
|
|
73
|
+
/**
|
|
74
|
+
* SPEC-128: qué acciones toca mostrar en un MOMENTO del flujo. Lo provee el host, que es quien
|
|
75
|
+
* sabe qué significa «comprobante_subido» en su producto — aquí solo se sabe que hay momentos.
|
|
76
|
+
*
|
|
77
|
+
* Existe porque la tarjeta tenía que ADIVINAR en qué punto estaba, mirando campos de la fila y
|
|
78
|
+
* decidiendo con cuatro capas de condiciones cuáles de las quince acciones mostrar. Salían ocho
|
|
79
|
+
* botones para una decisión, y pasos futuros apagados ocupando tres cuartas partes. Y cuando dos
|
|
80
|
+
* momentos comparten los mismos datos, adivinar es imposible.
|
|
81
|
+
*
|
|
82
|
+
* Devolver `undefined` significa «no sé de ese momento»: entonces se decide por el estado, como
|
|
83
|
+
* siempre. Una lista VACÍA es distinto — es «en este momento no hay nada que hacer», y la tarjeta
|
|
84
|
+
* enseña solo «Ver».
|
|
85
|
+
*/
|
|
86
|
+
resolveMomento?: (momento: string) => string[] | undefined;
|
|
62
87
|
/**
|
|
63
88
|
* SPEC-022: clave de Google Maps JavaScript API para el componente `map_view`. La provee el
|
|
64
89
|
* HOST desde su entorno; no viaja en el payload del LLM (es configuración de despliegue, y el
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Separadores {
|
|
2
|
+
/** El que agrupa los miles: `.` en es-CO, `,` en en-US. */
|
|
3
|
+
miles: string;
|
|
4
|
+
/** El que abre los decimales: `,` en es-CO, `.` en en-US. */
|
|
5
|
+
decimal: string;
|
|
6
|
+
}
|
|
7
|
+
/** Cómo se escriben los números en ese locale, según el propio navegador.
|
|
8
|
+
*
|
|
9
|
+
* Se deriva en vez de tabularse: una tabla de locales se queda corta en cuanto alguien vende en
|
|
10
|
+
* otro país, y `Intl` ya lo sabe. Si el locale no se entiende, se responde el formato de la casa
|
|
11
|
+
* en vez de reventar — un número mal separado es feo; un formulario que no pinta, inservible. */
|
|
12
|
+
export declare function separadoresDelLocale(locale?: string): Separadores;
|