@arquimedes.co/eureka-forms 3.0.45-mui9 → 3.0.46-new-steps
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/@Types/AvailabilityFormStep.d.ts +65 -0
- package/dist/@Types/AvailabilityFormStep.js +27 -0
- package/dist/@Types/BankAccountFormStep.d.ts +67 -0
- package/dist/@Types/BankAccountFormStep.js +14 -0
- package/dist/@Types/CommunicationChannelFormStep.d.ts +51 -0
- package/dist/@Types/CommunicationChannelFormStep.js +15 -0
- package/dist/@Types/ConsentFormStep.d.ts +36 -0
- package/dist/@Types/ConsentFormStep.js +8 -0
- package/dist/@Types/EntityFormFormStep.d.ts +66 -0
- package/dist/@Types/EntityFormFormStep.js +20 -0
- package/dist/@Types/EventFormStep.d.ts +52 -0
- package/dist/@Types/EventFormStep.js +13 -0
- package/dist/@Types/ExternalReferenceFormStep.d.ts +74 -0
- package/dist/@Types/ExternalReferenceFormStep.js +20 -0
- package/dist/@Types/LocationFormStep.d.ts +136 -0
- package/dist/@Types/LocationFormStep.js +33 -0
- package/dist/@Types/NumericFormSteps.d.ts +171 -0
- package/dist/@Types/NumericFormSteps.js +32 -0
- package/dist/@Types/PredefinedSelectorFormStep.d.ts +51 -0
- package/dist/@Types/PredefinedSelectorFormStep.js +39 -0
- package/dist/@Types/StepRef.d.ts +79 -0
- package/dist/@Types/StepRef.js +27 -0
- package/package.json +8 -8
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — AvailabilityFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar ventanas de disponibilidad: días de la semana + rangos de hora.
|
|
5
|
+
* Ej: "Disponible lunes y miércoles de 9am a 12pm, y viernes de 2pm a 6pm"
|
|
6
|
+
*/
|
|
7
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
8
|
+
/** Granularidad de los slots — define cada cuánto se pueden seleccionar franjas */
|
|
9
|
+
export declare enum AvailabilityGranularity {
|
|
10
|
+
HOUR = "HOUR",
|
|
11
|
+
HALF_HOUR = "HALF_HOUR",
|
|
12
|
+
QUARTER_HOUR = "QUARTER_HOUR"
|
|
13
|
+
}
|
|
14
|
+
/** Días de la semana (refleja DaysOfWeekTypes de Eureka-Types con valores 1-7) */
|
|
15
|
+
export declare enum AvailabilityDayOfWeek {
|
|
16
|
+
MONDAY = 1,
|
|
17
|
+
TUESDAY = 2,
|
|
18
|
+
WEDNESDAY = 3,
|
|
19
|
+
THURSDAY = 4,
|
|
20
|
+
FRIDAY = 5,
|
|
21
|
+
SATURDAY = 6,
|
|
22
|
+
SUNDAY = 7
|
|
23
|
+
}
|
|
24
|
+
export interface AvailabilityStep extends GBaseStep {
|
|
25
|
+
type: 'AVAILABILITY';
|
|
26
|
+
label: string;
|
|
27
|
+
description: string | null;
|
|
28
|
+
required: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Días que el usuario puede seleccionar.
|
|
31
|
+
* Si no se define, todos los días de la semana están disponibles.
|
|
32
|
+
*/
|
|
33
|
+
allowedDays?: AvailabilityDayOfWeek[];
|
|
34
|
+
granularity: AvailabilityGranularity;
|
|
35
|
+
/**
|
|
36
|
+
* Si true, el usuario puede agregar múltiples franjas por día.
|
|
37
|
+
* Si false, solo puede seleccionar una franja continua por día.
|
|
38
|
+
*/
|
|
39
|
+
allowMultipleSlots: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Hora mínima seleccionable en formato HH:mm (24h).
|
|
42
|
+
* Default: "00:00"
|
|
43
|
+
*/
|
|
44
|
+
minTime?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Hora máxima seleccionable en formato HH:mm (24h).
|
|
47
|
+
* Default: "23:59"
|
|
48
|
+
*/
|
|
49
|
+
maxTime?: string;
|
|
50
|
+
size: 1 | 2 | 3 | 4;
|
|
51
|
+
}
|
|
52
|
+
/** Franja horaria dentro de un día */
|
|
53
|
+
export interface AvailabilitySlot {
|
|
54
|
+
/** Hora de inicio en formato HH:mm (24h) */
|
|
55
|
+
start: string;
|
|
56
|
+
/** Hora de fin en formato HH:mm (24h) */
|
|
57
|
+
end: string;
|
|
58
|
+
}
|
|
59
|
+
/** Disponibilidad de un día específico */
|
|
60
|
+
export interface AvailabilityDay {
|
|
61
|
+
day: AvailabilityDayOfWeek;
|
|
62
|
+
slots: AvailabilitySlot[];
|
|
63
|
+
}
|
|
64
|
+
/** Valor completo del paso — array de días con sus franjas */
|
|
65
|
+
export type AvailabilityValue = AvailabilityDay[];
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — AvailabilityFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar ventanas de disponibilidad: días de la semana + rangos de hora.
|
|
5
|
+
* Ej: "Disponible lunes y miércoles de 9am a 12pm, y viernes de 2pm a 6pm"
|
|
6
|
+
*/
|
|
7
|
+
// ===========================================================================
|
|
8
|
+
// Enums
|
|
9
|
+
// ===========================================================================
|
|
10
|
+
/** Granularidad de los slots — define cada cuánto se pueden seleccionar franjas */
|
|
11
|
+
export var AvailabilityGranularity;
|
|
12
|
+
(function (AvailabilityGranularity) {
|
|
13
|
+
AvailabilityGranularity["HOUR"] = "HOUR";
|
|
14
|
+
AvailabilityGranularity["HALF_HOUR"] = "HALF_HOUR";
|
|
15
|
+
AvailabilityGranularity["QUARTER_HOUR"] = "QUARTER_HOUR";
|
|
16
|
+
})(AvailabilityGranularity || (AvailabilityGranularity = {}));
|
|
17
|
+
/** Días de la semana (refleja DaysOfWeekTypes de Eureka-Types con valores 1-7) */
|
|
18
|
+
export var AvailabilityDayOfWeek;
|
|
19
|
+
(function (AvailabilityDayOfWeek) {
|
|
20
|
+
AvailabilityDayOfWeek[AvailabilityDayOfWeek["MONDAY"] = 1] = "MONDAY";
|
|
21
|
+
AvailabilityDayOfWeek[AvailabilityDayOfWeek["TUESDAY"] = 2] = "TUESDAY";
|
|
22
|
+
AvailabilityDayOfWeek[AvailabilityDayOfWeek["WEDNESDAY"] = 3] = "WEDNESDAY";
|
|
23
|
+
AvailabilityDayOfWeek[AvailabilityDayOfWeek["THURSDAY"] = 4] = "THURSDAY";
|
|
24
|
+
AvailabilityDayOfWeek[AvailabilityDayOfWeek["FRIDAY"] = 5] = "FRIDAY";
|
|
25
|
+
AvailabilityDayOfWeek[AvailabilityDayOfWeek["SATURDAY"] = 6] = "SATURDAY";
|
|
26
|
+
AvailabilityDayOfWeek[AvailabilityDayOfWeek["SUNDAY"] = 7] = "SUNDAY";
|
|
27
|
+
})(AvailabilityDayOfWeek || (AvailabilityDayOfWeek = {}));
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — BankAccountFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar información de una cuenta bancaria.
|
|
5
|
+
* Incluye banco, tipo de cuenta, número, país, moneda y titular opcional.
|
|
6
|
+
*/
|
|
7
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
8
|
+
export declare enum BankAccountType {
|
|
9
|
+
SAVINGS = "SAVINGS",
|
|
10
|
+
CHECKING = "CHECKING"
|
|
11
|
+
}
|
|
12
|
+
export interface BankAccountStep extends GBaseStep {
|
|
13
|
+
type: 'BANK_ACCOUNT';
|
|
14
|
+
label: string;
|
|
15
|
+
description: string | null;
|
|
16
|
+
required: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* País predeterminado para filtrar la lista de bancos.
|
|
19
|
+
* Código ISO 3166-1 alpha-2 (ej: "CO", "US", "MX").
|
|
20
|
+
* El usuario puede cambiarlo si no se restringe.
|
|
21
|
+
*/
|
|
22
|
+
defaultCountry?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Si se define, solo se muestran bancos de estos países.
|
|
25
|
+
* Si no se define, se permite cualquier país.
|
|
26
|
+
*/
|
|
27
|
+
allowedCountries?: string[];
|
|
28
|
+
/**
|
|
29
|
+
* Si se define, solo se muestran estas monedas.
|
|
30
|
+
* Códigos ISO 4217 (ej: ["COP", "USD"]).
|
|
31
|
+
*/
|
|
32
|
+
allowedCurrencies?: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Si true, se solicita información del titular de la cuenta
|
|
35
|
+
* (nombre / identificación).
|
|
36
|
+
*/
|
|
37
|
+
requireHolder: boolean;
|
|
38
|
+
size: 1 | 2 | 3 | 4;
|
|
39
|
+
}
|
|
40
|
+
export interface BankAccountHolder {
|
|
41
|
+
/** Nombre completo del titular */
|
|
42
|
+
name?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Referencia a un registro de identidad en Capta.
|
|
45
|
+
* Puede ser el id del contacto o el número de documento.
|
|
46
|
+
*/
|
|
47
|
+
identityRef?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface BankValue {
|
|
50
|
+
bank: {
|
|
51
|
+
/** Id interno del banco en el catálogo de Capta */
|
|
52
|
+
id: string;
|
|
53
|
+
/** Nombre display del banco */
|
|
54
|
+
label: string;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Tipo de cuenta. Se acepta string para bancos con tipos no estándar
|
|
58
|
+
* (ej: "NEQUI", "DAVIPLATA", "CORRIENTE_EXTERIOR").
|
|
59
|
+
*/
|
|
60
|
+
accountType: BankAccountType | string;
|
|
61
|
+
accountNumber: string;
|
|
62
|
+
/** Código ISO 3166-1 alpha-2 del país */
|
|
63
|
+
country: string;
|
|
64
|
+
/** Código ISO 4217 de la moneda */
|
|
65
|
+
currency: string;
|
|
66
|
+
holder?: BankAccountHolder;
|
|
67
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — BankAccountFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar información de una cuenta bancaria.
|
|
5
|
+
* Incluye banco, tipo de cuenta, número, país, moneda y titular opcional.
|
|
6
|
+
*/
|
|
7
|
+
// ===========================================================================
|
|
8
|
+
// Enums
|
|
9
|
+
// ===========================================================================
|
|
10
|
+
export var BankAccountType;
|
|
11
|
+
(function (BankAccountType) {
|
|
12
|
+
BankAccountType["SAVINGS"] = "SAVINGS";
|
|
13
|
+
BankAccountType["CHECKING"] = "CHECKING";
|
|
14
|
+
})(BankAccountType || (BankAccountType = {}));
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — CommunicationChannelFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar uno o más canales de comunicación (WhatsApp / Email / Teléfono).
|
|
5
|
+
* Cada canal es un objeto con tipo + valor + estado de verificación opcional.
|
|
6
|
+
*/
|
|
7
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
8
|
+
export declare enum CommunicationChannelType {
|
|
9
|
+
WHATSAPP = "WHATSAPP",
|
|
10
|
+
EMAIL = "EMAIL",
|
|
11
|
+
PHONE = "PHONE"
|
|
12
|
+
}
|
|
13
|
+
export interface CommunicationChannelStep extends GBaseStep {
|
|
14
|
+
type: 'COMMUNICATION_CHANNEL';
|
|
15
|
+
label: string;
|
|
16
|
+
description: string | null;
|
|
17
|
+
required: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Canales que el usuario puede seleccionar.
|
|
20
|
+
* Si solo hay uno, no se muestra el selector de tipo.
|
|
21
|
+
*/
|
|
22
|
+
allowedChannels: [CommunicationChannelType, ...CommunicationChannelType[]];
|
|
23
|
+
/**
|
|
24
|
+
* Si true, se muestra un campo/estado "verificado" junto al valor.
|
|
25
|
+
* Útil para marcar si el canal fue confirmado (doble opt-in, OTP, etc.).
|
|
26
|
+
*/
|
|
27
|
+
includeVerification: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Si true, el usuario puede agregar más de un canal.
|
|
30
|
+
* El valor guardado pasa de ser un objeto a un array.
|
|
31
|
+
*/
|
|
32
|
+
allowMultiple: boolean;
|
|
33
|
+
/** Solo aplica si allowMultiple === true */
|
|
34
|
+
maxChannels?: number;
|
|
35
|
+
size: 1 | 2 | 3 | 4;
|
|
36
|
+
}
|
|
37
|
+
export interface CommunicationChannelValue {
|
|
38
|
+
channelType: CommunicationChannelType;
|
|
39
|
+
/** Número de teléfono (con código de país) o dirección de email */
|
|
40
|
+
value: string;
|
|
41
|
+
/**
|
|
42
|
+
* Presente solo si el paso tiene includeVerification === true.
|
|
43
|
+
* true = verificado, false = pendiente de verificación.
|
|
44
|
+
*/
|
|
45
|
+
verified?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Si allowMultiple === false → CommunicationChannelValue
|
|
49
|
+
* Si allowMultiple === true → CommunicationChannelValue[]
|
|
50
|
+
*/
|
|
51
|
+
export type CommunicationChannelStepValue = CommunicationChannelValue | CommunicationChannelValue[];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — CommunicationChannelFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar uno o más canales de comunicación (WhatsApp / Email / Teléfono).
|
|
5
|
+
* Cada canal es un objeto con tipo + valor + estado de verificación opcional.
|
|
6
|
+
*/
|
|
7
|
+
// ===========================================================================
|
|
8
|
+
// Enum de canales (refleja ChannelTypes de Eureka-Types)
|
|
9
|
+
// ===========================================================================
|
|
10
|
+
export var CommunicationChannelType;
|
|
11
|
+
(function (CommunicationChannelType) {
|
|
12
|
+
CommunicationChannelType["WHATSAPP"] = "WHATSAPP";
|
|
13
|
+
CommunicationChannelType["EMAIL"] = "EMAIL";
|
|
14
|
+
CommunicationChannelType["PHONE"] = "PHONE";
|
|
15
|
+
})(CommunicationChannelType || (CommunicationChannelType = {}));
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — ConsentFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso de consentimiento / términos y condiciones.
|
|
5
|
+
* El usuario debe aceptar explícitamente para continuar.
|
|
6
|
+
* El contenido puede ser texto enriquecido (EurekaDraft) o un link externo.
|
|
7
|
+
*/
|
|
8
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
9
|
+
import { EurekaDraft } from './Draft/Draft';
|
|
10
|
+
export interface ConsentStep extends GBaseStep {
|
|
11
|
+
type: 'CONSENT';
|
|
12
|
+
/**
|
|
13
|
+
* Texto del checkbox que el usuario marca.
|
|
14
|
+
* Ej: "Acepto los términos y condiciones de uso"
|
|
15
|
+
*/
|
|
16
|
+
label: string;
|
|
17
|
+
required: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Contenido completo del documento de T&C / política.
|
|
20
|
+
* Se muestra en un modal o área expandible al hacer clic en el link.
|
|
21
|
+
* Si no se define, solo se muestra label + linkUrl.
|
|
22
|
+
*/
|
|
23
|
+
content?: EurekaDraft;
|
|
24
|
+
/**
|
|
25
|
+
* URL externa opcional. Si se define, el link abre esta URL en lugar
|
|
26
|
+
* de mostrar el content inline.
|
|
27
|
+
* Solo uno de content o linkUrl debería estar activo a la vez.
|
|
28
|
+
*/
|
|
29
|
+
linkUrl?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Si true, el checkbox no se puede desmarcar una vez aceptado
|
|
32
|
+
* (útil en flujos donde el consentimiento es permanente en esa sesión).
|
|
33
|
+
*/
|
|
34
|
+
irreversible?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export type ConsentValue = boolean;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — EntityFormFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso que permite al usuario buscar y/o crear un registro de entidad
|
|
5
|
+
* directamente dentro del formulario, sin salir de él.
|
|
6
|
+
*
|
|
7
|
+
* Modos:
|
|
8
|
+
* SEARCH → solo busca entidades existentes
|
|
9
|
+
* CREATE → solo crea una entidad nueva (muestra sub-campos)
|
|
10
|
+
* SEARCH_OR_CREATE → busca primero; si no encuentra, puede crear
|
|
11
|
+
*/
|
|
12
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
13
|
+
import { ErkIconTypes } from '../constants/ErkIconTypes';
|
|
14
|
+
export declare enum EntityFormMode {
|
|
15
|
+
SEARCH = "SEARCH",
|
|
16
|
+
CREATE = "CREATE",
|
|
17
|
+
SEARCH_OR_CREATE = "SEARCH_OR_CREATE"
|
|
18
|
+
}
|
|
19
|
+
export interface EntityFormStep extends GBaseStep {
|
|
20
|
+
type: 'ENTITY_FORM';
|
|
21
|
+
label: string;
|
|
22
|
+
description: string | null;
|
|
23
|
+
required: boolean;
|
|
24
|
+
/** Id de la entidad de Capta que se va a buscar/crear */
|
|
25
|
+
idEntity: string;
|
|
26
|
+
mode: EntityFormMode;
|
|
27
|
+
/** Icono representativo de la entidad en la UI */
|
|
28
|
+
icon: ErkIconTypes;
|
|
29
|
+
/**
|
|
30
|
+
* Si true (solo para SEARCH y SEARCH_OR_CREATE), se muestra un campo de
|
|
31
|
+
* búsqueda con filtrado por texto.
|
|
32
|
+
*/
|
|
33
|
+
searchable?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Ids de los FormSteps que definen los campos del sub-formulario de creación.
|
|
36
|
+
* Solo aplica cuando mode === CREATE o SEARCH_OR_CREATE.
|
|
37
|
+
* Estos steps son "embebidos" — se renderizan inline dentro de este paso.
|
|
38
|
+
*/
|
|
39
|
+
entityFieldSteps?: string[];
|
|
40
|
+
/**
|
|
41
|
+
* Si true, el usuario puede seleccionar más de un registro.
|
|
42
|
+
* El valor pasa de ser un objeto a un array.
|
|
43
|
+
*/
|
|
44
|
+
allowMultiple?: boolean;
|
|
45
|
+
maxSize?: number;
|
|
46
|
+
size: 1 | 2 | 3 | 4;
|
|
47
|
+
}
|
|
48
|
+
/** Entidad existente seleccionada en modo SEARCH */
|
|
49
|
+
export interface ExistingEntityRef {
|
|
50
|
+
/** Id del registro de entidad en Capta */
|
|
51
|
+
idEntityValue: string;
|
|
52
|
+
/** Etiqueta display del registro (para mostrar en UI sin refetch) */
|
|
53
|
+
label?: string;
|
|
54
|
+
}
|
|
55
|
+
/** Entidad nueva creada en modo CREATE */
|
|
56
|
+
export interface NewEntityDraft {
|
|
57
|
+
/** Indica que este valor corresponde a un registro por crear */
|
|
58
|
+
isDraft: true;
|
|
59
|
+
/** Campos del sub-formulario indexados por stepId */
|
|
60
|
+
fields: Record<string, unknown>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Si allowMultiple === false → ExistingEntityRef | NewEntityDraft
|
|
64
|
+
* Si allowMultiple === true → (ExistingEntityRef | NewEntityDraft)[]
|
|
65
|
+
*/
|
|
66
|
+
export type EntityFormStepValue = ExistingEntityRef | NewEntityDraft | (ExistingEntityRef | NewEntityDraft)[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — EntityFormFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso que permite al usuario buscar y/o crear un registro de entidad
|
|
5
|
+
* directamente dentro del formulario, sin salir de él.
|
|
6
|
+
*
|
|
7
|
+
* Modos:
|
|
8
|
+
* SEARCH → solo busca entidades existentes
|
|
9
|
+
* CREATE → solo crea una entidad nueva (muestra sub-campos)
|
|
10
|
+
* SEARCH_OR_CREATE → busca primero; si no encuentra, puede crear
|
|
11
|
+
*/
|
|
12
|
+
// ===========================================================================
|
|
13
|
+
// Enum de modos
|
|
14
|
+
// ===========================================================================
|
|
15
|
+
export var EntityFormMode;
|
|
16
|
+
(function (EntityFormMode) {
|
|
17
|
+
EntityFormMode["SEARCH"] = "SEARCH";
|
|
18
|
+
EntityFormMode["CREATE"] = "CREATE";
|
|
19
|
+
EntityFormMode["SEARCH_OR_CREATE"] = "SEARCH_OR_CREATE";
|
|
20
|
+
})(EntityFormMode || (EntityFormMode = {}));
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — EventFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar un evento de calendario.
|
|
5
|
+
* La semántica exacta está pendiente de revisión — este draft cubre la
|
|
6
|
+
* configuración más probable basada en la discusión inicial.
|
|
7
|
+
*
|
|
8
|
+
* TODO: Definir si "evento" corresponde a:
|
|
9
|
+
* (a) Un evento de calendario puro (integrar con Google Calendar / Outlook)
|
|
10
|
+
* (b) Un registro de tipo "evento" en la entidad de Capta
|
|
11
|
+
* (c) Ambos con integración opcional
|
|
12
|
+
*/
|
|
13
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
14
|
+
export interface EventStep extends GBaseStep {
|
|
15
|
+
type: 'EVENT';
|
|
16
|
+
label: string;
|
|
17
|
+
description: string | null;
|
|
18
|
+
required: boolean;
|
|
19
|
+
/** Si true, el usuario puede especificar una fecha/hora de inicio */
|
|
20
|
+
includeStartDate: boolean;
|
|
21
|
+
/** Si true, el usuario puede especificar una fecha/hora de fin */
|
|
22
|
+
includeEndDate: boolean;
|
|
23
|
+
/** Si true, se permite marcar el evento como "todo el día" */
|
|
24
|
+
includeAllDay?: boolean;
|
|
25
|
+
/** Si true, el usuario puede agregar una ubicación al evento */
|
|
26
|
+
includeLocation: boolean;
|
|
27
|
+
/** Si true, el usuario puede escribir una descripción del evento */
|
|
28
|
+
includeDescription: boolean;
|
|
29
|
+
/** Si true, el usuario puede agregar asistentes (lista de contactos/emails) */
|
|
30
|
+
includeAttendees: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Si true, se ofrece la opción de sincronizar con calendario externo.
|
|
33
|
+
* Pendiente: definir qué calendarios se soportan.
|
|
34
|
+
*/
|
|
35
|
+
includeCalendarSync?: boolean;
|
|
36
|
+
size: 1 | 2 | 3 | 4;
|
|
37
|
+
}
|
|
38
|
+
export interface EventStepValue {
|
|
39
|
+
/** ISO 8601 — fecha y hora de inicio */
|
|
40
|
+
startDate?: string;
|
|
41
|
+
/** ISO 8601 — fecha y hora de fin */
|
|
42
|
+
endDate?: string;
|
|
43
|
+
/** Si el evento es de día completo (sin hora específica) */
|
|
44
|
+
allDay?: boolean;
|
|
45
|
+
title?: string;
|
|
46
|
+
description?: string;
|
|
47
|
+
location?: string;
|
|
48
|
+
/** Lista de emails o ids de contactos */
|
|
49
|
+
attendees?: string[];
|
|
50
|
+
/** Si el usuario eligió sincronizar con su calendario externo */
|
|
51
|
+
calendarSync?: boolean;
|
|
52
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — EventFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar un evento de calendario.
|
|
5
|
+
* La semántica exacta está pendiente de revisión — este draft cubre la
|
|
6
|
+
* configuración más probable basada en la discusión inicial.
|
|
7
|
+
*
|
|
8
|
+
* TODO: Definir si "evento" corresponde a:
|
|
9
|
+
* (a) Un evento de calendario puro (integrar con Google Calendar / Outlook)
|
|
10
|
+
* (b) Un registro de tipo "evento" en la entidad de Capta
|
|
11
|
+
* (c) Ambos con integración opcional
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — ExternalReferenceFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar una referencia a un registro externo, ya sea:
|
|
5
|
+
* - CBR (Customer Base Record) — entidades del modelo de datos de Capta
|
|
6
|
+
* - INTEGRATION — registros de sistemas externos vía integración
|
|
7
|
+
*
|
|
8
|
+
* El usuario busca/selecciona un registro externo y el step guarda su referencia.
|
|
9
|
+
* Opcionalmente, puede incluir validación asistida por IA para normalizar el valor.
|
|
10
|
+
*/
|
|
11
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
12
|
+
export declare enum ExternalRefTargetType {
|
|
13
|
+
/** Customer Base Record — entidad interna de Capta */
|
|
14
|
+
CBR = "CBR",
|
|
15
|
+
/** Sistema externo integrado (ERP, CRM, etc.) */
|
|
16
|
+
INTEGRATION = "INTEGRATION"
|
|
17
|
+
}
|
|
18
|
+
/** Configuración de un tipo de entidad CBR que se puede referenciar */
|
|
19
|
+
export interface CBRRefTarget {
|
|
20
|
+
/** Id del tipo de entidad en Capta (ej: "CLIENT", "SUPPLIER", "PROJECT") */
|
|
21
|
+
entityType: string;
|
|
22
|
+
/** Etiqueta legible para mostrar en la UI */
|
|
23
|
+
label: string;
|
|
24
|
+
/** Icono opcional para diferenciar tipos en el selector */
|
|
25
|
+
icon?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ExternalReferenceStep extends GBaseStep {
|
|
28
|
+
type: 'EXTERNAL_REFERENCE';
|
|
29
|
+
label: string;
|
|
30
|
+
description: string | null;
|
|
31
|
+
required: boolean;
|
|
32
|
+
targetType: ExternalRefTargetType;
|
|
33
|
+
/**
|
|
34
|
+
* Tipos de entidad CBR que el usuario puede referenciar.
|
|
35
|
+
* Si tiene un solo elemento, no se muestra el selector de tipo.
|
|
36
|
+
*/
|
|
37
|
+
cbrTargets?: CBRRefTarget[];
|
|
38
|
+
/** Id de la integración configurada en Capta */
|
|
39
|
+
integrationId?: string;
|
|
40
|
+
/** Endpoint o recurso específico dentro de la integración */
|
|
41
|
+
integrationResource?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Si true, se usa IA para validar / normalizar el valor ingresado.
|
|
44
|
+
* Ej: corregir nombre de empresa, resolver ambigüedades, sugerir coincidencias.
|
|
45
|
+
*/
|
|
46
|
+
aiValidation: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Ids de otros steps cuyo valor se usa como contexto para la búsqueda.
|
|
49
|
+
* Ej: usar el valor de un step de "país" para filtrar resultados.
|
|
50
|
+
*/
|
|
51
|
+
compositeStepIds?: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Si true, el usuario puede seleccionar múltiples referencias.
|
|
54
|
+
*/
|
|
55
|
+
allowMultiple?: boolean;
|
|
56
|
+
maxSize?: number;
|
|
57
|
+
size: 1 | 2 | 3 | 4;
|
|
58
|
+
}
|
|
59
|
+
export interface ExternalReferenceValue {
|
|
60
|
+
/** Identificador de la referencia en el sistema origen */
|
|
61
|
+
ref: string;
|
|
62
|
+
/** Etiqueta display del registro referenciado (para UI sin refetch) */
|
|
63
|
+
label?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Datos del registro resuelto, si el backend los retorna.
|
|
66
|
+
* Estructura variable dependiendo del sistema origen.
|
|
67
|
+
*/
|
|
68
|
+
resolved?: Record<string, unknown>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Si allowMultiple === false → ExternalReferenceValue
|
|
72
|
+
* Si allowMultiple === true → ExternalReferenceValue[]
|
|
73
|
+
*/
|
|
74
|
+
export type ExternalReferenceStepValue = ExternalReferenceValue | ExternalReferenceValue[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — ExternalReferenceFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso para capturar una referencia a un registro externo, ya sea:
|
|
5
|
+
* - CBR (Customer Base Record) — entidades del modelo de datos de Capta
|
|
6
|
+
* - INTEGRATION — registros de sistemas externos vía integración
|
|
7
|
+
*
|
|
8
|
+
* El usuario busca/selecciona un registro externo y el step guarda su referencia.
|
|
9
|
+
* Opcionalmente, puede incluir validación asistida por IA para normalizar el valor.
|
|
10
|
+
*/
|
|
11
|
+
// ===========================================================================
|
|
12
|
+
// Enums
|
|
13
|
+
// ===========================================================================
|
|
14
|
+
export var ExternalRefTargetType;
|
|
15
|
+
(function (ExternalRefTargetType) {
|
|
16
|
+
/** Customer Base Record — entidad interna de Capta */
|
|
17
|
+
ExternalRefTargetType["CBR"] = "CBR";
|
|
18
|
+
/** Sistema externo integrado (ERP, CRM, etc.) */
|
|
19
|
+
ExternalRefTargetType["INTEGRATION"] = "INTEGRATION";
|
|
20
|
+
})(ExternalRefTargetType || (ExternalRefTargetType = {}));
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — LocationStep types
|
|
3
|
+
* Pendiente de revisión antes de integrar al FormStep union principal.
|
|
4
|
+
*/
|
|
5
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
6
|
+
import { DynamicRef } from './StepRef';
|
|
7
|
+
/** Modos de entrada que el paso puede ofrecer al usuario */
|
|
8
|
+
export declare enum LocationInputMode {
|
|
9
|
+
/** Autocomplete de Google Places — retorna placeId, coordenadas y addressDetail */
|
|
10
|
+
GOOGLE_PLACES = "GOOGLE_PLACES",
|
|
11
|
+
/** Geolocalización del navegador (GPS) — retorna solo lat/lng */
|
|
12
|
+
GPS = "GPS",
|
|
13
|
+
/** Entrada manual de campos de dirección — sin coordenadas garantizadas */
|
|
14
|
+
MANUAL = "MANUAL"
|
|
15
|
+
}
|
|
16
|
+
/** Tipo de restricción geográfica */
|
|
17
|
+
export declare enum LocationRestrictionType {
|
|
18
|
+
/** Zona circular definida por un centro y un radio en metros */
|
|
19
|
+
RADIUS = "RADIUS",
|
|
20
|
+
/** Polígono arbitrario (geofence) */
|
|
21
|
+
GEOFENCE = "GEOFENCE"
|
|
22
|
+
}
|
|
23
|
+
/** Comportamiento de la restricción */
|
|
24
|
+
export declare enum LocationRestrictionBehavior {
|
|
25
|
+
/** Solo se permite una ubicación dentro de esta zona */
|
|
26
|
+
ALLOW = "ALLOW",
|
|
27
|
+
/** Se rechaza una ubicación dentro de esta zona */
|
|
28
|
+
DENY = "DENY"
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Coordenadas fijas usadas como centro de una restricción de radio.
|
|
32
|
+
* Cuando el centro viene de otro step se usa StepRef con allowedStepTypes: ['LOCATION'].
|
|
33
|
+
*/
|
|
34
|
+
export interface LocationCoords {
|
|
35
|
+
latitude: number;
|
|
36
|
+
longitude: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Centro del radio: coordenadas fijas o referencia a otro LocationStep.
|
|
40
|
+
* El segundo parámetro de DynamicRef restringe las referencias a steps de tipo 'LOCATION'.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // fijo
|
|
44
|
+
* center: { type: 'FIXED', value: { latitude: 6.2, longitude: -75.5 } }
|
|
45
|
+
*
|
|
46
|
+
* // dinámico — TypeScript solo acepta allowedStepTypes: ['LOCATION']
|
|
47
|
+
* center: { type: 'STEP_REF', idStep: 'step_origen', allowedStepTypes: ['LOCATION'] }
|
|
48
|
+
*/
|
|
49
|
+
export type LocationCenterRef = DynamicRef<LocationCoords, 'LOCATION'>;
|
|
50
|
+
/** Restricción circular */
|
|
51
|
+
export interface RadiusRestriction {
|
|
52
|
+
type: LocationRestrictionType.RADIUS;
|
|
53
|
+
behavior: LocationRestrictionBehavior;
|
|
54
|
+
center: LocationCenterRef;
|
|
55
|
+
/** Radio en metros */
|
|
56
|
+
radiusMeters: number;
|
|
57
|
+
/** Mensaje de error personalizado cuando la validación falla */
|
|
58
|
+
errorMessage?: string;
|
|
59
|
+
}
|
|
60
|
+
/** Vértice de un polígono */
|
|
61
|
+
export interface GeofenceVertex {
|
|
62
|
+
latitude: number;
|
|
63
|
+
longitude: number;
|
|
64
|
+
}
|
|
65
|
+
/** Restricción por polígono — mínimo 3 vértices, se cierra automáticamente */
|
|
66
|
+
export interface GeofenceRestriction {
|
|
67
|
+
type: LocationRestrictionType.GEOFENCE;
|
|
68
|
+
behavior: LocationRestrictionBehavior;
|
|
69
|
+
/** Lista ordenada de vértices que forman el polígono */
|
|
70
|
+
polygon: [GeofenceVertex, GeofenceVertex, GeofenceVertex, ...GeofenceVertex[]];
|
|
71
|
+
/** Mensaje de error personalizado cuando la validación falla */
|
|
72
|
+
errorMessage?: string;
|
|
73
|
+
}
|
|
74
|
+
/** Una restricción geográfica — pueden combinarse varias (todas deben cumplirse) */
|
|
75
|
+
export type LocationRestriction = RadiusRestriction | GeofenceRestriction;
|
|
76
|
+
export interface LocationStep extends GBaseStep {
|
|
77
|
+
type: 'LOCATION';
|
|
78
|
+
label: string;
|
|
79
|
+
description: string | null;
|
|
80
|
+
required: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Modos de entrada habilitados. Al menos uno debe estar presente.
|
|
83
|
+
* Si solo hay uno, la UI no muestra selector de modo.
|
|
84
|
+
*/
|
|
85
|
+
allowedModes: [LocationInputMode, ...LocationInputMode[]];
|
|
86
|
+
/**
|
|
87
|
+
* Modo que se preselecciona al abrir el paso.
|
|
88
|
+
* Debe estar incluido en allowedModes.
|
|
89
|
+
* Si no se especifica, se usa el primero de allowedModes.
|
|
90
|
+
*/
|
|
91
|
+
defaultMode?: LocationInputMode;
|
|
92
|
+
/**
|
|
93
|
+
* Restricciones geográficas. Se evalúan todas (lógica AND).
|
|
94
|
+
* Una ubicación es válida solo si pasa cada restricción.
|
|
95
|
+
*/
|
|
96
|
+
restrictions?: LocationRestriction[];
|
|
97
|
+
size: 1 | 2 | 3 | 4;
|
|
98
|
+
}
|
|
99
|
+
/** Desglose estructurado de la dirección (mismo shape que AddressModel) */
|
|
100
|
+
export interface LocationAddressDetail {
|
|
101
|
+
street?: string;
|
|
102
|
+
streetNumber?: string;
|
|
103
|
+
unit?: string;
|
|
104
|
+
neighborhood?: string;
|
|
105
|
+
city?: string;
|
|
106
|
+
state?: string;
|
|
107
|
+
country?: string;
|
|
108
|
+
/** ISO 3166-1 alpha-2 (e.g., "CO", "US", "MX") */
|
|
109
|
+
countryCode?: string;
|
|
110
|
+
postalCode?: string;
|
|
111
|
+
}
|
|
112
|
+
export interface LocationStepValue {
|
|
113
|
+
/** Indica cómo fue capturada la ubicación */
|
|
114
|
+
source: LocationInputMode;
|
|
115
|
+
/**
|
|
116
|
+
* Latitud — presente si source es GOOGLE_PLACES o GPS.
|
|
117
|
+
* Ausente en MANUAL si el usuario no activó coordenadas.
|
|
118
|
+
*/
|
|
119
|
+
latitude?: number;
|
|
120
|
+
/**
|
|
121
|
+
* Longitud — presente si source es GOOGLE_PLACES o GPS.
|
|
122
|
+
* Ausente en MANUAL si el usuario no activó coordenadas.
|
|
123
|
+
*/
|
|
124
|
+
longitude?: number;
|
|
125
|
+
/** Nombre del lugar o negocio (ej: "Torre Bancolombia") */
|
|
126
|
+
name?: string;
|
|
127
|
+
/** Dirección completa formateada (viene de Google o construida manualmente) */
|
|
128
|
+
address?: string;
|
|
129
|
+
/**
|
|
130
|
+
* Google Place ID — presente solo si source === GOOGLE_PLACES.
|
|
131
|
+
* Permite re-fetch de detalles y construcción de links a Maps.
|
|
132
|
+
*/
|
|
133
|
+
placeId?: string;
|
|
134
|
+
/** Desglose campo a campo de la dirección */
|
|
135
|
+
addressDetail?: LocationAddressDetail;
|
|
136
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — LocationStep types
|
|
3
|
+
* Pendiente de revisión antes de integrar al FormStep union principal.
|
|
4
|
+
*/
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Enums
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
/** Modos de entrada que el paso puede ofrecer al usuario */
|
|
9
|
+
export var LocationInputMode;
|
|
10
|
+
(function (LocationInputMode) {
|
|
11
|
+
/** Autocomplete de Google Places — retorna placeId, coordenadas y addressDetail */
|
|
12
|
+
LocationInputMode["GOOGLE_PLACES"] = "GOOGLE_PLACES";
|
|
13
|
+
/** Geolocalización del navegador (GPS) — retorna solo lat/lng */
|
|
14
|
+
LocationInputMode["GPS"] = "GPS";
|
|
15
|
+
/** Entrada manual de campos de dirección — sin coordenadas garantizadas */
|
|
16
|
+
LocationInputMode["MANUAL"] = "MANUAL";
|
|
17
|
+
})(LocationInputMode || (LocationInputMode = {}));
|
|
18
|
+
/** Tipo de restricción geográfica */
|
|
19
|
+
export var LocationRestrictionType;
|
|
20
|
+
(function (LocationRestrictionType) {
|
|
21
|
+
/** Zona circular definida por un centro y un radio en metros */
|
|
22
|
+
LocationRestrictionType["RADIUS"] = "RADIUS";
|
|
23
|
+
/** Polígono arbitrario (geofence) */
|
|
24
|
+
LocationRestrictionType["GEOFENCE"] = "GEOFENCE";
|
|
25
|
+
})(LocationRestrictionType || (LocationRestrictionType = {}));
|
|
26
|
+
/** Comportamiento de la restricción */
|
|
27
|
+
export var LocationRestrictionBehavior;
|
|
28
|
+
(function (LocationRestrictionBehavior) {
|
|
29
|
+
/** Solo se permite una ubicación dentro de esta zona */
|
|
30
|
+
LocationRestrictionBehavior["ALLOW"] = "ALLOW";
|
|
31
|
+
/** Se rechaza una ubicación dentro de esta zona */
|
|
32
|
+
LocationRestrictionBehavior["DENY"] = "DENY";
|
|
33
|
+
})(LocationRestrictionBehavior || (LocationRestrictionBehavior = {}));
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — NumericFormSteps types
|
|
3
|
+
* Cubre tres pasos relacionados con números:
|
|
4
|
+
* - NUMBER → entrada numérica con subtipos (integer, decimal, currency, percentage, quantity, rate)
|
|
5
|
+
* - SCORE → calificación numérica con min/max/precision y bandas opcionales
|
|
6
|
+
* - FORMULA → campo calculado (solo lectura), derivado de otros steps
|
|
7
|
+
*/
|
|
8
|
+
import { GBaseStep } from './GenericFormSteps';
|
|
9
|
+
import { DynamicRef } from './StepRef';
|
|
10
|
+
/** Subtipo del paso numérico — discriminante secundario */
|
|
11
|
+
export declare enum NumberStepType {
|
|
12
|
+
INTEGER = "INTEGER",
|
|
13
|
+
DECIMAL = "DECIMAL",
|
|
14
|
+
CURRENCY = "CURRENCY",
|
|
15
|
+
PERCENTAGE = "PERCENTAGE",
|
|
16
|
+
QUANTITY = "QUANTITY",
|
|
17
|
+
RATE = "RATE"
|
|
18
|
+
}
|
|
19
|
+
/** Campos base compartidos por todos los subtipos numéricos */
|
|
20
|
+
interface GNumberStep extends GBaseStep {
|
|
21
|
+
type: 'NUMBER';
|
|
22
|
+
numberType: NumberStepType;
|
|
23
|
+
label: string;
|
|
24
|
+
description: string | null;
|
|
25
|
+
required: boolean;
|
|
26
|
+
min?: number;
|
|
27
|
+
max?: number;
|
|
28
|
+
/** Cantidad de decimales permitidos (0 = entero). Default: 2 */
|
|
29
|
+
decimals?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Sufijo de unidad que se muestra junto al valor (solo visual, no afecta el número guardado).
|
|
32
|
+
* Puede ser fijo ("km", "km/h", "°C") o venir de otro step.
|
|
33
|
+
*
|
|
34
|
+
* Ejemplo con SELECT dinámico:
|
|
35
|
+
* suffix: { type: 'STEP_REF', idStep: 'step_unidad', fallback: 'm' }
|
|
36
|
+
* → el step 'step_unidad' es un selector con opciones: km | m | cm
|
|
37
|
+
*/
|
|
38
|
+
suffix?: DynamicRef<string>;
|
|
39
|
+
size: 1 | 2 | 3 | 4;
|
|
40
|
+
defaultValue?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface IntegerStep extends GNumberStep {
|
|
43
|
+
numberType: NumberStepType.INTEGER;
|
|
44
|
+
/** Siempre 0 para enteros, pero puede dejarse undefined */
|
|
45
|
+
decimals?: 0;
|
|
46
|
+
}
|
|
47
|
+
export interface DecimalStep extends GNumberStep {
|
|
48
|
+
numberType: NumberStepType.DECIMAL;
|
|
49
|
+
}
|
|
50
|
+
export interface PercentageStep extends GNumberStep {
|
|
51
|
+
numberType: NumberStepType.PERCENTAGE;
|
|
52
|
+
}
|
|
53
|
+
export interface CurrencyStep extends GNumberStep {
|
|
54
|
+
numberType: NumberStepType.CURRENCY;
|
|
55
|
+
/**
|
|
56
|
+
* Moneda: fija ("COP", "USD") o tomada de otro step (ej: un SELECT de monedas).
|
|
57
|
+
* null = el usuario elige la moneda en el mismo campo.
|
|
58
|
+
*/
|
|
59
|
+
currency: DynamicRef<string> | null;
|
|
60
|
+
allowCurrencyChange: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface QuantityStep extends GNumberStep {
|
|
63
|
+
numberType: NumberStepType.QUANTITY;
|
|
64
|
+
/**
|
|
65
|
+
* Unidad fija ("kg", "m", "hrs") o tomada de otro step (ej: un SELECT con km | m | cm).
|
|
66
|
+
* null = el usuario elige la unidad dentro del campo.
|
|
67
|
+
*/
|
|
68
|
+
unit: DynamicRef<string> | null;
|
|
69
|
+
allowUnitChange: boolean;
|
|
70
|
+
availableUnits?: string[];
|
|
71
|
+
}
|
|
72
|
+
export interface RateStep extends GNumberStep {
|
|
73
|
+
numberType: NumberStepType.RATE;
|
|
74
|
+
/** Moneda del rate ("USD") o tomada de otro step. null = usuario elige */
|
|
75
|
+
currency: DynamicRef<string> | null;
|
|
76
|
+
/**
|
|
77
|
+
* Unidad de tiempo/base del rate ("per_hour", "per_month", "per_km") o tomada de otro step.
|
|
78
|
+
* null = usuario elige.
|
|
79
|
+
*/
|
|
80
|
+
unit: DynamicRef<string> | null;
|
|
81
|
+
availableUnits?: string[];
|
|
82
|
+
}
|
|
83
|
+
/** Unión discriminada del paso NUMBER — narrowing por numberType */
|
|
84
|
+
export type NumberStep = IntegerStep | DecimalStep | PercentageStep | CurrencyStep | QuantityStep | RateStep;
|
|
85
|
+
export type IntegerValue = number;
|
|
86
|
+
export type DecimalValue = number;
|
|
87
|
+
export type PercentageValue = number;
|
|
88
|
+
export interface CurrencyValue {
|
|
89
|
+
value: number;
|
|
90
|
+
currency: string;
|
|
91
|
+
}
|
|
92
|
+
export interface QuantityValue {
|
|
93
|
+
value: number;
|
|
94
|
+
unit: string;
|
|
95
|
+
}
|
|
96
|
+
export interface RateValue {
|
|
97
|
+
value: number;
|
|
98
|
+
currency: string;
|
|
99
|
+
unit: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Banda de calificación — agrupa un rango numérico bajo una etiqueta.
|
|
103
|
+
* Ej: { label: 'Bajo', min: 0, max: 3, color: '#e53935' }
|
|
104
|
+
*/
|
|
105
|
+
export interface ScoreBand {
|
|
106
|
+
label: string;
|
|
107
|
+
min: number;
|
|
108
|
+
max: number;
|
|
109
|
+
/** Color hex o css para mostrar en la UI */
|
|
110
|
+
color?: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Calificación numérica configurable.
|
|
114
|
+
* Diferente de Rating (estrellas/like/escala fija) — Score tiene rango arbitrario.
|
|
115
|
+
* Ej: NPS 0-10, evaluación 0-100, score de riesgo 1-5 con 1 decimal.
|
|
116
|
+
*/
|
|
117
|
+
export interface ScoreStep extends GBaseStep {
|
|
118
|
+
type: 'SCORE';
|
|
119
|
+
label: string;
|
|
120
|
+
description: string | null;
|
|
121
|
+
required: boolean;
|
|
122
|
+
min: number;
|
|
123
|
+
max: number;
|
|
124
|
+
/** Cantidad de decimales. 0 = solo enteros */
|
|
125
|
+
precision: number;
|
|
126
|
+
/**
|
|
127
|
+
* Bandas visuales opcionales (Bajo/Medio/Alto, etc.).
|
|
128
|
+
* Si no se definen, el campo es solo numérico sin categorización.
|
|
129
|
+
*/
|
|
130
|
+
bands?: ScoreBand[];
|
|
131
|
+
size: 1 | 2 | 3 | 4;
|
|
132
|
+
defaultValue?: number;
|
|
133
|
+
}
|
|
134
|
+
export type ScoreValue = number;
|
|
135
|
+
/** Tipo de salida de la fórmula — define cómo se formatea el resultado */
|
|
136
|
+
export declare enum FormulaOutputType {
|
|
137
|
+
NUMBER = "NUMBER",
|
|
138
|
+
CURRENCY = "CURRENCY",
|
|
139
|
+
PERCENTAGE = "PERCENTAGE"
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Campo calculado — siempre readonly, su valor se deriva de otros steps.
|
|
143
|
+
*
|
|
144
|
+
* La expresión usa {{idStep}} para referenciar el valor de otros steps.
|
|
145
|
+
* Ej: "{{precio}} * {{cantidad}} * (1 + {{iva}} / 100)"
|
|
146
|
+
*
|
|
147
|
+
* La evaluación de la fórmula ocurre en el frontend en tiempo real
|
|
148
|
+
* y se valida en backend al guardar.
|
|
149
|
+
*/
|
|
150
|
+
export interface FormulaStep extends GBaseStep {
|
|
151
|
+
type: 'FORMULA';
|
|
152
|
+
label: string;
|
|
153
|
+
description: string | null;
|
|
154
|
+
/**
|
|
155
|
+
* Expresión matemática con referencias a steps entre doble llave.
|
|
156
|
+
* Ej: "{{step_subtotal}} * 1.19"
|
|
157
|
+
*/
|
|
158
|
+
formula: string;
|
|
159
|
+
outputType: FormulaOutputType;
|
|
160
|
+
/** Decimales a mostrar en el resultado */
|
|
161
|
+
precision?: number;
|
|
162
|
+
/** Requerido si outputType === CURRENCY. Puede venir de otro step. */
|
|
163
|
+
currency?: DynamicRef<string>;
|
|
164
|
+
/** Unidad a mostrar si outputType === NUMBER (ej: "m²", "hrs"). Puede venir de otro step. */
|
|
165
|
+
unit?: DynamicRef<string>;
|
|
166
|
+
size: 1 | 2 | 3 | 4;
|
|
167
|
+
/** Siempre true — el usuario no puede editar este campo */
|
|
168
|
+
readonly: true;
|
|
169
|
+
}
|
|
170
|
+
export type FormulaValue = number;
|
|
171
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — NumericFormSteps types
|
|
3
|
+
* Cubre tres pasos relacionados con números:
|
|
4
|
+
* - NUMBER → entrada numérica con subtipos (integer, decimal, currency, percentage, quantity, rate)
|
|
5
|
+
* - SCORE → calificación numérica con min/max/precision y bandas opcionales
|
|
6
|
+
* - FORMULA → campo calculado (solo lectura), derivado de otros steps
|
|
7
|
+
*/
|
|
8
|
+
// ===========================================================================
|
|
9
|
+
// NUMBER
|
|
10
|
+
// ===========================================================================
|
|
11
|
+
// NUMBER
|
|
12
|
+
// ===========================================================================
|
|
13
|
+
/** Subtipo del paso numérico — discriminante secundario */
|
|
14
|
+
export var NumberStepType;
|
|
15
|
+
(function (NumberStepType) {
|
|
16
|
+
NumberStepType["INTEGER"] = "INTEGER";
|
|
17
|
+
NumberStepType["DECIMAL"] = "DECIMAL";
|
|
18
|
+
NumberStepType["CURRENCY"] = "CURRENCY";
|
|
19
|
+
NumberStepType["PERCENTAGE"] = "PERCENTAGE";
|
|
20
|
+
NumberStepType["QUANTITY"] = "QUANTITY";
|
|
21
|
+
NumberStepType["RATE"] = "RATE";
|
|
22
|
+
})(NumberStepType || (NumberStepType = {}));
|
|
23
|
+
// ===========================================================================
|
|
24
|
+
// FORMULA
|
|
25
|
+
// ===========================================================================
|
|
26
|
+
/** Tipo de salida de la fórmula — define cómo se formatea el resultado */
|
|
27
|
+
export var FormulaOutputType;
|
|
28
|
+
(function (FormulaOutputType) {
|
|
29
|
+
FormulaOutputType["NUMBER"] = "NUMBER";
|
|
30
|
+
FormulaOutputType["CURRENCY"] = "CURRENCY";
|
|
31
|
+
FormulaOutputType["PERCENTAGE"] = "PERCENTAGE";
|
|
32
|
+
})(FormulaOutputType || (FormulaOutputType = {}));
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — PredefinedSelectorFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso que reemplaza tener que configurar manualmente opciones de selectores
|
|
5
|
+
* para listas fijas y controladas por Capta (países, ciudades, monedas, etc.).
|
|
6
|
+
* Las opciones vienen de APIs internas — el formulario no necesita configurarlas.
|
|
7
|
+
*
|
|
8
|
+
* También resuelve la cascada Country → State → City via parentStepId.
|
|
9
|
+
*/
|
|
10
|
+
import { GSmartSelect } from './GenericFormSteps';
|
|
11
|
+
export declare enum PredefinedOptionType {
|
|
12
|
+
/** ISO 3166-1 — lista de países */
|
|
13
|
+
COUNTRY = "COUNTRY",
|
|
14
|
+
/**
|
|
15
|
+
* Departamento / provincia / estado.
|
|
16
|
+
* Requiere parentStepId apuntando a un step COUNTRY.
|
|
17
|
+
*/
|
|
18
|
+
STATE = "STATE",
|
|
19
|
+
/**
|
|
20
|
+
* Ciudad / municipio.
|
|
21
|
+
* Requiere parentStepId apuntando a un step STATE (o COUNTRY si no hay STATE).
|
|
22
|
+
*/
|
|
23
|
+
CITY = "CITY",
|
|
24
|
+
/** ISO 4217 — monedas (USD, COP, EUR, etc.) */
|
|
25
|
+
CURRENCY = "CURRENCY",
|
|
26
|
+
/** BCP 47 — idiomas (es, en, pt, etc.) */
|
|
27
|
+
LANGUAGE = "LANGUAGE",
|
|
28
|
+
/** Tipos de canal de comunicación (WhatsApp, Email, Teléfono) */
|
|
29
|
+
COMMUNICATION_CHANNEL_TYPE = "COMMUNICATION_CHANNEL_TYPE",
|
|
30
|
+
/** Tipos de documento de identidad por país (CC, NIT, Pasaporte, etc.) */
|
|
31
|
+
DOCUMENT_TYPE = "DOCUMENT_TYPE",
|
|
32
|
+
/** Días de la semana */
|
|
33
|
+
DAY_OF_WEEK = "DAY_OF_WEEK",
|
|
34
|
+
/** Meses del año */
|
|
35
|
+
MONTH = "MONTH"
|
|
36
|
+
}
|
|
37
|
+
export interface PredefinedSelectorStep extends GSmartSelect {
|
|
38
|
+
type: 'PREDEFINED_SELECTOR';
|
|
39
|
+
predefinedType: PredefinedOptionType;
|
|
40
|
+
/**
|
|
41
|
+
* Solo para STATE y CITY: id del step padre que filtra las opciones.
|
|
42
|
+
* - COUNTRY step → filtra estados del país seleccionado
|
|
43
|
+
* - STATE step → filtra ciudades del estado seleccionado
|
|
44
|
+
*
|
|
45
|
+
* Si no se especifica, se listan todas las opciones sin filtrar.
|
|
46
|
+
*/
|
|
47
|
+
parentStepId?: string;
|
|
48
|
+
maxSize?: number;
|
|
49
|
+
defaultValue?: string;
|
|
50
|
+
}
|
|
51
|
+
export type PredefinedSelectorValue = string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — PredefinedSelectorFormStep types
|
|
3
|
+
*
|
|
4
|
+
* Paso que reemplaza tener que configurar manualmente opciones de selectores
|
|
5
|
+
* para listas fijas y controladas por Capta (países, ciudades, monedas, etc.).
|
|
6
|
+
* Las opciones vienen de APIs internas — el formulario no necesita configurarlas.
|
|
7
|
+
*
|
|
8
|
+
* También resuelve la cascada Country → State → City via parentStepId.
|
|
9
|
+
*/
|
|
10
|
+
// ===========================================================================
|
|
11
|
+
// Tipos predefinidos disponibles
|
|
12
|
+
// ===========================================================================
|
|
13
|
+
export var PredefinedOptionType;
|
|
14
|
+
(function (PredefinedOptionType) {
|
|
15
|
+
/** ISO 3166-1 — lista de países */
|
|
16
|
+
PredefinedOptionType["COUNTRY"] = "COUNTRY";
|
|
17
|
+
/**
|
|
18
|
+
* Departamento / provincia / estado.
|
|
19
|
+
* Requiere parentStepId apuntando a un step COUNTRY.
|
|
20
|
+
*/
|
|
21
|
+
PredefinedOptionType["STATE"] = "STATE";
|
|
22
|
+
/**
|
|
23
|
+
* Ciudad / municipio.
|
|
24
|
+
* Requiere parentStepId apuntando a un step STATE (o COUNTRY si no hay STATE).
|
|
25
|
+
*/
|
|
26
|
+
PredefinedOptionType["CITY"] = "CITY";
|
|
27
|
+
/** ISO 4217 — monedas (USD, COP, EUR, etc.) */
|
|
28
|
+
PredefinedOptionType["CURRENCY"] = "CURRENCY";
|
|
29
|
+
/** BCP 47 — idiomas (es, en, pt, etc.) */
|
|
30
|
+
PredefinedOptionType["LANGUAGE"] = "LANGUAGE";
|
|
31
|
+
/** Tipos de canal de comunicación (WhatsApp, Email, Teléfono) */
|
|
32
|
+
PredefinedOptionType["COMMUNICATION_CHANNEL_TYPE"] = "COMMUNICATION_CHANNEL_TYPE";
|
|
33
|
+
/** Tipos de documento de identidad por país (CC, NIT, Pasaporte, etc.) */
|
|
34
|
+
PredefinedOptionType["DOCUMENT_TYPE"] = "DOCUMENT_TYPE";
|
|
35
|
+
/** Días de la semana */
|
|
36
|
+
PredefinedOptionType["DAY_OF_WEEK"] = "DAY_OF_WEEK";
|
|
37
|
+
/** Meses del año */
|
|
38
|
+
PredefinedOptionType["MONTH"] = "MONTH";
|
|
39
|
+
})(PredefinedOptionType || (PredefinedOptionType = {}));
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — Sistema de referencias dinámicas entre steps
|
|
3
|
+
*
|
|
4
|
+
* Permite que la configuración de un paso use el valor en tiempo de ejecución
|
|
5
|
+
* de otro step del mismo formulario, en lugar de un literal fijo.
|
|
6
|
+
*
|
|
7
|
+
* Patrón de uso:
|
|
8
|
+
*
|
|
9
|
+
* // Valor fijo definido en la configuración del formulario
|
|
10
|
+
* suffix: { type: 'FIXED', value: 'km' }
|
|
11
|
+
*
|
|
12
|
+
* // Valor tomado del step 'step_unidad' cuando el usuario interactúa
|
|
13
|
+
* suffix: { type: 'STEP_REF', idStep: 'step_unidad', fallback: 'm' }
|
|
14
|
+
*
|
|
15
|
+
* Se puede aplicar a cualquier campo de configuración cuyo valor deba
|
|
16
|
+
* responder a la selección previa del usuario: sufijos, unidades, monedas,
|
|
17
|
+
* títulos dinámicos, límites numéricos, etc.
|
|
18
|
+
*/
|
|
19
|
+
/** Valor literal configurado en tiempo de diseño del formulario */
|
|
20
|
+
export interface FixedRef<T> {
|
|
21
|
+
type: 'FIXED';
|
|
22
|
+
value: T;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Referencia al valor actual de otro step en el mismo formulario.
|
|
26
|
+
* El runtime sustituye este ref por el valor que el usuario haya ingresado
|
|
27
|
+
* en el step indicado. Si ese step aún no tiene valor, se usa `fallback`.
|
|
28
|
+
*
|
|
29
|
+
* @typeParam TAllowed - Literal(es) de tipo de step permitidos como origen.
|
|
30
|
+
* Default: `string` (sin restricción). Pasar un literal union restringe
|
|
31
|
+
* qué steps puede seleccionar el form builder en la UI.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // sin restricción de tipo
|
|
35
|
+
* StepRef
|
|
36
|
+
*
|
|
37
|
+
* // solo puede apuntar a steps LOCATION
|
|
38
|
+
* StepRef<'LOCATION'>
|
|
39
|
+
*
|
|
40
|
+
* // puede apuntar a PREDEFINED_SELECTOR o CHECKBOX
|
|
41
|
+
* StepRef<'PREDEFINED_SELECTOR' | 'CHECKBOX'>
|
|
42
|
+
*/
|
|
43
|
+
export interface StepRef<TAllowed extends string = string> {
|
|
44
|
+
type: 'STEP_REF';
|
|
45
|
+
/** Id del step cuyo valor se usará */
|
|
46
|
+
idStep: string;
|
|
47
|
+
/**
|
|
48
|
+
* Valor de respaldo mientras el step referenciado no tenga valor.
|
|
49
|
+
* Si no se define, el campo aparece vacío/sin unidad.
|
|
50
|
+
*/
|
|
51
|
+
fallback?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Restricción de tipo — puramente declarativa.
|
|
54
|
+
* El form builder filtra la lista de steps disponibles a estos tipos.
|
|
55
|
+
* El backend valida al guardar la configuración.
|
|
56
|
+
*
|
|
57
|
+
* Si no se define, se permite referenciar cualquier step.
|
|
58
|
+
*/
|
|
59
|
+
allowedStepTypes?: TAllowed[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Un campo dinámico de tipo T puede ser un valor fijo o una referencia a step.
|
|
63
|
+
*
|
|
64
|
+
* @typeParam T - Tipo del valor cuando es FIXED.
|
|
65
|
+
* @typeParam TAllowed - Tipos de step permitidos en la referencia (default: sin restricción).
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* // sufijo sin restricción de tipo de step
|
|
69
|
+
* DynamicRef<string>
|
|
70
|
+
*
|
|
71
|
+
* // centro de radio — solo puede apuntar a steps LOCATION
|
|
72
|
+
* DynamicRef<LocationCoords, 'LOCATION'>
|
|
73
|
+
*
|
|
74
|
+
* // moneda — solo desde PREDEFINED_SELECTOR o CHECKBOX
|
|
75
|
+
* DynamicRef<string, 'PREDEFINED_SELECTOR' | 'CHECKBOX'>
|
|
76
|
+
*/
|
|
77
|
+
export type DynamicRef<T, TAllowed extends string = string> = FixedRef<T> | StepRef<TAllowed>;
|
|
78
|
+
export declare function isFixedRef<T, TAllowed extends string = string>(ref: DynamicRef<T, TAllowed>): ref is FixedRef<T>;
|
|
79
|
+
export declare function isStepRef<T, TAllowed extends string = string>(ref: DynamicRef<T, TAllowed>): ref is StepRef<TAllowed>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRAFT — Sistema de referencias dinámicas entre steps
|
|
3
|
+
*
|
|
4
|
+
* Permite que la configuración de un paso use el valor en tiempo de ejecución
|
|
5
|
+
* de otro step del mismo formulario, en lugar de un literal fijo.
|
|
6
|
+
*
|
|
7
|
+
* Patrón de uso:
|
|
8
|
+
*
|
|
9
|
+
* // Valor fijo definido en la configuración del formulario
|
|
10
|
+
* suffix: { type: 'FIXED', value: 'km' }
|
|
11
|
+
*
|
|
12
|
+
* // Valor tomado del step 'step_unidad' cuando el usuario interactúa
|
|
13
|
+
* suffix: { type: 'STEP_REF', idStep: 'step_unidad', fallback: 'm' }
|
|
14
|
+
*
|
|
15
|
+
* Se puede aplicar a cualquier campo de configuración cuyo valor deba
|
|
16
|
+
* responder a la selección previa del usuario: sufijos, unidades, monedas,
|
|
17
|
+
* títulos dinámicos, límites numéricos, etc.
|
|
18
|
+
*/
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Helpers de narrowing
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
export function isFixedRef(ref) {
|
|
23
|
+
return ref.type === 'FIXED';
|
|
24
|
+
}
|
|
25
|
+
export function isStepRef(ref) {
|
|
26
|
+
return ref.type === 'STEP_REF';
|
|
27
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arquimedes.co/eureka-forms",
|
|
3
3
|
"repository": "git://github.com/Arquimede5/Eureka-Forms.git",
|
|
4
|
-
"version":"3.0.
|
|
4
|
+
"version":"3.0.46-new-steps",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"watch": "tsgo --noEmit --watch --project tsconfig.app.json",
|
|
7
7
|
"start": "vite",
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
"@eslint/eslintrc": "3.3.3",
|
|
50
50
|
"@eslint/js": "9.39.1",
|
|
51
51
|
"@faker-js/faker": "10.1.0",
|
|
52
|
-
"@mui/material": "9.0.1",
|
|
53
|
-
"@mui/x-data-grid-pro": "9.3.0",
|
|
54
|
-
"@mui/x-date-pickers": "9.3.0",
|
|
55
|
-
"@mui/x-date-pickers-pro": "9.3.0",
|
|
52
|
+
"@mui/material": "^9.0.1",
|
|
53
|
+
"@mui/x-data-grid-pro": "^9.3.0",
|
|
54
|
+
"@mui/x-date-pickers": "^9.3.0",
|
|
55
|
+
"@mui/x-date-pickers-pro": "^9.3.0",
|
|
56
56
|
"@storybook/addon-docs": "^10.4.0",
|
|
57
57
|
"@storybook/addon-onboarding": "^10.4.0",
|
|
58
58
|
"@storybook/addon-themes": "^10.4.0",
|
|
@@ -96,8 +96,8 @@
|
|
|
96
96
|
"peerDependencies": {
|
|
97
97
|
"@emotion/react": "11.x.x",
|
|
98
98
|
"@emotion/styled": "11.x.x",
|
|
99
|
-
"@mui/material": "9.0.
|
|
100
|
-
"@mui/x-date-pickers": "9.0
|
|
99
|
+
"@mui/material": "^9.0.1",
|
|
100
|
+
"@mui/x-date-pickers": "^9.3.0",
|
|
101
101
|
"react": "18 || 19",
|
|
102
102
|
"react-dom": "18 || 19"
|
|
103
103
|
},
|
|
@@ -112,4 +112,4 @@
|
|
|
112
112
|
"files": [
|
|
113
113
|
"/dist"
|
|
114
114
|
]
|
|
115
|
-
}
|
|
115
|
+
}
|